diff --git a/.rustfmt.toml b/.rustfmt.toml index e82b0d8..e9fbc1c 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -2,14 +2,16 @@ hard_tabs = true max_width = 100 use_small_heuristics = "Max" + # Imports imports_granularity = "Crate" reorder_imports = true + # Consistency newline_style = "Unix" -# Format comments -comment_width = 100 -wrap_comments = true +normalize_comments = true +normalize_doc_attributes = true + # Misc chain_width = 80 spaces_around_ranges = false @@ -20,6 +22,6 @@ match_arm_blocks = false match_block_trailing_comma = true trailing_comma = "Vertical" trailing_semicolon = false -use_field_init_shorthand = true + # Canvas specific license_template_path = "FILE_HEADER" diff --git a/Cargo.lock b/Cargo.lock index 2e63453..3b48532 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,39 +38,58 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aead" -version = "0.4.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3e798aa0c8239776f54415bc06f3d74b1850f3f830b45c35cfc80556973f70" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" dependencies = [ "generic-array 0.14.4", ] [[package]] name = "aes" -version = "0.7.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495ee669413bfbe9e8cace80f4d3d78e6d8c8d99579f97fb93bde351b185f2d4" +checksum = "dd2bc6d3f370b5666245ff421e231cba4353df936e26986d2918e61a8fd6aef6" dependencies = [ - "cfg-if 1.0.0", - "cipher", - "cpufeatures", - "opaque-debug 0.3.0", + "aes-soft", + "aesni", + "block-cipher", ] [[package]] name = "aes-gcm" -version = "0.9.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a930fd487faaa92a30afa92cc9dd1526a5cff67124abbbb1c617ce070f4dcf" +checksum = "0301c9e9c443494d970a07885e8cf3e587bae8356a1d5abd0999068413f7205f" dependencies = [ "aead", "aes", - "cipher", - "ctr", + "block-cipher", "ghash", "subtle 2.4.1", ] +[[package]] +name = "aes-soft" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63dd91889c49327ad7ef3b500fd1109dbd3c509a03db0d4a9ce413b79f575cb6" +dependencies = [ + "block-cipher", + "byteorder", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aesni" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6fe808308bb07d393e2ea47780043ec47683fcf19cf5efc8ca51c50cc8c68a" +dependencies = [ + "block-cipher", + "opaque-debug 0.3.0", +] + [[package]] name = "ahash" version = "0.7.4" @@ -91,6 +110,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "always-assert" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf688625d06217d5b1bb0ea9d9c44a1635fd0ee3534466388d18203174f4d11" + [[package]] name = "ansi_term" version = "0.11.0" @@ -157,6 +182,22 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d6e24d2cce90c53b948c46271bfb053e4bdc2db9b5d3f65e20f8cf28a1b7fc3" +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "async-channel" version = "1.6.1" @@ -258,12 +299,13 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" dependencies = [ + "async-attributes", "async-channel", "async-global-executor", "async-io", "async-lock", "async-process", - "crossbeam-utils", + "crossbeam-utils 0.8.5", "futures-channel", "futures-core", "futures-io", @@ -380,10 +422,23 @@ dependencies = [ "cfg-if 1.0.0", "libc", "miniz_oxide", - "object 0.26.1", + "object 0.26.0", "rustc-demangle", ] +[[package]] +name = "bae" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107f431ee3d8a8e45e6dd117adab769556ef463959e77bf6a4888d5fd500cf" +dependencies = [ + "heck", + "proc-macro-error 0.4.12", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "base-x" version = "0.2.8" @@ -408,6 +463,84 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "beef" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736" +dependencies = [ + "serde", +] + +[[package]] +name = "beefy-gadget" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" +dependencies = [ + "beefy-primitives", + "fnv", + "futures 0.3.16", + "hex", + "log", + "parity-scale-codec", + "parking_lot 0.11.1", + "sc-client-api", + "sc-keystore", + "sc-network", + "sc-network-gossip", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-utils", + "substrate-prometheus-endpoint", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "beefy-gadget-rpc" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" +dependencies = [ + "beefy-gadget", + "beefy-primitives", + "futures 0.3.16", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-pubsub", + "log", + "parity-scale-codec", + "sc-rpc", + "serde", + "serde_json", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "beefy-merkle-tree" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" + +[[package]] +name = "beefy-primitives" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "bincode" version = "1.3.3" @@ -546,6 +679,15 @@ dependencies = [ "generic-array 0.14.4", ] +[[package]] +name = "block-cipher" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f337a3e6da609650eb74e02bc9fac7b735049f7623ab12f2e4c719316fcc7e80" +dependencies = [ + "generic-array 0.14.4", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -630,6 +772,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ "byteorder", + "either", "iovec", ] @@ -665,66 +808,103 @@ name = "canvas-node" version = "0.1.0" dependencies = [ "canvas-runtime", + "cumulus-client-cli", + "cumulus-client-collator", + "cumulus-client-consensus-aura", + "cumulus-client-consensus-common", + "cumulus-client-network", + "cumulus-client-service", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "derive_more", "frame-benchmarking", "frame-benchmarking-cli", "hex-literal", "jsonrpc-core", + "log", "pallet-contracts-rpc", "pallet-transaction-payment-rpc", + "parity-scale-codec", + "polkadot-cli", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-service", + "polkadot-test-service", "sc-basic-authorship", + "sc-chain-spec", "sc-cli", "sc-client-api", "sc-consensus", - "sc-consensus-aura", "sc-executor", - "sc-finality-grandpa", "sc-keystore", + "sc-network", "sc-rpc", "sc-rpc-api", "sc-service", "sc-telemetry", + "sc-tracing", "sc-transaction-pool", "sc-transaction-pool-api", + "serde", "sp-api", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-aura", "sp-core", - "sp-finality-grandpa", "sp-inherents", + "sp-keystore", + "sp-offchain", "sp-runtime", + "sp-session", "sp-timestamp", + "sp-transaction-pool", "structopt", "substrate-build-script-utils", "substrate-frame-rpc-system", + "substrate-prometheus-endpoint", ] [[package]] name = "canvas-runtime" version = "0.1.0" dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "log", "pallet-aura", "pallet-balances", "pallet-contracts", "pallet-contracts-primitives", "pallet-contracts-rpc-runtime-api", - "pallet-grandpa", "pallet-randomness-collective-flip", "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", + "pallet-xcm", + "parachain-info", "parity-scale-codec", + "polkadot-parachain", + "serde", "sp-api", "sp-block-builder", "sp-consensus-aura", "sp-core", "sp-inherents", + "sp-io", "sp-offchain", "sp-runtime", "sp-session", @@ -732,6 +912,9 @@ dependencies = [ "sp-transaction-pool", "sp-version", "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -787,28 +970,32 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chacha20" -version = "0.7.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8756167ea0aca10e066cdbe7813bd71d2f24e69b0bc7b50509590cef2ce0b9" +checksum = "244fbce0d47e97e8ef2f63b81d5e05882cb518c68531eb33194990d7b7e85845" dependencies = [ - "cfg-if 1.0.0", - "cipher", - "cpufeatures", + "stream-cipher", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.8.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175a11316f33592cf2b71416ee65283730b5b7849813c4891d02a12906ed9acc" +checksum = "9bf18d374d66df0c05cdddd528a7db98f78c28e2519b120855c4f84c5027b1f5" dependencies = [ "aead", "chacha20", - "cipher", "poly1305", + "stream-cipher", "zeroize", ] @@ -832,19 +1019,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff0e3bc0b6446b3f9663c1a6aba6ef06c5aeaa1bc92bd18077be337198ab9768" dependencies = [ "multibase", - "multihash 0.13.2", + "multihash", "unsigned-varint 0.5.1", ] [[package]] name = "cipher" -version = "0.3.0" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" dependencies = [ "generic-array 0.14.4", ] +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e486fe53bb9f2ca0f58cb60e8679a5354fd6687a839942ef0a75967250289ca6" +dependencies = [ + "cfg-if 0.1.10", +] + [[package]] name = "clang-sys" version = "1.2.0" @@ -901,16 +1097,32 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + [[package]] name = "core-foundation" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.2", "libc", ] +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + [[package]] name = "core-foundation-sys" version = "0.8.2" @@ -935,6 +1147,12 @@ dependencies = [ "libc", ] +[[package]] +name = "cpuid-bool" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" + [[package]] name = "cranelift-bforest" version = "0.74.0" @@ -958,7 +1176,7 @@ dependencies = [ "log", "regalloc", "serde", - "smallvec", + "smallvec 1.6.1", "target-lexicon", ] @@ -998,7 +1216,7 @@ checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", - "smallvec", + "smallvec 1.6.1", "target-lexicon", ] @@ -1024,7 +1242,7 @@ dependencies = [ "itertools 0.10.1", "log", "serde", - "smallvec", + "smallvec 1.6.1", "thiserror", "wasmparser", ] @@ -1045,7 +1263,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils", + "crossbeam-utils 0.8.5", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" +dependencies = [ + "crossbeam-epoch 0.8.2", + "crossbeam-utils 0.7.2", + "maybe-uninit", ] [[package]] @@ -1055,8 +1284,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-epoch 0.9.5", + "crossbeam-utils 0.8.5", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset 0.5.6", + "scopeguard", ] [[package]] @@ -1066,12 +1310,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils", + "crossbeam-utils 0.8.5", "lazy_static", - "memoffset", + "memoffset 0.6.4", "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +dependencies = [ + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if 0.1.10", + "lazy_static", +] + [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -1110,9 +1376,9 @@ dependencies = [ [[package]] name = "ct-logs" -version = "0.8.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" +checksum = "8c8e13110a84b6315df212c045be706af261fd364791cad863285439ebba672e" dependencies = [ "sct", ] @@ -1127,15 +1393,6 @@ dependencies = [ "syn", ] -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher", -] - [[package]] name = "cuckoofilter" version = "0.5.0" @@ -1148,171 +1405,539 @@ dependencies = [ ] [[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +name = "cumulus-client-cli" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.4.1", - "zeroize", + "sc-cli", + "sc-service", + "structopt", ] [[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +name = "cumulus-client-collator" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle 2.4.1", - "zeroize", -] - -[[package]] -name = "data-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + "cumulus-client-consensus-common", + "cumulus-client-network", + "cumulus-primitives-core", + "futures 0.3.16", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "sc-client-api", + "sp-api", + "sp-consensus", + "sp-core", + "sp-io", + "sp-runtime", + "tracing", +] [[package]] -name = "data-encoding-macro" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +name = "cumulus-client-consensus-aura" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "data-encoding", - "data-encoding-macro-internal", + "async-trait", + "cumulus-client-consensus-common", + "cumulus-primitives-core", + "futures 0.3.16", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-client", + "sc-client-api", + "sc-consensus", + "sc-consensus-aura", + "sc-consensus-slots", + "sc-telemetry", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-aura", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "tracing", ] [[package]] -name = "data-encoding-macro-internal" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +name = "cumulus-client-consensus-common" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "data-encoding", - "syn", + "async-trait", + "dyn-clone", + "futures 0.3.16", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime", + "sc-client-api", + "sc-consensus", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-trie", + "substrate-prometheus-endpoint", + "tracing", ] [[package]] -name = "derive_more" -version = "0.99.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +name = "cumulus-client-network" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.3.3", - "syn", + "derive_more", + "futures 0.3.16", + "futures-timer 3.0.2", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-client", + "polkadot-node-primitives", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-statement-table", + "sc-client-api", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "tracing", ] [[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +name = "cumulus-client-pov-recovery" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "generic-array 0.12.4", + "cumulus-primitives-core", + "futures 0.3.16", + "futures-timer 3.0.2", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "rand 0.8.4", + "sc-client-api", + "sc-consensus", + "sp-api", + "sp-consensus", + "sp-core", + "sp-maybe-compressed-blob", + "sp-runtime", + "tracing", ] [[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +name = "cumulus-client-service" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "generic-array 0.14.4", + "cumulus-client-collator", + "cumulus-client-consensus-common", + "cumulus-client-pov-recovery", + "cumulus-primitives-core", + "parity-scale-codec", + "parking_lot 0.10.2", + "polkadot-overseer", + "polkadot-primitives", + "polkadot-service", + "sc-chain-spec", + "sc-client-api", + "sc-consensus", + "sc-consensus-babe", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "tracing", ] [[package]] -name = "directories" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" +name = "cumulus-pallet-aura-ext" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "dirs-sys", + "frame-executive", + "frame-support", + "frame-system", + "pallet-aura", + "parity-scale-codec", + "serde", + "sp-application-crypto", + "sp-consensus-aura", + "sp-runtime", + "sp-std", ] [[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +name = "cumulus-pallet-dmp-queue" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "rand 0.8.4", + "rand_chacha 0.3.1", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] -name = "dirs-sys" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +name = "cumulus-pallet-parachain-system" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "environmental", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", + "polkadot-parachain", + "serde", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "xcm", ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +name = "cumulus-pallet-parachain-system-proc-macro" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", + "proc-macro-crate 1.0.0", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "dns-parser" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" +name = "cumulus-pallet-xcm" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "byteorder", - "quick-error 1.2.3", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", ] [[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +name = "cumulus-pallet-xcmp-queue" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "rand 0.8.4", + "rand_chacha 0.3.1", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] [[package]] -name = "dyn-clonable" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +name = "cumulus-primitives-core" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "dyn-clonable-impl", - "dyn-clone", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sp-api", + "sp-runtime", + "sp-std", + "sp-trie", + "xcm", ] [[package]] -name = "dyn-clonable-impl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +name = "cumulus-primitives-parachain-inherent" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "proc-macro2", - "quote", - "syn", + "async-trait", + "cumulus-primitives-core", + "cumulus-test-relay-sproof-builder", + "parity-scale-codec", + "polkadot-client", + "sc-client-api", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "tracing", ] [[package]] -name = "dyn-clone" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" +name = "cumulus-primitives-timestamp" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" +dependencies = [ + "cumulus-primitives-core", + "sp-inherents", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "cumulus-primitives-utility" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sp-runtime", + "sp-std", + "sp-trie", + "xcm", +] + +[[package]] +name = "cumulus-test-relay-sproof-builder" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" +dependencies = [ + "cumulus-primitives-core", + "parity-scale-codec", + "polkadot-primitives", + "sp-runtime", + "sp-state-machine", + "sp-std", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.3.3", + "syn", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.4", +] + +[[package]] +name = "directories" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + +[[package]] +name = "dns-parser" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" +dependencies = [ + "byteorder", + "quick-error 1.2.3", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dyn-clone" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" [[package]] name = "ed25519" @@ -1355,6 +1980,37 @@ dependencies = [ "syn", ] +[[package]] +name = "enumflags2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumn" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e58b112d5099aa0857c5d05f0eacab86406dd8c0f85fe5d320a13256d29ecf4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "env_logger" version = "0.7.1" @@ -1362,7 +2018,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", - "humantime", + "humantime 1.3.0", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "atty", + "humantime 2.1.0", "log", "regex", "termcolor", @@ -1405,18 +2074,67 @@ dependencies = [ ] [[package]] -name = "event-listener" -version = "2.5.1" +name = "ethbloom" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" +checksum = "779864b9c7f7ead1f092972c3257496c6a84b46dba2ce131dd8a282cb2cc5972" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] [[package]] -name = "exit-future" -version = "0.2.0" +name = "ethereum-types" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +checksum = "0dd6bde671199089e601e8d47e153368b893ef885f11f365a3261ec58153c211" dependencies = [ - "futures 0.3.16", + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint", +] + +[[package]] +name = "event-listener" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" + +[[package]] +name = "exit-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +dependencies = [ + "futures 0.3.16", +] + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] @@ -1455,7 +2173,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fdbe0d94371f9ce939b555dd342d0686cc4c0cadbcd4b61d70af5ff97eb4126" dependencies = [ - "env_logger", + "env_logger 0.7.1", "log", ] @@ -1515,7 +2233,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", ] @@ -1533,7 +2251,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", @@ -1552,7 +2270,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "Inflector", "chrono", @@ -1575,10 +2293,23 @@ dependencies = [ "structopt", ] +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-arithmetic", + "sp-npos-elections", + "sp-std", +] + [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", @@ -1593,7 +2324,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "14.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "serde", @@ -1604,7 +2335,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "bitflags", "frame-metadata", @@ -1615,7 +2346,7 @@ dependencies = [ "parity-scale-codec", "paste", "serde", - "smallvec", + "smallvec 1.6.1", "sp-arithmetic", "sp-core", "sp-inherents", @@ -1630,7 +2361,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -1642,7 +2373,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate 1.0.0", @@ -1654,7 +2385,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "proc-macro2", "quote", @@ -1664,9 +2395,10 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", + "impl-trait-for-tuples", "log", "parity-scale-codec", "serde", @@ -1677,15 +2409,47 @@ dependencies = [ "sp-version", ] +[[package]] +name = "frame-system-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "frame-support", "parity-scale-codec", "sp-api", + "sp-runtime", + "sp-std", ] +[[package]] +name = "fs-err" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ebd3504ad6116843b8375ad70df74e7bfe83cac77a1f3fe73200c844d43bfe0" + [[package]] name = "fs-swap" version = "0.2.6" @@ -1773,6 +2537,16 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +dependencies = [ + "futures 0.1.31", + "num_cpus", +] + [[package]] name = "futures-executor" version = "0.3.16" @@ -1826,7 +2600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a1387e07917c711fb4ee4f48ea0adb04a3c9739e53ef85bf43ae1edc2937a8b" dependencies = [ "futures-io", - "rustls", + "rustls 0.19.1", "webpki", ] @@ -1925,9 +2699,9 @@ dependencies = [ [[package]] name = "ghash" -version = "0.4.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b442c439366184de619215247d24e908912b175e824a530253845ac4c251a5c1" +checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" dependencies = [ "opaque-debug 0.3.0", "polyval", @@ -1982,6 +2756,44 @@ dependencies = [ "web-sys", ] +[[package]] +name = "h2" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +dependencies = [ + "byteorder", + "bytes 0.4.12", + "fnv", + "futures 0.1.31", + "http 0.1.21", + "indexmap", + "log", + "slab", + "string", + "tokio-io", +] + +[[package]] +name = "h2" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +dependencies = [ + "bytes 0.5.6", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.4", + "indexmap", + "slab", + "tokio 0.2.25", + "tokio-util", + "tracing", + "tracing-futures", +] + [[package]] name = "handlebars" version = "3.5.5" @@ -2046,22 +2858,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-literal" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" -dependencies = [ - "hex-literal-impl", - "proc-macro-hack", -] - -[[package]] -name = "hex-literal-impl" -version = "0.2.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853f769599eb31de176303197b7ba4973299c38c7a7604a6bc88c3eef05b9b46" -dependencies = [ - "proc-macro-hack", -] +checksum = "21e4590e13640f19f249fe3e4eca5113bc4289f2497710378190e7f4bd96f45b" [[package]] name = "hex_fmt" @@ -2091,13 +2890,13 @@ dependencies = [ [[package]] name = "hmac-drbg" -version = "0.3.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" dependencies = [ - "digest 0.9.0", - "generic-array 0.14.4", - "hmac 0.8.1", + "digest 0.8.1", + "generic-array 0.12.4", + "hmac 0.7.1", ] [[package]] @@ -2111,6 +2910,17 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "http" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +dependencies = [ + "bytes 0.4.12", + "fnv", + "itoa", +] + [[package]] name = "http" version = "0.2.4" @@ -2122,6 +2932,28 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "http 0.1.21", + "tokio-buf", +] + +[[package]] +name = "http-body" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +dependencies = [ + "bytes 0.5.6", + "http 0.2.4", +] + [[package]] name = "http-body" version = "0.4.3" @@ -2129,15 +2961,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ "bytes 1.0.1", - "http", + "http 0.2.4", "pin-project-lite 0.2.7", ] [[package]] name = "httparse" -version = "1.5.1" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" + +[[package]] +name = "httpdate" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" [[package]] name = "httpdate" @@ -2154,6 +2992,66 @@ dependencies = [ "quick-error 1.2.3", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.12.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "futures-cpupool", + "h2 0.1.26", + "http 0.1.21", + "http-body 0.1.0", + "httparse", + "iovec", + "itoa", + "log", + "net2", + "rustc_version 0.2.3", + "time", + "tokio 0.1.22", + "tokio-buf", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "want 0.2.0", +] + +[[package]] +name = "hyper" +version = "0.13.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" +dependencies = [ + "bytes 0.5.6", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.2.7", + "http 0.2.4", + "http-body 0.3.1", + "httparse", + "httpdate 0.3.2", + "itoa", + "pin-project 1.0.8", + "socket2 0.3.19", + "tokio 0.2.25", + "tower-service", + "tracing", + "want 0.3.0", +] + [[package]] name = "hyper" version = "0.14.11" @@ -2164,33 +3062,33 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http", - "http-body", + "http 0.2.4", + "http-body 0.4.3", "httparse", - "httpdate", + "httpdate 1.0.1", "itoa", "pin-project-lite 0.2.7", - "socket2 0.4.1", "tokio 1.10.0", "tower-service", "tracing", - "want", + "want 0.3.0", ] [[package]] name = "hyper-rustls" -version = "0.22.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" dependencies = [ + "bytes 0.5.6", "ct-logs", "futures-util", - "hyper", + "hyper 0.13.10", "log", - "rustls", - "rustls-native-certs", - "tokio 1.10.0", - "tokio-rustls", + "rustls 0.18.1", + "rustls-native-certs 0.4.0", + "tokio 0.2.25", + "tokio-rustls 0.14.1", "webpki", ] @@ -2262,6 +3160,15 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + [[package]] name = "impl-serde" version = "0.3.1" @@ -2302,6 +3209,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "integer-encoding" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48dc51180a9b377fd75814d0cc02199c20f8e99433d6762f650d39cdbbd3b56f" + [[package]] name = "integer-sqrt" version = "0.1.5" @@ -2332,9 +3245,9 @@ dependencies = [ [[package]] name = "ip_network" -version = "0.4.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b746553d2f4a1ca26fab939943ddfb217a091f34f53571620a8e3d30691303" +checksum = "2ee15951c035f79eddbef745611ec962f63f4558f1dadf98ab723cc603487c6f" [[package]] name = "ipconfig" @@ -2374,9 +3287,9 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.8" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "jobserver" @@ -2389,21 +3302,21 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.53" +version = "0.3.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4bf49d50e2961077d9c99f4b7997d770a1114f087c3c2e0069b36c13fc2979d" +checksum = "ce791b7ca6638aae45be056e068fc756d871eb3b3b10b8efa62d1c9cec616752" dependencies = [ "wasm-bindgen", ] [[package]] name = "jsonrpc-client-transports" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +checksum = "489b9c612e60c766f751ab40fcb43cbb55a1e10bb44a9b4307ed510ca598cbd7" dependencies = [ - "derive_more", - "futures 0.3.16", + "failure", + "futures 0.1.31", "jsonrpc-core", "jsonrpc-pubsub", "log", @@ -2414,13 +3327,11 @@ dependencies = [ [[package]] name = "jsonrpc-core" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +checksum = "0745a6379e3edc893c84ec203589790774e4247420033e71a76d3ab4687991fa" dependencies = [ - "futures 0.3.16", - "futures-executor", - "futures-util", + "futures 0.1.31", "log", "serde", "serde_derive", @@ -2429,19 +3340,18 @@ dependencies = [ [[package]] name = "jsonrpc-core-client" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +checksum = "6f764902d7b891344a0acb65625f32f6f7c6db006952143bd650209fbe7d94db" dependencies = [ - "futures 0.3.16", "jsonrpc-client-transports", ] [[package]] name = "jsonrpc-derive" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +checksum = "99a847f9ec7bb52149b2786a17c9cb260d6effc6b8eeb8c16b343a487a7563a3" dependencies = [ "proc-macro-crate 0.1.5", "proc-macro2", @@ -2451,92 +3361,141 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +checksum = "4fb5c4513b7b542f42da107942b7b759f27120b5cc894729f88254b28dff44b7" dependencies = [ - "futures 0.3.16", - "hyper", + "hyper 0.12.36", "jsonrpc-core", "jsonrpc-server-utils", "log", "net2", - "parking_lot 0.11.1", + "parking_lot 0.10.2", "unicase", ] [[package]] name = "jsonrpc-ipc-server" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" +checksum = "cf50e53e4eea8f421a7316c5f63e395f7bc7c4e786a6dc54d76fab6ff7aa7ce7" dependencies = [ - "futures 0.3.16", "jsonrpc-core", "jsonrpc-server-utils", "log", "parity-tokio-ipc", - "parking_lot 0.11.1", - "tower-service", + "parking_lot 0.10.2", + "tokio-service", ] [[package]] name = "jsonrpc-pubsub" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +checksum = "639558e0604013be9787ae52f798506ae42bf4220fe587bdc5625871cc8b9c77" dependencies = [ - "futures 0.3.16", "jsonrpc-core", - "lazy_static", "log", - "parking_lot 0.11.1", + "parking_lot 0.10.2", "rand 0.7.3", "serde", ] [[package]] name = "jsonrpc-server-utils" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +checksum = "72f1f3990650c033bd8f6bd46deac76d990f9bbfb5f8dc8c4767bf0a00392176" dependencies = [ - "bytes 1.0.1", - "futures 0.3.16", + "bytes 0.4.12", "globset", "jsonrpc-core", "lazy_static", "log", - "tokio 1.10.0", - "tokio-stream", - "tokio-util", + "tokio 0.1.22", + "tokio-codec", "unicase", ] [[package]] name = "jsonrpc-ws-server" -version = "18.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f892c7d766369475ab7b0669f417906302d7c0fb521285c0a0c92e52e7c8e946" +checksum = "6596fe75209b73a2a75ebe1dce4e60e03b88a2b25e8807b667597f6315150d22" dependencies = [ - "futures 0.3.16", "jsonrpc-core", "jsonrpc-server-utils", "log", "parity-ws", - "parking_lot 0.11.1", + "parking_lot 0.10.2", "slab", ] [[package]] -name = "keccak" -version = "0.1.0" +name = "jsonrpsee-proc-macros" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" +checksum = "f37924e16300e249a52a22cabb5632f846dc9760b39355f5e8bc70cd23dc6300" +dependencies = [ + "Inflector", + "bae", + "proc-macro-crate 1.0.0", + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "jsonrpsee-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d67724d368c59e08b557a516cf8fcc51100e7a708850f502e1044b151fe89788" +dependencies = [ + "async-trait", + "beef", + "futures-channel", + "futures-util", + "hyper 0.14.11", + "log", + "serde", + "serde_json", + "soketto 0.6.0", + "thiserror", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2834b6e7f57ce9a4412ed4d6dc95125d2c8612e68f86b9d9a07369164e4198" +dependencies = [ + "async-trait", + "fnv", + "futures 0.3.16", + "jsonrpsee-types", + "log", + "pin-project 1.0.8", + "rustls 0.19.1", + "rustls-native-certs 0.5.0", + "serde", + "serde_json", + "soketto 0.6.0", + "thiserror", + "tokio 0.2.25", + "tokio-rustls 0.15.0", + "tokio-util", + "url 2.2.2", +] + +[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ @@ -2560,7 +3519,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45a3f58dc069ec0e205a27f5b45920722a46faed802a0541538241af6228f512" dependencies = [ "parity-util-mem", - "smallvec", + "smallvec 1.6.1", ] [[package]] @@ -2576,9 +3535,9 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.14.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1b6ea8f2536f504b645ad78419c8246550e19d2c3419a167080ce08edee35a" +checksum = "0d169dbb316aa0fa185d02d847c047f1aa20e292cf1563d790c13536a2a732c8" dependencies = [ "fs-swap", "kvdb", @@ -2589,7 +3548,7 @@ dependencies = [ "parking_lot 0.11.1", "regex", "rocksdb", - "smallvec", + "smallvec 1.6.1", ] [[package]] @@ -2606,9 +3565,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.100" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" +checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765" [[package]] name = "libloading" @@ -2638,9 +3597,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.39.1" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9004c06878ef8f3b4b4067e69a140d87ed20bf777287f82223e49713b36ee433" +checksum = "08053fbef67cd777049ef7a95ebaca2ece370b4ed7712c3fa404d69a88cb741b" dependencies = [ "atomic", "bytes 1.0.1", @@ -2668,18 +3627,18 @@ dependencies = [ "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", - "multiaddr", + "parity-multiaddr", "parking_lot 0.11.1", "pin-project 1.0.8", - "smallvec", + "smallvec 1.6.1", "wasm-timer", ] [[package]] name = "libp2p-core" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9b4abdeaa420593a297c8592f63fad4234f4b88dc9343b8fd8e736c35faa59" +checksum = "554d3e7e9e65f939d66b75fd6a4c67f258fe250da61b91f46c545fc4a89b51d9" dependencies = [ "asn1_der", "bs58", @@ -2689,20 +3648,20 @@ dependencies = [ "futures 0.3.16", "futures-timer 3.0.2", "lazy_static", - "libsecp256k1 0.5.0", + "libsecp256k1 0.3.5", "log", - "multiaddr", - "multihash 0.14.0", + "multihash", "multistream-select", + "parity-multiaddr", "parking_lot 0.11.1", "pin-project 1.0.8", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "rand 0.7.3", "ring", "rw-stream-sink", "sha2 0.9.5", - "smallvec", + "smallvec 1.6.1", "thiserror", "unsigned-varint 0.7.0", "void", @@ -2711,9 +3670,9 @@ dependencies = [ [[package]] name = "libp2p-deflate" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66097fccc0b7f8579f90a03ea76ba6196332ea049fd07fd969490a06819dcdc8" +checksum = "a2181a641cd15f9b6ba71b1335800f309012a0a97a29ffaabbbf40e9d3d58f08" dependencies = [ "flate2", "futures 0.3.16", @@ -2722,23 +3681,23 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.29.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ff08b3196b85a17f202d80589e93b1660a574af67275706657fdc762e42c32" +checksum = "62e63dab8b5ff35e0c101a3e51e843ba782c07bbb1682f5fd827622e0d02b98b" dependencies = [ "async-std-resolver", "futures 0.3.16", "libp2p-core", "log", - "smallvec", + "smallvec 1.6.1", "trust-dns-resolver", ] [[package]] name = "libp2p-floodsub" -version = "0.30.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404eca8720967179dac7a5b4275eb91f904a53859c69ca8d018560ad6beb214f" +checksum = "48a9b570f6766301d9c4aa00fce3554cad1598e2f466debbc4dde909028417cf" dependencies = [ "cuckoofilter", "fnv", @@ -2746,17 +3705,17 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", ] [[package]] name = "libp2p-gossipsub" -version = "0.32.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cc48709bcbc3a3321f08a73560b4bbb4166a7d56f6fdb615bc775f4f91058e" +checksum = "e7b0c8506a6ec3344b9e706d7c7a6dba826f8ede735cfe13dde12a8c263c4af9" dependencies = [ "asynchronous-codec 0.6.0", "base64 0.13.0", @@ -2768,37 +3727,37 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "rand 0.7.3", "regex", "sha2 0.9.5", - "smallvec", + "smallvec 1.6.1", "unsigned-varint 0.7.0", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.30.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b61f6cf07664fb97016c318c4d4512b3dd4cc07238607f3f0163245f99008e" +checksum = "5f668f00efd9883e8b7bcc582eaf0164615792608f886f6577da18bcbeea0a46" dependencies = [ "futures 0.3.16", "libp2p-core", "libp2p-swarm", "log", - "prost 0.8.0", - "prost-build 0.8.0", - "smallvec", + "prost", + "prost-build", + "smallvec 1.6.1", "wasm-timer", ] [[package]] name = "libp2p-kad" -version = "0.31.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ed78489c87924235665a0ab345b298ee34dff0f7ad62c0ba6608b2144fb75e" +checksum = "b07312ebe5ee4fd2404447a0609814574df55c65d4e20838b957bbd34907d820" dependencies = [ "arrayvec 0.5.2", "asynchronous-codec 0.6.0", @@ -2809,11 +3768,11 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "rand 0.7.3", "sha2 0.9.5", - "smallvec", + "smallvec 1.6.1", "uint", "unsigned-varint 0.7.0", "void", @@ -2822,9 +3781,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.31.0" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a29e6cbc2a24b8471b6567e580a0e8e7b70a6d0f0ea2be0844d1e842d7d4fa33" +checksum = "4efa70c1c3d2d91237f8546e27aeb85e287d62c066a7b4f3ea6a696d43ced714" dependencies = [ "async-io", "data-encoding", @@ -2836,16 +3795,16 @@ dependencies = [ "libp2p-swarm", "log", "rand 0.8.4", - "smallvec", + "smallvec 1.6.1", "socket2 0.4.1", "void", ] [[package]] name = "libp2p-mplex" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313d9ea526c68df4425f580024e67a9d3ffd49f2c33de5154b1f5019816f7a99" +checksum = "85e9b544335d1ed30af71daa96edbefadef6f19c7a55f078b9fc92c87163105d" dependencies = [ "asynchronous-codec 0.6.0", "bytes 1.0.1", @@ -2855,15 +3814,15 @@ dependencies = [ "nohash-hasher", "parking_lot 0.11.1", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", "unsigned-varint 0.7.0", ] [[package]] name = "libp2p-noise" -version = "0.32.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1db7212f342b6ba7c981cc40e31f76e9e56cb48e65fa4c142ecaca5839523e" +checksum = "36db0f0db3b0433f5b9463f1c0cd9eadc0a3734a9170439ce501ff99733a88bd" dependencies = [ "bytes 1.0.1", "curve25519-dalek 3.2.0", @@ -2871,9 +3830,9 @@ dependencies = [ "lazy_static", "libp2p-core", "log", - "prost 0.8.0", - "prost-build 0.8.0", - "rand 0.8.4", + "prost", + "prost-build", + "rand 0.7.3", "sha2 0.9.5", "snow", "static_assertions", @@ -2883,9 +3842,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.30.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2482cfd9eb0b7a0baaf3e7b329dc4f2785181a161b1a47b7192f8d758f54a439" +checksum = "bf4bfaffac63bf3c7ec11ed9d8879d455966ddea7e78ee14737f0b6dce0d1cd1" dependencies = [ "futures 0.3.16", "libp2p-core", @@ -2898,26 +3857,26 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b4783e5423870b9a5c199f65a7a3bc66d86ab56b2b9beebf3c338d889cf8e4" +checksum = "0c8c37b4d2a075b4be8442760a5f8c037180f0c8dd5b5734b9978ab868b3aa11" dependencies = [ "asynchronous-codec 0.6.0", "bytes 1.0.1", "futures 0.3.16", "libp2p-core", "log", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "unsigned-varint 0.7.0", "void", ] [[package]] name = "libp2p-pnet" -version = "0.21.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cb4dd4b917e5b40ddefe49b96b07adcd8d342e0317011d175b7b2bb1dcc974" +checksum = "6ce3374f3b28162db9d3442c9347c4f14cb01e8290052615c7d341d40eae0599" dependencies = [ "futures 0.3.16", "log", @@ -2929,9 +3888,9 @@ dependencies = [ [[package]] name = "libp2p-relay" -version = "0.3.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0133f6cfd81cdc16e716de2982e012c62e6b9d4f12e41967b3ee361051c622aa" +checksum = "0b8786aca3f18671d8776289706a5521f6c9124a820f69e358de214b9939440d" dependencies = [ "asynchronous-codec 0.6.0", "bytes 1.0.1", @@ -2941,10 +3900,10 @@ dependencies = [ "libp2p-swarm", "log", "pin-project 1.0.8", - "prost 0.8.0", - "prost-build 0.8.0", + "prost", + "prost-build", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", "unsigned-varint 0.7.0", "void", "wasm-timer", @@ -2952,9 +3911,9 @@ dependencies = [ [[package]] name = "libp2p-request-response" -version = "0.12.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06cdae44b6821466123af93cbcdec7c9e6ba9534a8af9cdc296446d39416d241" +checksum = "1cdbe172f08e6d0f95fa8634e273d4c4268c4063de2e33e7435194b0130c62e3" dependencies = [ "async-trait", "bytes 1.0.1", @@ -2965,32 +3924,32 @@ dependencies = [ "lru", "minicbor", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", "unsigned-varint 0.7.0", "wasm-timer", ] [[package]] name = "libp2p-swarm" -version = "0.30.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7083861341e1555467863b4cd802bea1e8c4787c0f7b5110097d0f1f3248f9a9" +checksum = "1e04d8e1eef675029ec728ba14e8d0da7975d84b6679b699b4ae91a1de9c3a92" dependencies = [ "either", "futures 0.3.16", "libp2p-core", "log", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", "void", "wasm-timer", ] [[package]] name = "libp2p-swarm-derive" -version = "0.24.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8cb308d4fc854869f5abb54fdab0833d2cf670d407c745849dc47e6e08d79c" +checksum = "365b0a699fea5168676840567582a012ea297b1ca02eee467e58301b9c9c5eed" dependencies = [ "quote", "syn", @@ -2998,9 +3957,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79edd26b6b4bb5feee210dcda562dca186940dfecb0024b979c3f50824b3bf28" +checksum = "2b1a27d21c477951799e99d5c105d78868258502ce092988040a808d5a19bbd9" dependencies = [ "async-io", "futures 0.3.16", @@ -3015,9 +3974,9 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.29.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280e793440dd4e9f273d714f4497325c72cddb0fe85a49f9a03c88f41dd20182" +checksum = "ffd6564bb3b7ff203661ccbb69003c2b551e34cef974f2d6c6a28306a12170b5" dependencies = [ "async-std", "futures 0.3.16", @@ -3027,9 +3986,9 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.29.0" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f553b7140fad3d7a76f50497b0ea591e26737d9607428a75509fc191e4d1b1f6" +checksum = "e2d413e4cf9b8e5dfbcd2a60d3dc5a3391308bdb463684093d4f67137b7113de" dependencies = [ "futures 0.3.16", "js-sys", @@ -3041,9 +4000,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.30.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf99dcbf5063e9d59087f61b1e85c686ceab2f5abedb472d32288065c0e5e27" +checksum = "cace60995ef6f637e4752cccbb2590f6bc358e8741a0d066307636c69a4b3a74" dependencies = [ "either", "futures 0.3.16", @@ -3052,16 +4011,16 @@ dependencies = [ "log", "quicksink", "rw-stream-sink", - "soketto", + "soketto 0.4.2", "url 2.2.2", "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.33.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214cc0dd9c37cbed27f0bb1eba0c41bbafdb93a8be5e9d6ae1e6b4b42cd044bf" +checksum = "f35da42cfc6d5cb0dcf3ad6881bc68d146cdf38f98655e09e33fbba4d13eabc4" dependencies = [ "futures 0.3.16", "libp2p-core", @@ -3084,20 +4043,17 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.5.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1137239ab33b41aa9637a88a28249e5e70c40a42ccc92db7f12cc356c1fcd7" +checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" dependencies = [ "arrayref", - "base64 0.12.3", - "digest 0.9.0", + "crunchy", + "digest 0.8.1", "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", "rand 0.7.3", - "serde", - "sha2 0.9.5", + "sha2 0.8.2", + "subtle 2.4.1", "typenum", ] @@ -3110,14 +4066,12 @@ dependencies = [ "arrayref", "base64 0.12.3", "digest 0.9.0", - "hmac-drbg", "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", "rand 0.7.3", "serde", "sha2 0.9.5", - "typenum", ] [[package]] @@ -3231,26 +4185,6 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "lz4" -version = "1.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac20ed6991e01bf6a2e68cc73df2b389707403662a8ba89f68511fb340f724c" -dependencies = [ - "libc", - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca79aa95d8b3226213ad454d328369853be3a1382d89532a854f4d69640acae" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "mach" version = "0.3.2" @@ -3296,6 +4230,12 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.4.1" @@ -3311,6 +4251,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.6.4" @@ -3331,6 +4280,15 @@ dependencies = [ "parity-util-mem", ] +[[package]] +name = "memory-lru" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beeb98b3d1ed2c0054bd81b5ba949a0243c3ccad751d45ea898fa8059fa2860a" +dependencies = [ + "lru", +] + [[package]] name = "memory_units" version = "0.3.0" @@ -3349,6 +4307,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "metered-channel" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "derive_more", + "futures 0.3.16", + "futures-timer 3.0.2", +] + +[[package]] +name = "mick-jaeger" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c023c3f16109e7f33aa451f773fd61070e265b4977d0b6e344a51049296dd7df" +dependencies = [ + "futures 0.3.16", + "rand 0.7.3", + "thrift", +] + [[package]] name = "minicbor" version = "0.8.1" @@ -3399,28 +4378,27 @@ dependencies = [ ] [[package]] -name = "mio" -version = "0.7.13" +name = "mio-extras" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ - "libc", + "lazycell", "log", - "miow 0.3.7", - "ntapi", - "winapi 0.3.9", + "mio", + "slab", ] [[package]] -name = "mio-extras" -version = "2.0.6" +name = "mio-named-pipes" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ - "lazycell", "log", - "mio 0.6.23", - "slab", + "mio", + "miow 0.3.7", + "winapi 0.3.9", ] [[package]] @@ -3431,7 +4409,7 @@ checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ "iovec", "libc", - "mio 0.6.23", + "mio", ] [[package]] @@ -3461,24 +4439,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" -[[package]] -name = "multiaddr" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ee4ea82141951ac6379f964f71b20876d43712bea8faf6dd1a375e08a46499" -dependencies = [ - "arrayref", - "bs58", - "byteorder", - "data-encoding", - "multihash 0.14.0", - "percent-encoding 2.1.0", - "serde", - "static_assertions", - "unsigned-varint 0.7.0", - "url 2.2.2", -] - [[package]] name = "multibase" version = "0.8.0" @@ -3507,19 +4467,6 @@ dependencies = [ "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.4", - "multihash-derive", - "sha2 0.9.5", - "unsigned-varint 0.7.0", -] - [[package]] name = "multihash-derive" version = "0.7.2" @@ -3527,7 +4474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" dependencies = [ "proc-macro-crate 1.0.0", - "proc-macro-error", + "proc-macro-error 1.0.4", "proc-macro2", "quote", "syn", @@ -3550,7 +4497,7 @@ dependencies = [ "futures 0.3.16", "log", "pin-project 1.0.8", - "smallvec", + "smallvec 1.6.1", "unsigned-varint 0.7.0", ] @@ -3627,15 +4574,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-bigint" version = "0.2.6" @@ -3721,9 +4659,9 @@ dependencies = [ [[package]] name = "object" -version = "0.26.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2766204889d09937d00bfbb7fec56bb2a199e2ade963cab19185d8a6104c7c" +checksum = "c55827317fb4c08822499848a14237d2874d6f139828893017237e7ab93eb386" dependencies = [ "memchr", ] @@ -3755,6 +4693,15 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +[[package]] +name = "ordered-float" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" +dependencies = [ + "num-traits", +] + [[package]] name = "owning_ref" version = "0.4.1" @@ -3767,10 +4714,11 @@ dependencies = [ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", + "pallet-session", "pallet-timestamp", "parity-scale-codec", "sp-application-crypto", @@ -3779,10 +4727,25 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", @@ -3794,71 +4757,163 @@ dependencies = [ ] [[package]] -name = "pallet-balances" +name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", "parity-scale-codec", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-io", "sp-runtime", + "sp-session", + "sp-staking", "sp-std", ] [[package]] -name = "pallet-contracts" +name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "bitflags", + "frame-benchmarking", "frame-support", "frame-system", "log", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", "parity-scale-codec", - "pwasm-utils", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-beefy" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" +dependencies = [ + "beefy-primitives", + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", "serde", - "smallvec", - "sp-core", - "sp-io", "sp-runtime", - "sp-sandbox", "sp-std", - "wasmi-validation", ] [[package]] -name = "pallet-contracts-primitives" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +name = "pallet-beefy-mmr" +version = "0.1.0" +source = "git+https://github.com/paritytech/grandpa-bridge-gadget?branch=hc-contract-experiment-patched-v0.9.9#3cb5c033c8df149250ed43801fc83bf110e0ef41" dependencies = [ - "bitflags", + "beefy-merkle-tree", + "beefy-primitives", + "frame-support", + "frame-system", + "hex", + "libsecp256k1 0.6.0", + "log", + "pallet-beefy", + "pallet-mmr", + "pallet-mmr-primitives", + "pallet-session", "parity-scale-codec", + "scale-info", "serde", "sp-core", + "sp-io", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-contracts-proc-macro" +name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "proc-macro2", - "quote", - "syn", + "frame-support", + "frame-system", + "pallet-treasury", + "parity-scale-codec", + "sp-runtime", + "sp-std", ] [[package]] -name = "pallet-contracts-rpc" +name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "jsonrpc-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-contracts" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "bitflags", + "frame-support", + "frame-system", + "log", + "pallet-contracts-primitives", + "pallet-contracts-proc-macro", + "parity-scale-codec", + "pwasm-utils", + "serde", + "smallvec 1.6.1", + "sp-core", + "sp-io", + "sp-runtime", + "sp-sandbox", + "sp-std", + "wasmi-validation", +] + +[[package]] +name = "pallet-contracts-primitives" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "bitflags", + "parity-scale-codec", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-contracts-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pallet-contracts-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", "pallet-contracts-primitives", @@ -3875,7 +4930,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -3884,10 +4939,60 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-democracy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std", + "static_assertions", +] + +[[package]] +name = "pallet-elections-phragmen" +version = "5.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-benchmarking", "frame-support", @@ -3907,77 +5012,79 @@ dependencies = [ ] [[package]] -name = "pallet-randomness-collective-flip" +name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "enumflags2", + "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", - "safe-mix", + "sp-io", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-session" +name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", - "impl-trait-for-tuples", "log", - "pallet-timestamp", + "pallet-authorship", "parity-scale-codec", + "sp-application-crypto", "sp-core", "sp-io", "sp-runtime", - "sp-session", "sp-staking", "sp-std", - "sp-trie", ] [[package]] -name = "pallet-sudo" +name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", + "sp-core", "sp-io", + "sp-keyring", "sp-runtime", "sp-std", ] [[package]] -name = "pallet-timestamp" +name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "parity-scale-codec", - "sp-inherents", + "sp-io", "sp-runtime", "sp-std", - "sp-timestamp", ] [[package]] -name = "pallet-transaction-payment" +name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "ckb-merkle-mountain-range", + "frame-benchmarking", "frame-support", "frame-system", + "pallet-mmr-primitives", "parity-scale-codec", - "serde", - "smallvec", "sp-core", "sp-io", "sp-runtime", @@ -3985,15 +5092,32 @@ dependencies = [ ] [[package]] -name = "pallet-transaction-payment-rpc" +name = "pallet-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "serde", + "sp-api", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-mmr-rpc" +version = "3.0.0" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", - "pallet-transaction-payment-rpc-runtime-api", + "pallet-mmr-primitives", "parity-scale-codec", + "serde", "sp-api", "sp-blockchain", "sp-core", @@ -4002,362 +5126,1863 @@ dependencies = [ ] [[package]] -name = "pallet-transaction-payment-rpc-runtime-api" +name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "pallet-transaction-payment", + "frame-support", + "frame-system", "parity-scale-codec", - "sp-api", + "sp-core", + "sp-io", "sp-runtime", + "sp-std", ] [[package]] -name = "parity-db" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241f9c5d25063080f2c02846221f13e1d0e5e18fa00c32c234aad585b744ee55" +name = "pallet-nicks" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "blake2-rfc", - "crc32fast", - "fs2", - "hex", - "libc", - "log", - "lz4", - "memmap2", - "parking_lot 0.11.1", - "rand 0.8.4", - "snap", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] -name = "parity-scale-codec" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8975095a2a03bbbdc70a74ab11a4f76a6d0b84680d87c68d722531b0ac28e8a9" +name = "pallet-offences" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "arrayvec 0.7.1", - "bitvec 0.20.4", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "parity-scale-codec", "serde", + "sp-runtime", + "sp-staking", + "sp-std", ] [[package]] -name = "parity-scale-codec-derive" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40dbbfef7f0a1143c5b06e0d76a6278e25dac0bc1af4be51a0fbb73f07e7ad09" +name = "pallet-proxy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "proc-macro-crate 1.0.0", - "proc-macro2", - "quote", - "syn", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" +name = "pallet-randomness-collective-flip" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "safe-mix", + "sp-runtime", + "sp-std", +] [[package]] -name = "parity-tokio-ipc" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" +name = "pallet-scheduler" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "futures 0.3.16", - "libc", + "frame-benchmarking", + "frame-support", + "frame-system", "log", - "rand 0.7.3", - "tokio 1.10.0", - "winapi 0.3.9", + "parity-scale-codec", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] -name = "parity-util-mem" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad6f1acec69b95caf435bbd158d486e5a0a44fcf51531e84922c59ff09e8457" +name = "pallet-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "cfg-if 1.0.0", - "hashbrown", + "frame-support", + "frame-system", "impl-trait-for-tuples", - "parity-util-mem-derive", - "parking_lot 0.11.1", - "primitive-types", - "smallvec", - "winapi 0.3.9", + "log", + "pallet-timestamp", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-trie", ] [[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +name = "pallet-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "paste", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", + "static_assertions", +] + +[[package]] +name = "pallet-staking-reward-curve" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "proc-macro-crate 1.0.0", "proc-macro2", + "quote", "syn", - "synstructure", ] [[package]] -name = "parity-wasm" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" +name = "pallet-sudo" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "byteorder", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] -name = "parity-wasm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" +name = "pallet-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", +] [[package]] -name = "parity-ws" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab8a461779bd022964cae2b4989fa9c99deb270bec162da2125ec03c09fcaa" +name = "pallet-tips" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" 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", + "frame-support", + "frame-system", + "pallet-treasury", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", ] [[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +name = "pallet-transaction-payment" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", + "smallvec 1.6.1", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] [[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +name = "pallet-transaction-payment-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", ] [[package]] -name = "parking_lot" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +name = "pallet-transaction-payment-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "instant", - "lock_api 0.4.4", - "parking_lot_core 0.8.3", + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", ] [[package]] -name = "parking_lot_core" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +name = "pallet-treasury" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "smallvec", - "winapi 0.3.9", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", ] [[package]] -name = "parking_lot_core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +name = "pallet-utility" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.10", - "smallvec", - "winapi 0.3.9", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", ] [[package]] -name = "paste" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" +name = "pallet-vesting" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "enumflags2", + "frame-support", + "frame-system", + "parity-scale-codec", + "sp-runtime", + "sp-std", +] [[package]] -name = "pbkdf2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +name = "pallet-xcm" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "byteorder", - "crypto-mac 0.7.0", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "serde", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +name = "parachain-info" +version = "0.1.0" +source = "git+https://github.com/paritytech/cumulus?branch=hc-contract-experiment-patched-v0.9.9#3018a6c503c4aa832e7778177498f95e5e083633" dependencies = [ - "crypto-mac 0.8.0", + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "serde", ] [[package]] -name = "peeking_take_while" -version = "0.1.2" +name = "parity-db" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +checksum = "2e337f62db341435f0da05b8f6b97e984ef4ea5800510cd07c2d624688c40b47" +dependencies = [ + "blake2-rfc", + "crc32fast", + "fs2", + "hex", + "libc", + "log", + "memmap2", + "parking_lot 0.11.1", + "rand 0.8.4", +] [[package]] -name = "percent-encoding" -version = "1.0.1" +name = "parity-multiaddr" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +checksum = "58341485071825827b7f03cf7efd1cb21e6a709bea778fb50227fd45d2f361b4" +dependencies = [ + "arrayref", + "bs58", + "byteorder", + "data-encoding", + "multihash", + "percent-encoding 2.1.0", + "serde", + "static_assertions", + "unsigned-varint 0.7.0", + "url 2.2.2", +] [[package]] -name = "percent-encoding" -version = "2.1.0" +name = "parity-scale-codec" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "8975095a2a03bbbdc70a74ab11a4f76a6d0b84680d87c68d722531b0ac28e8a9" +dependencies = [ + "arrayvec 0.7.1", + "bitvec 0.20.4", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] [[package]] -name = "pest" -version = "2.1.3" +name = "parity-scale-codec-derive" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "40dbbfef7f0a1143c5b06e0d76a6278e25dac0bc1af4be51a0fbb73f07e7ad09" dependencies = [ - "ucd-trie", + "proc-macro-crate 1.0.0", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "pest_derive" -version = "2.1.0" +name = "parity-send-wrapper" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" + +[[package]] +name = "parity-tokio-ipc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e57fea504fea33f9fbb5f49f378359030e7e026a6ab849bb9e8f0787376f1bf" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "libc", + "log", + "mio-named-pipes", + "miow 0.3.7", + "rand 0.7.3", + "tokio 0.1.22", + "tokio-named-pipes", + "tokio-uds", + "winapi 0.3.9", +] + +[[package]] +name = "parity-util-mem" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad6f1acec69b95caf435bbd158d486e5a0a44fcf51531e84922c59ff09e8457" +dependencies = [ + "cfg-if 1.0.0", + "ethereum-types", + "hashbrown", + "impl-trait-for-tuples", + "lru", + "parity-util-mem-derive", + "parking_lot 0.11.1", + "primitive-types", + "smallvec 1.6.1", + "winapi 0.3.9", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2", + "syn", + "synstructure", +] + +[[package]] +name = "parity-wasm" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" +dependencies = [ + "byteorder", +] + +[[package]] +name = "parity-wasm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" + +[[package]] +name = "parity-ws" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322d72dfe461b8b9e367d057ceace105379d64d5b03907d23c481ccf3fbf8aa4" +dependencies = [ + "byteorder", + "bytes 0.4.12", + "httparse", + "log", + "mio", + "mio-extras", + "rand 0.7.3", + "sha-1 0.8.2", + "slab", + "url 2.2.2", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +dependencies = [ + "lock_api 0.3.4", + "parking_lot_core 0.6.2", + "rustc_version 0.2.3", +] + +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api 0.3.4", + "parking_lot_core 0.7.2", +] + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api 0.4.4", + "parking_lot_core 0.8.3", +] + +[[package]] +name = "parking_lot_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi", + "libc", + "redox_syscall 0.1.57", + "rustc_version 0.2.3", + "smallvec 0.6.14", + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi", + "libc", + "redox_syscall 0.1.57", + "smallvec 1.6.1", + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.10", + "smallvec 1.6.1", + "winapi 0.3.9", +] + +[[package]] +name = "paste" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" + +[[package]] +name = "pbkdf2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +dependencies = [ + "byteorder", + "crypto-mac 0.7.0", +] + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac 0.8.0", +] + +[[package]] +name = "pdqselect" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27" + +[[package]] +name = "peeking_take_while" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1 0.8.2", +] + +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" +dependencies = [ + "pin-project-internal 0.4.28", +] + +[[package]] +name = "pin-project" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" +dependencies = [ + "pin-project-internal 1.0.8", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "platforms" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989d43012e2ca1c4a02507c67282691a0a3207f9dc67cec596b43fe925b3d325" + +[[package]] +name = "polkadot-approval-distribution" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "tracing", +] + +[[package]] +name = "polkadot-availability-bitfield-distribution" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "tracing", +] + +[[package]] +name = "polkadot-availability-distribution" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "lru", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-core-runtime-api", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.4", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-availability-recovery" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "lru", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.4", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-cli" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "frame-benchmarking-cli", + "futures 0.3.16", + "log", + "polkadot-node-core-pvf", + "polkadot-service", + "sc-cli", + "sc-service", + "sp-core", + "sp-trie", + "structopt", + "substrate-build-script-utils", + "thiserror", + "try-runtime-cli", +] + +[[package]] +name = "polkadot-client" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "beefy-primitives", + "frame-benchmarking", + "frame-system-rpc-runtime-api", + "pallet-mmr-primitives", + "pallet-transaction-payment-rpc-runtime-api", + "polkadot-primitives", + "polkadot-runtime", + "sc-client-api", + "sc-consensus", + "sc-executor", + "sc-service", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-finality-grandpa", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-storage", + "sp-transaction-pool", +] + +[[package]] +name = "polkadot-collator-protocol" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "always-assert", + "futures 0.3.16", + "futures-timer 3.0.2", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-core", + "sp-keystore", + "sp-runtime", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-core-primitives" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "parity-scale-codec", + "parity-util-mem", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polkadot-dispute-distribution" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "lru", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-core-runtime-api", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.4", + "sc-network", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-erasure-coding" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-primitives", + "reed-solomon-novelpoly", + "sp-core", + "sp-trie", + "thiserror", +] + +[[package]] +name = "polkadot-gossip-support" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "rand 0.8.4", + "rand_chacha 0.3.1", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "tracing", +] + +[[package]] +name = "polkadot-network-bridge" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "parity-scale-codec", + "parking_lot 0.11.1", + "polkadot-node-network-protocol", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sc-network", + "sp-consensus", + "strum", + "tracing", +] + +[[package]] +name = "polkadot-node-collation-generation" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-core", + "sp-maybe-compressed-blob", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-approval-voting" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "derive_more", + "futures 0.3.16", + "futures-timer 3.0.2", + "kvdb", + "lru", + "merlin", + "parity-scale-codec", + "polkadot-node-jaeger", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "sc-client-api", + "sc-keystore", + "schnorrkel", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-slots", + "sp-runtime", + "tracing", +] + +[[package]] +name = "polkadot-node-core-av-store" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "futures 0.3.16", + "futures-timer 3.0.2", + "kvdb", + "parity-scale-codec", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-backing" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "futures 0.3.16", + "polkadot-erasure-coding", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "polkadot-statement-table", + "sp-keystore", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-bitfield-signing" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-keystore", + "thiserror", + "tracing", + "wasm-timer", +] + +[[package]] +name = "polkadot-node-core-candidate-validation" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "parity-scale-codec", + "polkadot-node-core-pvf", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-parachain", + "polkadot-primitives", + "sp-maybe-compressed-blob", + "tracing", +] + +[[package]] +name = "polkadot-node-core-chain-api" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sc-client-api", + "sc-consensus-babe", + "sp-blockchain", + "tracing", +] + +[[package]] +name = "polkadot-node-core-chain-selection" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "futures-timer 3.0.2", + "kvdb", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-dispute-coordinator" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "derive_more", + "futures 0.3.16", + "kvdb", + "parity-scale-codec", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sc-keystore", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-dispute-participation" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-primitives", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-parachains-inherent" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "futures-timer 3.0.2", + "polkadot-node-subsystem", + "polkadot-primitives", + "sp-blockchain", + "sp-inherents", + "sp-runtime", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-provisioner" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "futures 0.3.16", + "futures-timer 3.0.2", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-core-pvf" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "always-assert", + "assert_matches", + "async-process", + "async-std", + "futures 0.3.16", + "futures-timer 3.0.2", + "libc", + "parity-scale-codec", + "pin-project 1.0.8", + "polkadot-core-primitives", + "polkadot-parachain", + "rand 0.8.4", + "sc-executor", + "sc-executor-common", + "sc-executor-wasmtime", + "slotmap", + "sp-core", + "sp-externalities", + "sp-io", + "sp-maybe-compressed-blob", + "sp-tracing", + "sp-wasm-interface", + "tracing", +] + +[[package]] +name = "polkadot-node-core-runtime-api" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "memory-lru", + "parity-util-mem", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sp-api", + "sp-authority-discovery", + "sp-consensus-babe", + "sp-core", + "tracing", +] + +[[package]] +name = "polkadot-node-jaeger" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-std", + "lazy_static", + "log", + "mick-jaeger", + "parity-scale-codec", + "parking_lot 0.11.1", + "polkadot-node-primitives", + "polkadot-primitives", + "sc-network", + "sp-core", + "thiserror", +] + +[[package]] +name = "polkadot-node-metrics" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "futures-timer 3.0.2", + "metered-channel", + "sc-network", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "polkadot-node-network-protocol" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "parity-scale-codec", + "polkadot-node-jaeger", + "polkadot-node-primitives", + "polkadot-primitives", + "sc-authority-discovery", + "sc-network", + "strum", + "thiserror", +] + +[[package]] +name = "polkadot-node-primitives" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "futures 0.3.16", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-statement-table", + "schnorrkel", + "serde", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-core", + "sp-keystore", + "sp-maybe-compressed-blob", + "sp-runtime", + "thiserror", + "tracing", + "zstd", +] + +[[package]] +name = "polkadot-node-subsystem" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "polkadot-node-jaeger", + "polkadot-node-subsystem-types", + "polkadot-overseer", +] + +[[package]] +name = "polkadot-node-subsystem-types" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-std", + "async-trait", + "derive_more", + "futures 0.3.16", + "futures-timer 3.0.2", + "lazy_static", + "log", + "mick-jaeger", + "parity-scale-codec", + "parking_lot 0.11.1", + "pin-project 1.0.8", + "polkadot-node-jaeger", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-overseer-gen", + "polkadot-primitives", + "polkadot-statement-table", + "sc-network", + "smallvec 1.6.1", + "sp-core", + "substrate-prometheus-endpoint", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-node-subsystem-util" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "futures-timer 3.0.2", + "itertools 0.10.1", + "lru", + "metered-channel", + "parity-scale-codec", + "pin-project 1.0.8", + "polkadot-node-jaeger", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-primitives", + "rand 0.8.4", + "sc-network", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "substrate-prometheus-endpoint", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-overseer" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "futures-timer 3.0.2", + "lru", + "parking_lot 0.11.1", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem-types", + "polkadot-overseer-all-subsystems-gen", + "polkadot-overseer-gen", + "polkadot-primitives", + "sc-client-api", + "sp-api", + "tracing", +] + +[[package]] +name = "polkadot-overseer-all-subsystems-gen" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "assert_matches", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "polkadot-overseer-gen" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "async-trait", + "futures 0.3.16", + "futures-timer 3.0.2", + "metered-channel", + "pin-project 1.0.8", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-overseer-gen-proc-macro", + "thiserror", + "tracing", +] + +[[package]] +name = "polkadot-overseer-gen-proc-macro" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "proc-macro-crate 1.0.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "polkadot-parachain" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "derive_more", + "frame-support", + "parity-scale-codec", + "parity-util-mem", + "polkadot-core-primitives", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polkadot-primitives" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "frame-system", + "hex-literal", + "parity-scale-codec", + "parity-util-mem", + "polkadot-core-primitives", + "polkadot-parachain", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "polkadot-rpc" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "beefy-gadget", + "beefy-gadget-rpc", + "jsonrpc-core", + "pallet-mmr-rpc", + "pallet-transaction-payment-rpc", + "parity-scale-codec", + "polkadot-primitives", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-babe-rpc", + "sc-consensus-epochs", + "sc-finality-grandpa", + "sc-finality-grandpa-rpc", + "sc-keystore", + "sc-rpc", + "sc-sync-state-rpc", + "sc-transaction-pool-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-keystore", + "sp-runtime", + "substrate-frame-rpc-system", +] + +[[package]] +name = "polkadot-runtime" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "beefy-primitives", + "bitvec 0.20.4", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-bounties", + "pallet-collective", + "pallet-democracy", + "pallet-election-provider-multi-phase", + "pallet-elections-phragmen", + "pallet-grandpa", + "pallet-identity", + "pallet-im-online", + "pallet-indices", + "pallet-membership", + "pallet-mmr-primitives", + "pallet-multisig", + "pallet-nicks", + "pallet-offences", + "pallet-proxy", + "pallet-scheduler", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-timestamp", + "pallet-tips", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-common", + "rustc-hex", + "serde", + "serde_derive", + "smallvec 1.6.1", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-npos-elections", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "static_assertions", + "substrate-wasm-builder", +] + +[[package]] +name = "polkadot-runtime-common" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "bitvec 0.20.4", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "libsecp256k1 0.6.0", + "log", + "pallet-authorship", + "pallet-balances", + "pallet-beefy-mmr", + "pallet-election-provider-multi-phase", + "pallet-offences", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-parachains", + "rustc-hex", + "serde", + "serde_derive", + "slot-range-helper", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "static_assertions", + "xcm", ] [[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +name = "polkadot-runtime-parachains" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", + "bitflags", + "bitvec 0.20.4", + "derive_more", + "frame-support", + "frame-system", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-balances", + "pallet-offences", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "rand 0.8.4", + "rand_chacha 0.3.1", + "rustc-hex", + "serde", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "xcm", + "xcm-executor", ] [[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +name = "polkadot-service" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "maplit", - "pest", - "sha-1 0.8.2", + "async-trait", + "beefy-gadget", + "beefy-primitives", + "frame-system-rpc-runtime-api", + "futures 0.3.16", + "hex-literal", + "kvdb", + "kvdb-rocksdb", + "pallet-babe", + "pallet-im-online", + "pallet-mmr-primitives", + "pallet-staking", + "pallet-transaction-payment-rpc-runtime-api", + "polkadot-approval-distribution", + "polkadot-availability-bitfield-distribution", + "polkadot-availability-distribution", + "polkadot-availability-recovery", + "polkadot-client", + "polkadot-collator-protocol", + "polkadot-dispute-distribution", + "polkadot-gossip-support", + "polkadot-network-bridge", + "polkadot-node-collation-generation", + "polkadot-node-core-approval-voting", + "polkadot-node-core-av-store", + "polkadot-node-core-backing", + "polkadot-node-core-bitfield-signing", + "polkadot-node-core-candidate-validation", + "polkadot-node-core-chain-api", + "polkadot-node-core-chain-selection", + "polkadot-node-core-dispute-coordinator", + "polkadot-node-core-dispute-participation", + "polkadot-node-core-parachains-inherent", + "polkadot-node-core-provisioner", + "polkadot-node-core-runtime-api", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-rpc", + "polkadot-runtime", + "polkadot-runtime-parachains", + "polkadot-statement-distribution", + "sc-authority-discovery", + "sc-basic-authorship", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-consensus-babe", + "sc-consensus-slots", + "sc-consensus-uncles", + "sc-executor", + "sc-finality-grandpa", + "sc-keystore", + "sc-network", + "sc-service", + "sc-sync-state-rpc", + "sc-telemetry", + "sc-transaction-pool", + "serde", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-timestamp", + "sp-transaction-pool", + "sp-trie", + "substrate-prometheus-endpoint", + "thiserror", + "tracing", ] [[package]] -name = "petgraph" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +name = "polkadot-statement-distribution" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "fixedbitset", + "arrayvec 0.5.2", + "futures 0.3.16", "indexmap", + "parity-scale-codec", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-util", + "polkadot-primitives", + "sc-network", + "sp-keystore", + "sp-staking", + "thiserror", + "tracing", ] [[package]] -name = "pin-project" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" -dependencies = [ - "pin-project-internal 0.4.28", -] - -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" +name = "polkadot-statement-table" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "pin-project-internal 1.0.8", + "parity-scale-codec", + "polkadot-primitives", + "sp-core", ] [[package]] -name = "pin-project-internal" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" +name = "polkadot-test-runtime" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "proc-macro2", - "quote", - "syn", + "beefy-primitives", + "bitvec 0.20.4", + "frame-election-provider-support", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-grandpa", + "pallet-indices", + "pallet-mmr-primitives", + "pallet-nicks", + "pallet-offences", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-curve", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-vesting", + "pallet-xcm", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "rustc-hex", + "serde", + "serde_derive", + "smallvec 1.6.1", + "sp-api", + "sp-authority-discovery", + "sp-block-builder", + "sp-consensus-babe", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +name = "polkadot-test-service" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" dependencies = [ - "proc-macro2", - "quote", - "syn", + "frame-benchmarking", + "frame-system", + "futures 0.1.31", + "futures 0.3.16", + "hex", + "pallet-balances", + "pallet-staking", + "pallet-transaction-payment", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-overseer", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-rpc", + "polkadot-runtime-common", + "polkadot-runtime-parachains", + "polkadot-service", + "polkadot-test-runtime", + "rand 0.8.4", + "sc-authority-discovery", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-consensus-babe", + "sc-executor", + "sc-finality-grandpa", + "sc-network", + "sc-service", + "sc-tracing", + "sc-transaction-pool", + "sp-arithmetic", + "sp-authority-discovery", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-finality-grandpa", + "sp-inherents", + "sp-keyring", + "sp-runtime", + "sp-state-machine", + "substrate-test-client", + "tempfile", + "tracing", ] -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - -[[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "platforms" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989d43012e2ca1c4a02507c67282691a0a3207f9dc67cec596b43fe925b3d325" - [[package]] name = "polling" version = "2.1.0" @@ -4373,23 +6998,21 @@ dependencies = [ [[package]] name = "poly1305" -version = "0.7.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fcffab1f78ebbdf4b93b68c1ffebc24037eedf271edaca795732b24e5e4e349" +checksum = "4b7456bc1ad2d4cf82b3a016be4c2ac48daf11bf990c1603ebd447fe6f30fca8" dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", + "cpuid-bool", "universal-hash", ] [[package]] name = "polyval" -version = "0.5.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ba6a405ef63530d6cb12802014b22f9c5751bd17cdcddbe9e46d5c8ae83287" +checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", + "cpuid-bool", "opaque-debug 0.3.0", "universal-hash", ] @@ -4408,6 +7031,7 @@ checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", "impl-serde", "uint", ] @@ -4431,16 +7055,42 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-error" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f33027081eba0a6d8aba6d1b1c3a3be58cbb12106341c2d5759fcd9b5277e7" +dependencies = [ + "proc-macro-error-attr 0.4.12", + "proc-macro2", + "quote", + "syn", + "version_check", +] + [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr 1.0.4", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a5b4b77fdb63c1eca72173d68d24501c54ab1269409f6b672c85deb18af69de" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", "syn", + "syn-mid", "version_check", ] @@ -4497,17 +7147,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2" dependencies = [ "bytes 1.0.1", - "prost-derive 0.7.0", -] - -[[package]] -name = "prost" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5e2533f59d08fcf364fd374ebda0692a70bd6d7e66ef97f306f45c6c5d8020" -dependencies = [ - "bytes 1.0.1", - "prost-derive 0.8.0", + "prost-derive", ] [[package]] @@ -4522,26 +7162,8 @@ dependencies = [ "log", "multimap", "petgraph", - "prost 0.7.0", - "prost-types 0.7.0", - "tempfile", - "which", -] - -[[package]] -name = "prost-build" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603" -dependencies = [ - "bytes 1.0.1", - "heck", - "itertools 0.10.1", - "log", - "multimap", - "petgraph", - "prost 0.8.0", - "prost-types 0.8.0", + "prost", + "prost-types", "tempfile", "which", ] @@ -4559,19 +7181,6 @@ dependencies = [ "syn", ] -[[package]] -name = "prost-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600d2f334aa05acb02a755e217ef1ab6dea4d51b58b7846588b747edec04efba" -dependencies = [ - "anyhow", - "itertools 0.10.1", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "prost-types" version = "0.7.0" @@ -4579,17 +7188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb" dependencies = [ "bytes 1.0.1", - "prost 0.7.0", -] - -[[package]] -name = "prost-types" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "603bbd6394701d13f3f25aada59c7de9d35a6a5887cfc156181234a44002771b" -dependencies = [ - "bytes 1.0.1", - "prost 0.8.0", + "prost", ] [[package]] @@ -4808,7 +7407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg", - "crossbeam-deque", + "crossbeam-deque 0.8.1", "either", "rayon-core", ] @@ -4820,8 +7419,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", + "crossbeam-deque 0.8.1", + "crossbeam-utils 0.8.5", "lazy_static", "num_cpus", ] @@ -4860,6 +7459,19 @@ dependencies = [ "redox_syscall 0.2.10", ] +[[package]] +name = "reed-solomon-novelpoly" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd8f48b2066e9f69ab192797d66da804d1935bf22763204ed3675740cb0f221" +dependencies = [ + "derive_more", + "fs-err", + "itertools 0.10.1", + "static_init", + "thiserror", +] + [[package]] name = "ref-cast" version = "1.0.6" @@ -4889,7 +7501,7 @@ dependencies = [ "log", "rustc-hash", "serde", - "smallvec", + "smallvec 1.6.1", ] [[package]] @@ -4930,6 +7542,24 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "remote-externalities" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "env_logger 0.8.4", + "hex", + "jsonrpsee-proc-macros", + "jsonrpsee-ws-client", + "log", + "parity-scale-codec", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-runtime", +] + [[package]] name = "remove_dir_all" version = "0.5.3" @@ -4970,6 +7600,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "rlp" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999508abb0ae792aabed2460c45b89106d97fe4adac593bdaef433c2605847b5" +dependencies = [ + "bytes 1.0.1", + "rustc-hex", +] + [[package]] name = "rocksdb" version = "0.17.0" @@ -5026,6 +7666,19 @@ dependencies = [ "semver 0.11.0", ] +[[package]] +name = "rustls" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" +dependencies = [ + "base64 0.12.3", + "log", + "ring", + "sct", + "webpki", +] + [[package]] name = "rustls" version = "0.19.1" @@ -5039,6 +7692,18 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls-native-certs" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629d439a7672da82dd955498445e496ee2096fe2117b9f796558a43fdb9e59b8" +dependencies = [ + "openssl-probe", + "rustls 0.18.1", + "schannel", + "security-framework 1.0.0", +] + [[package]] name = "rustls-native-certs" version = "0.5.0" @@ -5046,9 +7711,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" dependencies = [ "openssl-probe", - "rustls", + "rustls 0.19.1", "schannel", - "security-framework", + "security-framework 2.3.1", ] [[package]] @@ -5089,9 +7754,9 @@ dependencies = [ [[package]] name = "salsa20" -version = "0.8.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbd2eb639fd7cab5804a0837fe373cc2172d15437e804c054a9fb885cb923b0" +checksum = "399f290ffc409596022fce5ea5d4138184be4784f2b28c62c59f0d8389059a15" dependencies = [ "cipher", ] @@ -5108,7 +7773,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "log", "sp-core", @@ -5116,10 +7781,39 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sc-authority-discovery" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "async-trait", + "derive_more", + "either", + "futures 0.3.16", + "futures-timer 3.0.2", + "ip_network", + "libp2p", + "log", + "parity-scale-codec", + "prost", + "prost-build", + "rand 0.7.3", + "sc-client-api", + "sc-network", + "serde_json", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", +] + [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "futures-timer 3.0.2", @@ -5142,7 +7836,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5158,7 +7852,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -5174,7 +7868,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -5185,7 +7879,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "chrono", "fdlimit", @@ -5223,11 +7917,14 @@ dependencies = [ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "derive_more", "fnv", "futures 0.3.16", "hash-db", + "kvdb", + "lazy_static", "log", "parity-scale-codec", "parking_lot 0.11.1", @@ -5239,20 +7936,24 @@ dependencies = [ "sp-core", "sp-database", "sp-externalities", + "sp-inherents", "sp-keystore", "sp-runtime", "sp-state-machine", + "sp-std", "sp-storage", "sp-trie", "sp-utils", + "sp-version", "substrate-prometheus-endpoint", ] [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "blake2-rfc", "hash-db", "kvdb", "kvdb-memorydb", @@ -5261,8 +7962,10 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", + "parity-util-mem", "parking_lot 0.11.1", "sc-client-api", + "sc-executor", "sc-state-db", "sp-arithmetic", "sp-blockchain", @@ -5271,12 +7974,13 @@ dependencies = [ "sp-runtime", "sp-state-machine", "sp-trie", + "substrate-prometheus-endpoint", ] [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "futures 0.3.16", @@ -5295,16 +7999,18 @@ dependencies = [ "sp-utils", "substrate-prometheus-endpoint", "thiserror", + "wasm-timer", ] [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "derive_more", "futures 0.3.16", + "futures-timer 3.0.2", "log", "parity-scale-codec", "sc-block-builder", @@ -5321,25 +8027,113 @@ dependencies = [ "sp-consensus-slots", "sp-core", "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-version", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "async-trait", + "derive_more", + "fork-tree", + "futures 0.3.16", + "futures-timer 3.0.2", + "log", + "merlin", + "num-bigint", + "num-rational 0.2.4", + "num-traits", + "parity-scale-codec", + "parking_lot 0.11.1", + "pdqselect", + "rand 0.7.3", + "retain_mut", + "sc-client-api", + "sc-consensus", + "sc-consensus-epochs", + "sc-consensus-slots", + "sc-consensus-uncles", + "sc-keystore", + "sc-telemetry", + "schnorrkel", + "serde", + "sp-api", + "sp-application-crypto", + "sp-block-builder", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-consensus-slots", + "sp-consensus-vrf", + "sp-core", + "sp-inherents", + "sp-io", "sp-keystore", "sp-runtime", + "sp-utils", + "sp-version", "substrate-prometheus-endpoint", ] +[[package]] +name = "sc-consensus-babe-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "derive_more", + "futures 0.3.16", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-rpc-api", + "serde", + "sp-api", + "sp-application-crypto", + "sp-blockchain", + "sp-consensus", + "sp-consensus-babe", + "sp-core", + "sp-keystore", + "sp-runtime", +] + +[[package]] +name = "sc-consensus-epochs" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "fork-tree", + "parity-scale-codec", + "sc-client-api", + "sc-consensus", + "sp-blockchain", + "sp-runtime", +] + [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "futures 0.3.16", "futures-timer 3.0.2", + "impl-trait-for-tuples", "log", "parity-scale-codec", "sc-client-api", "sc-consensus", "sc-telemetry", "sp-api", + "sp-application-crypto", "sp-arithmetic", "sp-blockchain", "sp-consensus", @@ -5349,18 +8143,32 @@ dependencies = [ "sp-runtime", "sp-state-machine", "sp-timestamp", + "sp-trie", + "thiserror", +] + +[[package]] +name = "sc-consensus-uncles" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "sc-client-api", + "sp-authorship", + "sp-runtime", "thiserror", ] [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "derive_more", "lazy_static", - "libsecp256k1 0.6.0", + "libsecp256k1 0.3.5", "log", "parity-scale-codec", + "parity-wasm 0.42.2", "parking_lot 0.11.1", "sc-executor-common", "sc-executor-wasmi", @@ -5371,6 +8179,7 @@ dependencies = [ "sp-io", "sp-panic-handler", "sp-runtime-interface", + "sp-serializer", "sp-tasks", "sp-trie", "sp-version", @@ -5381,7 +8190,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "derive_more", "parity-scale-codec", @@ -5398,13 +8207,12 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "log", "parity-scale-codec", "sc-allocator", "sc-executor-common", - "scoped-tls", "sp-core", "sp-runtime-interface", "sp-wasm-interface", @@ -5414,13 +8222,14 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "cfg-if 1.0.0", "libc", "log", "parity-scale-codec", "parity-wasm 0.42.2", + "pwasm-utils", "sc-allocator", "sc-executor-common", "scoped-tls", @@ -5433,7 +8242,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "derive_more", @@ -5442,9 +8251,11 @@ dependencies = [ "fork-tree", "futures 0.3.16", "futures-timer 3.0.2", + "linked-hash-map", "log", "parity-scale-codec", "parking_lot 0.11.1", + "pin-project 1.0.8", "rand 0.8.4", "sc-block-builder", "sc-client-api", @@ -5461,16 +8272,42 @@ dependencies = [ "sp-consensus", "sp-core", "sp-finality-grandpa", + "sp-inherents", "sp-keystore", "sp-runtime", "sp-utils", "substrate-prometheus-endpoint", + "wasm-timer", +] + +[[package]] +name = "sc-finality-grandpa-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "derive_more", + "finality-grandpa", + "futures 0.3.16", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-pubsub", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-finality-grandpa", + "sc-rpc", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-runtime", ] [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "ansi_term 0.12.1", "futures 0.3.16", @@ -5482,29 +8319,36 @@ dependencies = [ "sc-transaction-pool-api", "sp-blockchain", "sp-runtime", + "wasm-timer", ] [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "derive_more", + "futures 0.3.16", + "futures-util", "hex", + "merlin", "parking_lot 0.11.1", + "rand 0.7.3", "serde_json", "sp-application-crypto", "sp-core", "sp-keystore", + "subtle 2.4.1", ] [[package]] name = "sc-light" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "hash-db", + "lazy_static", "parity-scale-codec", "parking_lot 0.11.1", "sc-client-api", @@ -5520,16 +8364,18 @@ dependencies = [ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-std", "async-trait", "asynchronous-codec 0.5.0", "bitflags", + "bs58", "bytes 1.0.1", "cid", "derive_more", "either", + "erased-serde", "fnv", "fork-tree", "futures 0.3.16", @@ -5541,11 +8387,12 @@ dependencies = [ "linked_hash_set", "log", "lru", + "nohash-hasher", "parity-scale-codec", "parking_lot 0.11.1", "pin-project 1.0.8", - "prost 0.8.0", - "prost-build 0.7.0", + "prost", + "prost-build", "rand 0.7.3", "sc-block-builder", "sc-client-api", @@ -5553,7 +8400,7 @@ dependencies = [ "sc-peerset", "serde", "serde_json", - "smallvec", + "smallvec 1.6.1", "sp-arithmetic", "sp-blockchain", "sp-consensus", @@ -5565,13 +8412,14 @@ dependencies = [ "thiserror", "unsigned-varint 0.6.0", "void", + "wasm-timer", "zeroize", ] [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "futures-timer 3.0.2", @@ -5582,19 +8430,20 @@ dependencies = [ "sp-runtime", "substrate-prometheus-endpoint", "tracing", + "wasm-timer", ] [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "bytes 1.0.1", + "bytes 0.5.6", "fnv", "futures 0.3.16", "futures-timer 3.0.2", "hex", - "hyper", + "hyper 0.13.10", "hyper-rustls", "log", "num_cpus", @@ -5602,6 +8451,7 @@ dependencies = [ "parking_lot 0.11.1", "rand 0.7.3", "sc-client-api", + "sc-keystore", "sc-network", "sp-api", "sp-core", @@ -5614,7 +8464,7 @@ dependencies = [ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "libp2p", @@ -5627,7 +8477,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -5636,7 +8486,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "hash-db", @@ -5648,6 +8498,8 @@ dependencies = [ "sc-block-builder", "sc-chain-spec", "sc-client-api", + "sc-executor", + "sc-keystore", "sc-rpc-api", "sc-tracing", "sc-transaction-pool-api", @@ -5660,6 +8512,8 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-session", + "sp-state-machine", + "sp-tracing", "sp-utils", "sp-version", ] @@ -5667,7 +8521,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "derive_more", "futures 0.3.16", @@ -5692,32 +8546,36 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ - "futures 0.3.16", + "futures 0.1.31", "jsonrpc-core", "jsonrpc-http-server", "jsonrpc-ipc-server", "jsonrpc-pubsub", "jsonrpc-ws-server", "log", + "serde", "serde_json", + "sp-runtime", "substrate-prometheus-endpoint", ] [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "directories", "exit-future", + "futures 0.1.31", "futures 0.3.16", "futures-timer 3.0.2", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", + "lazy_static", "log", "parity-scale-codec", "parity-util-mem", @@ -5751,6 +8609,7 @@ dependencies = [ "sp-core", "sp-externalities", "sp-inherents", + "sp-io", "sp-keystore", "sp-runtime", "sp-session", @@ -5767,12 +8626,13 @@ dependencies = [ "thiserror", "tracing", "tracing-futures", + "wasm-timer", ] [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "log", "parity-scale-codec", @@ -5781,12 +8641,35 @@ dependencies = [ "parking_lot 0.11.1", "sc-client-api", "sp-core", + "thiserror", +] + +[[package]] +name = "sc-sync-state-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "parity-scale-codec", + "sc-chain-spec", + "sc-client-api", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-finality-grandpa", + "sc-rpc-api", + "serde", + "serde_json", + "sp-blockchain", + "sp-runtime", + "thiserror", ] [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "chrono", "futures 0.3.16", @@ -5797,17 +8680,20 @@ dependencies = [ "rand 0.7.3", "serde", "serde_json", + "take_mut", "thiserror", + "void", "wasm-timer", ] [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "ansi_term 0.12.1", "atty", + "erased-serde", "lazy_static", "log", "once_cell", @@ -5816,26 +8702,31 @@ dependencies = [ "rustc-hash", "sc-client-api", "sc-rpc-server", + "sc-telemetry", "sc-tracing-proc-macro", "serde", + "serde_json", "sp-api", + "sp-block-builder", "sp-blockchain", "sp-core", "sp-rpc", "sp-runtime", + "sp-storage", "sp-tracing", "thiserror", "tracing", "tracing-log", "tracing-subscriber", "wasm-bindgen", + "wasm-timer", "web-sys", ] [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "proc-macro-crate 1.0.0", "proc-macro2", @@ -5846,8 +8737,9 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "derive_more", "futures 0.3.16", "intervalier", "linked-hash-map", @@ -5868,16 +8760,18 @@ dependencies = [ "sp-utils", "substrate-prometheus-endpoint", "thiserror", + "wasm-timer", ] [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "derive_more", "futures 0.3.16", "log", + "parity-scale-codec", "serde", "sp-blockchain", "sp-runtime", @@ -5968,6 +8862,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad502866817f0575705bd7be36e2b2535cc33262d493aa733a2ec862baa2bc2b" +dependencies = [ + "bitflags", + "core-foundation 0.7.0", + "core-foundation-sys 0.7.0", + "libc", + "security-framework-sys 1.0.0", +] + [[package]] name = "security-framework" version = "2.3.1" @@ -5975,10 +8882,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" dependencies = [ "bitflags", - "core-foundation", - "core-foundation-sys", + "core-foundation 0.9.1", + "core-foundation-sys 0.8.2", + "libc", + "security-framework-sys 2.3.0", +] + +[[package]] +name = "security-framework-sys" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ceb04988b17b6d1dcd555390fa822ca5637b4a14e1f5099f13d351bed4d6c7" +dependencies = [ + "core-foundation-sys 0.7.0", "libc", - "security-framework-sys", ] [[package]] @@ -5987,7 +8904,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.2", "libc", ] @@ -6036,18 +8953,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.129" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" +checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.129" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57ae87ad533d9a56427558b516d0adac283614e347abf85b0dc0cbbf0a249f3" +checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" dependencies = [ "proc-macro2", "quote", @@ -6194,31 +9111,55 @@ dependencies = [ "erased-serde", ] +[[package]] +name = "slot-range-helper" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "enumn", + "parity-scale-codec", + "paste", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "slotmap" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a952280edbecfb1d4bd3cf2dbc309dc6ab523e53487c438ae21a6df09fe84bc4" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" -version = "1.6.1" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] [[package]] -name = "snap" -version = "1.0.5" +name = "smallvec" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "snow" -version = "0.8.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6142f7c25e94f6fd25a32c3348ec230df9109b463f59c8c7acc4bd34936babb7" +checksum = "795dd7aeeee24468e5a32661f6d27f7b5cbed802031b2d7640c7b10f8fb2dd50" dependencies = [ "aes-gcm", "blake2", "chacha20poly1305", - "rand 0.8.4", - "rand_core 0.6.3", + "rand 0.7.3", + "rand_core 0.5.1", "ring", - "rustc_version 0.3.3", + "rustc_version 0.2.3", "sha2 0.9.5", "subtle 2.4.1", "x25519-dalek", @@ -6261,10 +9202,25 @@ dependencies = [ "sha-1 0.9.7", ] +[[package]] +name = "soketto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74e48087dbeed4833785c2f3352b59140095dc192dce966a3bfc155020a439f" +dependencies = [ + "base64 0.13.0", + "bytes 1.0.1", + "futures 0.3.16", + "httparse", + "log", + "rand 0.8.4", + "sha-1 0.9.7", +] + [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "hash-db", "log", @@ -6281,7 +9237,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "blake2-rfc", "proc-macro-crate 1.0.0", @@ -6293,7 +9249,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "serde", @@ -6305,7 +9261,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "integer-sqrt", "num-traits", @@ -6316,10 +9272,22 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "sp-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", +] + [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "parity-scale-codec", @@ -6331,7 +9299,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "sp-api", @@ -6343,7 +9311,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "log", @@ -6361,34 +9329,63 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "futures 0.3.16", "futures-timer 3.0.2", "log", "parity-scale-codec", + "parking_lot 0.11.1", + "serde", + "sp-api", "sp-core", "sp-inherents", "sp-runtime", "sp-state-machine", "sp-std", + "sp-trie", + "sp-utils", "sp-version", + "substrate-prometheus-endpoint", "thiserror", + "wasm-timer", ] [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", + "merlin", "parity-scale-codec", + "serde", "sp-api", "sp-application-crypto", "sp-consensus", "sp-consensus-slots", + "sp-consensus-vrf", + "sp-core", "sp-inherents", + "sp-keystore", "sp-runtime", "sp-std", "sp-timestamp", @@ -6397,17 +9394,29 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "sp-arithmetic", "sp-runtime", ] +[[package]] +name = "sp-consensus-vrf" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "parity-scale-codec", + "schnorrkel", + "sp-core", + "sp-runtime", + "sp-std", +] + [[package]] name = "sp-core" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "base58", "blake2-rfc", @@ -6420,7 +9429,7 @@ dependencies = [ "hex", "impl-serde", "lazy_static", - "libsecp256k1 0.6.0", + "libsecp256k1 0.3.5", "log", "merlin", "num-traits", @@ -6451,7 +9460,7 @@ dependencies = [ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "kvdb", "parking_lot 0.11.1", @@ -6460,7 +9469,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "proc-macro2", "quote", @@ -6470,7 +9479,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "environmental", "parity-scale-codec", @@ -6481,7 +9490,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "finality-grandpa", "log", @@ -6498,7 +9507,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -6512,11 +9521,11 @@ dependencies = [ [[package]] name = "sp-io" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", "hash-db", - "libsecp256k1 0.6.0", + "libsecp256k1 0.3.5", "log", "parity-scale-codec", "parking_lot 0.11.1", @@ -6537,7 +9546,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "lazy_static", "sp-core", @@ -6548,7 +9557,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "derive_more", @@ -6565,16 +9574,40 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "ruzstd", "zstd", ] +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "parity-scale-codec", + "serde", + "sp-arithmetic", + "sp-core", + "sp-npos-elections-compact", + "sp-std", +] + +[[package]] +name = "sp-npos-elections-compact" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "proc-macro-crate 1.0.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "sp-api", "sp-core", @@ -6584,7 +9617,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "backtrace", ] @@ -6592,17 +9625,18 @@ dependencies = [ [[package]] name = "sp-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "rustc-hash", "serde", "sp-core", + "tracing-core", ] [[package]] name = "sp-runtime" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "either", "hash256-std-hasher", @@ -6623,7 +9657,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -6640,7 +9674,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "Inflector", "proc-macro-crate 1.0.0", @@ -6652,8 +9686,9 @@ dependencies = [ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ + "log", "parity-scale-codec", "sp-core", "sp-io", @@ -6665,7 +9700,7 @@ dependencies = [ [[package]] name = "sp-serializer" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "serde", "serde_json", @@ -6674,7 +9709,7 @@ dependencies = [ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "sp-api", @@ -6687,7 +9722,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -6697,7 +9732,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "hash-db", "log", @@ -6705,7 +9740,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.11.1", "rand 0.7.3", - "smallvec", + "smallvec 1.6.1", "sp-core", "sp-externalities", "sp-panic-handler", @@ -6720,12 +9755,12 @@ dependencies = [ [[package]] name = "sp-std" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" [[package]] name = "sp-storage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "impl-serde", "parity-scale-codec", @@ -6738,7 +9773,7 @@ dependencies = [ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "log", "sp-core", @@ -6751,7 +9786,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "futures-timer 3.0.2", @@ -6762,12 +9797,13 @@ dependencies = [ "sp-runtime", "sp-std", "thiserror", + "wasm-timer", ] [[package]] name = "sp-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "erased-serde", "log", @@ -6785,7 +9821,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "sp-api", "sp-runtime", @@ -6794,7 +9830,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-trait", "log", @@ -6809,7 +9845,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "hash-db", "memory-db", @@ -6823,9 +9859,10 @@ dependencies = [ [[package]] name = "sp-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "futures 0.3.16", + "futures-core", "futures-timer 3.0.2", "lazy_static", "prometheus", @@ -6834,7 +9871,7 @@ dependencies = [ [[package]] name = "sp-version" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "impl-serde", "parity-scale-codec", @@ -6849,9 +9886,10 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "parity-scale-codec", + "proc-macro-crate 1.0.0", "proc-macro2", "quote", "syn", @@ -6860,7 +9898,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -6886,6 +9924,31 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "static_init" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11b73400442027c4adedda20a9f9b7945234a5bd8d5f7e86da22bd5d0622369c" +dependencies = [ + "cfg_aliases", + "libc", + "parking_lot 0.11.1", + "static_init_macro", +] + +[[package]] +name = "static_init_macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2261c91034a1edc3fc4d1b80e89d82714faede0515c14a75da10cb941546bbf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "statrs" version = "0.15.0" @@ -6899,6 +9962,25 @@ dependencies = [ "rand 0.8.4", ] +[[package]] +name = "stream-cipher" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c80e15f898d8d8f25db24c253ea615cc14acf418ff307822995814e7d42cfa89" +dependencies = [ + "block-cipher", + "generic-array 0.14.4", +] + +[[package]] +name = "string" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" +dependencies = [ + "bytes 0.4.12", +] + [[package]] name = "strsim" version = "0.8.0" @@ -6923,7 +10005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7813934aecf5f51a54775e00068c237de98489463968231a51746bbbc03f9c10" dependencies = [ "heck", - "proc-macro-error", + "proc-macro-error 1.0.4", "proc-macro2", "quote", "syn", @@ -6966,7 +10048,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "platforms", ] @@ -6974,7 +10056,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.16", @@ -6986,6 +10068,7 @@ dependencies = [ "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", + "serde", "sp-api", "sp-block-builder", "sp-blockchain", @@ -6996,23 +10079,53 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.9.0" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "async-std", "derive_more", "futures-util", - "hyper", + "hyper 0.13.10", "log", "prometheus", - "tokio 1.10.0", + "tokio 0.2.25", +] + +[[package]] +name = "substrate-test-client" +version = "2.0.1" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "async-trait", + "futures 0.1.31", + "futures 0.3.16", + "hash-db", + "hex", + "parity-scale-codec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-executor", + "sc-light", + "sc-offchain", + "sc-service", + "serde", + "serde_json", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-keyring", + "sp-keystore", + "sp-runtime", + "sp-state-machine", ] [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate#ed702e8246d5c4f82e686fb044ac6c2e6cd269cf" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" dependencies = [ "ansi_term 0.12.1", + "atty", "build-helper", "cargo_metadata", "sp-maybe-compressed-blob", @@ -7035,14 +10148,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] -name = "syn" -version = "1.0.75" +name = "syn" +version = "1.0.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "syn-mid" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "syn", ] [[package]] @@ -7057,6 +10181,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" + [[package]] name = "tap" version = "1.0.1" @@ -7139,6 +10269,19 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "thrift" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6d965454947cc7266d22716ebfd07b18d84ebaf35eec558586bbb2a8cb6b5b" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float", + "threadpool", +] + [[package]] name = "time" version = "0.1.44" @@ -7192,6 +10335,30 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +[[package]] +name = "tokio" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "mio", + "num_cpus", + "tokio-codec", + "tokio-current-thread", + "tokio-executor", + "tokio-fs", + "tokio-io", + "tokio-reactor", + "tokio-sync", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "tokio-udp", + "tokio-uds", +] + [[package]] name = "tokio" version = "0.2.25" @@ -7199,14 +10366,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" dependencies = [ "bytes 0.5.6", + "fnv", + "futures-core", + "iovec", "lazy_static", "libc", - "mio 0.6.23", + "memchr", + "mio", "mio-uds", "num_cpus", "pin-project-lite 0.1.12", "signal-hook-registry", "slab", + "tokio-macros", "winapi 0.3.9", ] @@ -7217,49 +10389,248 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b" dependencies = [ "autocfg", - "bytes 1.0.1", - "libc", - "memchr", - "mio 0.7.13", - "num_cpus", "pin-project-lite 0.2.7", - "winapi 0.3.9", +] + +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +dependencies = [ + "bytes 0.4.12", + "either", + "futures 0.1.31", +] + +[[package]] +name = "tokio-codec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "tokio-io", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +dependencies = [ + "futures 0.1.31", + "tokio-executor", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures 0.1.31", +] + +[[package]] +name = "tokio-fs" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" +dependencies = [ + "futures 0.1.31", + "tokio-io", + "tokio-threadpool", +] + +[[package]] +name = "tokio-io" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "log", +] + +[[package]] +name = "tokio-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-named-pipes" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d282d483052288b2308ba5ee795f5673b159c9bdf63c385a05609da782a5eae" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "mio", + "mio-named-pipes", + "tokio 0.1.22", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures 0.1.31", + "lazy_static", + "log", + "mio", + "num_cpus", + "parking_lot 0.9.0", + "slab", + "tokio-executor", + "tokio-io", + "tokio-sync", ] [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" dependencies = [ - "rustls", - "tokio 1.10.0", + "futures-core", + "rustls 0.18.1", + "tokio 0.2.25", "webpki", ] [[package]] -name = "tokio-stream" -version = "0.1.7" +name = "tokio-rustls" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" +checksum = "03d15e5669243a45f630a5167d101b942174ca94b615445b2057eace1c818736" dependencies = [ "futures-core", - "pin-project-lite 0.2.7", - "tokio 1.10.0", + "rustls 0.19.1", + "tokio 0.2.25", + "webpki", +] + +[[package]] +name = "tokio-service" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" +dependencies = [ + "futures 0.1.31", +] + +[[package]] +name = "tokio-sync" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +dependencies = [ + "fnv", + "futures 0.1.31", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "iovec", + "mio", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +dependencies = [ + "crossbeam-deque 0.7.4", + "crossbeam-queue", + "crossbeam-utils 0.7.2", + "futures 0.1.31", + "lazy_static", + "log", + "num_cpus", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures 0.1.31", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-udp" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "log", + "mio", + "tokio-codec", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-uds" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" +dependencies = [ + "bytes 0.4.12", + "futures 0.1.31", + "iovec", + "libc", + "log", + "mio", + "mio-uds", + "tokio-codec", + "tokio-io", + "tokio-reactor", ] [[package]] name = "tokio-util" -version = "0.6.7" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ - "bytes 1.0.1", + "bytes 0.5.6", "futures-core", + "futures-io", "futures-sink", "log", - "pin-project-lite 0.2.7", - "tokio 1.10.0", + "pin-project-lite 0.1.12", + "tokio 0.2.25", ] [[package]] @@ -7284,6 +10655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", + "log", "pin-project-lite 0.2.7", "tracing-attributes", "tracing-core", @@ -7354,7 +10726,7 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec", + "smallvec 1.6.1", "thread_local", "tracing", "tracing-core", @@ -7372,7 +10744,7 @@ dependencies = [ "hashbrown", "log", "rustc-hex", - "smallvec", + "smallvec 1.6.1", ] [[package]] @@ -7402,7 +10774,7 @@ dependencies = [ "lazy_static", "log", "rand 0.8.4", - "smallvec", + "smallvec 1.6.1", "thiserror", "tinyvec", "url 2.2.2", @@ -7422,7 +10794,7 @@ dependencies = [ "lru-cache", "parking_lot 0.11.1", "resolv-conf", - "smallvec", + "smallvec 1.6.1", "thiserror", "trust-dns-proto", ] @@ -7433,6 +10805,31 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "try-runtime-cli" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/substrate?branch=hc-contract-experiment-patched-v0.9.9#6080e7a33e63558bf619c240b1ada2cb08c8b443" +dependencies = [ + "frame-try-runtime", + "log", + "parity-scale-codec", + "remote-externalities", + "sc-chain-spec", + "sc-cli", + "sc-client-api", + "sc-executor", + "sc-service", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "structopt", +] + [[package]] name = "twox-hash" version = "1.6.1" @@ -7630,6 +11027,17 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +dependencies = [ + "futures 0.1.31", + "log", + "try-lock", +] + [[package]] name = "want" version = "0.3.0" @@ -7654,9 +11062,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.76" +version = "0.2.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce9b1b516211d33767048e5d47fa2a381ed8b76fc48d2ce4aa39877f9f183e0" +checksum = "b608ecc8f4198fe8680e2ed18eccab5f0cd4caaf3d83516fa5fb2e927fda2586" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -7664,9 +11072,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.76" +version = "0.2.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8dc78e2326ba5f845f4b5bf548401604fa20b1dd1d365fb73b6c1d6364041" +checksum = "580aa3a91a63d23aac5b6b267e2d13cb4f363e31dce6c352fca4752ae12e479f" dependencies = [ "bumpalo", "lazy_static", @@ -7679,9 +11087,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.26" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fded345a6559c2cfee778d562300c581f7d4ff3edb9b0d230d69800d213972" +checksum = "16646b21c3add8e13fdb8f20172f8a28c3dbf62f45406bcff0233188226cfe0c" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -7691,9 +11099,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.76" +version = "0.2.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44468aa53335841d9d6b6c023eaab07c0cd4bddbcfdee3e2bb1e8d2cb8069fef" +checksum = "171ebf0ed9e1458810dfcb31f2e766ad6b3a89dbda42d8901f2b268277e5f09c" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7701,9 +11109,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.76" +version = "0.2.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" +checksum = "6c2657dd393f03aa2a659c25c6ae18a13a4048cebd220e147933ea837efc589f" dependencies = [ "proc-macro2", "quote", @@ -7714,9 +11122,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.76" +version = "0.2.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdb075a845574a1fa5f09fd77e43f7747599301ea3417a9fbffdeedfc1f4a29" +checksum = "2e0c4a743a309662d45f4ede961d7afa4ba4131a59a639f29b0069c3798bbcc2" [[package]] name = "wasm-gc-api" @@ -7752,6 +11160,7 @@ checksum = "d2ee05bba3d1d994652079893941a2ef9324d2b58a63c31b40678fb7eddd7a5a" dependencies = [ "downcast-rs", "libc", + "libm", "memory_units", "num-rational 0.2.4", "num-traits", @@ -7794,7 +11203,7 @@ dependencies = [ "region", "rustc-demangle", "serde", - "smallvec", + "smallvec 1.6.1", "target-lexicon", "wasmparser", "wasmtime-cache", @@ -7954,7 +11363,7 @@ dependencies = [ "libc", "log", "mach", - "memoffset", + "memoffset 0.6.4", "more-asserts", "rand 0.8.4", "region", @@ -7965,9 +11374,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.53" +version = "0.3.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224b2f6b67919060055ef1a67807367c2066ed520c3862cc013d26cf893a783c" +checksum = "01c70a82d842c9979078c772d4a1344685045f1a5628f677c2b2eab4dd7d2696" dependencies = [ "js-sys", "wasm-bindgen", @@ -8097,6 +11506,53 @@ dependencies = [ "zeroize", ] +[[package]] +name = "xcm" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "derivative", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", +] + +[[package]] +name = "xcm-builder" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "xcm-executor" +version = "0.9.9-1" +source = "git+https://github.com/paritytech/polkadot?branch=hc-contract-experiment-patched-v0.9.9#ba327c4ac0489e7273b1542c7366ac568645b193" +dependencies = [ + "frame-support", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", +] + [[package]] name = "yamux" version = "0.9.0" @@ -8113,9 +11569,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "377db0846015f7ae377174787dd452e1c5f5a9050bc6f954911d01f116daa0cd" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 9c337cd..686da4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,10 @@ +resolver = "2" + [workspace] members = [ 'node', 'runtime', ] + [profile.release] panic = 'unwind' diff --git a/README.md b/README.md index e202568..a715440 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,16 @@ # canvas-node This is a node implementation for Canvas, a [Substrate](https://github.com/paritytech/substrate) -chain for smart contracts. +parachain for smart contracts. It uses Substrate's smart contract module ‒ the [`contracts`](https://github.com/paritytech/substrate/tree/master/frame/contracts) pallet. - ## Note -The master branch is currently tracking Substrate master in order to include -various fixes. Therefore, it may not build if there are breaking changes. +This used to be a standalone smart contract node used for the ink! workshop. We +have moved the standalone node to [substrate-contracts-node](https://github.com/paritytech/substrate-contracts-node/). ## Installation @@ -28,30 +27,26 @@ If it fails to build/install, add the cargo `--locked` flag. The installation pr will then use the same versions as the `Cargo.lock` in this repository to ensure that the most recent working version of Substrate will be used. -The latest confirmed working Substrate commit which will then be used is -[ed702e8246d5c4f82e686fb044ac6c2e6cd269cf](https://github.com/paritytech/substrate/tree/ed702e8246d5c4f82e686fb044ac6c2e6cd269cf). +### Substrate Compatibility -## Usage - -To run a local dev node execute -``` -canvas --dev --tmp -``` -The `--tmp` implies that a new chain will be created each time the command -is executed. If you want to persist chain state across runs leave it away. +The latest confirmed working Substrate commit which will then be used is +[6080e7a33e63558bf619c240b1ada2cb08c8b443](https://github.com/paritytech/substrate/commit/6080e7a33e63558bf619c240b1ada2cb08c8b443). -To run `testnet-1` execute +It tracks a modified `polkadot-v0.9.9` branches across: +[`substrate`](https://github.com/paritytech/substrate/tree/hc-contract-experiment-patched-v0.9.9), +[`grandpa-bridge-gadget`](https://github.com/paritytech/grandpa-bridge-gadget/tree/hc-contract-experiment-patched-v0.9.9), +[`polkadot`](https://github.com/paritytech/polkadot/tree/hc-contract-experiment-patched-v0.9.9) and +[`cumulus`](https://github.com/paritytech/cumulus/tree/hc-contract-experiment-patched-v0.9.9). -``` -canvas --chain=./res/testnet-1.json -``` +### Unstable Features -## Running as a parachain +If you're the type of person that likes to drink your soup before it cools, you might +also be wondering about how to activate unstable `pallet-contracts` features. To do this +you can run the previous installation command with the following flag: +`--features contracts-unstable-interface`. -The [`rococo-v1`](https://github.com/paritytech/canvas-node/tree/rococo-v1) branch -contains an experimental implementation which allows running `canvas-node` as a parachain. +## Usage -It tracks the `rococo-v1` branches of -[`substrate`](https://github.com/paritytech/substrate/tree/rococo-v1), -[`polkadot`](https://github.com/paritytech/polkadot/tree/rococo-v1) and -[`cumulus`](https://github.com/paritytech/cumulus/tree/rococo-v1). +To simplify your life you'll want to use the +[`polkadot-launch`](https://github.com/paritytech/polkadot-launch) tool. More +instructions to come! diff --git a/node/Cargo.toml b/node/Cargo.toml index 08340b5..b41642d 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -12,50 +12,88 @@ edition = "2018" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] -[dependencies] -structopt = "0.3.8" -hex-literal = "0.2.1" - -sc-cli = { git = "https://github.com/paritytech/substrate", package = "sc-cli", features = ["wasmtime"] } -sp-core = { git = "https://github.com/paritytech/substrate", package = "sp-core" } -sc-executor = { git = "https://github.com/paritytech/substrate", package = "sc-executor", features = ["wasmtime"] } -sc-service = { git = "https://github.com/paritytech/substrate", package = "sc-service", features = ["wasmtime"] } -sc-telemetry = { git = "https://github.com/paritytech/substrate", package = "sc-telemetry" } -sc-keystore = { git = "https://github.com/paritytech/substrate", package = "sc-keystore" } -sp-inherents = { git = "https://github.com/paritytech/substrate", package = "sp-inherents" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", package = "sc-transaction-pool" } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", package = "sc-transaction-pool-api" } -sc-consensus-aura = { git = "https://github.com/paritytech/substrate", package = "sc-consensus-aura" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", package = "sp-consensus-aura" } -sp-consensus = { git = "https://github.com/paritytech/substrate", package = "sp-consensus" } -sc-consensus = { git = "https://github.com/paritytech/substrate", package = "sc-consensus" } -sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", package = "sc-finality-grandpa" } -sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", package = "sp-finality-grandpa" } -sc-client-api = { git = "https://github.com/paritytech/substrate", package = "sc-client-api" } -sp-runtime = { git = "https://github.com/paritytech/substrate", package = "sp-runtime" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", package = "sp-timestamp" } - -# These dependencies are used for the node's RPCs -jsonrpc-core = "18.0.0" -sc-rpc = { git = "https://github.com/paritytech/substrate", package = "sc-rpc" } -sp-api = { git = "https://github.com/paritytech/substrate", package = "sp-api" } -sc-rpc-api = { git = "https://github.com/paritytech/substrate", package = "sc-rpc-api" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", package = "sp-blockchain" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", package = "sp-block-builder" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", package = "sc-basic-authorship" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", package = "substrate-frame-rpc-system" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", package = "pallet-transaction-payment-rpc" } -pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate", package = "pallet-contracts-rpc" } - -# These dependencies are used for runtime benchmarking -frame-benchmarking = { git = "https://github.com/paritytech/substrate", package = "frame-benchmarking" } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", package = "frame-benchmarking-cli" } - -canvas-runtime = { version = "0.1.0", path = "../runtime" } - [build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", package = "substrate-build-script-utils" } +substrate-build-script-utils = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } [[bin]] -name = "canvas" -path = "src/main.rs" +name = 'canvas' +path = 'src/main.rs' + +[features] +runtime-benchmarks = ['canvas-runtime/runtime-benchmarks'] +contracts-unstable-interface = ['canvas-runtime/contracts-unstable-interface'] + +[dependencies] +derive_more = '0.99.2' +log = '0.4.14' +codec = { package = 'parity-scale-codec', version = '2.0.0' } +structopt = '0.3.8' +serde = { version = '1.0.119', features = ['derive'] } +hex-literal = '0.3.1' + +# RPC related Dependencies +jsonrpc-core = '15.1.0' + +# Local Dependencies +canvas-runtime = { path = '../runtime' } + +# Substrate Dependencies +frame-benchmarking = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +frame-benchmarking-cli = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } + +pallet-transaction-payment-rpc = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } + +substrate-frame-rpc-system = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "hc-contract-experiment-patched-v0.9.9" } + +## Substrate Client Dependencies +sc-basic-authorship = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-chain-spec = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-cli = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-client-api = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-consensus = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-executor = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-network = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-keystore = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-rpc = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-rpc-api = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-service = { git = 'https://github.com/paritytech/substrate', features = ['wasmtime'] , branch = "hc-contract-experiment-patched-v0.9.9" } +sc-telemetry = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-transaction-pool = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-transaction-pool-api = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sc-tracing = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } + +## Substrate Primitive Dependencies +sp-api = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-block-builder = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-blockchain = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-consensus = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-core = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-inherents = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-keystore = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-offchain = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-runtime = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-session = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-timestamp = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } +sp-transaction-pool = { git = 'https://github.com/paritytech/substrate', branch = "hc-contract-experiment-patched-v0.9.9" } + +# Cumulus dependencies +cumulus-client-consensus-aura = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-client-consensus-common = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-client-collator = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-client-cli = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-client-network = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-client-service = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-primitives-core = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-primitives-parachain-inherent = { git = 'https://github.com/paritytech/cumulus', branch = "hc-contract-experiment-patched-v0.9.9" } + +# Polkadot dependencies +polkadot-cli = { git = 'https://github.com/paritytech/polkadot', branch = "hc-contract-experiment-patched-v0.9.9" } +polkadot-parachain = { git = 'https://github.com/paritytech/polkadot', branch = "hc-contract-experiment-patched-v0.9.9" } +polkadot-primitives = { git = 'https://github.com/paritytech/polkadot', branch = "hc-contract-experiment-patched-v0.9.9" } +polkadot-service = { git = 'https://github.com/paritytech/polkadot', branch = "hc-contract-experiment-patched-v0.9.9" } +polkadot-test-service = { git = 'https://github.com/paritytech/polkadot', branch = "hc-contract-experiment-patched-v0.9.9" } + +# Contracts specific packages +pallet-contracts-rpc = { git = "https://github.com/paritytech/substrate", branch = "hc-contract-experiment-patched-v0.9.9" } diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 69f69d9..2eec7a5 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -14,33 +14,44 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use canvas_runtime::{ - AccountId, AuraConfig, BalancesConfig, GenesisConfig, GrandpaConfig, Signature, SudoConfig, - SystemConfig, WASM_BINARY, -}; -use hex_literal::hex; +use canvas_runtime::{AccountId, AuraId, Signature}; +use cumulus_primitives_core::ParaId; +use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use sc_service::ChainType; -use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use serde::{Deserialize, Serialize}; use sp_core::{sr25519, Pair, Public}; -use sp_finality_grandpa::AuthorityId as GrandpaId; use sp_runtime::traits::{IdentifyAccount, Verify}; -// The URL for the telemetry server. -// const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; +/// Specialized `ChainSpec` for the normal parachain runtime. +pub type ChainSpec = sc_service::GenericChainSpec; -/// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. -pub type ChainSpec = sc_service::GenericChainSpec; - -/// Generate a crypto pair from seed. +/// Helper function to generate a crypto pair from seed pub fn get_from_seed(seed: &str) -> ::Public { TPublic::Pair::from_string(&format!("//{}", seed), None) .expect("static values are valid; qed") .public() } +/// The extensions for the [`ChainSpec`]. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)] +#[serde(deny_unknown_fields)] +pub struct Extensions { + /// The relay chain of the Parachain. + pub relay_chain: String, + /// The id of the Parachain. + pub para_id: u32, +} + +impl Extensions { + /// Try to get the extension from the given `ChainSpec`. + pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> { + sc_chain_spec::get_extension(chain_spec.extensions()) + } +} + type AccountPublic = ::Signer; -/// Generate an account ID from seed. +/// Helper function to generate an account ID from seed pub fn get_account_id_from_seed(seed: &str) -> AccountId where AccountPublic: From<::Public>, @@ -48,55 +59,13 @@ where AccountPublic::from(get_from_seed::(seed)).into_account() } -/// Generate an Aura authority key. -pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) { - (get_from_seed::(s), get_from_seed::(s)) -} - -pub fn testnet_authorities() -> Vec<(AuraId, GrandpaId)> { - use sp_core::crypto::UncheckedInto; - - // ./scripts/prepare-test-net.sh 2 - let initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)> = vec![ - ( - //5Dkp2xwztRtRkXdmLDJUm8wvdHWSApgYgJY3rB5brKZkWJPM - hex!["4ad2d854d1bc5bbfdf93b689cb1aa3986684126c2b16d86924019de6798b0971"].into(), - //5DvnJs3jM7sJkgfpVDxwu9GNmpFyzJSn2jG9w1hxBBWwqi92 - hex!["526d7d3d5357d20e4cd75d1a452bd5b4903caf160f55d6bd19807efbdf165319"].into(), - //5GKFbTTgrVS4Vz1UWWHPqMZQNFWZtqo7H2KpCDyYhEL3aS26 - hex!["bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c"] - .unchecked_into(), - //5ErzrnqhfgXJeuFsRvwNsrbqBAbiePoqeeDZZYzaTDxwtANY - hex!["7bc6fd5dc6e832b294bbf2ae21df67f990a526793a9ded12a5e54e40a5a94d1d"] - .unchecked_into(), - ), - ( - //5Gnadix7NJH2K7Akr5hVKyXqtYqTsQJbXnKFFt274MsG8n7h - hex!["d0e0ece66fb861b82383e85326a2e179316021105492820ca544ea8743620b59"].into(), - //5FADgcPNMtcLtrmd16rZk6HJfDWqtEDT4N3jMSqtFo8tJhRr - hex!["88e95527362f479ebf30502db2f7d88329e034f5d77aed585042c548fa93ae01"].into(), - //5EPRJHm2GpABVWcwnAujcrhnrjFZyDGd5TwKFzkBoGgdRyv2 - hex!["66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72"] - .unchecked_into(), - //5HNx7nq3brkA3St9CAU1KijnscvAsa5ornNuk1H1iSuXy1nd - hex!["eb17972691ec3a7d09a316baddc8838362ade2c12a21a506d697903e16577bfd"] - .unchecked_into(), - ), - ]; - initial_authorities - .into_iter() - .map(|(_, _, aura_id, grandpa_id)| (aura_id, grandpa_id)) - .collect() -} - -pub fn testnet_root() -> AccountId { - hex!("baa78c7154c7f82d6d377177e20bcab65d327eca0086513f9964f5a0f6bdad56").into() -} - -pub fn development_config() -> Result { - let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?; +pub fn development_config(id: ParaId) -> ChainSpec { + // Give your base currency a unit name and decimal places + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("tokenSymbol".into(), "CAN".into()); + properties.insert("tokenDecimals".into(), 12.into()); - Ok(ChainSpec::from_genesis( + ChainSpec::from_genesis( // Name "Development", // ID @@ -104,12 +73,8 @@ pub fn development_config() -> Result { ChainType::Development, move || { testnet_genesis( - wasm_binary, - // Initial PoA authorities - vec![authority_keys_from_seed("Alice")], - // Sudo account get_account_id_from_seed::("Alice"), - // Pre-funded accounts + vec![get_from_seed::("Alice"), get_from_seed::("Bob")], vec![ get_account_id_from_seed::("Alice"), get_account_id_from_seed::("Bob"), @@ -124,101 +89,93 @@ pub fn development_config() -> Result { get_account_id_from_seed::("Eve//stash"), get_account_id_from_seed::("Ferdie//stash"), ], - true, + id, ) }, - // Bootnodes vec![], - // Telemetry None, - // Protocol ID None, - // Properties None, - // Extensions - None, - )) + Extensions { + relay_chain: "rococo-local".into(), // You MUST set this to the correct network! + para_id: id.into(), + }, + ) } -pub fn testnet_config() -> Result { - let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?; - let mut properties = sc_service::Properties::new(); - properties.insert("tokenSymbol".to_string(), "CAN".into()); - properties.insert("tokenDecimals".to_string(), 12.into()); - properties.insert("ss58Format".to_string(), 42.into()); +pub fn local_testnet_config(id: ParaId) -> ChainSpec { + // Give your base currency a unit name and decimal places + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("tokenSymbol".into(), "CAN".into()); + properties.insert("tokenDecimals".into(), 12.into()); - Ok(ChainSpec::from_genesis( - "Canvas Testnet", - "canvas_testnet2", - ChainType::Live, + ChainSpec::from_genesis( + // Name + "Canvas Local", + // ID + "canvas_local", + ChainType::Local, move || { + // TODO [#76]: Right now these are being left as default values, but in the old `canvas-node` + // we had some non-default authorities, as well as accounts for the faucent and + // `ink-waterfall`. We'll need to add those back in testnet_genesis( - wasm_binary, - testnet_authorities(), - testnet_root(), + get_account_id_from_seed::("Alice"), + vec![get_from_seed::("Alice"), get_from_seed::("Bob")], vec![ - testnet_root(), - // AccountId of the Canvas Testnet faucet - hex!("18c64aa111a8a0e6e4eed41d6d906c7614d745e48be3cfc13b6128e1d51f4405").into(), - // AccountId of an account which `ink-waterfall` uses for automated testing - hex!("0e47e2344d523c3cc5c34394b0d58b9a4200e813a038e6c5a6163cc07d70b069").into(), + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), ], - true, + id, ) }, // Bootnodes - vec![ - "/ip4/34.90.191.237/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj" - .parse() - .expect("MultiaddrWithPeerId"), - "/ip4/35.204.68.28/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh" - .parse() - .expect("MultiaddrWithPeerId"), - "/ip4/34.90.139.15/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk" - .parse() - .expect("MultiaddrWithPeerId"), - "/ip4/35.204.99.97/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" - .parse() - .expect("MultiaddrWithPeerId"), - ], + // These will be configured using the JSON files in the `res` foler + Vec::new(), // Telemetry None, // Protocol ID - Some("prc"), + Some("canvas-rococo"), // Properties Some(properties), // Extensions - None, - )) + Extensions { + relay_chain: "rococo-local".into(), // You MUST set this to the correct network! + para_id: id.into(), + }, + ) } -/// Configure initial storage state for FRAME modules. fn testnet_genesis( - wasm_binary: &[u8], - initial_authorities: Vec<(AuraId, GrandpaId)>, root_key: AccountId, + initial_authorities: Vec, endowed_accounts: Vec, - _enable_println: bool, -) -> GenesisConfig { - GenesisConfig { - system: SystemConfig { - // Add Wasm runtime to storage. - code: wasm_binary.to_vec(), + id: ParaId, +) -> canvas_runtime::GenesisConfig { + canvas_runtime::GenesisConfig { + system: canvas_runtime::SystemConfig { + code: canvas_runtime::WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), changes_trie_config: Default::default(), }, - balances: BalancesConfig { - // Configure endowed accounts with initial balance of 1 << 60. + balances: canvas_runtime::BalancesConfig { balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), }, - aura: AuraConfig { - authorities: initial_authorities.iter().map(|x| (x.0.clone())).collect(), - }, - grandpa: GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.1.clone(), 1)).collect(), - }, - sudo: SudoConfig { - // Assign network admin rights. - key: root_key, - }, + sudo: canvas_runtime::SudoConfig { key: root_key }, + parachain_info: canvas_runtime::ParachainInfoConfig { parachain_id: id }, + aura: canvas_runtime::AuraConfig { authorities: initial_authorities }, + aura_ext: Default::default(), + parachain_system: Default::default(), } } diff --git a/node/src/cli.rs b/node/src/cli.rs index 39654cd..9b9d318 100644 --- a/node/src/cli.rs +++ b/node/src/cli.rs @@ -14,22 +14,22 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use sc_cli::RunCmd; +use crate::chain_spec; +use cumulus_client_cli; +use sc_cli; +use std::path::PathBuf; use structopt::StructOpt; -#[derive(Debug, StructOpt)] -pub struct Cli { - #[structopt(subcommand)] - pub subcommand: Option, - - #[structopt(flatten)] - pub run: RunCmd, -} - +/// Sub-commands supported by the collator. #[derive(Debug, StructOpt)] pub enum Subcommand { - /// Key management cli utilities - Key(sc_cli::KeySubcommand), + /// Export the genesis state of the parachain. + #[structopt(name = "export-genesis-state")] + ExportGenesisState(ExportGenesisStateCommand), + + /// Export the genesis wasm of the parachain. + #[structopt(name = "export-genesis-wasm")] + ExportGenesisWasm(ExportGenesisWasmCommand), /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), @@ -47,8 +47,93 @@ pub enum Subcommand { ImportBlocks(sc_cli::ImportBlocksCmd), /// Remove the whole chain. - PurgeChain(sc_cli::PurgeChainCmd), + PurgeChain(cumulus_client_cli::PurgeChainCmd), /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), + + /// The custom benchmark subcommmand benchmarking runtime pallets. + #[structopt(name = "benchmark", about = "Benchmark runtime pallets.")] + Benchmark(frame_benchmarking_cli::BenchmarkCmd), +} + +/// Command for exporting the genesis state of the parachain +#[derive(Debug, StructOpt)] +pub struct ExportGenesisStateCommand { + /// Output file name or stdout if unspecified. + #[structopt(parse(from_os_str))] + pub output: Option, + + /// Id of the parachain this state is for. + /// + /// Default: 100 + #[structopt(long, conflicts_with = "chain")] + pub parachain_id: Option, + + /// Write output in binary. Default is to write in hex. + #[structopt(short, long)] + pub raw: bool, + + /// The name of the chain for that the genesis state should be exported. + #[structopt(long, conflicts_with = "parachain-id")] + pub chain: Option, +} + +/// Command for exporting the genesis wasm file. +#[derive(Debug, StructOpt)] +pub struct ExportGenesisWasmCommand { + /// Output file name or stdout if unspecified. + #[structopt(parse(from_os_str))] + pub output: Option, + + /// Write output in binary. Default is to write in hex. + #[structopt(short, long)] + pub raw: bool, + + /// The name of the chain for that the genesis wasm file should be exported. + #[structopt(long)] + pub chain: Option, +} + +#[derive(Debug, StructOpt)] +#[structopt(settings = &[ + structopt::clap::AppSettings::GlobalVersion, + structopt::clap::AppSettings::ArgsNegateSubcommands, + structopt::clap::AppSettings::SubcommandsNegateReqs, +])] +pub struct Cli { + #[structopt(subcommand)] + pub subcommand: Option, + + #[structopt(flatten)] + pub run: cumulus_client_cli::RunCmd, + + /// Relaychain arguments + #[structopt(raw = true)] + pub relaychain_args: Vec, +} + +#[derive(Debug)] +pub struct RelayChainCli { + /// The actual relay chain cli object. + pub base: polkadot_cli::RunCmd, + + /// Optional chain id that should be passed to the relay chain. + pub chain_id: Option, + + /// The base path that should be used by the relay chain. + pub base_path: Option, +} + +impl RelayChainCli { + /// Parse the relay chain CLI parameters using the para chain `Configuration`. + pub fn new<'a>( + para_config: &sc_service::Configuration, + relay_chain_args: impl Iterator, + ) -> Self { + let extension = chain_spec::Extensions::try_get(&*para_config.chain_spec); + let chain_id = extension.map(|e| e.relay_chain.clone()); + let base_path = para_config.base_path.as_ref().map(|x| x.path().join("polkadot")); + Self { base_path, chain_id, base: polkadot_cli::RunCmd::from_iter(relay_chain_args) } + } } diff --git a/node/src/command.rs b/node/src/command.rs index c762b52..49d81cd 100644 --- a/node/src/command.rs +++ b/node/src/command.rs @@ -16,11 +16,34 @@ use crate::{ chain_spec, - cli::{Cli, Subcommand}, - service, + cli::{Cli, RelayChainCli, Subcommand}, + service::{new_partial, ParachainRuntimeExecutor}, }; -use sc_cli::{ChainSpec, Role, RuntimeVersion, SubstrateCli}; -use sc_service::PartialComponents; +use canvas_runtime::{Block, RuntimeApi}; +use codec::Encode; +use cumulus_client_service::genesis::generate_genesis_block; +use cumulus_primitives_core::ParaId; +use log::info; +use polkadot_parachain::primitives::AccountIdConversion; +use sc_cli::{ + ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, + NetworkParams, Result, RuntimeVersion, SharedParams, SubstrateCli, +}; +use sc_service::config::{BasePath, PrometheusConfig}; +use sp_core::hexdisplay::HexDisplay; +use sp_runtime::traits::Block as BlockT; +use std::{io::Write, net::SocketAddr}; + +fn load_spec( + id: &str, + para_id: ParaId, +) -> std::result::Result, String> { + Ok(match id { + "dev" => Box::new(chain_spec::development_config(para_id)), + "" | "local" => Box::new(chain_spec::local_testnet_config(para_id)), + path => Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?), + }) +} impl SubstrateCli for Cli { fn impl_name() -> String { @@ -32,7 +55,13 @@ impl SubstrateCli for Cli { } fn description() -> String { - env!("CARGO_PKG_DESCRIPTION").into() + format!( + "Canvas Node\n\nThe command-line arguments provided first will be \ + passed to the parachain node, while the arguments provided after -- will be passed \ + to the relaychain node.\n\n\ + {} [parachain-args] -- [relaychain-args]", + Self::executable_name() + ) } fn author() -> String { @@ -47,13 +76,8 @@ impl SubstrateCli for Cli { 2020 } - fn load_spec(&self, id: &str) -> Result, String> { - Ok(match id { - "dev" => Box::new(chain_spec::development_config()?), - "" => Box::new(chain_spec::testnet_config()?), // default to running on testnet - path => - Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?), - }) + fn load_spec(&self, id: &str) -> std::result::Result, String> { + load_spec(id, self.run.parachain_id.unwrap_or(2000).into()) } fn native_runtime_version(_: &Box) -> &'static RuntimeVersion { @@ -61,67 +85,344 @@ impl SubstrateCli for Cli { } } -/// Parse and run command line arguments -pub fn run() -> sc_cli::Result<()> { +impl SubstrateCli for RelayChainCli { + fn impl_name() -> String { + "Canvas Node".into() + } + + fn impl_version() -> String { + env!("SUBSTRATE_CLI_IMPL_VERSION").into() + } + + fn description() -> String { + "Canvas Node\n\nThe command-line arguments provided first will be \ + passed to the parachain node, while the arguments provided after -- will be passed \ + to the relaychain node.\n\n\ + parachain-collator [parachain-args] -- [relaychain-args]" + .into() + } + + fn author() -> String { + env!("CARGO_PKG_AUTHORS").into() + } + + fn support_url() -> String { + "https://github.com/paritytech/canvas-node/issues/new".into() + } + + fn copyright_start_year() -> i32 { + 2020 + } + + fn load_spec(&self, id: &str) -> std::result::Result, String> { + polkadot_cli::Cli::from_iter([RelayChainCli::executable_name().to_string()].iter()) + .load_spec(id) + } + + fn native_runtime_version(chain_spec: &Box) -> &'static RuntimeVersion { + polkadot_cli::Cli::native_runtime_version(chain_spec) + } +} + +fn extract_genesis_wasm(chain_spec: &Box) -> Result> { + let mut storage = chain_spec.build_storage()?; + + storage + .top + .remove(sp_core::storage::well_known_keys::CODE) + .ok_or_else(|| "Could not find wasm file in genesis state!".into()) +} + +macro_rules! construct_async_run { + (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ + let runner = $cli.create_runner($cmd)?; + runner.async_run(|$config| { + let $components = new_partial::< + RuntimeApi, + ParachainRuntimeExecutor, + _ + >( + &$config, + crate::service::parachain_build_import_queue, + )?; + let task_manager = $components.task_manager; + { $( $code )* }.map(|v| (v, task_manager)) + }) + }} +} + +/// Parse command line arguments into service configuration. +pub fn run() -> Result<()> { let cli = Cli::from_args(); match &cli.subcommand { - Some(Subcommand::Key(cmd)) => cmd.run(&cli), Some(Subcommand::BuildSpec(cmd)) => { let runner = cli.create_runner(cmd)?; runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) }, Some(Subcommand::CheckBlock(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { client, task_manager, import_queue, .. } = - service::new_partial(&config)?; - Ok((cmd.run(client, import_queue), task_manager)) + construct_async_run!(|components, cli, cmd, config| { + Ok(cmd.run(components.client, components.import_queue)) }) }, Some(Subcommand::ExportBlocks(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?; - Ok((cmd.run(client, config.database), task_manager)) + construct_async_run!(|components, cli, cmd, config| { + Ok(cmd.run(components.client, config.database)) }) }, Some(Subcommand::ExportState(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?; - Ok((cmd.run(client, config.chain_spec), task_manager)) + construct_async_run!(|components, cli, cmd, config| { + Ok(cmd.run(components.client, config.chain_spec)) }) }, Some(Subcommand::ImportBlocks(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { client, task_manager, import_queue, .. } = - service::new_partial(&config)?; - Ok((cmd.run(client, import_queue), task_manager)) + construct_async_run!(|components, cli, cmd, config| { + Ok(cmd.run(components.client, components.import_queue)) }) }, Some(Subcommand::PurgeChain(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.database)) + + runner.sync_run(|config| { + let polkadot_cli = RelayChainCli::new( + &config, + [RelayChainCli::executable_name().to_string()] + .iter() + .chain(cli.relaychain_args.iter()), + ); + + let polkadot_config = SubstrateCli::create_configuration( + &polkadot_cli, + &polkadot_cli, + config.task_executor.clone(), + ) + .map_err(|err| format!("Relay chain argument error: {}", err))?; + + cmd.run(config, polkadot_config) + }) }, Some(Subcommand::Revert(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { client, task_manager, backend, .. } = - service::new_partial(&config)?; - Ok((cmd.run(client, backend), task_manager)) + construct_async_run!(|components, cli, cmd, config| { + Ok(cmd.run(components.client, components.backend)) }) }, + Some(Subcommand::ExportGenesisState(params)) => { + let mut builder = sc_cli::LoggerBuilder::new(""); + builder.with_profiling(sc_tracing::TracingReceiver::Log, ""); + let _ = builder.init(); + + let block: Block = generate_genesis_block(&load_spec( + ¶ms.chain.clone().unwrap_or_default(), + params.parachain_id.unwrap_or(2000).into(), + )?)?; + let raw_header = block.header().encode(); + let output_buf = if params.raw { + raw_header + } else { + format!("0x{:?}", HexDisplay::from(&block.header().encode())).into_bytes() + }; + + if let Some(output) = ¶ms.output { + std::fs::write(output, output_buf)?; + } else { + std::io::stdout().write_all(&output_buf)?; + } + + Ok(()) + }, + Some(Subcommand::ExportGenesisWasm(params)) => { + let mut builder = sc_cli::LoggerBuilder::new(""); + builder.with_profiling(sc_tracing::TracingReceiver::Log, ""); + let _ = builder.init(); + + let raw_wasm_blob = + extract_genesis_wasm(&cli.load_spec(¶ms.chain.clone().unwrap_or_default())?)?; + let output_buf = if params.raw { + raw_wasm_blob + } else { + format!("0x{:?}", HexDisplay::from(&raw_wasm_blob)).into_bytes() + }; + + if let Some(output) = ¶ms.output { + std::fs::write(output, output_buf)?; + } else { + std::io::stdout().write_all(&output_buf)?; + } + + Ok(()) + }, + Some(Subcommand::Benchmark(cmd)) => + if cfg!(feature = "runtime-benchmarks") { + let runner = cli.create_runner(cmd)?; + + runner.sync_run(|config| cmd.run::(config)) + } else { + Err("Benchmarking wasn't enabled when building the node. \ + You can enable it with `--features runtime-benchmarks`." + .into()) + }, None => { - let runner = cli.create_runner(&cli.run)?; + let runner = cli.create_runner(&cli.run.normalize())?; + runner.run_node_until_exit(|config| async move { - match config.role { - Role::Light => service::new_light(config), - _ => service::new_full(config), - } - .map_err(sc_cli::Error::Service) + let para_id = + chain_spec::Extensions::try_get(&*config.chain_spec).map(|e| e.para_id); + + let polkadot_cli = RelayChainCli::new( + &config, + [RelayChainCli::executable_name().to_string()] + .iter() + .chain(cli.relaychain_args.iter()), + ); + + let id = ParaId::from(cli.run.parachain_id.or(para_id).unwrap_or(2000)); + + let parachain_account = + AccountIdConversion::::into_account(&id); + + let block: Block = + generate_genesis_block(&config.chain_spec).map_err(|e| format!("{:?}", e))?; + let genesis_state = format!("0x{:?}", HexDisplay::from(&block.header().encode())); + + let task_executor = config.task_executor.clone(); + let polkadot_config = + SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, task_executor) + .map_err(|err| format!("Relay chain argument error: {}", err))?; + + info!("Parachain id: {:?}", id); + info!("Parachain Account: {}", parachain_account); + info!("Parachain genesis state: {}", genesis_state); + info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); + + crate::service::start_node(config, polkadot_config, id) + .await + .map(|r| r.0) + .map_err(Into::into) }) }, } } + +impl DefaultConfigurationValues for RelayChainCli { + fn p2p_listen_port() -> u16 { + 30334 + } + + fn rpc_ws_listen_port() -> u16 { + 9945 + } + + fn rpc_http_listen_port() -> u16 { + 9934 + } + + fn prometheus_listen_port() -> u16 { + 9616 + } +} + +impl CliConfiguration for RelayChainCli { + fn shared_params(&self) -> &SharedParams { + self.base.base.shared_params() + } + + fn import_params(&self) -> Option<&ImportParams> { + self.base.base.import_params() + } + + fn network_params(&self) -> Option<&NetworkParams> { + self.base.base.network_params() + } + + fn keystore_params(&self) -> Option<&KeystoreParams> { + self.base.base.keystore_params() + } + + fn base_path(&self) -> Result> { + Ok(self + .shared_params() + .base_path() + .or_else(|| self.base_path.clone().map(Into::into))) + } + + fn rpc_http(&self, default_listen_port: u16) -> Result> { + self.base.base.rpc_http(default_listen_port) + } + + fn rpc_ipc(&self) -> Result> { + self.base.base.rpc_ipc() + } + + fn rpc_ws(&self, default_listen_port: u16) -> Result> { + self.base.base.rpc_ws(default_listen_port) + } + + fn prometheus_config(&self, default_listen_port: u16) -> Result> { + self.base.base.prometheus_config(default_listen_port) + } + + fn init(&self) -> Result<()> { + unreachable!("PolkadotCli is never initialized; qed"); + } + + fn chain_id(&self, is_dev: bool) -> Result { + let chain_id = self.base.base.chain_id(is_dev)?; + + Ok(if chain_id.is_empty() { self.chain_id.clone().unwrap_or_default() } else { chain_id }) + } + + fn role(&self, is_dev: bool) -> Result { + self.base.base.role(is_dev) + } + + fn transaction_pool(&self) -> Result { + self.base.base.transaction_pool() + } + + fn state_cache_child_ratio(&self) -> Result> { + self.base.base.state_cache_child_ratio() + } + + fn rpc_methods(&self) -> Result { + self.base.base.rpc_methods() + } + + fn rpc_ws_max_connections(&self) -> Result> { + self.base.base.rpc_ws_max_connections() + } + + fn rpc_cors(&self, is_dev: bool) -> Result>> { + self.base.base.rpc_cors(is_dev) + } + + fn telemetry_external_transport(&self) -> Result> { + self.base.base.telemetry_external_transport() + } + + fn default_heap_pages(&self) -> Result> { + self.base.base.default_heap_pages() + } + + fn force_authoring(&self) -> Result { + self.base.base.force_authoring() + } + + fn disable_grandpa(&self) -> Result { + self.base.base.disable_grandpa() + } + + fn max_runtime_instances(&self) -> Result> { + self.base.base.max_runtime_instances() + } + + fn announce_block(&self) -> Result { + self.base.base.announce_block() + } + + fn telemetry_endpoints( + &self, + chain_spec: &Box, + ) -> Result> { + self.base.base.telemetry_endpoints(chain_spec) + } +} diff --git a/node/src/lib.rs b/node/src/lib.rs new file mode 100644 index 0000000..f9b778a --- /dev/null +++ b/node/src/lib.rs @@ -0,0 +1,19 @@ +// Copyright (C) 2018-2021 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 +// +// This program 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. +// +// This program 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 this program. If not, see . + +pub mod chain_spec; +mod rpc; +pub mod service; diff --git a/node/src/rpc.rs b/node/src/rpc.rs index 266367c..7054fd2 100644 --- a/node/src/rpc.rs +++ b/node/src/rpc.rs @@ -23,15 +23,20 @@ use std::sync::Arc; -use canvas_runtime::{opaque::Block, AccountId, Balance, BlockNumber, Hash, Index}; +use canvas_runtime::{opaque::Block, AccountId, Balance, BlockNumber, Hash, Index as Nonce}; use pallet_contracts_rpc::{Contracts, ContractsApi}; -pub use sc_rpc_api::DenyUnsafe; + +use sc_client_api::AuxStore; +pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; -/// Full client dependencies. +/// A type representing all RPC extensions. +pub type RpcExtension = jsonrpc_core::IoHandler; + +/// Full client dependencies pub struct FullDeps { /// The client instance to use. pub client: Arc, @@ -41,17 +46,21 @@ pub struct FullDeps { pub deny_unsafe: DenyUnsafe, } -/// Instantiate all full RPC extensions. -pub fn create_full(deps: FullDeps) -> jsonrpc_core::IoHandler +/// Instantiate all RPC extensions. +pub fn create_full(deps: FullDeps) -> RpcExtension where - C: ProvideRuntimeApi, - C: HeaderBackend + HeaderMetadata + 'static, - C: Send + Sync + 'static, - C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: pallet_contracts_rpc::ContractsRuntimeApi, + C: ProvideRuntimeApi + + HeaderBackend + + AuxStore + + HeaderMetadata + + Send + + Sync + + 'static, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, + C::Api: substrate_frame_rpc_system::AccountNonceApi, + C::Api: pallet_contracts_rpc::ContractsRuntimeApi, C::Api: BlockBuilder, - P: TransactionPool + 'static, + P: TransactionPool + Sync + Send + 'static, { use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi}; use substrate_frame_rpc_system::{FullSystem, SystemApi}; @@ -60,10 +69,7 @@ where let FullDeps { client, pool, deny_unsafe } = deps; io.extend_with(SystemApi::to_delegate(FullSystem::new(client.clone(), pool, deny_unsafe))); - io.extend_with(TransactionPaymentApi::to_delegate(TransactionPayment::new(client.clone()))); - - // Contracts RPC API extension io.extend_with(ContractsApi::to_delegate(Contracts::new(client.clone()))); io diff --git a/node/src/service.rs b/node/src/service.rs index 4be4c75..1d459cf 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -16,64 +16,89 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. -use canvas_runtime::{self, opaque::Block, RuntimeApi}; -use sc_client_api::{ExecutorProvider, RemoteBackend}; -use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams}; -pub use sc_executor::NativeElseWasmExecutor; -use sc_finality_grandpa::SharedVoterState; -use sc_keystore::LocalKeystore; -use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; -use sc_telemetry::{Telemetry, TelemetryWorker}; +// std +use std::sync::Arc; + +// Local Runtime Types +use canvas_runtime::{ + opaque::Block, AccountId, Balance, BlockNumber, Hash, Index as Nonce, RuntimeApi, +}; + +// Cumulus Imports +use cumulus_client_consensus_aura::{ + build_aura_consensus, BuildAuraConsensusParams, SlotProportion, +}; +use cumulus_client_consensus_common::ParachainConsensus; +use cumulus_client_network::build_block_announce_validator; +use cumulus_client_service::{ + prepare_node_config, start_collator, start_full_node, StartCollatorParams, StartFullNodeParams, +}; +use cumulus_primitives_core::ParaId; + +// Substrate Imports +use sc_client_api::ExecutorProvider; +use sc_executor::native_executor_instance; +pub use sc_executor::NativeExecutor; +use sc_network::NetworkService; +use sc_service::{Configuration, PartialComponents, Role, TFullBackend, TFullClient, TaskManager}; +use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; +use sp_api::ConstructRuntimeApi; use sp_consensus::SlotData; -use sp_consensus_aura::sr25519::AuthorityPair as AuraPair; -use std::{sync::Arc, time::Duration}; - -// Our native executor instance. -pub struct ExecutorDispatch; - -impl sc_executor::NativeExecutionDispatch for ExecutorDispatch { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - canvas_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - canvas_runtime::native_version() - } -} - -type FullClient = - sc_service::TFullClient>; -type FullBackend = sc_service::TFullBackend; -type FullSelectChain = sc_consensus::LongestChain; - -pub fn new_partial( +use sp_keystore::SyncCryptoStorePtr; +use sp_runtime::traits::BlakeTwo256; +use substrate_prometheus_endpoint::Registry; + +// Native executor instance. +native_executor_instance!( + pub ParachainRuntimeExecutor, + canvas_runtime::api::dispatch, + canvas_runtime::native_version, + frame_benchmarking::benchmarking::HostFunctions, +); + +/// Starts a `ServiceBuilder` for a full service. +/// +/// Use this macro if you don't actually need the full service, but just the builder in order to +/// be able to perform chain operations. +pub fn new_partial( config: &Configuration, + build_import_queue: BIQ, ) -> Result< - sc_service::PartialComponents< - FullClient, - FullBackend, - FullSelectChain, - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - ( - sc_finality_grandpa::GrandpaBlockImport< - FullBackend, - Block, - FullClient, - FullSelectChain, - >, - sc_finality_grandpa::LinkHalf, - Option, - ), + PartialComponents< + TFullClient, + TFullBackend, + (), + sc_consensus::DefaultImportQueue>, + sc_transaction_pool::FullPool>, + (Option, Option), >, - ServiceError, -> { - if config.keystore_remote.is_some() { - return Err(ServiceError::Other(format!("Remote Keystores are not supported."))) - } - + sc_service::Error, +> +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::Metadata + + sp_session::SessionKeys + + sp_api::ApiExt< + Block, + StateBackend = sc_client_api::StateBackendFor, Block>, + > + sp_offchain::OffchainWorkerApi + + sp_block_builder::BlockBuilder, + sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, + Executor: sc_executor::NativeExecutionDispatch + 'static, + BIQ: FnOnce( + Arc>, + &Configuration, + Option, + &TaskManager, + ) -> Result< + sc_consensus::DefaultImportQueue>, + sc_service::Error, + >, +{ let telemetry = config .telemetry_endpoints .clone() @@ -85,27 +110,20 @@ pub fn new_partial( }) .transpose()?; - let executor = NativeElseWasmExecutor::::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - ); - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::( + sc_service::new_full_parts::( &config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), - executor, )?; let client = Arc::new(client); + let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle()); + let telemetry = telemetry.map(|(worker, telemetry)| { task_manager.spawn_handle().spawn("telemetry", worker.run()); telemetry }); - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - let transaction_pool = sc_transaction_pool::BasicPool::new_full( config.transaction_pool.clone(), config.role.is_authority().into(), @@ -114,375 +132,343 @@ pub fn new_partial( client.clone(), ); - let (grandpa_block_import, grandpa_link) = sc_finality_grandpa::block_import( + let import_queue = build_import_queue( client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - telemetry.as_ref().map(|x| x.handle()), + config, + telemetry.as_ref().map(|telemetry| telemetry.handle()), + &task_manager, )?; - let slot_duration = sc_consensus_aura::slot_duration(&*client)?.slot_duration(); - - let import_queue = - sc_consensus_aura::import_queue::(ImportQueueParams { - block_import: grandpa_block_import.clone(), - justification_import: Some(Box::new(grandpa_block_import.clone())), - client: client.clone(), - create_inherent_data_providers: move |_, ()| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( - *timestamp, - slot_duration, - ); - - Ok((timestamp, slot)) - }, - spawner: &task_manager.spawn_essential_handle(), - can_author_with: sp_consensus::CanAuthorWithNativeVersion::new( - client.executor().clone(), - ), - registry: config.prometheus_registry(), - check_for_equivocation: Default::default(), - telemetry: telemetry.as_ref().map(|x| x.handle()), - })?; - - Ok(sc_service::PartialComponents { - client, + let params = PartialComponents { backend, - task_manager, + client, import_queue, keystore_container, - select_chain, + task_manager, transaction_pool, - other: (grandpa_block_import, grandpa_link, telemetry), - }) -} + select_chain: (), + other: (telemetry, telemetry_worker_handle), + }; -fn remote_keystore(_url: &String) -> Result, &'static str> { - // FIXME: here would the concrete keystore be built, - // must return a concrete type (NOT `LocalKeystore`) that - // implements `CryptoStore` and `SyncCryptoStore` - Err("Remote Keystore not supported.") + Ok(params) } -/// Builds a new service for a full client. -pub fn new_full(mut config: Configuration) -> Result { - let sc_service::PartialComponents { - client, - backend, - mut task_manager, - import_queue, - mut keystore_container, - select_chain, - transaction_pool, - other: (block_import, grandpa_link, mut telemetry), - } = new_partial(&config)?; - - if let Some(url) = &config.keystore_remote { - match remote_keystore(url) { - Ok(k) => keystore_container.set_remote_keystore(k), - Err(e) => - return Err(ServiceError::Other(format!( - "Error hooking up remote keystore for {}: {}", - url, e - ))), - }; +/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. +/// +/// This is the actual implementation that is abstract over the executor and the runtime api. +#[sc_tracing::logging::prefix_logs_with("Parachain")] +async fn start_node_impl( + parachain_config: Configuration, + polkadot_config: Configuration, + id: ParaId, + _rpc_ext_builder: RB, + build_import_queue: BIQ, + build_consensus: BIC, +) -> sc_service::error::Result<(TaskManager, Arc>)> +where + RuntimeApi: ConstructRuntimeApi> + + Send + + Sync + + 'static, + RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::Metadata + + sp_session::SessionKeys + + sp_api::ApiExt< + Block, + StateBackend = sc_client_api::StateBackendFor, Block>, + > + sp_offchain::OffchainWorkerApi + + sp_block_builder::BlockBuilder + + cumulus_primitives_core::CollectCollationInfo + + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + + substrate_frame_rpc_system::AccountNonceApi + + pallet_contracts_rpc::ContractsRuntimeApi, + sc_client_api::StateBackendFor, Block>: sp_api::StateBackend, + Executor: sc_executor::NativeExecutionDispatch + 'static, + RB: Fn( + Arc>, + ) -> Result, sc_service::Error> + + Send + + 'static, + BIQ: FnOnce( + Arc>, + &Configuration, + Option, + &TaskManager, + ) -> Result< + sc_consensus::DefaultImportQueue>, + sc_service::Error, + > + 'static, + BIC: FnOnce( + Arc>, + Option<&Registry>, + Option, + &TaskManager, + &polkadot_service::NewFull, + Arc>>, + Arc>, + SyncCryptoStorePtr, + bool, + ) -> Result>, sc_service::Error>, +{ + if matches!(parachain_config.role, Role::Light) { + return Err("Light client not supported!".into()) } - config.network.extra_sets.push(sc_finality_grandpa::grandpa_peers_set_config()); - let warp_sync = Arc::new(sc_finality_grandpa::warp_proof::NetworkProvider::new( - backend.clone(), - grandpa_link.shared_authority_set().clone(), - )); + let parachain_config = prepare_node_config(parachain_config); + + let params = new_partial::(¶chain_config, build_import_queue)?; + let (mut telemetry, telemetry_worker_handle) = params.other; + + let relay_chain_full_node = + cumulus_client_service::build_polkadot_full_node(polkadot_config, telemetry_worker_handle) + .map_err(|e| match e { + polkadot_service::Error::Sub(x) => x, + s => format!("{}", s).into(), + })?; + + let client = params.client.clone(); + let backend = params.backend.clone(); + let block_announce_validator = build_block_announce_validator( + relay_chain_full_node.client.clone(), + id, + Box::new(relay_chain_full_node.network.clone()), + relay_chain_full_node.backend.clone(), + ); - let (network, system_rpc_tx, network_starter) = + let force_authoring = parachain_config.force_authoring; + let validator = parachain_config.role.is_authority(); + let prometheus_registry = parachain_config.prometheus_registry().cloned(); + let transaction_pool = params.transaction_pool.clone(); + let mut task_manager = params.task_manager; + let import_queue = cumulus_client_service::SharedImportQueue::new(params.import_queue); + let (network, system_rpc_tx, start_network) = sc_service::build_network(sc_service::BuildNetworkParams { - config: &config, + config: ¶chain_config, client: client.clone(), transaction_pool: transaction_pool.clone(), spawn_handle: task_manager.spawn_handle(), - import_queue, + import_queue: import_queue.clone(), on_demand: None, - block_announce_validator_builder: None, - warp_sync: Some(warp_sync), + block_announce_validator_builder: Some(Box::new(|_| block_announce_validator)), + warp_sync: None, })?; - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - - let role = config.role.clone(); - let force_authoring = config.force_authoring; - let backoff_authoring_blocks: Option<()> = None; - let name = config.network.node_name.clone(); - let enable_grandpa = !config.disable_grandpa; - let prometheus_registry = config.prometheus_registry().cloned(); - let rpc_extensions_builder = { let client = client.clone(); - let pool = transaction_pool.clone(); + let transaction_pool = transaction_pool.clone(); Box::new(move |deny_unsafe, _| { - let deps = - crate::rpc::FullDeps { client: client.clone(), pool: pool.clone(), deny_unsafe }; + let deps = crate::rpc::FullDeps { + client: client.clone(), + pool: transaction_pool.clone(), + deny_unsafe, + }; Ok(crate::rpc::create_full(deps)) }) }; - let _rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { - network: network.clone(), - client: client.clone(), - keystore: keystore_container.sync_keystore(), - task_manager: &mut task_manager, - transaction_pool: transaction_pool.clone(), - rpc_extensions_builder, + sc_service::spawn_tasks(sc_service::SpawnTasksParams { on_demand: None, remote_blockchain: None, - backend, + rpc_extensions_builder, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + task_manager: &mut task_manager, + config: parachain_config, + keystore: params.keystore_container.sync_keystore(), + backend: backend.clone(), + network: network.clone(), system_rpc_tx, - config, telemetry: telemetry.as_mut(), })?; - if role.is_authority() { - let proposer_factory = sc_basic_authorship::ProposerFactory::new( - task_manager.spawn_handle(), + let announce_block = { + let network = network.clone(); + Arc::new(move |hash, data| network.announce_block(hash, data)) + }; + + if validator { + let parachain_consensus = build_consensus( client.clone(), - transaction_pool, prometheus_registry.as_ref(), - telemetry.as_ref().map(|x| x.handle()), - ); - - let can_author_with = - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); - - let slot_duration = sc_consensus_aura::slot_duration(&*client)?; - let raw_slot_duration = slot_duration.slot_duration(); - - let aura = sc_consensus_aura::start_aura::( - StartAuraParams { - slot_duration, - client: client.clone(), - select_chain, - block_import, - proposer_factory, - create_inherent_data_providers: move |_, ()| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( - *timestamp, - raw_slot_duration, - ); - - Ok((timestamp, slot)) - }, - force_authoring, - backoff_authoring_blocks, - keystore: keystore_container.sync_keystore(), - can_author_with, - sync_oracle: network.clone(), - justification_sync_link: network.clone(), - block_proposal_slot_portion: SlotProportion::new(2f32 / 3f32), - max_block_proposal_slot_portion: None, - telemetry: telemetry.as_ref().map(|x| x.handle()), - }, + telemetry.as_ref().map(|t| t.handle()), + &task_manager, + &relay_chain_full_node, + transaction_pool, + network, + params.keystore_container.sync_keystore(), + force_authoring, )?; - // the AURA authoring task is considered essential, i.e. if it - // fails we take down the service with it. - task_manager.spawn_essential_handle().spawn_blocking("aura", aura); - } + let spawner = task_manager.spawn_handle(); - // if the node isn't actively participating in consensus then it doesn't - // need a keystore, regardless of which protocol we use below. - let keystore = - if role.is_authority() { Some(keystore_container.sync_keystore()) } else { None }; - - let grandpa_config = sc_finality_grandpa::Config { - // FIXME #1578 make this available through chainspec - gossip_duration: Duration::from_millis(333), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore, - local_role: role, - telemetry: telemetry.as_ref().map(|x| x.handle()), - }; + let params = StartCollatorParams { + para_id: id, + block_status: client.clone(), + announce_block, + client: client.clone(), + task_manager: &mut task_manager, + relay_chain_full_node, + spawner, + parachain_consensus, + import_queue, + }; - if enable_grandpa { - // start the full GRANDPA voter - // NOTE: non-authorities could run the GRANDPA observer protocol, but at - // this point the full voter should provide better guarantees of block - // and vote data availability than the observer. The observer has not - // been tested extensively yet and having most nodes in a network run it - // could lead to finality stalls. - let grandpa_config = sc_finality_grandpa::GrandpaParams { - config: grandpa_config, - link: grandpa_link, - network, - voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(), - prometheus_registry, - shared_voter_state: SharedVoterState::empty(), - telemetry: telemetry.as_ref().map(|x| x.handle()), + start_collator(params).await?; + } else { + let params = StartFullNodeParams { + client: client.clone(), + announce_block, + task_manager: &mut task_manager, + para_id: id, + relay_chain_full_node, }; - // the GRANDPA voter task is considered infallible, i.e. - // if it fails we take down the service with it. - task_manager.spawn_essential_handle().spawn_blocking( - "grandpa-voter", - sc_finality_grandpa::run_grandpa_voter(grandpa_config)?, - ); + start_full_node(params)?; } - network_starter.start_network(); - Ok(task_manager) -} - -/// Builds a new service for a light client. -pub fn new_light(mut config: Configuration) -> Result { - let telemetry = config - .telemetry_endpoints - .clone() - .filter(|x| !x.is_empty()) - .map(|endpoints| -> Result<_, sc_telemetry::Error> { - let worker = TelemetryWorker::new(16)?; - let telemetry = worker.handle().new_telemetry(endpoints); - Ok((worker, telemetry)) - }) - .transpose()?; - - let executor = NativeElseWasmExecutor::::new( - config.wasm_method, - config.default_heap_pages, - config.max_runtime_instances, - ); + start_network.start_network(); - let (client, backend, keystore_container, mut task_manager, on_demand) = - sc_service::new_light_parts::( - &config, - telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), - executor, - )?; - - let mut telemetry = telemetry.map(|(worker, telemetry)| { - task_manager.spawn_handle().spawn("telemetry", worker.run()); - telemetry - }); - - config.network.extra_sets.push(sc_finality_grandpa::grandpa_peers_set_config()); - - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - - let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( - config.transaction_pool.clone(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), - on_demand.clone(), - )); - - let (grandpa_block_import, grandpa_link) = sc_finality_grandpa::block_import( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - telemetry.as_ref().map(|x| x.handle()), - )?; - - let slot_duration = sc_consensus_aura::slot_duration(&*client)?.slot_duration(); + Ok((task_manager, client)) +} - let import_queue = - sc_consensus_aura::import_queue::(ImportQueueParams { - block_import: grandpa_block_import.clone(), - justification_import: Some(Box::new(grandpa_block_import.clone())), - client: client.clone(), - create_inherent_data_providers: move |_, ()| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); +/// Build the import queue for the the parachain runtime. +pub fn parachain_build_import_queue( + client: Arc>, + config: &Configuration, + telemetry: Option, + task_manager: &TaskManager, +) -> Result< + sc_consensus::DefaultImportQueue< + Block, + TFullClient, + >, + sc_service::Error, +> { + 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_duration( + *time, + slot_duration.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) +} - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( - *timestamp, - slot_duration, +/// Start a normal parachain node. +pub async fn start_node( + parachain_config: Configuration, + polkadot_config: Configuration, + id: ParaId, +) -> sc_service::error::Result<( + TaskManager, + Arc>, +)> { + start_node_impl::( + parachain_config, + polkadot_config, + id, + |_| Ok(Default::default()), + parachain_build_import_queue, + |client, + prometheus_registry, + telemetry, + task_manager, + relay_chain_node, + transaction_pool, + sync_oracle, + keystore, + force_authoring| { + let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; + + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry.clone(), + telemetry.clone(), + ); + + let relay_chain_backend = relay_chain_node.backend.clone(); + let relay_chain_client = relay_chain_node.client.clone(); + Ok(build_aura_consensus::< + sp_consensus_aura::sr25519::AuthorityPair, + _, + _, + _, + _, + _, + _, + _, + _, + _, + >(BuildAuraConsensusParams { + proposer_factory, + create_inherent_data_providers: move |_, (relay_parent, validation_data)| { + let parachain_inherent = + cumulus_primitives_parachain_inherent::ParachainInherentData::create_at_with_client( + relay_parent, + &relay_chain_client, + &*relay_chain_backend, + &validation_data, + id, ); + async move { + let time = sp_timestamp::InherentDataProvider::from_system_time(); - Ok((timestamp, slot)) - }, - spawner: &task_manager.spawn_essential_handle(), - can_author_with: sp_consensus::NeverCanAuthor, - registry: config.prometheus_registry(), - check_for_equivocation: Default::default(), - telemetry: telemetry.as_ref().map(|x| x.handle()), - })?; - - let warp_sync = Arc::new(sc_finality_grandpa::warp_proof::NetworkProvider::new( - backend.clone(), - grandpa_link.shared_authority_set().clone(), - )); - - let (network, system_rpc_tx, network_starter) = - sc_service::build_network(sc_service::BuildNetworkParams { - config: &config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - spawn_handle: task_manager.spawn_handle(), - import_queue, - on_demand: Some(on_demand.clone()), - block_announce_validator_builder: None, - warp_sync: Some(warp_sync), - })?; - - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - - let enable_grandpa = !config.disable_grandpa; - if enable_grandpa { - let name = config.network.node_name.clone(); - - let config = sc_finality_grandpa::Config { - gossip_duration: std::time::Duration::from_millis(333), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore: None, - local_role: config.role.clone(), - telemetry: telemetry.as_ref().map(|x| x.handle()), - }; - - task_manager.spawn_handle().spawn_blocking( - "grandpa-observer", - sc_finality_grandpa::run_grandpa_observer(config, grandpa_link, network.clone())?, - ); - } - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - remote_blockchain: Some(backend.remote_blockchain()), - transaction_pool, - task_manager: &mut task_manager, - on_demand: Some(on_demand), - rpc_extensions_builder: Box::new(|_, _| Ok(())), - config, - client, - keystore: keystore_container.sync_keystore(), - backend, - network, - system_rpc_tx, - telemetry: telemetry.as_mut(), - })?; + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_duration( + *time, + slot_duration.slot_duration(), + ); - network_starter.start_network(); - Ok(task_manager) + let parachain_inherent = parachain_inherent.ok_or_else(|| { + Box::::from( + "Failed to create parachain inherent", + ) + })?; + Ok((time, slot, parachain_inherent)) + } + }, + block_import: client.clone(), + relay_chain_client: relay_chain_node.client.clone(), + relay_chain_backend: relay_chain_node.backend.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), + // And a maximum of 750ms if slots are skipped + max_block_proposal_slot_portion: Some(SlotProportion::new(1f32 / 16f32)), + telemetry, + })) + }, + ) + .await } diff --git a/res/testnet-1.json b/res/testnet-1.json deleted file mode 100644 index 1d33eee..0000000 --- a/res/testnet-1.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Canvas Testnet", - "id": "canvas_testnet2", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.90.191.237/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", - "/ip4/35.204.68.28/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", - "/ip4/34.90.139.15/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", - "/ip4/35.204.99.97/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" - ], - "telemetryEndpoints": null, - "protocolId": "prc", - "properties": { - "ss58Format": 42, - "tokenDecimals": 12, - "tokenSymbol": "CAN" - }, - "consensusEngine": null, - "lightSyncState": null, - "genesis": { - "raw": { - "top": { - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000300000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x2371e21684d2fae99bcb4d579242f74a8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x5f9cc45b7a00c5899361e1c6099678dc878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da902608ff1ce2fe83971163aa4ef605c5518c64aa111a8a0e6e4eed41d6d906c7614d745e48be3cfc13b6128e1d51f4405": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x08bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98498a8f808e0050b3c0ba85c699f73280e47e2344d523c3cc5c34394b0d58b9a4200e813a038e6c5a6163cc07d70b069": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00584457049eaf05e811531058e928e9f067a93fcb2e28ff289d73ca5c2654e68170b3fd42a0f3ec00b1779f98a2bd5dee302dac000f9a4204ff3360693894a2803a97ac46bdd7768d7bfe48161aefa00a5e23d21a21bb914d08d97b4b191513b711c0105e105947298bd4f1276a6360d8cc82d4c4056d78e2005018000405888288143e5a0830c59010a84490da52c30868a0620055ccc045005608b92208090280059012c8900500bac4e0a5478bc95d58866930bbaeeb3f51c3501836afb9058f097c70e17da927f8097650a0038cf61a4d059d0ab685a9788ab18b59faf47e6256b5fac952fd8a60973eff03a9166bc993d54499051c652fb6e5e275a2a2ac6fd88e1e95ace3a56c9a8eff89b3665b96611e652fe8179716fc0573214fc05f700a180ca3804f1057c05fb017cc02ee82577099a4647d3dd645ea8529e9c1abf202e1530e83598c6d612afe939732ca7fb2a5b7359c13321535a0cbf37d7d7af49eae7ce95cf9942f66fe8925efbb9e65871c9094c54ea3345fd2215de9b45487740b51a598264d9a342d21aa7483d6bb403e2bfd45e921fe7559bf9b22fc2fcaae4fe9abe28d1b7337b0f775cdddd023fe072ea083ffba6e7d4a8f97d7b8e5e729dcb87e5d4b2ebae4ed02915afdb29e1e1177ddceb07ad522d9d29b10c59f1ccfa0376c4be134cd6702fb008e89355f486e8b6b0bc644f682d69482968452195a834d0cce7402d315a7283a1778a066dbc28d28d8706adc94c1310307528ead8b9cd2163ab40a1d53ec88f1c40e319670418c23788831448f2c3c63a39698e04d23f808e3073c3b78e106306033f841c54079d10326862d0080850c615001240c2d0108a389201bd7308e1032d308605a6186a40180c1041ac050a30630849002a3072a307030048c310400830c1f30c42002c617050023050600638b038041021bc0d8f20306081a8c0facc0400201601491002c00b5808d224fb82153020e9999a0cc070ac87460a405662ca00532c8a1056330208c235de8f0a50159160ec8aa78c01448b02720d0822576d8b8b6004b04b620010ccd04a64081275460091650e30244c0c00f92f04009992536c8800c988cc183184261bce8210c181fc26cf143182c9a84a1e20ba365288c134e9400e28827618880d246942a48492262c214358a861044192a3ad00066469519087191b1812fc4e080150e58e1020b2b57ac5c915bae185d31fa4289f90516239611cb0b366613582d56ab08ad215a4370680c41c41044d48088228828a28454049622b0685f60e900960e94be74c0880e18a16161c411461cb1e588a3238ea03842e208092590f000121ef0028b0792f0401258484289249448526209259648c2124c2cc14429084c7c80890fece003593e9045ab419626b23481d484134d3851f2c289279c78e2cb13503c018586051420800204230041142088228a28a488428a0f48a1450a2dfc6d5970a4650a2d536869a608c11421d0aa100211844004adf904116c11c19699842d23d83282d92ba68b218c002b438544a30a2e5570e9a28c18ebe605172bb858a1022bb05e315d70710509ae20c1960c0a126041022cbac8824509b02841172d09b5508288852c6415ba78e9e205b2e1450b2f5ac8242d36ae4f40da82db73af982b6ad03910b5cb4991bd0b643d20299ca6b50502e37f206bc149e134bd5f2ed6b940e0753015ba15b30233fd6ddb1e9e2bb7d4d6671bc2cff5b97ac5ace0079d03515bc434d8041bd7dd9aeddbd17cda2b660566740e44f1e9b209780bd682bd7017ce824bc0583009f80ab682b970154c058f80b7b00838043c056b6129380a060143c14fb013dc0467e10f3013bc042bc149b00718093ee223d808268287e016cbe88a150e6c40882a1aa01244d114222951a03c01c2c9d0d7e4071f7a10e281490696284982810b58a0021498800422b00304903cc0010dd0e10803725880110504e1704311a0042060d53f361cc0000520e2438021aa540d340c6006010809120020320020861ed40f185ee0f1e1d5f7e0e1c28e1d1d3a393970e0dcd8dca8e94e266ea3256d66d82523e4652e4cbb40f6443aa00ae8f84be9aecf6aff6a28fd2300ff9bc1061ae4bf00040000438060ff7efce011000cd9bfdf85187a5cff747ce4e8e0d851c341be1ba7f9ef462f4e89c86e908fd2145d221b0781dfeffa981608fc177b4feb6951f0a51a81ed81d7ea0316051f7134fc74a1e12f9e86cf00d0f0585d467d33f4a23e02347c04b60c1da2f7d5d070913a3bd7ccfbb8d767fee3c7ecf2bafcacbb40328f9e767d987f71ddbeaa8428192b91642366cd288db0fcebf0a29be277f43ed950a66484314d1a4804f6c53d44c4bd69d2346f0b5397fcae4ffc77fde2be0ebd85a81f186b11346243b322c7209c867430fecb91ffbaeb90cb8a2fef9bd2fbba86fce87d390ddf3f9025994bc0cd28a0f1eb7da8deefaab47ff399f7cd9e97a7595da06ef6cc7a681e7becd9375fced9755f4eefbf9c9edf55edf6eca7f7f1330fab40dd39233d7a888f790b51d7553f19ebc75fcf09ca885918642bc0272808218c9787f006a69ca09a0f2794b5cbf5588b62035db2e365476fc748bc7c8cdec746cc8a90874097e75b331d4f877413a29ca0fafa72409717b71b8f2aecc664738393936347e731913b41f57c86800eabbc3da7df30111407612232709028c45b9fd40289347090781c37dd748e9ceb9df4be2add9db53e9d2fb9a0d99d37d45d1e85c3fb204eb56151453887450225909241080d26192e21ddafdadd64fa1098ea4e27d3c515b92eff134d2b666b9083211b4c3d414d98ca20079451deb23a7bb9eb97d705fb725d8ebec23c23d4eacb1394995e1fac1a2366c588c580cad59f941015e1155c74b5cc915c8baee6c35a84cfde8e11d97cd9cc87675986ae00ba25a39ab1872e77033cf70ea6a6f771cfc7e76caae6d7776caafb759c259283f32f475fafd9d48d5f2f6dcae6d7e3a66e7eddb444769c9e2d9163ff341f181648fc07fbfa2e111e0e127f795fd1d5f3d9651d325d9eceda41547c562744c577c73dbffdc09cd2e3b7741cef837d53832c2adea6a618157fa31a6051f13535011015df551c202a1e06edf13be8e3cf4476836c8fe76122cb41b4d39fbcef83bd1df33ed8dfb91bdea65fd574ac7eacc68e822993f7715f8f5fd3bfebdad7e4f1254c7dd8e5f9546e43bac90149b1214d9a34bd41d4758955565f759bab1f37f79fc87d03e8785a3f9f8e2fd56fc7e878ad12c9fe500d0f53d9e33798ba1e3f81324fd56119e6155d7d5dbf3c2a175c32bd3e58367c71a1fc0abf3c9009dd5e9eaf6b78ca8ffc6f6b48237f287295cd2535951b27d8484d05e368dc767df8dfc71d6be8b8e3f7cbdd10bd49e3c635364705dbcc3495cdb43e44dc6a2936341f1e724764abd57ce682ba56f33798da86adddaed7072b325c02dd5e98fae0f7129effed17a216a2e46be8e0f7f1cb1d811f5a6f214a7ad1fb812cc80d90ff72faba1098fae61098fa3a144c7d42fafa751a604af625660863fafa0ea882abeb0b53b1bf02f475bd8329f8eb3730157ffdfa0653fcebcb7379438bc43a4c7d120553df79600a761473041a1dbf41155cc9d0b0bf1d1dbf4280a0fbe5f984743cdd9510b57b99c3fefa0fa45b4ba7cb51ef6335fdd6efbde70ab9e51a095145b1b3e7c014f6f81d14d334efd39e5db3326b0753da7cfc56bf28bda75ae5a60b51db99bb815b42d4e67ddbb36b757bab45b1e729c3e568d2ea3636eb42d48c2a24be5ad8f315f57e17c8b7f53e9ec6c993e5692d7deb7240a5f9b951deb662a7cbb1f7b19abf3572cb35ff262a3b95dc6ecd06513c1015af7d216afe10a579d3fbf6f23ff02772c5be1d44c1330784793b46aef3d983bf645d8ebd0951f05dced6edcfa892ad56abd55ac5a3d627f23f1e21bd3e5825beb8d0154047b700dd220da1a5176988a301f422b5d068ba44ba456a71d1dbdbf0ccf974482d31fa930d3ff9736e542decf9bae67f5d7fb3f7f012a6b2ef17a6e4f713a6b6577aaaee7a56afc34d566ee6ae5f59dda6cc0561bfbc0f3b760aa5915363ff81b27267751b7240f294b7ab625f6e21eabba174b9cbfbaaf4f5ac7eb3b363f5c3be1095fd2762753bab9fc4eaf6729757145b7a12a2208abf3c106368869eba6ebf185d988aff66ef972b37e58debb68429f83d8d751b56ee9630c5df53b8c5caa71c39203e85db902e5e87dc4127cf01414fd5f1e9b5418ebf9cf4e47240d15b8882ff81cbe1b01deb360b3277a13b808e9e96e7bb4ac29ef83d5d0174cc012d447df306ee85a8f81f98eae0e3690753dbf194b70ea616a2f6f13730c5dcdfecafebf8e580f83ff007c2ba636436fc6ce8ed18819787975e11377b0b519fecfd72417ce87df0fc1f0899b9a00bd3e8e0bf9c8e8fcf81a97dfc0e98e2c74ba8e2557c07532bc60aad8e5f98dafe6e3a7e79a237f45e1f2c661ce8d2d0d5f48a414309bd35745786d179bd6288504467bd6286d046736f0eba4166e8f6a22ba4db4b7ef90182314a12073207f20c398624438a91624824f902e902d902b902c982b885a805a90209465e21b5905ba4166985e422a79022905148104828e41312097984ec80c4228b9044c821642b4ec102199054c435a213e2122213620ca20ce20ce29848835803a8029802c8056401ec02828950803a802b805ec0134013c01bc03364157004708b84017c0242014100a38052402d700a1802280288026803f8454a2153c06cc02fa019b20bc8053ac144c02cb00958050f015b7088d8847806c600e6805b1007900ce4010bd200d680a7c0516029c01e4425a219b10ca3484614c31d602c5c843cb2e10006885288696416728b6885580509466c43924092912390349065709a9844f44044221ec523a211114b24220e115b300ddc026c03660162015e01a281558054806cc029c028c0240805f804e804d804b8049804680438042804f803582636c14ee035b8092c044683bd8866d80a41910851084a74e0216621421193f805947b19a2d160149ab2240349a22c11fa214912ca9187274249929496859c64604951922741f490a488891051131e9e344992442776b1421f14a2283be20a56c807156c4e4cc13a71b284499226517a4a11932544454fa020a02682d9294e9a2c2912e2218990500f3f220a164a0f4f9a24118248280829499a44e9a227424008b14487c713ac109327509e245992a449941662f2040a038a9e040185099376217ed91ea040218a92244a931fa610093dd100942442080dfd885c2c0f424f7c6832e54910499840a1d224082942498a88a04411224a52d404880c0431654834810f517878b284e8061e710b1ea03011e2a147ecb25384101a4a32658a1042469e406932658ad0036acc62a70835296a4204e587a22096d8c412ec13284d8a961005c1439222284ea6246912a5971005d138118bd5401228499a446922a12122281178d264c90f4c7ae8e1488d57ac50d1121e9a3859422589501042413400090f423ef8b0040900a2153b658889d00f4caad829454f8488847e78d2e4918a274d7ad8892358264da63c69425454452889104ea244599284488807274d82580d3181e264b52386608148b2a468090f4b8a8472a889536ca08993254d8a9a3c6982139dd82126509c6420895051104c84aa08dd881f58222808d876b03132315808d3cba28bd46a35b3a20ec63060187014ce640c4162882186dddd20cc0c75e8d0d1611da9233732eb608e01084084acc3cc3032cb187578d96462d6a15d10323feae8b029c617987558c608a38e49470742203b20c710eac07819384e0707009d1875b66ddb74b62d6edba613b74d27428cb98de3a613a18ed49152ca18a494529a648f942819a5949a8e0e29a526371921d4f90175a0d4e1628c5146082333845147076e114218228c3a9aa6f10b1b2184324266e6f1b1a31371a04e641d8f52eae89838469d08a54e843a7420d4913a3a9163943922431d8e3ad18311c6faebe8e844d94347461e3a31ea481d2e3233c4724418238c3172d41159c6a88363d4b1ec022febecd8e1a81363d4e118a38e0e73d4893a3a514747877975e86c84261d1d1d8ee3384e7e912888393e4071a2f3e3a49343c71093251970e2044a0c3874dc101a4a525445e8098f1b3a37538aa634a922c415315932e5c912a2a224454d8000020aaa490f4244513c9c9d1b53847c78b2e40726dee9895094284b7600d1a4e84910441e4e0f4541b8805345e88724454f9a104549c2644a132076dcf0204424c403119424a91a66106a425414030d2917aa40d140118f253f4ce131b4840913a1a1540d33fc66c80c02483283d0d012271948e2c393263f4c59f2c307e0a4c990109b1f378aa04041d52c112242753f4e444b849c304922e4c3122228455392f0e0a4c90f4c9214390962490f423cf49880e00185887a484204a5680913284e9c2cd9c115112d299af26306a2292f6c3c084d992244140508284c9210095181c2448828c992293c30114a2280a1540d33446122344585fdc0a468490692fc30a5c993263da0a8103d342112a2e2a34424f444c887240410400d35ccc0835012284551842062f2c20b535803424fae1509f990e473080a951d9950d1922645153ed100141e88960815251162f26449d194274d92548192011e9e2c9992a4a88ad00f2a4f8422b60248f2044a9329444254923811a222e4244995254024f1e149131f7c80e224495115a11e549e08c59a85421041014208088cca13a128e4e404dc6519b18c8c8c58172b3362492546d76564c462654646cb6295942ccbc88835952c8b599851645d4a768d8c585189116f54b246ac84c546ac648d8c8ca2122336622546cc323232924a8cd8c8082a592323a884b54a8c8c5851098b8d8c8c58981216b38c8c5852098b578911b358c9b2582c9654b22c1654b22c864a58cc62b1a212213008bcbb0cc494251b7c1c38fe03b52f17b92652b297ce8da37e53588de3fcbdb7c79eebd9e93635bf893ddc71beabd2f98defaa74dcf45dd5cebbeff69dbadb83e37d399d5d47ddedb9f1beaeb3ebd4dd1e1befdb6f78dfeced27ef9b26efeb7a7b8df775db795f4e6fe7bc2fa7bf6f759fd54f49a5c2cdffb8b92f778436f71f08c41d47a55f6e01acc6e1ed74cfbe793b386c9b5e73faadf1763a0f87edeedbb32ee34eb9cae5e0b8c1b139fda3d2a34da7d2a36f9c72949ed69d1ce74e73680e1cf47bbadd6cdbb7ba7373ee1b0e11f77663b37dbf6dcf4e59973dab3ba773c761fb4657f37df79ad7d4aeee9c3c1cb64d9eec41f7fe8aaee6beff8aaecebecfce9dab1f6b068e3b3bad4e62671e15d83f742c851bdb7ce8f8ff8152b067d7ea7e56e6c682709a7f7943901a45d64dac3aa0a720ec18f61fd8d9e1e763f6f92bc66b663152e1798c1766cfbcf70ffc81ded0fcc5d1b81db9bc0da2f6d9e39c5d7760dda138fcf4ae0c5f961581cf3e2b7c0c82cf66f61f789d089b9a9684d522aca5d8d01aa6d5eb18166bd1d6526c68ac7ef07afcb815c092c1cbea173f349f9d46a2ed444558d31349d9a456ab8b6eb4f6a2ad4ba7dbf66ddb925adbeac71db77a9d9a69edb454a5d8d0bc40e663fd60cf52dd8ebfe6edca00b922d7a717ff1333ecaa1fd3b8c55a843b4aaf83a83dabc4330554a8fb7662ae58a377f48ab9e2064d4f2c7aba5150a9a5c434521a753c5f6ab4f4a4c43469a6bce63d99de37ef849582a4bebc27ffa2f759f97247f68c2c3dbd2e18bdfe19f577d5efd29e18000b525f4ff68c2c7dfddb404fedd2c1cb0b82a441c6f4be78b897357e390afcc02dab4c0aa7e92e2d1c434841114b68b556dca5e5c2122580820bd10b5c5030a6551465d5e82ead206990d1a262002c485536d0d7bb10b16aac32afb56aacd6b3b2377a4285153e18a28d566b85792d2cadd6e57dfc188593404d118690c5168a489366b5bf81469015232666931a9ec24d837ff4b7de1a4ed687484877c1ce5a275c7e62dee5613102c8eafa91cd4af21a3075d3f073d2bc0644c10be9efa6bf5d43072c4cba8fd76868057b4eec61ad960a5bbea8e20b30665aadd575b892b5254dc0040988b8c2052b2c460059c91fd9acb0633102aeb21f1d60257fd5a303acac7c41226f4502f2d7ad7c4192fdf2ace0107be033cfca1724d7a567e5f2868c1923ff6d99adc21134e8e2841f6c51041da01a5efaa0db150b0466b8800a2ac628a38229ac7685fd1b82e4add64aae01533f1a1ee3d69e6291de915cc95f1e16230ab0923f92ab2bfe53753c91908e9e945377b9feb1fadb7fbb46c3e5565f7563cf5ed67d52af0f23c98230cb82caf591df5f9506888a5e5ac8972324aab2c7a3a26a4a88ba1e3f647dbe40aec7f75c3d5f8e8e39b0e77a14734596fe68e8f81cebc31d2956996d20eb72cdc65d5724d1391075c9ff406f21ea5a20fbe5e402592409610fa8bc5c2e9eeb926ec7081366eb06535f2e3eaab07ce15fdece156d74ceaa6bb55aad15bcacdc5b3b1a2481a6254c61f4fbd54ada8574a95473b4fdfa70fd0211d27b2c087bc5b87466ae8876e2a6cb012dd7741055baf679e6807ee20f9c55aba54ab14a85fb632adca5d2b1ba2d21c76892127ba7486ced9af705b2e7c66ac91b9ad7ce49998d7db91ce635efc44536ba78f8ec3b216abf79ade47dac2e9dab56bf1bb8d5521849fb4fe40a5faaf13f50db60ddac0269acd68f7bd6efda614f0a37e66d19ad5603a09703ba9ea052560c7443f23ffa6bfe27a43116864309bbfec94f5bc01ea131afcb857deb75acee10248d31d2acf6b27e565a7ed99db0b6f4fc67d4d88a39caa28bb8a7f764d5c8bc2e56f646ac1424ad2eaff55969ccfbe43f4dd61f4d79bb28b0676459ed8f8e46cc8211a2b149ba1593841acdad8ea7276e353c5561a01bda6f7fdc82bd629260a3f9080fd1d1fbb8c5458f4afd58bd41a596ff368d962712d2d29372eaf86fd3f4b75bb7b75ea0e3732fac61cf9c944be93a7a0b51dc22832e4c69c9128f620b4dd2193365c88c410a03c60b172d59e0116ca1493a63a60c99314861c078e1a225cb11b7aa44f941890474c0e1678810d473bad833a39c33931b7bb440914589a30bcbd56a030d1b496b9c51c34c10caa041c68c3165208911a60b305c78c182cb162d50b4cc22959047128b6cb581868da435fa8c1a668250060d32d10c881a5306921861ba00c385f7cd5eb8d00b8cdf7819b1687928b7f7b1462e10c5d0e3d5fe0707f48af1ba68bc60bcaea9c26636630fcb7f57955142d4e56d9450f2806a1a88f3e200941b55bc3d9a0678769412a67851f22b83e44ad32e10f91f28a3f7b124f46018944a9eb3bbb191f1868ebf2919a58cfcedca5d795af96f36c718a327cf3d78367b9fa4d71504ba30859da5c4346d349fb91c384d4b8969d25cd0a8212f90f8a0ce2e0e34e445c5432e48f6751a373e56833c22f9a2d944455d0c12bf6ca5b9a0d890bb8e556e7a6d1815d8f214db2297436c79ca117234655fae48eccc93125b9e8f5ddec76a7806c22c8ca119508585de88afa8f78587f81a7683032322ffddb8e93d567b2c2ac887d35fce4d7f3938dfd08d4d006e9cd8dc006203c48d1a196e3ca9e9005003a53bc5d04539997a4e524c1cca44c46d3fb8291b85612ba2a5176810258da744459b3e340dcccc9b5532ac6642b4c472de10ebeb71032daf1e920397e411adc8e802bc12e102b90e3920ec3bd6870f9f0353dc10f33ea3aebc40ae53c95c768a65519b1df68c3bc297a7b2ea903ce8f8dbd8330e08f3541d63fc20f63c3923d031d5b65d9f95ac738343d61e8b82a775610f0369181a1ec7faf05820f0f0374c64070781873903c89121e7859cd6ce55cb81298d53256ecdfbf8d729cd8c662592344ac8d75e26ecdec7c2ea2e904b83352890a20cb82d1399ad5e2682b5b66522b2d57b7a6dcb44606b5b26b2bb3e587fb257724518a9f7d787b16ab907fec37a4f65bd1ab2aae31c08a3bc3069fa8cb0347b52384d4b8f882f85d5ea226ebe4e2fa70056b3b72bc317352e68aee488020953183667368774180724251265dfbe3939b18700dd3704aa7080a90f25c3900298d1f0aaf5e1c9791f3734fd2b82adbdf4ad4a316ab5e9b37eac3e9d6aa53acde8b4ed3f90ca2dab5c2f97c3a9e7b37a325522d3647576fee482b2c7631c50f6c815e1feb2d3d36bcb84685336b7691d8adf2e7908b0c2914631cec889ebc805f145b30daba75e2e076862ac8b7956d3d3f2c8f5e1785bcec8a9336c3929dceaec5725ba5e8465de2e902ffb3c9fc2ae1b0253430a701e1a1afeb43e2cd7e7d4f3903b321f7f7141d9a7c75c910cf3beacb1f8037f205685908c048d8044128d02921a4865206f34ed02d91ea8482e922d657311be944dc38f677926029c9fd6da4615fdd7c9edfaca7f1b964dad4437ce74ea6a6ed8dce0e0c891a3a36367c775ca63ab588cd8ce6aade8b7e5594d1702d7594d6180619b15fed8668dacdabe25566d5e0220aba8b7b0e7bbd1f014b5cd2abb547b81c01f88a4a7679b358b21866dd6a90100009730c500d866d57a612a5ebbf609537ced280e48f354ddd6dd75aa43eea0db31a27d7e5efbf5f81e0e287aaa4ee3e66395bd9ce615c1962f821d4f9933221f61b81e20830cdbac1488c411804d5eee75e68e5c8f07000c4000b6594f41826cb37642846cb3d6084000dbac3766d066d866b5e9010c609bf586061ab659716aa8619b15472ab5cd9a43a5da66cd1932649b55870004d866d5e1e3b3cdba4384c836eb8e0214609bd5050318609b95c7010eb0cddac3061bb659fff3b3cd5abbb759bdd56a9bd5070210b0cdca9380046cb3be0004b4cd0a439122dbac3f6eb8619b1585030edbac3d41fc2dd2b7481db4cd1a43d3fa85bf2c035784fb07a2e0b59a0088827740c7a70a3062649b150039449cde530630609b55862ed56de6e263dd05a2c32661aa745aaa5737609b154853ad12155d67b55a3b45b22d546d1dcdead55cb73a630f843b6cb306d1ea2e4a02db46d59269b55a43ace8d7cdd803859c478804b65985f4065375b7e7bb8e9d4e609b954dd09402dbacbc45d30a6cb3b2164d2db0cdca5e9a5e609b95bb34c5c0362b67d134c9362b97a0a9926d56c6a2e9926d562641d30c6cb3f2154d996cb3b2154d79d866652e4d85b659b98aa63d6cb332154d7dd866e51134fd619b95b7346db2cdca2268fa6db372089a0e6db3f2144d9d6cb3b296a6406cb3b2144d9f6cb372144da16cb332089a46d96665289a4ad966e5279a126db3b2134da76cb372134d8bb659394bd320b659f9034da96cb332134d35b0cdca4b34adb2cdca4a3415629b959368ba816d56f640530e6cb332124dad6cb3f251d32bdbac7c4453a36d5636a2296b9b953bd0945bdbac8ca5290fb1cdca45ccca44ccca43cccaad5937cdacbb8559570b13892c34650f60a129277185a6ac049aa6bc84159a32135568ca1fa04253cec246536e620a4dd9092934e527a2d094a1486aca208042538ee2094d590a2734652d6b34e5299ad09443c084a62c822534e52d679af20894d094a9484253ae02094d998b1a4dd98a2334e52b8cd094495084a68c8599a65c022234e52c86d094bb08a1297b094253d602084d798b1f346513f8a0297351a6297f49a3299fa0074d19053c68ca60d068ca29d8415356810e9af20a72d094bb20d394598083a6ecc5194df98b1b34e5306634e516d8a029835183a61c060d9ab218639ab20b66d0945f2083a60c83183465a46dd62da3298fb1cdba629a3219dbac4b465316b3cdba6334e532b65917a929c7609bd586a62c836dd60334e5196cb31aa0298fd9662d4053a6c1362b91a65c836d569fa66c836d5602346533b6598734e51b6cb3aa9af219dbaca9a68c836dd61a9a32996d561a9a720eb65907d09475b0cd3a4353dec136ab009a031ad05ade0a17348db823463870b53c8b0b923dd4836dd6003413c1ddb069ba74ca696c5c04779d72996dd60034e52002b41666486bd76910395d94d3d769c5426fc4f62f25efd2aeba0b8488b99c046c586d9e956cb59984e8ad0ab1a27557b30ec577803bc26888b8d5d3088ecf46b0115cd06c299c264887cbe179ba1c0edbf35a25d25e74cdcbbac1943ccbf0b1fa93c7ce3de082bee080e4f908ae08ec4f3e3b1f71467af4e57d595f2f55ae7fa226446775289e1b090f6c03ba150383a48e97e725b823f2f1ec055784d5b0e59909aec8f578ca3fd866353565206cb3724d3908dbaca5a62c846d56ac290f619bf56aca44d86611b6abf7d4089beac7f65cabfafa5cbdff717a54cded5109893df00b51360d4f80ee5ba486ff8434bc0460ea0b0253df96b1004c5da91503832e1a3e0150c52bb868347c90f5619e8243c022e02d3c02a682ab602e6c055fc124602cb8049c0577612fac056fc126602ef80b9f8051c0cc0c8653c02ae0157017cccc19c6cccc02f6e2e22f380cb74032181c068b01d9088c64ca3e53d7f959dd05f2c9632fe082aec7b30bb820f9cbfb587a1b34822c0d2e400a149e0ee9e4174eef8bd2f357fdbabee269e418f9929fb548729045c16bab42c51e989a9fb50010051f6453bba8afeb6f48c3de1ef849798b752bf26dbd121e9bff819d0ddb03cfab1a127be063f4be2249afda1de9e2bf198744554eb461553d66fd5920f03d56156473a20a157be0e18364874745d56e0f76f89f78658d79df8ed1707b084431a0e34f98921e028c4003a2767b83aa5d652caba07448074f619510c5107a0b510c23c37861d92c6db16e1b4de916eb6aa1e9b6c5ba5b68ca6db16e9aa627da455a03831b2fb071c18d183861e00023470b72c2e87ca1c38b1d16ece8c28515f050418f141c4c458177021f5f78b878c104306cf1430b94979e2e3164018012c88005101204e08a205608e122802a66a0620023a0614b0d2248854035c5102d0490c2270a22202800140678e2004ed8d0c44f96fec08a09042c910025809228e2811b90c0e128e808051861a4030bc09243110c20e2c8103a70ab01691cb085076801491b10c8c20e5888c0152480660256a040152a40050bb071812960400a49a2a02469091432f004264ee0610da126f4c0041f96f0c399264af892308404276a00718427468052842866a4108168085384501484208040e5071af041953242a4b1811e70800756d0b8b203231db072d02233040e8838a3881b6031a3033630a20647d0e0680c1233f0800c92d816a662a0c454d1291fcb88f1e225a414934dec3a65712ccae280e29773c0aea87744b6a2ff81f1f2bad09f38c998bdc57a4556ab63f6e56e60f5350407947db92bab4f2265d16ab59c18c1ea9363bc6469b59cd0b2fa24992fad56cb8930ab4f968155b45aad2c5a587dd20c129856ab0926569f3c336140a6d512e38bd52793a030d36a85a184d527d184804cabd5840956dfd50aa3d56a3d0184d5771dc1239869b5a09862f55d59fa8612fd5d5a7a9f78820e56fc440d9eb0da7751c559c46c59ed73a20a224901cc6affa8e22c6824adf6a8a8e226a85063b51712559c850a67acf643a28a9bd02208abfd4f5471961424adf638441567310215abbd0e5105ab2802cc6a2f81a8da312508c16aaf24aa220b86405aed7f882a6663b58f125510092f6856fb2a51751d61b5e75654c122d8a042d26acf4751b5484ac81255100754e80069b5672d5155002e51c50309ab3d7b89aabd81972e5cacf60c26aae0138c5863b5e7305125b7ec808cd501ba7cf9c16a6da0b8410e9056bb6a44d1c66acf66a26a6f30860b11ab3d9f89aa8b05ab3d2745d58e2146cc16567b4613559d154b2063b587ada8a24058ede151542d1a5a785963b5874c38c216ab3dd412552e5061b5875ca26ac748421466567be825aa2499d51e82892a8c88d51e86892a28c518336062b5874851b5646c61b58763a24a2a61b58764a20ae362b58765a2ea8616ab3d341355ac040cb058ede199a87a41cc6a0f93a28a9930a38dd51ea2892a1d44ac760b5868adf6f128aa3610ac76b790832c564bdb58ed2397a85aa456abd5c2b2daefd4827669ad0e50b004302b21502bf2add24a7a4418b5e4f77203ddeeeeeeee2e8cbbbbbbbbbbbbbbbbbbbbbb1b17ee2e7b103e42184fe3c6e5b8ff89b072f37e77777779f692607a2fc60b1bbd62ba40d16ba6578c97261a72445276c81eaf439cdf41fbbc0ef3cb011149d9a174ec3a60a7a7de95d231ba1ddb62162c6a294530314ce4d2f0347a2979f128f6cc2bdae7a42fd138a614c968f14c4c5a33fd41340d3fa3190da9e1af1d76768857b2476f871fcf5aed6a4707edf3bb5a4e8a0376a5b51a5e87e91d65dfd1814bc35b61adbc34bcd16a39243bece990a5e1a3d4827d390958c9221a8826f6c0635e6cc51e8668c6441576fd8364b0caababeeec80fdfa85d4f01876cc0c56664c16a8e5a86196321f9b69787a555ec5ca647676b81e1fbd2bd8afd5ae56cb01e9d080320dad1471b2f265077e020b6ad05aedec807946f14410b9810a6090264d9a34695646f1ad18842640d15a613c269a2973550cfb05bd402ed729733bc49ee51cc0ab8d3d1f9f19137b2087812858c3c762345f829952034397e78b5c9abf81eee331ada8bab080864b2bccc763ccf884a0065e905a739a64a0831a6469cd66a4d882a905c00eac300430ad55fc46d58c3d653a336772fa9b49a8e67f104df3b94c54452d3c26aa6e9091428dd68acf64a26a574763c8c42cb187ffc12c5acc9ce98fc76c527f3c66d1f4c763c648efe3a4e87d8ca63fd88247dc0db1a117c59420a9a38c47fdc52ccde7340dff452dcd0debf68c2a1e137bf8fc7894256a892a22375001d20af59ce6d5d7452ed71342a8f0e245f7e534ccd98192014b1755d7a1f618148f5df568aeaecb8ac58821abeb47732533ecb454671739eb17a5b11955f2f05d54c1786dfedb9756dbd526f601745687308f4aec7dd7cb195925f47a5d76b05b59a49510f2425c322523bcdc47ecdf6edc8dc72e1fe597db594f87eb98e7805d5ddec69e1d6c58496f63cf0a31822c18af1b5032b694e9542f195baa68ba91051d195bce34fc06bf3b7488a71b55f140f31bc44773158f61b10a10f6e8c14f6fce219bc6ea90f4a8c4be3e7b39233ffaf2ba08215332c298260d24b269d2ace277b74bfc723bd8b08adec61e236671944ca0cb438774f0f2f13afc272fafcb23d7908c30aa78c5cd5f1ebe988fa094c2ebbaae631e265332c26566defd9c6cbd4071772f8e4ba0311e8bd731cea2f4648c70b230862ba0d4fb7222955162315e7c31b3b7de6e5d201193524aefba64c4220fa101a27648775dbba656d3f19a4ec763db132f4fd5bd25363db8636ee8f83240d49e47031cb321bd1ae8f8f28bd56f91c8cc298540d43ec6786d1280d8ce6c4ac7df206aeff1948e2f216ab32d627261990c9eab742c818ebf42e4757510253788baaeeb92d9a6818e8f7d7723bcaeb951e9f8d75ebb97a69562bca1e3df40d47e9b740b222bc9948c50a31b47ba6d57fd9c9ce3802e63f422c66d451d7f2f6a92a7d86d7ba9b2c7eb7c75b167af085fb3c5b3dc95de6553327dace61b26969916a2f646ccbae2d9a05a2d1975d0699e9ebcaf0afcacb1bbfab19a76d94eff03b55a7ae9c884a8d2e97599bea7a72aadcd7fdce317a2be2b9dfd749a3950af8be9e47d469d7db3ffc0d217aa4cdec29e92f7719b16f443ef210b962e4904f948e6244f2943b8108b10fee28e4879082176ac42c6604fd04254e4416ba3b4a66ee7c0bda6d2ff44e672e0bc2e39514ca7b586e3be9cf765dfd714c5defa44e1c637c7ea91ed35a75c6914ed5176b71a1dede654629bb453531ddaf9a9e6e67453fd669bb28cfbe93927facd94b36dd9e93fd1a4e3dab9d31a9b9fea4e91ec353ffd746e3bf721eeb4a6c214ce4d973085e3266e1733319f4ce7fe1371d42e475fe51ca776c999c26a93c79d9fc33540ebed18310dd53cbbc91bda4e4b379dd62fa8fb4294e97bba55698e5ba5cdf41bdffacd3ed26d8d77dd5437f3ae2f77e33fb0e63f9096ead00d8f0ab7e9a5bab32fedec4dbf61aa3bec11ad1794bde641f4db4d268f4ab4317943a773a7bae37d3a3cd36f546e754dddadc4996a6e9ee348778aca61e4e639bc8fd53972d4f94cfb5677826a7ef39adf6c67ba50a5f3eda667d7f1e872463893c7dc919a58f3d329ad9bb719e13a5a53f9b44b8ed79d7272b653b9ddd49a9b9bd71ce94c3775bbab5d74bc1aed9af6c81d99df4e17a2b26dc338a26dabf13e56d73c873ea72eeca1ff89b466ab3bd94ef69a9bbecc44bb9afd544da66f357b57b79f4c94ab5fcdbfd3b9d3ba53e305e1d8397526d38ecdbb9d1b3f3da3f4c6c4d5cfc60bc2f11dd36b6ef3cf74ee5ddd31794135b7f93ec7cee936379de6a838c7516f7ef3ade23c47dd8e03c7fb5837db97a87e37bca01bdf39bde6ddbf931754f3ce6453bbdfa8a77395fbf4ac76b7a9d96fd49a2f1754d3791febe42d447dec04dba4b47a7dd8449b36285d79ae5f95caa2d869dcaefa4d88c167cf0ebf1f2e987db9993df316a2b0cf287a55fadb17c56656c67008edf444afd34ba5ad54e7b5fab15a3b859c02e23699032a7df3be2aa6a1ec70d34e7feae2843ddab58e76f3f3e46dde5006a5cbbe9ae67d26af28f6b9aa7d7fd58ffb9ad7bc8fc51c9665a5cf1ac4cfbc8f7ba31bbda69dcecaad5539b3af0aacdf95e6b3a22c02a55001acce82aeecfa7e7f5d97f6eb1906e3a4f3cc052ddd975eca4a98771dfbd6acce7b13a2e4b16b759e967e442b79b207fbf5b4793df3a43739b2409e7699251371c3c7738dc5297be4755d9e940cf3a65c9f725d32428f0a4327d0785d9c02580d4fb18d392c5e7247320c8341d8e76fc03e218661d88cdc912cbbae4c83f1d22ee5e3b5bab0279e4a4e01ac9ea7d7c65c94f28a313e724778a7c8cc306c62c7b067f27b7d614b6ee91531fc89543883171a5cb2f3a17499b79425731c87e9dbe95ce9f7d19fbe5cd0c9b4d51d239452c6712ab1b7cf9aef568774dee13c478ee3e8eab679df2e9093f7b1baee749bad7e554e2793d755e9a12fe77bbee938dabbba53c4f4a2d8a577a7db9c3f54141ba7dad48fdbe60b533ba79730a5e3d4f33e6eefe3c679f78f284aab8b624ff989dbb6fd072e54c5bee14d6135f57681d89c7ff39dba1075731d5542d44db76384e2dc74ea0dd9fc543fe6d2d7b19fea5784d5363f511b1b1b1b9bdb9c980bdbd493f73117ec749bd24df5bb81d53814e7dcac9da0ec38bf213bce59bddc0dce71b6edf5e3a61b4e3579df4ba6e36075a8444f31ecf425fad2cd7f20ad3b37a6e33ce8749b53ea51e134cf487744536fa83b7755c7fb72bca2d8387ef352e556e3d46d539fb8d59ce337672e28c771be5c108ee7f8760a83b28ce680e3db56719ea3ee04e11cc7718ee31447c5c181e338a79401dba623d942147df61a7a1c75bb26bba9df647ddb4ddd7eaa1ff7c964f26e5c46becde9f75522a70056e3dce674f3eef454b7d3376e01acc639e52d7241261cd3e9e94d5e769baf28f6e9355feec876baa9fc53ddb6a94b6fd46ff6bea676f5abd29bed9ef289b923db4d5feee4c91e743b46b69b6ef2362f5b7afa1fa851c93da173f3e84215770a7be8b37375614ff69f48eb57a5bfa2d8f4997788babe1cd0e651e1a61ecf84a8eb5935423bf33a88ba80e8be6d4aba6ddb24e2a6d781e8beef26f5710e4c5d3730f531172e3085054c7d672f7d7d83a9cd73123ba35e1115c8f37532c4c564f383f9d2e9899ed66dbadc0d970dada1274a4f1750f2806ebc8fd5377376dd97d3dab59f287f5387e695f4a7bde8ead2b748b14b373a93cd6b6efca469daa9f7bdb5923734b11c37386e706ee06f4e6f4e37372fd59377534b072a954aa552a9542ad56f3b8b4b6bffdef43ff051c51dfee63637afb9f92987f74d1cf038372f9dab7be37d46259bd26f9ccb69adf4ee9c76fa6ee9a673552b7daf9ddbbcc80149e1d64a1e73b5087ffe8619c49f1e7d97cedc029474e925ee52dd9e13fb58ad5e24a3e6978c9845e33c021148cdbf16bb249fcb7eca5e93d3cc72afc5962f26e28e97a5cd643299b69294cf5ec475760ab7ab4aac5473d375eeea7eeabad7d40b3b57bbc64e2ba661ded04e101fbb27657a547c6075e64dc15e7435e64dc14ea5a6316f0abf88939e942c4d9a345b68ce4ad711b2ec9811ca1a35c518a3896a8b494dbbb82359b62d2f4ca32f4dfaad2efd69773589c92c62d17c89058ae663b262df5571bf32edbbaad3e97755f3529abed55dd576d34f35a7a53c57b79ad3578fe67d5d5f3d99f7cdbe1e2f4f7adf1e468a65c77e79d717fb1efb0fc42a11f74505b2d888b189f9802ecf0791fa3aa5dc6beaf7aea1df6cfa754dbf9ca6f494d66f919a9ef246eb424e01acee9e55ea7d4ae8bba0edf448a83142c87436a4b3ecdf4f77cf6acdb76afa7240d97f20fd466f438f83f4ee37de37bbee7ea3fb8953008b7a9df76d5b2dba9adbf4fd50ba5b56b7fa29e92d3eab47b4ff583dc29d9e6eedce757bacd97be8e4630f9d7c76f8eddde67dacfa9d4add31b29dcfdf8e540414eda3178988a45e6ef386f83c5cc881bdefa772f589e7251fc7bcd7531d82e17cba0da0d7908830d3dabf1cd753fddea78e6e7c6393795f7613774c7770dec76a8e7bcd29bdb6e54e376c6e4c35dc8dcd0d1e2e6c3ff1543f253df4bdf0bde9efdee35c778ad077e79cf34d75a708f79a9b3e5474758e9b4ebbfa717735dfececcb31ddf03e56dfb0b9398ef771cfb9abf23edebc8fe8a7d545574f61f5e9a6ffc41bf563f58d1bff817376dd973385d5276f1748cd4de7e1c23766fc1d5f0ee886b76324fbf6cd1bea4e9f794335cfc1bdc6339df2565339efe31cdc6b322f874e61d1533ead5d57a9f72d520e7d5787723c2adcd9b353de72d49ded399e3da7ee7c39a0d3cec923dabc20faee41dc6b9efd63b53af3a8703d3c238b544567de10df0483f7bde0155dfd9f9e53b9d5dd76cd768ecaad36693f9db920edf4cb05fddab59a9db72f97c39f3dabf4dbfc5eab3b41ff8920d3f3384e797ba5ff29bc9e9dbcd76d5a3f56cfef79bc6fde87f775f7bc2f87870b3b4a582df1c05ca83b8ecce3402aa28be667a747709abda1ecfcad99f7716f3b7ecab929c76bbeab62a4d8737db7aec72b0f17b8efbebb67d5fb867477ef13d25d0fef437597f1b871c1e6cb79373aef53d2d9b9cadc91ace29c6e95db3cee59fdbe00d6717cb9239c472b7fabdb382a4efd94f49e91bec3fb667f8cf41cefebfa63a4e760a4be6ebed99cde3877aa598e6e27efc6a6c6bb41e1362b7f39066c67deb7082c3a5c9d1035bfd52ef6cc73976eb51292a4ed999f391396caf497833392a0171c8cf9168da41c24f58cad2e795f4e2f1a493d8f5d75e640d47c984e7e57310251d8f90824adcfe620d1b3cc105a7f9b4652cf6fcb90e9f9e599ded0faa025a3f6852ecf17779799afed92bf3820e95d9c8428088f6133cb3883d7152f69ea202a5e495fd28b172ea08a5bad56eb68152f37a51dca9a0451910d888af3d8e375f0e7b10f618770cc983243183403535864e8c5fb306806a2cac02074bd0dcbc094c4382009cbc05410608a831c0eefe9413410153fa4838758ba8fbd24311898ea02a6e26107ba373ce4802047d1d15e32d208d3f515bfe8e03761988e57b2076518894ef6c75ea097ed14c249b36d48c75a32de0251f006a20a0074039603194a53a77df376564a71957ac948630b84f3632f90b3c0143d43d15109ac18848755fbac4557337381282d5a3a422d30a53d52b91afee32dd84e91d8f2f2b0698410876de831770346658d5e200a88b980281d740c06a250f13a7cba31b2b4fa836b4432a238d3f13750c52b9e8e876bc0d4c75e3a2699015358c7b317984280155a10b51dcf5c40d5aee4a2b03317249b252681341804888a8fb00c44c5e70026c1d407211b30f5f56099cbd44b860fcc4819c6db206a4ad1bdcc25611908b15d79b9bc0f868148b1654383adbf1cb81d0852ca0572498f17755d5162d775c57829310cf33c1850e945f70ecb178697a1c3f205c663f9b237e2ab2ffccda1cbf375d3bb366b6cca1592d15a75a1e9908e271dd2691e2ce3ba2e0e883bd54acb95a809ba2f33b33e12a6e4630619890e9e9f9dc9ccc04c0dbee6656a6467608ad9cbce6466788b2cce68ba714ece0f395d4ecec64976b23576c80161f7bea286e7ea64eb8c3ddea283d92567d2c274e248c071d989c4aa789ccc75fd9b4d742443860c0fef73ea807b30843e25e1f4044dd3344dfb68439b86ffb2333b0d69c94b0be9457ac20a4dbb050152ef19bd485024351466fa472f1214619ab906b40290b4bace5e3a46a2e3fe4c47dc5a92f6049c325e4183da13d084665ac91166a5f3e574d0f11e7b72202a76c9d9d9545c2142668eb3e8f8534bd2a0f68409cd9cb1876b6e4cb93c65d63b060c84204fbd63c0e00c131a869099274c410d9bf4c6cd16e526b1ce698fafe7f9780fef4a8ffbd8c9be2b1fbfc29369d89c5a8f3a796a56511015efa30af150280dc3e6ecb8042fc4ff38d47a78595e40c913991f1a0ff55179754a4a4a8a42eb0a435c530ba799cc80a82efb3cf38f09264e2f1dc3bf79d4ff66969e5afe4d2e8dba8fc36fb662f032333ddec60983b7b1477a2f781b7ba0475155e73fea759ecae33eea6f3a73c67426331355bb3a93d4191a1f7557d474e405cc91e9e89b5c03786545373d1319f64c63680e15ec8252415318a6301076e18e088381d0f1916b6d0f4c7119cae3fabf83ce7978577a5ce7f7ae7c41d2e33a3abf827d57d77715679763f507a2e2752a0ed7222d123ccfd9e5d45a28a369fe07325724f6f448c07d451789e4b5332765075e8af476e01db02bef3bc429ac7a7c72a703162c3cae732cff75ca9999a89ab3d3c1f376e0bdb356db9ecebd23d1b9c7e33a3ddec3b3f25f67ad7c9cd5e348bcf7387c8f1ef7e159b9e2e3bff2e54a8ff360494089b765b6cc7af7f11d7a9cc7bbc2f31ef7e15df98284c7bbd283e756ac5ce9711eff82e4f771cfdb296d14888ae7a955bc4ddaa41ee771243efe1ee7f11d7cfc3c677947f2e3dee13dcfca17e821f1cee359b9c2f3ebca972bde755847598e8e90e84c6776e051df557c7626aa76a0b7d3801fe7f90ede51de15d4bdf37857be204179573cd4ad58b9e25de75f905ce7f90f6fa7f45dfdf8aee2c652652ea8ca5e7e70319de1d2f18b1d6672756a01edc023f1ae73243c3bd06b80779defc0f3eb7507fedf158fba03cfe3bba2b36e6b951b2245864839a8c7735ca2eac7e3393051f5020cd726268f6aba63bf1d3ef07b6f7db4ef7daccf4c6147511ecc1c37c66b2f17688490ca4d9b98cc7c9cc78c1120b7a5bac46769b6003f1e9f4161553f8f7f9915b84b6c318e2608c93079a023351deda023b7d1d8e53a57bbf4f856bbe87cfe079ace4495f778d31113d1a6e6758ffa83c747a559966ddb1029c6321d8fc1f017cef5e3b8e880050b961e47dd3b162c3efee33cf0d777a55377e075be5a197587bf0d4f796af682968e87814bc7ff38ea7854961eb5d5f15efd815edd154fdd558fba2b1f7557a8baab1f755730d45dbd8024b2b1ea71ae3a58f982e4efe159b9fe5bd1398fb3151d1cc3a5fb4e4927294cc10a9b85557192163a329a223a9e6a1be44aa7a52d312745550feec1493d76db38a0d237d3062b6705770547020e0b2f1d9b3d8e4b151db7ceaf6746581f29f41136459f2aa94c6732334c849338487c3451a1e34f5318d2d19bbaed98db4e9efce79c398d1d428c93208a7f551d6e7be5513f6edae0cce5ec4cb646f62f4bcac10c3b3e5bc2fac0c7674cc89ab03ef3f1cbd6e8ea6caa032726b308c780348039f0c1890c13a13275704ae304844de178fc89087b844d9d94b04d3841617dba53d1f1cf689a56e9ee9ca6704a82a8783e4da13f8e4b124c715cbe44a8cc9dff60f3e3a6e8f9d9a64a291ce79f368573becda64ee7e7d81477fecea6b6f37bac4f777e0972ec25438c30982651a0799155a7e9848e0a99163a9eb774b1a9dc98c69941199cd1f1b00770083a97943ab2de6b69da1f6a9ea9a8b0e9dcb8c2222c1023c0232c907859a11a673a1e3ee31a005730834847dd08ba33597a72cd5b324ec9c77359b02a33137b78722798bd9c2579c141be0ccd0bb0cccca5fdeb38a7b57f392bab0c0b848fcd52c55171206719bde9f1cde9a37af0f8af613c3abf688e6d25f62fa78f92584ecebfcd853a5f519dcaab4c0d9885e1b5dcdb69f6620e125dd7df89cc0ebfc759abb8c3de4e037e1e47f2f3389f8767e50b7b4878bc87678587f71eb7726f47fbae2eaf21c51e1641176633ae970c2ada803cbbb09c1c826e87bd1d1dfe6d24f20448a04198d68ac73faea5c3bfeaacdfacb03f98a523851ba389aa5dc1230845c7d38be3cae05e0ea8741ad271481015212ae35177f83cce5abdeef0900e05f465666073a93b0db8aef32ff05674beab1f7a48aef3f0ac78bfbc1df61ac0ab1edf158f43ae084fd165657434791123a78b8e0b383b2cfa93a1c30253a7c77759600a3ebe8302a64aa630b1275eef94e0fea1e8bfa99d4f6438309a3786bd2fa73fd318e61cc02bd6d2b1f6ec1fe4529fd053afcbc5649ad180a878ae3b41f0f3f0ac6629ba3376268307684c63b6273e8ee1288c58a24f99f74dcc5b0fa2b0743c57b374fcd60614a630510c5417e722078b8e9f5b3a3e4c477ea28b5fce4cec893f33933a9ee1d09c69e97d70061fcbb4860eb9836ea1d044dc5f66c60c083a531243d17d900b57c411497ce009294450c5fad47044502a5dbbe089196383c4df54a22e47a8d5f5a29cb6a9ec8365212c17618150998de345396dfa0e9deba85d766a172c46e4acae1fa1563a67ee0698156161432426c21e95d99a0f8e9cd61e61165870b982bd4f6b26c1fa645d4c8082157c11060cd6477b3ccde18a5814d7825d7345986cc0b560ca34665131bb4ee51d799db35674d62ed7b5da6587fff110c92e174781cc9315c9759d2cb127fe08ae8ac8d2a46963f5453b3bd111e578d16ca6ef71cf74643a8343a5f3f8d8c4a64e644e3b8850743c8cc2aa4adf95a67ff00a1d2f1e8f3e1e0f93d607e7b13bf7c12034cf4fe748b05d38137028e056c07dc185c1c1607d6ab82bd607bb8ab767de97937d7af326ef9b3c3589a73383a6e37dd48d3d27ef43bd3bed206ee9f838c5a2e223bcc2c62622121d9f795f1787e8f8e97d734887e3cb01997645877414362c038ee9780d9a4154d4359c410c36483ce46ee07ea2fb4c474f588389cc26ac4fb69570b8eea475667090d89dd1f1f159b876b90e6b171e3cead15717107ce05536f3c8016d998c1fc745c77a9c97d813afd3755e0ee7805dfdf495e3127be2392f9177c579891c98863d3bec15e1fe506d3a63328d893df138e0592b76a2c3f1d3afeb8cc9cc70d2890c3ca10153a732b38955998e624f7cfd37b568d391151dbf3945c767665e79959d81a96c0d9825c1147d7cc6c66cc1896566599fedcc4cd6c6f60f55fa3795e8789ec2a6acc059e034b00878044c027e607d6a580aeb8319311d45d5a3eade894cec897ff5be9cffeb724c473c72bcef44869be84e643a3e47c59458a3e34d3563a3e3a9dcf6e3cae8f871633a7ecbd480a878989dc9cc4054f74124fe95ce8483f591636840667d723cde948335dd6089c0c79b78b044a047a56be81115755d9ff3cf94c6908e7f7140dbe9900ee7943920ee744877fa0fe4b8705eb8301dcf1fe84cfd71481d1fb91c16a23eeaa5e34bbfd27d9999ac088b8a27ca3e67cf676660a646ad4c8405129f5359081b243e47e5320b24de54d9078b8aa73ab6fdbfe759d5f57d5d225c79c595ca6ce87158ec3025613ae295cebfae915c3a7507c9759deb58b9bc2b2734b1a7279eeba2e3592b66a2fb38a9e379bcc7bf5352c78fe3d2a6c7331b308506a6ba5c8f8764ac0f95ae2713998f876236b53d1ece6053a5c7431b6c0ae7f110079bdac1a6b1a9d3e3211036a53d1e12617d703cde748689b8f0781313d8f484f5a18f374161533b1e6f9ac2a6761e6fb2c2a6743cde94854ddd3cde946653368f3f15b1a91b8f3f1db13e358fbfd29d924e68a2ea1fd26da770a3cc953a834d877426d35f77052b371dd26d9497af68cafe0365171d082144c11fa8538fbed2f92b9f893df13d2a97893df13ceac69e1c50ba70353cadf03b76aa8e7a5317a26cea42d48d0a81e0a8322c8a7faa3c8be297eacda2f859dd1608df54bbe808e9aeeea2b8ba8b5377b77a6a3eb741f8d790e6776630116d8344d58e697e8e321d697f9d19535854fcb78393204fe134854e82a953d2a2e2e37989eecbcc6466b2331d19892ebbd4024bd3215db70171dfb84dab3a88d07c846b9389039aa7a64daba78675c9f072856620d9830eeb45c282a64b43baee1d07e4646bee1d07c4715870b50b2c03f6c49f38a0eef43af7095338ce799f938de25438a6422456a2c3f90791601910158ff31f7815b5c68be27ed54c0dd8336f321becc65523951093009150843b53637d70300e8e0b07a4dd74b43edbf13f11a76edfd42f6b42c7dbd42f6342c7dfa85fb6848eafa9dfec2f33d3119601534fb6e61e0f9160aa7b3c1c0353db409da7eab8aeca668efb725dae2fb7adbeec18399d3be73dd9fae4c9e5be2253958be2bc8f9e9b45644bb1d2da6f7041b2356f885efb46cf6df4dbdbe6a93aba517a1b2e887a9b0d37e7374f87e635b9836e9e7a1c17888a2f9dea903ce8e6b74b9f1c50c9537573d67041d3bbf1382c202abe86eb92e83e8e4b478e0b870534257534ad0151f1373820f64c67202a9e3dd06597ff4c673a9ee26cb3c25e0e08478e211d9f91e866f34bbd64645146efaaaef3b1d9cbe5c0b873b6cd8ed0f1df8e5e9d4d656616c5750b531ed56a16a22644695f8e3dad4437ce742a697281c06758ed72797cba94619457b6dc91e9f561a4b1d828b2a411b36c8c980527bbc00674611add92b1049a5e329648eafd8e1573a6f7726f184097e7bbb834b4025b100321685919412bba7061862ae85204265801c94876a00861aec78bcb40242b7008494d30b3b262b4493c4892a1f9468bf40230bc2c44b1a415e95961248cb94298951147410561565fa8949a974cf3af7490c8192d320b519f90863b48e2e5a56765cfc8b2fa6eec8167233a08cb088109343c82315768b5d1012f9711d008c298951b550260020748ab9537f0c01664201fd1514ce2c009675646d999d56657124248a2e10c30abe87d6135cf55438c96959578a31d489859452faa8c8268a10468560b6bf86e9a5f4a62024b19ba6d9172db4695101e382169c53a48e2cc6adba88ad1332262329115a2838f758335f0e9eec5a5d747d4bae05e8944662299008b384699a42906cc9848861647bdbd5f1bba51d579e9fd66597d110c11add517c374ad2f22bd75d46aadbe3826cd162eadd6124cacbe48a608595a4a547183d517cbf4b6c0b45a6118b1faa299d216665a2d3055acbe78a6075eb45aad2188587d31094dabe5012278b0fa221a984496568b092d569f6c5d69b45a2d25c2587df2688d56abc5822c569fccc23dc8e20220905962f5492d500c33ad96125a587d920b18645aad0f0461f5492f6c0330ad561269ac3e09a64b9656cb0931ab4f86d1824cabe5c4969f2ca85468594a63b91ce498530acdd088cc0600f31500303020168c85239aa0e8bd07148011879a5e543e160623319ea22086a130c4100200000000a000008470d4b40121cb64882ef6316dc6f7a17a3ea638ccf7f07da43796f00c056fb834562f275b5014fc8cc626e523c0ec2862424070e040588e0c4842d6cb36f9d0c089d4c79df405bf711b4a5b2dbb055271e239a8953de5a263c5de0e7eba8f627e8ffe2f7d43c7c42cfba4e4f8508a46812c0efa6c50735d557856913031deb32ef1653d98491e084b415a7a67e9eb711dcc68ff1ec3da53dd0e19285ebf1c7e9658efacf5fcb20d748c677a3d25dc009813c5edce8d8852656a566e8cab00104a802310bc54d99b073a871260d204952ac1117afbd9ad536d35d864b687cfbd000951393283dcab357d0161cc4136b07427fe9e1799c8f5f58aa143dc3f60191015399250e1baf6d2a30c999e5bc55d438fe3a1602cfe134258f94bb080db9dc16f4123e854ed79bd45cb63288b0b9b2c902b163a866357e8def46443c47412eb8e35486676d14738b8d9f4bddfe5348764528ce5649c23c50510df647ece0915820d9b72a273f36ebd12a98ae04e2736d34e2bc50d9a33c4c430a099f7260ba0328164b3e1fd50c542b993614a702b9ae4c67c0a33cd0a8afcf678cc8e060ba0cb98adf05a0161ab7f85d1bb19756d09d739699226360a7a9c7e41eb3edbe028143e95182b4a6b11e1189c211d5d09a8c46e383992b246625b8617c86180e01fd266e37240beafc2c989d387037772aeccb156a2e89388b4b1fdf4a54ce12c120c734fa7b26a43d1d4faba96d1de3fd5836a19337ba63feba31527df40b5e32194b2755d4ed86c36ca7213961a23b643790f4d110cc14faa77f3083652480e734cb34a7438a6de07e87e37a24360c63692d17fab25de961b057fd7d2bb8ab93a5c2dac22c1e65d4e110adce7ddd7b0a015be076aab4f99f8a6cf4eb7cebb7141f3cb9b145389bc60d758a1db03d6486612d24d37f84d6860b6a6960a2a186b8b834182e9fc146e4bc3813746880f60fc9ed3d105d6e115e19fdb0b13ae7c7827b03500e5e7270fbce8a74eb160b4700a690885c4b03aa7fecf25dceb678522ab2df9c6a5be5065e6d6282f19b52520f09a3fc269ed112e472970529e2e51bc7d2ddbd304dc0453f3b4cc64adb99ed63865e6096b1b788f1cb847bcd5bd362049646f83b8304f066a84e02e1729acfb370a5880801b8847a2ee7bf71e5ed4c56c7eb576ad8006e206fd83ce0d2e498c3991e69a573356d429bbc4875bd1fca0803b78a5f46ab7fdb85304dffaa0a43c97a575cac83bf51e467dc1e71490aed658cbb14211bf8048d6f6ba952eb74a6ca4ddd0382cbf1843a507ecbeadd8cc6908c63641ed458f60fc5e89361e6322476bab4bf74530060c42b3471e06d559e16f4d5fdec2d6046b7f5610bfe32bdf0f500f444135b4bed420151adab31ab8e01a68f68e770ba7e4119919285158d453316ecc3abab08be9e0d275f0e59e04de8e65c7760d657b4931f0454d0e73c772cde53ffa6726a43e7c612ef089ad51bc04bb742bad71b051fb770ab362042d7cac5cc49e599879674933272ab9d11a441b7470d498e8f86e60c5daab6bea25d92701344f0f9275551a6b0fc6de57349ed052fb2f48f6781e22fc8b3d6eaa4658ed34e29a184c62387c06e628b8897192a9d3eed064f50a2c34566c0a090bc7d74cad721a568593534b6f5eb278247ff406763528783e67fd76ab458cb27ce8b230948f21198974c7cfd486501ac14d420aea4a694138992eaef4d17df1ea9c5d06c8fca21498a1908560eedffc395302be59737531c2aabb6724b8ba0299c12b07ab590a0f3b0da4c5e2627aba9bce41d0a52397b6d264b0da294b9d8ab199e386fa48849fc4a7d83298f2a13e57d3b1fed6e20ad34479d804035be2e1af661a737e43f9e19da5c22ed18f1975f144c75461d1ab3401f60fee4e1f549869ecb4722f6546a08cabd09848300f11ecaf47029c648ece5c653530ff66817fb60cbf1064263cf3d57c6b009d512afc1439ea3421ca4141c1bcd27a697be0795130346c8e7e30816f3f0ff774d23c11b23b9dc448c8c0eff271ef2aed151d232d56f77ce4651d520a540e0d910c83ea262169c2c0c2b03f5a79bd2f477832ffdbb1936200f568e74c204fca834d343dc8e916733997ae3a346238215ad1dd7812828243bf5da9b8e622dc6021c9fcb59040bb8f7b29cb05b379b8699f3d4984cf2110d3dddfcd1b62f064b35ebe8bcf8c407b36ed807015c308621c572b03ec1e1884db1454c5815af1aedc30dfe5aef11ecfc5c20dadf80010e6eecdbc282f9bad776e3845bbae7e891c0a8817cdd1b93758b4e9f0bbddda19a3481eb8ffff7cdd9b5eb8482916d035fb0b2688ee2ed08b9f11e4ac657e9c3785ff43f7b6c03c8352967f80f18a4def1476f206445d9c01d13fadf2968f0a81b72964671254962b10e5df1087eda0625dadc2cb0af3da76dd98ffccb2d1d2ebd2a83d16a02d09097cb1528cbe1c267a9154fd545e02a28efed04c816d3c8ece77883f3d4bcfb19e7e92d08aec841cf407afa00ad7761641551b9b07aeb5c1fa99e522d690d5fad5304332dba8d68fbb5c6ac3918d3a9fdfaeb88453c21790ddce4b321952d16bdc0cc4b3199f7774669818f5a089a20f6939c9a56f50562c0b12a955cc13ff2d25858b99123b1e5ed955cea0b349d1835132e207377234aca8870fa36377833e4c100ad06fbd9148122a6b915995574e831114c257ee7981702562bd1b73267317568a817949b4a83d18e6abdf283027036fe9815f82fc2a332dd1fe63108393b79e8dffb4ab49fe0d0002868de4a319b3707a03a21d65f64ebe3a3d0cb3c02b9d23b63afe389a6b631bd641bbe3e804ec5c315539ee854ec984846dfd1fd0919f057d6ae767289f28f933b4b9a1b9614b1e01280ad23af3a5c60d97f54353f935e297e0ca5265f0ac17f1997d910ec4ed05e62c18c87a56c1427974f1880c52c567a013faec5674cd10fa31321e8fcffa2c59624161e0a7c1181eadfedca34a3cbe679e9841f2059782fe300193bd1346359b7cec0e55096a14384864063e1dbbbba14b578e946c41dda074ce19cc889378352ef74076efb0f90d7baecb16f2d30ebdd41add6a1d8f9dc7f10b1a81a85d9bdab1b5ed5f1e4338435ef733e9689e262f809b280eae8de3b57d6e91b726ab9cca184a8171e5c858619cd95c6e95a55ecb68ae8e77e1035e6ca0380ed2a7ed1cfdc13aa2770acbc4df5f4d03aaf71fa99510a14d8c76ed3731ad3c12ad5bd8941991405bf0fb8b4aac3493c4b14fa39c520a05e5f7bdad208edbe9faab1a38a67dfaecf985dbe04ed598731c4b6948d4dc100376f5c97788311517559c448bdb4b217a1aa1834f71e1537097cf0461f059d5a3251cec8479454dc8749736ca105550543b6f41a1c22143b253a1adb9ad8fd46ae3c4a818029e23687dca53711413176f77714c379a7e56ea650a13f3f9471af6b1fdee6cefeb3d4c5d77a69e1e221dad0d5beb1cce07393d2addeb35b808aee4d5c6457773013b8f2f9d5ee2b9554f1b50dced6171462ce4f5043ef10f8ce20418a3154c89f877cbd5979f885fb32bf31a0c9b998ad2d00fb426cd8eba40cb6254b7c9bdc8303461275210af860c649e8b74be4cdd43a0580be22328a45ce0a5a62e0254c1cedfa72c0e2db0ef95f28eabb6baa7d1ccf7113c99537faaa46e0cc853189cd50cee4ae723ddb4fabcfd61b36fe8b4d4fc82d9270695493d84e05f563eb2c4f7a59707ae920cebcd2bc32125bc94c5ae845775402435a07b377908d87a5f9bdac6dfb1aea4fa5b53088fd5a3cb14a89153ab0afbfd9cbb5e62105b62d8ca11236889b535719ca3b3828bd583439d71db9436104209eb95c3e7aa34a5266bff326f2fc15911d60e038bec7e1065ae36349dec4226870c9cf70d4dd5c0e17f023200e7330c81366418335e1933b3a8e4cc2aa0bf47f1890fc00984311f5d91987a17c84669f309d15d95c0909c2588382fcf2b86fabf3356acc0531d0442eac6872eb673042e8fad4e2d7fd32d3e75b9cbf6ce185e4c20333cc13426f0dc7d109637e1f29fb75de7de1dee575edcf3e7e5c1fb8e71621492321974f9eae2a87041275bade97d2d601fa45e8ad5c094b9af475c29e5823fd992429d56ceb201b7859a206bea872939efaf79e605b59fd41f9f91e018070eb34c83d3950afb02d6079d344adf5ad6c2c2e4947c57c4fac2403111080dc1a88d93346893de1b2212603d26628843a8a1ca7e894a5c323954d83cf11742460422f87f596bc95d29195cd36eb10e204d05cecd1b340e7c6c75e63f1a38d0cef4c7396fda2a07c0190e501bf910cd0aa441d2edd9efabea6d0b82ae7a06f57a1cb761814f89e3b488facc07abdae69eb091d7c1fff1826871a91ac11cde073065e359ef70931318f72915ef70b53701d257164cf69706965ba39fd7c4a7972fb5790831a338850a4a837ff807a4e2dbfe3f019159a9e3985c8db72c92589d62dff54d552badc9b2399f928bede5c8c19e913825cba2a781a85b9fef2ff5cb9094d91b8806552682fe80c9d259aaf00a6f5574fe19201ba498361e0aa427e04b1aa23b74c259f2e33fb116263018b9c51966f280534b66dda2916497e9223934de49636515dc59166645e3893d01a788242e362b480810747f5c269d8ef382c98498101a65841bcb435d6ad1f98233db2e1b3ae9db347ceca6dd601f5d0a8f083150628fb47fe02d2c6b6d846e2dffce9c1f910310d67e0b36460dc57fbdbb37bb4934a6c3296f02bd17807169c09eaf30146e6317bbd26e347492e1422a77b06e949a24caabfda1b9815c1dd4408f7369bf641e02f3f8266f168b8f54090c25d325ddc02214d27ec07f095758f1ee2eeee69816bd98ece23b32d15e13b57e95e78a87e187a0636b299411a7e434b2c8a15f2f28ea8871ad77d401a6dad0972ce11079eacd163748fb1e714dd0a7bc905eaf912877f2d960ab82bb37f77e8e3820dc96827b599e90b1948da60879816ed64d434d1595b26192554ab045c6a3454e4816cc657841932140c53cf1b40880059e1c2a4c7cad5d9a55e423f1202d6e0983708828264a3a2a82c027e081d69ebea4a86b6b3038a135fe0f907e41757ab5a9c7c27c08b003ee9d770cfaff10a12a0771c0ec9afd2f2a05cca7049a06ea2387a7c069a13e3a146fd8f65fc9010158a73db56c36779ebb7f330dffc85c8e0900c76a3d8437185e1b59b25b680def00f9a3ea2d13f80403862de67982bf2ff44fddd08f8b4a24e6e21b29d51bf3d71788e8ebb8be050e2783aa1ce87117598cfed6fd47d2e0b1edcdd3ef03e8b56c1109ecb547a20dffab9892fa8a9fd29d50fe4291d4d9a7ce2fa98562d47251071c6d5850656d29ba0624380634ee51cd7eec89becab2755492601336bea99c9121d64258479ce5ad25fe4c6573a1cbb141d1b37fc404b17e0411249900387753f7c72defdd0330d57c499fcf80c51f75ba9e1f8af39585554d3dfcf8c13b60efa670cc73423848e08a610b408424422aa873164ff4bba68481458cbefe6100f7c06bd7fd437c3a5e7ea6b592f95afcdb1af8ce5da7d86f9875b1bd2ac83595d3a16417863c1e8b8d1ed43a3fac10d3b6d160a564347da8efabf3c4e7ed4f50fc7fe5f8a32bb065154f286fa9b636e6151c88c1390303456e500e79f574e3f2a17091109a271f4cb43deff04a08b9773bab5bbffd8c607ab4816dcd35830bd9c9054e1c0c10bf34f969993c460471a4689f1e06c97bfb7e76739a3fcee87724be15ae583ac73e9726e97bf62a6652d99303664b4268f7758b766df55be077431de0002eabf75e89ce30d3d087c009b44f29933e6d707d5e0e628045df98d1840249d9ea1771ab773422e150deadbb9cc771d675be312045b56868fe526630edf1a261ff98908e305cd147c63a461022fb0c4068bf7683601b20b5ee74eeb1ec1104aca4ddef1a02717c1bdc90d4c2f5b3dfd639bbca5a437f35f854ffcc71b94d67110a2d16d24ad3c4d70b1a1e310af40f557ac608a59fe237a9274b68d8f42ddbcb994beb706074e3311b71970854710c6f185fbe5d5f09977ec83764ed248829e672f52214608eed0d6be627d2412ae716c75ba7fb90e82b497fc5a7bd6ea08ae90de6b63916475ba6cf8a5c207291b66c61d3794590c70ac2c0e1764351399a7f596943400f4716054906f4bcc295a858cc9f546e170f7f07448a17356c196adb32c6652b0e43e24c9c1f952904ae24645344a2b883ccf74711bf4d7b5dd1c89d2e96d26163ea00f17aa218139bf0c3dc8d212cc5c151f706414ef1c246a462a18ad11394e275729c2640fc1e17948c2418b988632c056a2fb2d6ef80f1df29906ce97292459628e89148a5b80b6d21422cc830d8db8830cb4ea897e399a4f48e90c1660d01d841393555649e22dd86c75fbdb6db10e9fdd0e78c70dff85c8b7ad4d2ff16470b6aa3f07027bf5ce6872791311e0057e36c0cd1261a8d688144e4d1059369fe9c9fe92ecdef4d3170f7949698fdde33ad4d4f197dc5707888c00cca5928106eadc9e8702a5931c92ec04b994604c697007eb99be7c68ef8881b084fc5136cf77382e1fd16856c2de1387f0439d6b1261414aaa0cf98dde0564440810c0fb76eb5ea1a9f416de0e56498aad6fe4959decbd86a4e6209d2b09ed71be6620a47df336574c01868a3d84fc02cb1fe509d692a889adc7a091a84400f17b34cebadd489df3e990e9f74c3e533c2d6c9695026c2d3148007bea757bad0134ecf6aa1f121841b1f688272c4b719c6d249665e7f34fab84f3b3ffcb9b85dc1846bcacc4502c4f80552283c741504c1b2d438922c31b826db28a2d036bbe08e8ba9bba0dd5537dc5da3d13c8df2a8561ee4ceb225b69496752ed081f6606b5290ef364e6e1a72c57f8f4350a6fa70720a9ca61ba8d0b080d01826bfcd1a14da5531ced51b1eaa8eed684137d7d6bdc2df99950bb84df6d346071c1efd8a8e48e07aaf573039750cda0297aa6b4ee1ad6e30c0320df5786b0559f36b4d33b4deae03b94e0f5fa970aab57bf01fe09ab6f60bfeb28054eaa02b293af22276c86b8f30f1ecaf68b0a93a19ca09ff91641e565fda1955329333d9208c347258cb5d6ed27175e012ca9c39ef878418cde9f3222307200359b585db3b63309dd44bce1ad9f945f10f2f256226650c835d7875063c88e60befa253cc59250ad22694fb0aba9326d6a5f1d5f0b32a5218f1a91627f19d44fef14a20a2f84aa140685d3b1e7c0c4b6b6db672c5550e4e873197c874c78dc2841652c35b146bd44b04c97adcc74c51747936e257fd459577acb977ea1bfbed226234609ecf3c4f6461e1686567ab040dd450b8db672f5e2d44bd82b4e7e4877bf185264609c64f29ff35c8a5e9ab9bea07765c7b573140069727b479898402a9170d1799190de693590d72e7c2052fd01b100f01c7fee59d8f6a706b72b2e9d28d39a962ae50b83d5355fbf7ede28de92d3cf1abff2be241f245001535e58c3f69f34d38feb6b1e0e658cb1e011d24a04f33c91357cef79bbded6bb754bf0b9013bce5ba9613566ca09e848b20503ce46fcb130606f81b402ce8c46d87b5b7a838fd0e25e4c3deec9f139d6bc227048690534b9651dc116242063414ad1bc7229a0014aa8293cca7bbbe935f7d486875f6e0fd300f1567fb77524990fbf33d34b3125f7851db1e58530d64257245108259ab4a70ec7bf0871de3f5e13a8a7722b65e4647b93055fb41c52fd9005f1301c1e6e6be5bc20519a1f75fa19ea8c811c0cf81ded9cbeab27832e3cf1ca6df5ec5bf101f334cd7fc1f75c35c15d4ebd216d51e2890e0aeef47b7e19ebcdf75a9183466989d8b0bc063e58bb2aa2a77eddce2fbc2f3d8735ec5960b96bcefcd8d6293700d4b83d4a5fb59a42714bafc4cc925e75ae64c7b4d3cfe283df7f3dd03d66e951800afd6f934f41d48635dbd7caa7f8ecd83a505c87e3a655f26a6ac6f7534accc4c383ed0ec4c8365663af5d48c340934868eed3b9e793fbc153251c51df293fc0004ff659f3e95f48fa7da78491d8ffe8491cf7fab98cb786c8691244d5bcdcfd3f89683134b9909a395a162b554dec8e0fca2e334d551935ec4ecf3770f6586b193e26d62fc9276dc9401b16662770578f6fc1e882ada95f768990e5b175f2bde87328d8f1ff0c0721c57428c7229381b8911d32b006e425d1dc057516da84d56235c40011ce54ecd34e187d3ab57621d20e922bca091b7ab69ba64ee48f90f524f1554fac7b97aca267dbd48a578865b09f7935f4485f148a0d5d343705fd3d81511095abbe6accc28c722d9d7abef697fe2e645e5575114415d1924c275bd066984c75f2cdf5a4bcc6491268e33ad985fd23f24855893101767007d32df5107e45ced29c71a1f190a79379b38b3bf9197f329dc15910f5335bc26e30fa9c3ca16d7d3089a20f3587a309c1434f005dcf6e5afa24bc1dfdc841698061d1d220bbcd689d7a9a3242ce5988a7bedd35eadbddc9b94e07cf42a90f837d795a565551d21be5ecc17c3938281a1f0b56446ad7a635c3bad9d12fa6910fb4635cdb14520979e94d65d95db8ecca6bf215ac6a57e3b642fa0cf64aa2c2cc561f4246da0d3f808f91e1d949c7cd562888936eadbc39d9b1795466a7c9cca8e2b8516818fdd6606f1920bb8c58d409c566e72d689a4b3a7cd912647849cd439384a413e00697dfe1eb15302fe0cceb9cbdc46eb7ab1a426af5fdef0857581e0d396dec71c24eb5170db93dc0abe62e2dff04241c7b190b57508789d3e11118e3826031ae039ef29ee554dd60fc8ff15a08955567c0e19822789d711cb661a0c249908c3354a8b1cd957d82040f67ce90ac6066c890a5ad334cabd5c6a3cbf19741f38db27ee20a3ea865f21440795266f6039d494b6557eb3c79f11aa1ec6d1dd79a5cf63bb585ee3bbc6eaa9160929518af9193eb228249cf99678353823464e8c3061f2b47e1d91ec666001123ff89a5d8111091733c9983012343a7d263e1dcf29fe1d76d728a68fc004319a3983ad0f345e76d80680e2e22e047b9565eb27b56a4295fe04012041b02b6459912ca1a316c098146cd40dfe1aa5d4f2ad741406a1983ab4ebf6b4d8ed672f7f30fb043cad0eaf2ba99cf845be1624043b37b25ea99eaa2ea5579f55450e568b9f34638ef267423210a692e5bfc925cee227cd6f666d68ce4b2c220c27f403495c9a7b89527f4efc0a1a39eb22758c58a9e31dd0ffaedf50f1ee436afff10c6f80348b46cd2ce954223bc059aa74a5e2e09c89a52cc632bbddab8585631a0da703f701749e4da6f76b66c089e5d60914026493fe3e55df15e9e363c1d5d17271a0d82a14b6eca1d746c566c61a78086365685a3f1bc662087ca4418fc711c4c657783494f92b8a2e789af84c0d4d2bfe927e440c871b7ecdd4cdbd4eb780c451095ef96b1579954904d6b794697892350971ed4d0760353254896eb5d650416a140e803964d590ce252ccdef04119487b916f253ab0b0930636726770444e520281acb8ba5f195550f7bda8a0fdca3d9bcdc2f94ce1ed37e744748696eb159291f618acc629508702f9a04ebf05321c2ca2c39a9271a498c476c0e8a517e5ad22de8ddc194e700296b8d6c160c1db0b20092788290ab07074ccdba549aac8a5b40cc99adc322f6290aa605fe928eac0918a6ece7b209eab0b649e4efb8bdbb0d36773bd8a9d50204073ee27d95b2d5ed2b025785608ba6ea8dc3e5f24b34e2624e7cd84b556211a940f80dbe0de633f96f9b954caa075dc0ef9e2a1906007c9240d1b65259be9ce89b1094a8029e54a51cfda49c9c08bc75f526701e006016faadf9049366eb3ad8602e5cf73bebc2e0bccb373f41f4f689b36bf688f67e6e36ec26b01bc9c89d17938a47dd15375f9ce6617d853b12b9580d92008d11179d70d7710f5984aff008dc39fb48487d5924503d8b3c633f1135252df6890305da4f86a190393aec7c6522b21685d0a378df2156d29f2bbf1a11e3882e9acd87750ae299750e32ec7d3f7cca961d29ad254f672747c03f6b2ecf2f6919bfb8062c9bf2db12d35789d4009e04f8f7b6e095bf45cfdbf0a70795ee803280c0caa6e5c31c4252d0cdf03100ba8a8c3776647c6d590e955393150374c8311a178d4d573afdfc5b812585692f878a73cc2543736c137fa928bdbb0ee3e6ab028eaf20950e4b784f63e2541552bb0e10ddc21ea63064396b7886674eed0f00fa7a441163d65e092c010ea9ae8ac919fdc4a7b9da44eeff586f20fc9835407a7cb744ade9306abcb664ac0dd4a69889bd9664f6cd51899ef00c8b3b6a9cc6b9bdf027933cd3959cbdc5473b61ab9b6deb47eb3f7b9f7e713e1c8150b4e3058f03f0ce6448b7a36c20b0acc0f3bb76cfa172f06c7ee6790f8bd59d29bb378a87f9eeb1826e613df0325fbc2644c90de1daeae31ac4c072f550166d12def32c08bcef687007d961fb75802d19fb63d37f4747cc7e2d8450d8f5ba30b01c2834eddd1aa46495e6bd2f981cca591faab1eee141b26dfec54e7e6b2ba63d902b8e4993c3255ef39043f536f6c207372870b8fb950f99cf4d4110ba6b3b3f482cd3602260c860c14db56c03be79042a8c31efbf0b394ab41417f6ba70f5088c3d7cb85036463075a8f8c4d5b8c205ac39c4bbcad31e4abafbb844a6cc4fec0ca29e180f010df4f562ea396cc0b9c8b8b23136be7dfdabbfa6b3c9cfbec9786c9252b05ce555478186426aa2a03d9bb93a7ed6dc5686a5d8c6f446fa8167d9f069d8ee6b87bb8c3a296955624745170c53e85bd09c1de277ff5ba3a29166092267967b7876e465426180bed460be3eb33028c3cca7854c54180377bd3e6b6a8bf0a779cf11a7bad9a5dc0216179a35f7f09062dde3f4a42dfdd6886504dc41da72398a01e7c23c6d0978c46427520546161ca0e6b781b415434067131f4365306498562b1ea3b6c43e20035d6ea2b992b20bf9ff81cd2487ab0399e3da90e048abf613b8c4df5b690fc23dddc92e7862e797f8ce4d6eb8419863df5dbeda172e22832768377bf4b8c7bfe3e4a06956546302b420c1e386506d210de46489d555a71669830545904f1b9337875bbe72a64072d6b8f6e6f2b419fcc4b8066781d828d8cb3d0744f736b3862944081c07b4e6e7416652df231d4604a52ec592d6d54728f9c8a6c8283c2552c0b08ed4ef10a3177443400da6f12951a9996036853a9b756842629975d58eae61f0453d246e51aae9538f90510492f2d56de1a5a68b639978d8efaf53159d448522e28b9aa8c72e95352cf49045e60e77cad146b6524de0dda12d209e8371702b978219f94d245450980c5afb0cc2d9163514d31ec8a65b923d4e26e9f2193f7d84db907d1ab0c4942afddfcc458a9ae881120a7ce8dd3b02427adadb121bcc20ca4dc6dc088b55baed4743cc00ecd3cae014e3e836a180c1f085a14e4220fd94caa5bafa610df531613c2a053644303de056cd98ccf4c0e0226278dd83b8362e1e34913c64d5417de2e1347f14eb99081e45bfed07b9c964e2508a41c323bbd3955bcfdf3e59964540a861cfbd26152f6ac9d3aaff8923aa6fa5f1be74cf4723d1b25f9138922a9c6e8a20a18be33ffd44958a0a65b6f8468966b00082878c4410b21d7d7dbe3d50b26c2bc9552c005c4757229d8e22eb0e958fee9d13b1527d917ed283901a04431e88aec2fb7f20f2525166d9d39d4a62f502b62c1453fc985bb5f7fd2cff22d36b24c28c9e57c15033f272860bfaf5f61d0a9e614668405cd0655ab5079a70859823699f03f2cda19ab593f6bb212433b89e86b0ed15ed6089ad053c73eb82eb6c0fb52675a2171031f628294498cabb0d312a9654651f681b81884756a670820c5a5631a1a7f907e84375e12f33a42b23e5a90a53d2067eb017f3594c08917355caeb88f5a10c3f869a73776e5efa259a9c5b97d3ab06163397a4fabd002e2e5b82fd441de01487c6731ac5a3ef20079c865cd339686175bc66ac62e629f58d3fa2462fc698b532347c95ac9aac79dd6c88d073c9cd592cc366d17a5e91281cc51deae8e502c18f981f81a71d90b93138f772e4bae6c30ed11a93334447cc87e95adf42980b79267944fdb8548bbb819a607128ae3ae641c743f00995b3f60ebf2ba76c9039f52a0c62e117df393039455d63ed3de610654740f8481a6ea4ebe78a8ef03f0aea41b8851b673dbbd816a6048ef1e98cd8626a63135ea56f8df6c610437be9e8991f20e3f5cfb6bb66e2d1eb3a32fba5fb520ea78d4c0f48287426d828dcb155602fffb17289192109ce81cb44e182c52232dc72e0c480c17f6bfd5ac8fdfec2513eccb07f6cddb288b8c096f1e50f637456c38943348dcb3da1943d0550b6accad21a4297e982847470c7fe59ca039a1895e36a1f562774957dd69d990eaa4d8711cebcf073967a3aa835d9a49dca7ca820d08cba17f632eab9831ce80ffa8dd5c696c69a398f33c9b199e1accc120ab170a7d11cf89c416db9b05bbf041645ed992119df198ffe8497d0e94d662cbbef6ecf3d5243a777ecdb88092565ab6cc81c3153412755ba38dc7ced736b9a2360ff05e67f06f38dd980bd2a58d536163a2a3457daf05ab064411ea9b6c91602033cac2ef8ea4b8d073cd2990f240ec9f4c1dd31e15dc08b17b168a4c9b2448a3d62229f687cc15562fb20da10b97f5983a349fe6e57f60e90de6ff1b0d7ac1b3f0555a5dd64ae49fd2881873f59636f4c2d2ec9e2cd755e9f034a6aac35d8bfc308b17ef40568b4107122d0a74edc4c540b1700b44dfb056ab5786f19a5bc4d8834dc63d77bc9a272efa2265f0466020dcb741b9d7838ecfc1751ebc359e0f245ef5c62ec54696222fd9abfead165d92c99cd05e753f1c413201a756258db981bdd1b65d2db2c66e9df0f69cd35ab6ea3d44f755741c5e1953531430974acd8b268ac3862171331ce7640f5006b1379b7ffb72536163a80712f95cb45e2a12a96da3313a54c913942bd3f7dc2223aab29d0c8ccbcccd8ecd2d33a305ea1fe4a649c70bf120d96a44fed9b4d87aaf9ca117b45d3f0ca38c582b33100f5d6e4c8b79528283ad4de3a24bb2da4436156d3538f6531105137a073895ea1ca7f3e07376a28982b3a83bf43e2654a15335e919e99fc082d7db32cf123255a7b44c248edd4e0524539b659a34c5a71a6d6fcdb1eaf069fa4a6961ea615d30116cb20cfe357ca90242808aa03f82ecc4231b68e677d3dcfb6375ac92a73c827900be2a2027d0e79d492ace9f1d058806d0ff0db429a4b7c98e39ebbc9f1be0aa909beb57c857aeec74249616417d9d16b37ec35ee57bbcc712a58f41564d8756d15bf732d835e0f0bdc81560e544393d48458c0d45542ff3e76330c5f576d91b1467eead1a6c8e1015e4eaea94c59d31b029d9f0ce028df9da466a695cab261aaada04f0ab9c8f091c8dbb99afbac278ccec08654f2786560cebe5f2f09f4fec57a6607a067fcab128e2ead7d2ecaf0f77ba0c24dc12e222d7802ced1511f698b3130496d79bc457aa3c878a6fd22594df2fe108d0296c7b76238917673b9fc2d2a10b256ccad8342c509f2968dc331637321a40ed9b5446f9f2a0df3e4ab5c9a005624e66a2c72b379a1683f604505c2e77189c58abef53a76b007847bc0beab7e6a9d81f186c28c3397bd0f7e5bc081d42f6c029ac937e67ab56db48d0950653af145dc88fbba83b017a8b4c50524c8dfc750aa757bc08f589cef150c9fde0e401614dc744cd0f956221f7dc2102f932e1af28342c2ea14f7da28bdc1257ec70b7a7012e1a09e75bcb3ae7e5d1d585571eda74249d891d456aa4306feab27e9ab85ef64def0b84b9a187d3704b3761bb7eac36b33667244bc08efa83e7102d18dc7601d2a06bc8b6c824924285ed0f1755cdf24fc49d4032a9b7107f9a1ca9b760a4479a68688ceac53e54f4de89058ced8b4b675fcb54d43047b4f3f2dbcb5ab5e89e34dd29ed198ba84f947a48144d3d631d298b5df6495c6b5a104a4b7cad14041dee00f4321da4bf54e5dc479345cccaac3b44c55913aa91bcd048f11ee86a81adc4706954fd05ddd8d92e60232cc16b2b1474bfa00e2bcff15f857a743d2e62519aba3a8608bba6454c2f8edd1554c24c0db63104d8ae9ab29af5348f5c21f575bcd45c5f48212d122d70dee3edce8a0ddcc8f74569246ef2c5e00fbcba3079d551fa4240ae189597ac526d3d4740fdc3d28d289692c5020ed82d108ea465a15c5eba1d3c09aecf6735f748fb92a616113efb579bcf1a8a39f614e1d8bad3a45de5b16426fd675eec464574c59185ddc1bdd4d971d2fafa2726f513f89458e34177580ddb184474e5fa0f96dc1ca8277e2f9779ab77f7c41cfbd6009922bd0f3e3c73336fca50eef547e3869797259d66525e1622b2513ec4aa23114966537b896554401678a203a98934a2cade04ecbebb11d3a917ba0657189c307163e7e3b4ae23159f99a7c4ff83e5a4bcd36675ec2fe262bc9c7885355b300c7f74737eb679b026477ce38eef2b0a7d80822687dcd8cb0697151055a40338ae03edaace3e5d249a0e0aa58ffaff0076ffe8e965af33bcf9aa2a2ae5fdbadb85ca38f7bc429309026595d1bc6f7925951477538e6aecef98c72e7c151f0fa3ffc1cbe064c3332f58e71b8e7baa91224b7f348b8d872d6d81a490ddfc502b2f2f85571b399429c8ff3a298c4111c98f49c1c3684bb390b31376e75e427dee3120784240bfb83f8e80eecf23d8f9892e6c91f754f86d171bf575327691e85665162949c765c2327bcbd6676085654d2e0eb6325b1b383af0b203a24921d21ce2e1676f0f1124aa876f855cb9dadee5cb272622ea2984e81145b1bba3899d7d285f03d683de0cc511cc6c51c2525313defd54b30882cdd84f41e34bbb8d506be3a4b97326148b719ca8db3c1d19376813ae10ce8128363b8fac2d7aeb3305392a234d725897cfc947c2a4eee53ea35931800ae04c805eeaf345b06c820495cb341ffaf0170b4adf3197f2874fc50935b2bce51b722ed7ac8abcb093dad6a9bf123c2a07189ea106c8b1111cf8c7fe52e7664d68b7ac059e1e1f6ca2ec6417cb30997663e6e3ce8f33b38af11a0c5b84e649c6d1a6078aa1bbb069b0fefa0b5e97523fc87a49110ba852600393cca65da440a4905192a22d0cd0ae414576f0b59c55084f4efd735f435b857a2d07220a2d91f9048b0498b93d45952e5c8d1804c744bcac68f400d0c2df33537c23a5a06a26102b3010b84d56cbf57523df056636063bfbb51e111d1e49ffc4aa7c4d65003a9bd402450fa76c0bb5edb3f562ee3dd30a98d38b0b4cb8a8983147a23b83aaf413db6ef4e7e551faad7785ef5a3f2656c7f27d8d434fdb6be3acc32f4836f4f70ba2f3ee6b1a83072bcf14099c1414988f7efe8608174d990038984ad37c4890611dd876b0fee708b83025b1285f554f339191e176c6ea9d051f8b976df83082f43c03a1b06a31eb1bbc269d9cb428480db3827ce9dce64dfe24ef9f8c8772973e233fdb11f4ccb4f9a8c061c0dcd0d28dd6b795930460ecd09e1f333f4dc53673e040db1d04c380e1abe54e3f3a22602bd3ac7bf7b70db3bcded9022af4b4ab07fe0494d0462d57e160a11fed55ed6b2d3e899780c5bd9d3d8b270f191aa8a5fe6226416c61278358770cfb4d84b88e1d059b7154d476f4d4b678e31b66112820282b811aa5157e4fd28265d44ec97c668c38367f5b3a82279ac4090e7445dba405f6889fc6dea08b8111fa27c40df18cbe70cb47b446b2d56f9c6efff1da023c45382dfd1cca003df7a812b901df3d54c3e5fc134ecf21da42ab643eec025f59fc5b2b74a0d3a65b3fca74b065ce0aa4f1856b01509d2befd9e990cfe259efdbf57597780e57d82b4df4751f4a67fe9de35930b6cde0e4480d431b6553d950f177c06cf0b9ae2f79caedff923ee606af98f5a3d0c4667bdcd26d8efc200a7cb39be625c4ee1e64eff7fbc3504cb49e7a0809c829324ae2b66fdfa9af20fedfea780969ca4fcfe88c2aac31eedf91511d53c88d16fcdbddf723425b031cbe281af3940348030299102d4bbcd2e14d5db3c064e8fd87b0cef8d69004157c199c26a4f1ef67b83a1bb4ad5062c15d8d6f2663c3429d573ddfb45284e792584d229640cab7c50c8f1c5ac72f651b8a27a85c0bd6189919c854d0bd6daad2584cd0c485ceee3d61f0f7c5c10be50b2bbb6b1ab2a6cf8412b3323d45b8e1a49b7f33e48bcb8e9aacae7c62b9bc7e72f5bc7835536b0f29ed0b401b18ce2242f25337192ea5f8e59bd645ab81550f5820a5ca55190f624b8bc2e36f96b7c7a82b171753bb489e0dc7c34604bad8bae83c3896341b90061fb463802dcfbd79432ab3779fe8ad2e549707f4a1d0b04125d15dabc04a048a2af9c05148ddd8c0eed0b4718f485b2736464898597a3fe206fc6beb321d0920295cc14b96c63589143997b47dc88e01b53a62f57f032abaec92f9dd24fed9fb340e453d6dfd6813937f1f32cf93134cf2dfafcf16d140d4006361c679d0cf70de7bc65563287c0f1c50468ad30f1bde012dffabf30902aac313ee032cdc62e5d0d7e52846cda8d6bf2170a92891d7415ff99e5402671c29afec582cc062759c51f2dc459ea062b047f40a0a4bb1882c04f885e76b8e06afe6079ce40775801df28c0d9e9806b63dfc041657a2a54ac382449ecbb54f43bf402d2967cb1a60c93e3dabdd1b20a9a39dc747dfe19e5269b76ee8afedc82c81e2759dd3f2d9e59e29c15fabf259d795d62753ea4bc33a87baec8ef1474f6ca29595abf7ecc854ce6c3c55ea1ff5dd0ac43375ac9baf1d3f2c8a4eeb922ff83d29e098ad622a7e747ca3b4b9d2757b6c558571d11b8254f1467381a70edcc08e1a5437b98cdd7dd650b7b455a2c4268c826719a599b6d8537426d7cecd673805b13118ee465706bc2098c3c614e997b0d3d2d190e25792acef7c41950e73819c63785bc889c1d0a19fbcf6789acf0894c6b9c43721af8aa6a59eb5c65f48c734e060b7d811a371d88e612868bd20d3e5e8ee05a4d76bddb1c1b6680bd74437a2fe04eb860519844e92f7957a5cb9fc35d1ab918349cb2596d29cab1e64092fda9978b32f4fd813a69aed2c6ed279a59e777b787b3116cb6a9051286f10386806cdcf367b0eb8dd38b56f53a06c39ddf406183131de289adb00e98a23b027bd7d824b5f43f983fd0151479becb6e2d24441213938ac3313d8c4fccb3dbe94f1c7f21668fe7bf4d4c041d8885000b882209fdcdb79a1c1614ab0f623208d19feaaf539cb47a9b11f89b8d9252f04ab3df65cc0ce9d54d93925a9faecdcb5ae675d0b8d4f8a0e22c8279b3daaa356273298116a3c01e1f36607b6f14f0713da5daf1d9c9ebd22d444748c13b800a138bc42d202eed00e0947361dee5c58c554bfce90bc45a46fb16e0b45b1a4f99cad10a8ea2be377126b72016c9a734454bd0a3af4554dfee55474e4f5296413bf237604e01407edfce8f6807e4ec56f54087ee950f48e25abf8205f7f51f64e2a6bac1b32eca193c77ad78a07257c5071677579f600237f50b32b9d25f0597ddcf8dbaefb70a687d740f8b72820d7ec27f70a012c06922b5035572a6eb16324feac9035621acd189845548b3668d6117a06f747d55d46b42e9078637911752f36c5372fb9a4e7b1baeb8333675a72a8597f6fe7a65ccf3f18690ef98dcd6435884de7c0dad1b0f95e8dcd37c875fa0f64c02862090014098bd465685688f1801ca2c4caa9fdc8faf2352e075275dcfe2b8c624b6dbd00f849ba09598e6b7e3838107938cd3f3ece38f90b4c6054afad74ad4b93a6f753af0773a9318977a1c9e1ff3f53add0b75e140cf2b5b7c166353fee1fcf052d293d8133adf99c707e221b847335248ac02f7116cf2e3f304a2296a025b3b59158651f36e27f01629a5b3dd62fc51969a0ee6548af98efdf0286882fd482229b05cf471c7f2a113b3ff984583aeadb4869e42003d035800ad7ea76b705263f873ad4308465c288e0634e7120660d663f39d1fecf9911eff332517a4b9a1d07c016481962160b2b51c9bd9eea76fc591e527b19351bbd6491ef38ca59a7ccc2fac63aa840a370b7a5cf855cbd892e40a978fb5c2cf50615a89f2e1db948800ad1ae65c621ac5470cd7e7655ead1aeeb999aa130b744bb7d51c47c71a9c7d19b2cb3c37c76ef60f61c24ab3aa7ea6e56c19f16dfcc667ed9137eb918f04cd1716ec55970836cb135e7d09c3b80ad87611c53f782766990ad3a4c8fc42134123f28f5bce8ca6d5b676e5ad9878fe84367f48c94a16147652e52a5a342b2d92192f9ae143bc68916f1ff36f0483dbe131e5cdaeeffbfe8436b64b03a32712f7fb86fd4fd41527ad3e7a38d44d73aa0ffadfc51aeae0af3586a488ba09f97de0f258c31927c95dfabb6bc4ab135ff0479e000038821bc2e658276b08180d8d6462d3813dd6e0cc5af7066fbf329dd28d664a7a19c5f694362aa3d2657456a7bad9cc922e30ca913d1b413a0081e3effeaba89932605a772ae61067d44391c6815ac53fe480e439400ed4c7c599a69057b6bb6f560b78af22538c0ce2cad075e4d5c2820f78a7c877e858816c3c098071e1c811b7e9aca54ac7d1909bdee81ce1558689b76ae122219f6dc777819bd08d4bf36e543ebb623d94bc9f2b3b01cb609c8cf8b38bbde7d7cd561f14534b9dcf1178b9342d45b6d59c18e8d33dc3dea3989509efa1bb64cfd5a53df67780e5ca5857780c834626f2f3cd27912b81d3b156472454607e72d753122b109dd6eb98480f944f95fa44a802f1f3bb9e925c81e9c45ec7a4f5407ca4d4255215383fd47594fc0a4c27f77a26b107e2d34a1d11a9074a407f3290b8f3bf04b8250aaf40a3cf9ab76e2f88bd886d4a5e3d60c9640de2086dbdc71e5329e494ab742839b5192dacb834424689c756909af87274929990832cba9480f321b4363002afb66fd98a62e5237e032f578a47d919d4518b14bbc9616a04c77a56872b62d01d43af5855284b87bf12272a8827af4b2d92aacd108fdf3f16055ebe8bf8dc4fd4f4def16a5c1b6608636d9ead76c38e3796b866edbdb75d6dd9053bded8e39e65af5e76b76d575878618f7bf6bd7bb1cb96dd61e3152baed9f7eedd6e5bec828577ecb8cedaab77bb6db71bd69c40208cf61d940870e39ce31e4a10d6e0c00795c7e89f100a8fbea0eae3e7c71c98b26f9941cc001722c3a262d5179edcac9ca9b23d4ba1794c2382404f739c77f3cf47fba808e692c2f99441a3864e6232876f44cf406424ddb3c452a24f52a549adef68b5afb3ca87b849352bf29e0056ee8dde21eeb118a61a9b1843758da58ac45042c94abc04d2ee111d084bb22a4c205eab11cf061a2c33ea5ed0784d3f98a50baf8ac36743fb94f788553f3182157afe66ff4c543a33242343d58fc5dea6da235997a9d0c160a9473d06688c76228cbab1ec4374fc412eea1d3725d66c27f4aa280d49188a109164a082e36520c3dee60ab6790e851c9970c031e030f41261297ff3bea0bd6691d045892848f69289af3e171b810c5d1d92485a0fa46694164163a9c5a30631348f29610fde2f7b7ce3352b9d72b6b5f60353c27d7bd661e8cea47f3cb7f36361eb81e058634661c202d71311ef1c19db4b5b0cb6a2fe3da6f6c067e58f87512931172b0750946696effe264ee498ef1cba1948f2cdf06a3eca3d68fd20b578e5ae21a4b76cc252a47e2078f123a626dac9f2ec5246da62fdd7dd701ca365ef8fa7699dfd87355fedce718cd6bd3d9ea675761fd678b11bc7315af6fe709a96d97c5cf3e5ee1cc660dd9bc76958cdf6718dafbb713ca6756f1ea76939dbc735bfecc6c198d6bd7d98a6e5ec1fd6f0ba3b87635af6e6711aacb37db4c6eb6e398e61bdf7c769b0cefee11aafbbe73086c5de1fa7d132fb876bbeec86e398967bdfbbc9820667722b8b9b50361d754b5ba7673dfbc735bceecee118d6bd7f9886c5ec1fd7f8b23b87635af6e6719a96b37f58c3eb6e388e61b5b7c769b4cef6f19aafbbe138a6e5de1ea7d932db076bbeee96c398967b7f9806ebec1faef9b21b8e63b0eeedd134acb3fdb8c6ebddf1714a432bed1d9261e5fb076a58d0fe918d2fbc7348a6856f1ea96949fb3d0c97375b9e479d0024ffe627e66402ec9b812c1999d4639460206855c5afd533398f1dc4403f89dcd012a322f680d58a239c79cb0c98644db05ec4826212f1e56808f98b129f068a043a04a19c3f8a32355bf8c18611dcd744c940f5e8c8c3880b6f9eb43616954afcfb8c2b7bb2dbc7d7f638a2934b4e195a7e1e8a886652f22e8172f2dafebb6357f0ef5b235172b102bef6088d0e73bf66caacdfad307796cc4cfa6525f37e6762aab3ac3275f6ccccbadd2ae66ec9cca4bbac32ef76e64cf5cb2a5367cfccacdfad64ee96cc4cfacb0af36e67c254bfac3275f74cccfadd4ae67ec9c4049d15793bffdbd4c9e18fb960624568f2ab3ecef5e49d901bb7a5b8c2b6d1b42b7e313a62a15b828a75a32fd303ba9214f6084ce7256998219a60a804c218917aa8f46771f2f1fe0253777ae5967f0725752f4e148c3dae4b583df456ca9d17a4045f45d4643985e8569117efacc66cef16bdfb230a00abdf8df4b2221b04e102b1ea3374a0921de83dc378aba9a881ae0b6a3f6ccad8e06a41badead4574c6bb2aa3662cbba5dd88c7108fc5bbe0312d89958304f64891aa2d3c2a1ebd278a7e598b92e16922959e112d17212a0706f6cc7bd8e71ec4bf7e1f08ff1c0cedb0e92902373098329802379feeac70c371d088a7e6c965a06181801f483bb449c16376f2ae8f7e1caca066c3a563fd81fd1c70158830c81f8873528b881bbc4a331fc8878cbbaf7e804bef824cb4868668a30750fadf0d46ebde962a6ebf0e44e9986d2627f491b543b3d2934185db0f4975f1526785a047085db642347e5e4157e9a349fb4e33ff201c011ce6d7372c4dd08726067ddec94af3c8c68d805c617fe0245697c69be569829f84f39d643cc9e79590d57360b3050790a303b0d8ac177402cfdfb62b0b857a06e7764c7818e3a74f5b5445691ea7e82938dbe119e067d1b415b76ac76b93798e6bf11d4008d3f9187f0ac3a1f39693276400b93b2021aee333fcfc624b53383d1e31cd9becd35c58984288e3456a4dd693cee7f0c920c79de0146f504f772cfcb0e692a73b2f7cb8e689a73b167e5873c9d39d173e5cf3c4d31d0b3facb9e4e9ce5d88a104d8f362dff1f013f0049cefe8049e0c337792f0b4db2d7e275e9bac314f5794e379463e83d8bbd3bc4f109e11f4d92f62313efe9b87b33d87cf59b6b40b933c12fe69de392f194f327f96a74c6f56b930c13be4399f8b31a80dfa39cf8b19a80df2f46c94f2e26a80e4745da80270d9522e4ee7cdf0cbf8e77966bcccf1d3b70d36d802e7e30384f3cf27af016464f2232e509cf08b5da1be29db85ac2a885d8210c8466f644e35887c7501e0020505d976ffa94026bb580b1e954541cc640f8d655fbcfd8649ad4585f2270bc1b06f5554f70ff5e753818819147decceb024f5731e977c11a1b07f48ee193bc2b2549e7b58ea4b84c2ee433967de0dcb52a1eed52f6348f614ba989cb8646aea55b5258666c574852e6896f46e284b9d7e57771920d8d3a963efc412525357d5af11223b0fe53873272e9b8a72556d8d21d97f52ae0c7763f954e94375eb0099dd4be8cacc1997a6a69fabb30408ecdfb4d3cc9c50726afab8fa2580c28ea28fb91b962c75eae7aa6e1106cdcab057c3fda5360db8275ccdbf798edf0932e784325225b1a98fe858bc5964b0d9281fa7826866e1573f58d54580629f0e4f7f4e0dc4cc3af2a8379e55d08c5f9bdffddd990e0493a986693df53ccddea0fd79eb5134c3183b71395399e3469f63d4619eee44255391573d70f58b1892ec71bc46bbe67e7a943c2ef6b4a9273dc46fa3f239ea009febdd875f8cbe86dd991e08932381a90fd1413c391ce43c635f96985dc12842c601b4a740a00f50add9973dd97dbf50c2c8e81365f578b32edc7cb0618f36151ccaa152d3c334e4943e518af577a8684a269e7a92c8bb296058d26b412bf04361b36a160b4568cb5873ec5c2c6f7ec28ddb5b60a0520a016ac629011b6d2932a8b1a153e3468288eb11f8d0b45bbe7952cd4c814ca110c0ff0c94e15ae364c4fe0ae41b491d46e267ecdff1fd38d82ae0162af28c466972254deb6060b571e6ccb48d246abcaafe693ddf5ab123d6971f9f7e16fe1ae20d84158833d2c52d20bebda5a20824681b7fb2d3e93ba5004e1064633452036ae06ae3391dffc50822140192482809f81edd91a365bcb01b6f0a44bf71fb31765d686ccbe71e2181aa215a6e865eabc21e6a42328a2bbd850373a103e286d83b8607b4a05c3cab61e25995971c5978fb5eca72288d46702eaf872bbc8881496a7f5403146bf14565b474f87c3e01b051e4cf760781e792bd196b081b5b87f94c7aceacc3e15c44582eb6beee065ffddf493fde6be5b363f490bffaa88269ebfcd1eadb43e44230926bea034598d6c626d02511ab4ac47699556e83aa77d5e70dea44462c10cee0951627b92e3bf61485ef9f70f8a7783b009668010c0dafe13148857e7b39a85d23cfa684381308841c6c7c915090f2d6b08bdcf1873cd18ac67dc84405177a6cebfce2ce3558bde5140a39f8c7af8134e9b8237cfc4ce33812a27656bd7da250ebe0fe264d40d6fed0d04ed39a12ecae92ccde8dd96dbc97e1c332cc46c5401543c004df1cc178c790f6011868681cf54ea0ea6b70a98e5dd25ebc67b5e62085c3838d12b572120c64cd0f57ecbb3473df11193504bd1daef2da8f85d922b82f5dc44719dadbaa5636c468bc9a4bfd7f986536fd42159f2a3158a928b1f24a44d972951f6f8f30d9d40073106c31309411466d4a940eef9ca351e36008ebb0996d4c291ac578dc67c6a443670f92f7e45ea4dab772051380a0b1f91d48ce82b4a9672b2fa844762234be7ac80c23b489912bdca90e858dcc5b7d1a48e1f36b1f95a04543ba84492adaa70f971f174c2dd797a068f7018fac57ec7c623335b6d24e79466c1cd903ddae18b70de2c292ab653c25e888ea85e549ac6dd8c190d31f3df640fd8a55ee3c2b0d2ae89f6e09f5499d3ccf2b5afb0ce1d1e003a6730ee80f2fdf6460173ba34def0eaea88d9c8c95e003c51d36a33060f17730c18c2aa284d8bcc58ac0fbbcf878aa5b4b677a1d8832ff3021045154438d92da70e97ce4a17cf38b147f63833ed0fa81413dcb669e0e422d811b75dc9641b3e78195debdfc4296d4648560b8721e544fcbe6672c2068e92750bfd8ad72ec00fd613ca50cba405f1bbafe66efd652ac127ae0c60d46e81121977ef37b1fb0b29f1169d2eb19fdfe1ce99dce0257c45548263fd28121cede5a87dfd078000ae220a7b713be3be74123c6e04afdabffb36027c6c11670a86c9bf67feeb4fc2cc8bccc85fc6348a2f0113f36369325bab2585cd9df141a9e1b6e8f8ba9a75d34a0844c7e596a9863cb7ad4e260f3a899fe30781512c322314dff98afa523587365be54f0effdef8f3f747598e83591cb7f97a2ad30abdef251b07e6fd77fb1434cbf52a169a74a6d364b6f882956f8dd59ee8da757367b992fff2f0598ed3800b1ec07a7877aeee8c87fd7467cc42a52d4d11ef290708205b5902205adadf19024ea43153d4e757731a7aa35604a160b0b71589dd7e0622f54c3dce49868b8b6fdeb3c73e0e2001f5ca3b6966567606b9a8b1d3817736c74f37446a3ea55e0550791f0c1c75e6306f1fc070aad640bb769173c7ef6424edbc4af57e5831f8d6c88ef198b4473b2ebae140ce3b0202a83850ddbcaa3ccf8812fd7fb1b6e210a5723be703fe83d4dbfe39fddb506368318236ad0d1d548a2582810daf53ef434560b10532338390c9d65d2a7ad1ec0581716eec9793d779a5fdc5c6f7e8b74d4237ed050751d83a34d165e1777266b466e917896677e1f146f51a6183c482c7294e28348b4720d6a63d28a31f713dd55b61a021f283dd5c93302ceda2a63892d85068aa13c3b1c001d8be832f9f0e7d158c295072c0fb2a5fe7a0dbc3ef401bc18059efe44450f53206015251d997250179485b0522c94e19fe3351cd52d6189a9206db49253e13d5415c4f07edeea81efadae3900e6bbfffe358e60ee4b666935343116cddfa07b1138c0d8ffdb7e6ba43542082184ecbdb7943b420f3f0f390f29eefd0ba646ef6f30a5bd4befa64d04eb0b610d00fc8bb7eb3ad2bb8ebb0e7b779adefec5cb7cd929d4f96cedc79c6135aaa1e3cbffb6bb72bed55d3bd5efbaa7774d588e3a5debed54bd77de4fa7e98e93177adf756789e714e25685f75483385728c44f3588be5e139bab663c888bea27c4fcca0350617b2b76eb54767a214a9d82975eeb1a9ad785dc0c7138e6a7fdba09286e131b19aa19d7e656838041d438a3c69d88921fd205d9c0fc2f94a9f18a28b3f6b996daebde73da6fc8fd2c6b72310d5de96c83c4528c5c4d898b19a3a67dd7f8da35cb1b7cc990289d26ce21f7cbac8d508a74139baba66659dc0e13a858ce37bb55656c34eae2621aba21f7e317911b7c611b75b0d2314e87659542d546e44aa5d28ddc0dfeca69fe8daa0cdfd087e45a1f9ffb5da945ba6f73fcacb6b0354274cd0681ed7117dd08d1adf30d55be91ab295da653a3cbdbe8986e7416ae6664633a79b95aaa196784e8960d72b5c7d608bee819a7a35412959e7135a5161dfcb5bc098b85423602625023201ec9651b915c0ddb3023ac975ef271bfd231ae86bf7137fa6e25285c8d6523142ea6a1cb20c7fd348b44dc16a16cb006b46a84c2cc2fd56fda8eabe9bad0667dc49ff61b7135d34628d10bec128968366363a10f8a5bbac6310b1f6c2175a415f2497bb1ce25edc549457b714e29da8bd3a63dae53497bb1ced5f6053725e48528a8eb620444e242e5a7548509678509cb16271f185ac4e86991e2c2f343142076645c712835472e9154ccf00962e31ab5f06e505208c066004a86d8b8cad5cb1604d85ae6678cc3fb15e9db724d011bd708a41a8000542a950aa552a95e5eb40c53a930ec52a9ae17a641801454000108708097971702700d42252be195e954b4a2bd7879ab3f6b3a5b6a8fbe01609de82ee99fe8ce737086f4a9fae69db36d84a263850ede2feafc3b51d38674ac75976cfd849c24d4613a5b28db53b19a64d911ced0f7c4ad15decba85f5fc5f24d7b720a81b91d103546e4a2fbd82672d145344871bfc6e9272e777e514707d290ff60c4c0ac562b13a8beeef609540cafe96d457b4f783ad39f5c38d3801f600169c0cb50e8cbf142986ac00fae801ebcdd801fecc83bafd6399d2ac295ff5a560e03ce441da6213f31d3e7b713acc15d2bd5ce699c289d267a73352b58a96a553ceaf0e95f875e2a5da57e2ea24beec67c779a3855de9eca0d085f78de7ad76f9e9aa0e9577b2a3fc11795d374a9ced1b3da04f7e1720f5527fa7e466e91be9a663b67541b07abf1c9153cf0457ea5631b9e8954803424db486db4c2953fd9afef0f3a78230fac017fee0f3150f5836dc01d56f10c2cf36d5b5c6a7cf218f5e31b836374a1fbd8bae93162b85c1ca64ec58851f9c6279d72a26f774a63bace7ef216e9eb01971b84edad7ab954785b6a0cce766cc1d13e4a4d38fad6234abe54e5c6156271bb4228ac56177248c45f900a27b89043e2b2577ba3c3b0b0bd511fb0702127db1b9da661c0dbdb653205a5be707235a8c56de4b1dc4aedb5e47074943da30c8daaa9c2cb55882a5c4dd3988b66e83e212ed77a76d3e94befba52bddaf32e147e8085866d565d001fa4b80ce3422858a10718d764b2a5adb99ad1ad2ac3e6d2fa5df4084fd00bdba3d1e4524e7aa10e45b8b03dcae188b788f5c2d5e6c69c11967569efb2f88a21ab96aea9c22cf630e542ae86da137ca1dc0dd1bb444f133f21de6d291d528e9956bf531179d9dec082f8020d17be39244a97edc9ce742ec5c3e8610f1c12f4a67365212e1ddfbd94803c98c1e237dffa986faa7d95eae7d2526acf7478b7f64cb6749ad8f14b6d15a006977ca2fb3b5db67c0b6e54061e807e611679c0e2c26a003d58a189afdbe0cb90db8f5c445e2b1a416f459b830b3924b0edbbe0356ce37aca030a2e7348f06dcb337237fa261a2f39aa3157baf6e476f557e38d05b7ab425c8d3923f8a36b538adb55015c8d3924fa6c9170bbaab2611c6b706e9133a21f84df76e370681b7335da0637d6b2adbb2eb7545bda36c177e5308b3b687131ae09be4dac1ca3f62b711be46aba7efcf5370e72874aedf5a5bd54611678a0c2edaa8c7b714864e76e7148f4479f9c11a6b70dc237d9ae3dfac86dedd16b1b07059d2cf86adcc6dc0d8a06226481860ba1d75a884330863e23f76aaf54611653b4b85d95b9f08a44a759dc21e87615880b3991c95403e14bf3e97a2da5c3d8d275a3dad275b2a5542a75a58b9e72b585964e7974e85271e954bc7c1763582c6c544825f4efb4c9741e57a371356c87682f8b3b60716755b9110c5da8094b8de950aeb0c245e7b2154f70aaa0a23dc94baebc0d4bd19e2c5dc57e2e57e59a9cb4adecc27056ab1510a6d0c1143f9882085328610a2c66ee1454803436015cae86ed674422316f490e897913ef30942745ba6b4fc59eda537973ac02554ed34c544ad594f1489bd9c330a2b479b35aad7ee0f3031434a5c69d62055f4cbf5057a349200aa6c005a63b050d4cc7b81a13e46a2211e0cb8fdbbd45c7393852b6373fa3893345bee9965fd461a9dd5c8dc9b64d7b36408c84e96ce2ca21f1c49545eefc8cdbd5144d10a7b91a29da93424a3e7588c24cda9333c7083ee700599ca90e54704600596d043323c1e71d9f4eb19511ca9011ab32ac424aaced300ed32f9d0762ee868922e144bc41faa6eeb4bbe9eb826c80ff0bf95ddfd8d04fdba60adbeb4eeb27a474fbb36d6adfe4747d93149d325927e235bdbb7cdf50b9b1d4d9b35aad9ca86e200a2eb970ba9c93ceafe94a718420aee9d6cbd5e436656e50a803171c39d367d5340e47ff1ae2db71e7295733795c95cfc8e1907d6dceebc9942250dae39098bc334dc74cf683b9739e4f133f956b2a755e8b9b26d301694f1e0a61a23d396777cf1d3c8ac821d39eb4d19e7ce20691278cb0d49b0bc48558a820e86ab09bd0412c56007421cf8558ac00e76a7353a9d37aedc9972a8ce825fbc95bba55af2a70da9382851436d8173cc5468a292c05a8332c5630c5669ee5f25a7335d3364e131b4fc562bb8a46c9378e1d6cf8ca16f0b460c9d5ba592a77d128792dea401484b2d3003cf074cdd39ee496d29e84d29ebc82eb9ef6245fa57edd55b916b96919a83d9ed2de170960a0abc5951ff75cb9a4535fd4c16edfebc29d16ac6e4c54c937934ec52bef135172ca953e64e854fe358ecf95672db8a753ed84bcdf905b445e2ceab417139f344a7adeefe9f1a753a7d3e9b061fcbb2e8c9f0e3b260a4fe524bb8d3f3e54e8e0fdbc1b81608deca9ebf2114aa7b8cbc72b3a355a394fa734295a449fb845e4a253bc5a5df9c4357d567e574ec7e8b37237d522f1ae70765455ea94648028a8860b0e10052f0d0bec0051f08a2087d9527b2dafc61c8eb9b537855861bdcf369d2a5d76523a651d5e18f5543f263e1e77da4fe5f3227ec9726f2a2cb5bb390a4f1558a8e0a7adb8ad72159e4e91481b298aa65255180a7f32518b2186c039151d13afe852896d54fe5d2af6eabad34df6fbe7c1b0fd6064da7e326d7ba8a830f3456c71b7af99aae44cd74c2c35428928798d4d15d660cb9ac317374ce729b086c94622c017f822b7e848ef2eeaea13edc9af88b4168d0c4b61694cb639938d3a62e89a16b9d6d9c42fa23db9f1d9c452598a46c9c6f9daa6716cba8a4ef5956f2b3ad572006a957c8cd2a9365dc564bfab856cb7a7c97e46aee9433ad57d20edc9be4aab0ce196ddc35ba99c649df404af3e38e54a23bc52b9f51edfceb086ca37fb15e16bfa8e1e310c9de9231e3dba0ae10bc97e47a0b83432349fcc9536688ef8ae98a81351f22a451cd19ecc721cd19e4eb4ec10d3a5653a10531d22a533e11062874018bf917c56bf4d543f0874a54af7556ac7aea666c247a74897ffd129954b1fddddd60f2648155e5325fdb8a4ae9fcb6d79fbdb4ab7455572a1b32ebacbe54c54a7e44267baf5ced499fe3239d3495588cbed36d5a85345d7d6934e59d6032ed7bae93242d1225763b2319d75c93c2e3f7239e0b56c139647ae89cd552c160a179593b66c3f68d90fa63f6f3a4df4aebce9894e6997372253c48e4e69b6017758a954789900d2297a2dae8452f5c12eaefcbd7fdbfdaec94d9a2eb91ad32318baaf73ae3c5796826dda9397918135e095ef9bc6e99c4ecdcb6fc391e9264c0443d79d24351213f753f985f0c574ae2af683f9f89354e1dda24e13965b5508cc2d3deac49815375c210b283186c5ca44947cc9caec5c791b5de393f6e42d79c5954fe04be9da94fdebe248b19c611ba6214b2a277dd47d3ec47d7e46a736edf343742abbe9d37e42602e9fa63df9abcab427df3ce8f89f0c0e1bd6a5b55dad37ac6a578b1b56b38b61f5c2aa85558ad5895589d588d5d6b46b93e9b6534de5d66609d92cabbb96a5dfae927da35ccd765191cd2464bb21c8d5942ccbe5e26a849caeca2fae66eb4e1b935ec230aea68b252a2f3aad14e2927135424a57e59990d2259134aea60948fa3cad9352669365325991964eaa5f1179492f6ddbb6712ae7b82da4722db489542eeae1799744eab81a212e57e51d57a3f2e3badc3967e95c85b85c924c37fa88abe94ee26a54ae9954de950eb91a156ed356b21551c8f4aea5cb1c8ef995ab5cc82131bf62b7abddec625793dbacd7d5e636ab7535bacd4aaf666db3ceab5ddbacf26ad8366bbc5ab6cdda57d3b659f96adbb669d9b67521d367121b14d764e393528d50da9357a9f18af6e44935eeb4273faa314a7bf25d8d3ca21aa5b4271faab1a73d79ae462dda93df6af4a9718bf6e4b31a7fda93bf2a3d139957eab427cf58745fdb5c79093d3e4df74da72e24ac9b80ee8b3a57caf314a0b8d3a98fa7f0179d9a573eeac8c7273246b9f20c046bc4ad6f50375c218bd585d093b72fd3292a6d74db748a2fdf52746a86b441e40e23d9a060242a938de085d697673a135c20a8f0c3cfedca725daeb8438b8ddc648db1e4762dc1b0e2761d5d8d6eb29e9a606db2b234e10ad726eb4a13b6c036594d4d6043b6c95a6ac21eb44d5615274cb16db2926e70bb7257e336594740b85d45570b6db27650080317a24d569112ba4dd65094d1262bd773bb6e57236db26e5bdcaedad55436593527ace17655b95a69933573421e6ed7d0d54c9bac98cdca26ebc5e476857135964d56eb08b76be96aa74d564a85dbb24e2d5c2dc626ab54c3edda5dad6593353ec10eb76b8cabb96cb2f6cdd57ed864854bb85d57ae06818032421f921b2bdcd9e9c1ed6aba4822cf236870c607c1b0bad7b5fe3a97f6ae9c7b49b1a2db4ad9d134991b4fc4bdae41fb1de1b90de53690db429ae8cb6c6962d70f06ddebb00a6928355606d49d92e08917c4c2037aae3f60a753f2d71f10a553f1d71fc0d3a916ecfa03a4740a9e80ba1f9f2cf04859d2c21daab65f3f4ca7e0bd7e844d8c99bf32fb41292bfa0f4ab9b9d7b1eb748a1bbc83eef486c8e82a67ae8995ab1c724d8c2c08f8aebc74994b22917ed2af18939d4422bdd342a1cfba23649528e19e5dc976916a341a8dae8d1e1a8542d68893d128f4d0476fbeb9e3a474bee9beb82d3b4eb6655ec36c96cd1be19e7d5a1e2223db451a73106095764da65b99956ed1de4a8fac22d358bc688fae1caa5a56ac12aca237720a8b954132e8d2e36c3f1772352d3b5a561e6a59b12d4a680f9d87f6d0cab5b3581e5717512b2b2b87aa58a16a54ad6baabdba5c61e8da7984ae59234e586e443e6457ce627968bfac9178cdc2885ab1d28af668eb70bd56ab1bab1388c512a25cedd997d09ed9234e78c86b5f22bbc81e89cf1eafa966abab952a4f9e9e3b7d4a7ce74e8ca1570725c668a7973a7247f6c81fa9e3239580aa4fea5cfa51fd648fe85ae8a319250b89b4c933b27367ee5c7a6945a7bea845a0ebeabad3e9f73c98fb45991b14a7ac6c6e967c12a73b4df3ed9c18233a7de36ca7d9e9bb27c65c6f2897d2f6e97628c17eddaa5fe35cca5dbbe84a946c5673d11e0d55ba24a2e82fca73e931da73e9330ae5d26b74e7d26f34e7d27354e7d28b28cea5f426a2a02a54a1aa81fa87def4bffeb9d40b2c1f6fdd5c505c485ace58a169a26d6b0f071d6c0f5a226af883e98e512465dc5ac876ba404e5cbb34a925eae894586c8c312cf421b932d1c6103033a457d31e84321d4c7b106e1a6d86113eb694926933758326a594cc4f6ed724ce38b994248c89b6e14e1452ba4bd348b867a0f1b5134ccdc3bbc0d4f58fa547055fd8046724d308c11923194c5987b7e0cc0ea60153fcabfb4e92a63d2ea23dced11e3f460d06d2d383cf047771f9463ac51e0f3ecd2da23596c3a503562d003dfe557b58500d6fb8fc09bdb87c23b00d3b180d2a58a302f085cfa7e119269806bf8b2f2ec3345c7e8f0c3dc89001441e8000e2073cfcf083cb141797963bb4b4c4b0438c1830ea0003c6c98bd389850e2c2c2b73585931c9c1642a05954a2a71505121c181441abd6134eabae83a911b44a2501b42218e0d1cb7016d9bb6064dcbd49065581a30ece2e2ba2c3458163d03a5d30c77cecbf0a5a5bc7c0bc01a31c6cbaf00acd1dd974f0158837b748a2f9f09588389688f61da63af531fa253bfcd678cb79c8eb2eceeeeeeee7e3754a954b4ceda5da8e27fd7af6c1fc86b44f8f3df35cfd3767753d0f112c6d9b81a57b1abf0ea9ff6d1788e6c8e1843b7097918f23064c8199d5c45577ae8f3ed937d49ce954b224a920e63ccca47ef2e8a36ffe2cdbfb864c5b6a964bfeb5221d9afeb2c7b3a5d1646eb65f5baaeae6b1fd50f5050ec29718571872aad97c418f998b32464fba66de6e4c93e937db8cc0457be85006bd02bcf049dcbf66b9d2bfbc985739bf276d99170eff3e0dee7777c668df46366918ceae9dca9fb776a1fee3fd9b72fa169df34ed47b067b6a5832a199a5d85d1b26a830e4ef6f1b1219f90fd2e9651c650e834dda1f6798be8e72538fded5f77efa753e88a315ae8f31aad4e200055f45ddd41ad1225dab72bc9dea9da275e57d785447607665b44c738db22b22d4a6cc7ce633b668d3811dd88f6ed22cbe33a77ce1ac97e1d896a6e9dd329e69946c16d5182fb761edc376bc449e846e2b9872c8fed9735d243628c7679203126bbfc1331e6baa4c7fef1cafac737778712ebf4dab17357a224fbf58d99f48fb5044614566dae7c26af5518b906bab27d224aaab60ab30a555885aaab429555a18a56a8621d748cc34bdae7ca1d4ae2751a8a0b49d3d3167a2e656629edd129ba1bc120a3192e8d6cb834cae1526e29649cf76b207411ca65a34e8f4e0f16ab7802c5469d16f4e8c098d31ebdac116705f45fc4b96f8028fa3a5cfa3d5caa73824ba34ecb129c1124aaedf4d18b4e656728b20ac9445221a580c236f18b4b4fa67fb18b4b391eade26e1351f423fb5d5717ed773a591bfb7940b1276a117d62cf157d2ebef48c07487f25e95270e9d72eb8f4ad84ee8b3df31ffbd040541f5ef05467659ef62813ba79692517ba8f792ebd16e784da9cb64509d14b5fa27bc81e09bd7bc91e71c223f4ceb65847ba8b2c549d4af5a2d3b91a2c26017a941e3e2681361b52d03590e834745d72deaa50542fda400dd44011e8d273c87673229e02015685ae3187e3bad336107ca1e716743196d07db1a753d7e9a3169d92f7895b48ae26c6ca306fafa79784916e9e88f6e82107d31eed3e9e42e9698b8e79e7e79dd6467bf43262e8e09df7639f2873e9d9678b4ba7481f9e0251f4174fa1b1c7545d1a35cf55b6893143346a9e9ea1cc432deefcc73a520ea39c6c7444dcf909654876e66ab0e60e5592b3473851f723a2872c54f5e8aa8f908fcfefc736a1d396111d559a9a23a2e8b9ca36e8a80ddbf014ce765044d106e23674578c47b89bfed291a8be93e8dd7988de5d4acba37bc91ae1dedd48e8a22339e2840777d38f845e5af1015f7ac5246df00c89280a776017e7e2b4851617368c021451b48bf748ff642ef701a2e869d402445198269f97834b3fb2df6770690b2e7db45f87824b872093c0e0c193c3d97002c3a5d40c57761794aea6b4479f82eee329975e45df2b591ba87610151d7dec8135e0a58f3e3126742a955c6a43de482a2e14ee5ff7c5a0aefa9069af2faa4334aa1faa5cadeda3d3e3d3f3c9150de4f1ee177b38c218825bd56a56b1eab5377f5518f8323f24c67c9dec89504824961ca20d3f975eeb9a74186348d7e1afca9c3c732dfd25440f7d89ee2abfaa9396b64a881e7a8fee2adcd238b7732e17698fbeaba21a7ad71d215df4ce1e71c28374d18f8c1edaa164645b24c9761f9d47675be4bb23518dce837495936c8bb4447890de5923240b2304a0ea8a287a242a951faa48ffbace3ae14355e954a552a14a8371d4b5d7120fa1f0832aae6c89f646dfd87fa2537ce98d740a66b1032a2e3de7f0938e89d9a167259d82583c09fa988a4befc7ab254afa67cafd1827468916e40462f1c405f4b136200f4f6a03f290531b90072bda83977b3af5412f2e3d3d6bd1a9ed36200f3aedc14bd35aabd416f9ebd2b628317af725546c4b5fe55075d9cec2d8b2041d54a22f11fae84b88ae628d408186347481278789142ad147f68813d14387aae65a76b4f43b3478a16ae9ee3c46efac1127f146b68f6cf668798cdebdb3465afa50c57d645bda2ac1aaeb50a51d898a2b33b7434989648d38f92000552568b28282a402154d44d18fec238aa40215cc7d3ebafc420755710b3750b152916c0b9f74a81ad9d1495f6274923de28487e8a41f097d648d38e1313ae9469cf0e83eba919e4bbf04e988e8246b8499d4000849f8c2cf4a35b2467c44147d67777c70273e99829321fcac5410e64a7a09860eaa58085920031e76562aa89a672b8fe47e50544315aa6044615a7037977eab4b2ebd56791551f419db5cfaab3e1151f4ac838e7ddaa3b72cf7b447e919a7e37fdc132d11f1d106b9453a3583da20fca3b5d482a05dd364ba93cb4f323688e8d4771ae2e4c2d093dd76a54093e9b8af16b8000dcef858e7462040d88697748aa56026f783409dfaba1f4084a4bcf6d8901a00f4ba802903cc1888f021c20b325a90c9420d18ff20d0e81fe482f40ffedc7f100cffe016ba7fd00a17daa8c28c0da611ff419eec9ff48680b9ff8890b17121dcb9db3f18a514a3f2af8b61f9778a59f9771aa6110ff9341d6fbc325df6b8799d629b01ace0c6229846ccc13478e6081b3cb383260a0c0f11570602f0452b8267d88a1c3ce31dc1333e76f00c100844f178a4dc780d46e5cb529140547ca97e00320aee70e3b3dac4e6a42add072ba0f4784ed283213146e5f14fc418960fbec47ff00c371e488c29d958f9c7ab1b39e783f12b15c2027c2e2c4c6ebc0a53719debf5ae3de87531c9595070dc1d8251618fd3e399b06aacbb9dec57804b93b8ac435ed3f772e937c4a5ff2270d974964abf52e92777c3fac7e36adb99e8d466bf1e3dbc4b1f512af51b101dddfd9ed0ce56e8e0f280ade016402f3ec432b8f1a27a03d89ec735f0c13330f8600d66017c898f07c2332c05d38867e25d8ec18df0a747f77826b4c7b34da72c1bafdbd98fbffde38b4eb91bfc90082e139111bbb67d7248c4cb67a2536ce37bc8bbd9af8fc9abd9207dee63b6c7d587f7fae46a2e1bd3f5d53ada6e4c50ee823e376a17c30ec5dba353df9980edb9b417eda9cf7dd66924ddec5643b4d7f43124173e8be5f93008c7eab5d7a753bc05e383c44f4b2344f5a3fde684f1b753cc31daef575a98f664baf856225344a7e265624c9ba0fb8def18234def30a18aeb36ec91398837f2cc7d809ee42951721f20d0bd0044491ff045c21fe61674d62522fb47a7e8d556d0d6e9165cadc34b7054d0d1ae53518acb3b65cd70694fbe4948e73ee99cf664bf89cd55a1735bd19e5cc24c58d0b58e6d1474d47e09c8e16b89d04517592348746820871fd511285eb0108795672f55e41674a228a53d990008b743c85d06d68831a1cb6b8063429671c028f9d03f4ff4efddbfd3485ea4ec5f6884fd5be9ae7f4088ac7f42408e0959c828fa8f00370130867b220e3886a7c4e19e38fb412d6cf68354b89afd20165766bf5087d96fe574d90f880b41ed47804b497bb57de08b6c304094bcec9c9e1207399cd870e5b9a7cdd0c5ef749ed2393d45176d2e1b7b05ddd739ab48edd79de2cd8500806222c97ac3c1cecd78015f37447b19949b5d71b36bdd73b3d3b4a6c95c0df2dc5a447b193333af6ec6719c3de2668ba1df28778ccae1bf4df4af348a21fd1be2c24b601563546c123e11959d6461772167743a89bace768f557bd9e56da0ee83595875218955b64ac227e766d7b9a07458d8c9c2037ee2037a3a259ffd015a742a3efb037c3ad5a21d5eeed91fb0c507b130e56659167ca4e4b474872ad1b3c3d0643f624996e1dcec5ae5b28c4ed15551ed226abb2681154465cf382fe3366d0bab9bf9dcac0b700bab9b69ff60175637fbc679ed659f77a1dcec3d56b006dfec3d92d0e0668730a6f371c1bd7c5637833e55dc0cfae4b49cdacbce2a23ac7a44e9dccccb741087bb29f1620c5471f6bb36fb759afd4ef7f36e763823b341201822128682914cc9fd4093e99865574f489a896870c62777ae9c1a6f41b8b3ae5cc8dd98323277def9093fb91a68f9009db6b11c6e30fe75259a9b4e99ae85363100e07e57107cb8f06ca33d2b741fdbdccc1850586171e19cdff519332adb44947cdbc418160b23e3b26d1c281dacc197a54ae7e7ad79a3bb1c80ef56d4e1b38d14f329d369daf4af2f5369da081ba9b6925a1a994efd70f9da710d5d7c4ebfe590ab71619b037109c425df2ae32a2a93bb418dc8eeda9b27cbe2de2a6f92bb614fafc974411c7235a74b65ba20aed1addefbe95a43eed087e4764d665c93e98408c0695ad3449fb5af4d9e937bce8ba6fdbad2bf78bb2f6167e16a2e662fdae325747cbf938cdb59c884ee639905d85c956dbf4aff60140baa3eaafc0518b3011f710309e8ac0c7c5942170faf4e7da3d13b0bafd1f9a307e1cbd306391c45b4c62c310cb3e8866154ca4969f7bc38fa8baba121b02ed604dcb9d869a2d61db3d6b66d6a90a3c7a606af505f6227eec675db227d7ea4b37035d6ad73775dd7294d936cb4d510910f12b1226cb4174994d27912a5741b75a653bd27fb8271649b6467eb5076360847c8020e97f4c9d590605757ae8d2ba95c21d3105393402c213f8494ea27e4e4c3d28cd2b9498cbd682fce9e24798a61168665a7b5896429a5946c9db0aeec49afa62d1bc3ac9e16666da439e9689bd6bcb68d88bc715a79753445146143c6864cbcb26a5d9bacdb8c2d0a4d5a794a8d3c7f11f9f30bf682be31699db0ae94d6b9837a5ae66a13ed5b6d925d63e66a73556621acc1721082bb21e3b2e520f812cf4ae8fa32310646c8ccf2722c45fa007035f3f24cff3137c46a3a0e07662fee4210bef0fba6915891a9308106d77063959186286e1aa670a3198e70639f010537d699abc5336421cf60861bab00ae3657706315e26a940837561957b37a6eac2c57bb36ae100a6858c38d350057c33616dc581370b52c0b41818b29dc587fd989eb3661f5810fabcb47d2dc5368f042a915d1f1e13b8aa64d8e51c69ea5aef2bb9a39d62374f0cd330bad1946c62e114786d6a253c6661863d46a3a282b92e6cb0d4eac63d6a6c5cdd2acbcfcc08d9dc44480928f9c8eeb6a3c54988c0c11202f391d72b36a8b12dbb5f7d86c0fec320c5d1370ca75087491a890a89a1eab4ab07711d530a2b2cbfab1dc42d7049c728bc43bbf4e6e3790dc0855d877ba3d2bbc9f34e2005875223924621ffa30e519d290323e5e277352095fe42757436f5576e244d338638c920b5dd689be739e5fa48d7c9653eb97f3942f60aaab039c91f20e728029111ce0cc7505b501a6426b8033dbc6064643c7341af2192e8c289c2ba7d33941f98ec7030379091398923180334c6c310317c0d4c60238e3e3e7e6c2b30a608a3b3ca300cefc601afd8f537059feb10980308d865c822f64bc80e9c2e3e25b9cb4b0d1314322aa0f4f044cadbcf44fe63bc0855086f882b890b300e2c202c0197ef202532a8717009c612842c05436c357c88029d3e15d788677ba97cacccd2cb969ad4853d64b98e054e18399b38449c60427c70755442ee219b89cdb8f3f510db73f0a897a7ba950257986a3d47fcdf37f7d379e612932fef5ed78867b48b0066f01bef45bfe5d31fe7530fe9deec1c85c2678a69900b1c5edfbe099c6f9e15fdf1f3cd355b8402e6e1f08cf74ce076b34107422aa2f001814048360100c9a01839ef04c0701e009149e692fec153cd35386385f71fbbcc333fd0567016b341fe22aa2fa03b800ec7709e028fb75a87bf63b790f80fd1e800b613f4f8807613f98203e43278867e2ce8c0320c80b9e89510070ebc5edf7149e893cf643d8af6f7fc133510ad3e003ac11b1005f563126fe4454ff1a80fdae4e00f6eb4e28fb9deed9ef5e00ece7c108613f9820e26a876724ce8c9d283c23ab0080fdba1f797846e658fbf58d5278465a810558430a01be44e199d853a3f0f04cd4e296e7f6590acf441f19f66beee199b8c51698f08cd40182090ecfc8273fd8af6f57e162bb8adb6f20740efbb458339c2cccfdd827b2cf29060c97b73c5608bd160bdb069954b43cc6921887c104c65d707670a2a2858a253198c09841809eb5031c2bde704f561c6eff9b42b87d168fdb649094d33af7f82d7237ac5fa789b222b91687c333524707a70a9e914f9e5471fb3287672414a6d197428035a413e08b153c23af601a31466a01a2fa6000fa644f101ba6c8e176fc9178b04972fb3305b7ffc925b7650f7ce9e7e8f8d209528767e4ce139e9151988684c233928769c82b78464ab146d7b2df766dea5cf9e4b21ccaedf707ee65836cbf2e7778662ee13eaddcb97d1985672613cbca28b72f797866e2b058c973fb520acfcc2a7c005ffad24a294b24b784893cc39c413095fa2a261c1fcc20481c59e754999aca37ba41e4b7cffa79a027f6f0cc64a2f568c1331327d3e2f6a30fcfcc2a9886e573fb710b9e99394ca30f04f8d25b30e1dc70fb1a93db9f382c7bb8b8fd0c27a2017afd51955f805e4f1a6e3f24c970fbb30a29860b0458437a01bee4f08cd48269a001a6bab8fd86920db7df720cb76fcd2ab65b75fb557b3ab559ee9f756df30037ba9bfdac9acf7a2635d913447e74471fb812e3745c0c3b646122b8f2f165fe7a224e1d0040c148a8ca0b1a8c314ee879c8490204f0b818a2ae3bafc52869ed61e3a409991ba448bcd6bd8b44356f3f56723d0a274dc85c2c9eb9009ab5359515de58bffea0b02e392354aee49288d616af8d5678afeac489a631466b862ceb44536a04f918638c35f2f665ec66319c4e27513ccb3aa1173fa59d50043b242f6a1e18e3e96252c8c636c658856cf79275ee50c63818da608ca1aa9deee472e13f0f4646e59f76e14517fe82354a30254987c7e08cca7678adab4a445712e3a3c72b5801367702b46103a35a40f78e58dc7e7c029ce1b7e9f422dd65392dad5cc27891eb967eadbcc8754dd762d45ea9ac2ddc467db30a51742a25515cc57311d067335c2551742a080b00f900df0cc3ed477152418880693f4672e365fc75797137188a0b7287620ca8829d9232bb2cc35831954e2c22eb9a569d3b4a462cdd9b67948e699e5b5a79e9f4505512b24eb2c7eac4e9aa7cce1329725ded34d2cbf8ab1271e274e98b5c3ba7d2e91857733a45292ba5c9354ff69597b25f2f9da54a2e74d9576ebac5e9c84ad96166ca607611a723b3adc5551271ddc3d58883b3bd1f7500532adb45e7e9051bc3ed8f261a6e9f34cb70db02377efee5eab81b482eb55f3c769a182b928b553977fa27a27c7c82445c930602e2665795748fe25b75e2ba59a71d8ba159d235d116e2e635998e74e692b830d2455c0d89145b8a0b6b9bbef62b8666e9394ec73c760dbb2637e9d4316d53815d21ae6ffa59e5a264296d3399b497f492ce699cc66928bdd33aad735b8913ec515c15ba556dae0ad9c8136344efd0db7a6757d1ae722c2b7dc39e5d1b6d325d4953293dc4d5944add713ad8f216edf535958e631fd10fff4ce9b8261cc44159e526cfed5329538be9332269a2182d8c832eca3310734a1a6da24d8c893836d745e9475c0d65a6144727da68b3c592beec3b6b13eb724aa932e78724bed437d7e67e118a1296cab273c70aca197145cb65833146aa68f6eb515ce504fb278373a3b8fd4f8413510d5fe2e04c54726db08648f4bea17ea7b16c2b9c3c8b649e9d1dde615959e16aaeaf70385a679493933377ae6315ce9fdbddf4b9fd15eec6bc97a55605b77f3a71f230381c7d6b9a3c1151fd29bc846ff8866f60c4e06ae4637038fac626d6696d123a569bd83c428928253c136d98463ffbd729b9fd5005d2f988a822fc442852a20dcf4c2c208dfe16ddd4a2a1606d6e3f067763c297fe122df46cfa61833126aae2d66122e04f125c164ec7e97482b1c1e06a220c4e89564d1e22c4a0bf2c0b1032b62bc65887dd2336d9a1d3432fa38cd89dae4cb31a4f6661d698ed11320727b16984e9bc4ee765617b9c0e79e26a62dc661431e90c8ee60a22cb2e79d931d6e575f1103abed7759ac630796dc626d361d85bb81a0c13018008007030305706800d06c76dd996d92038194b08ae265ef2b5397926cf16636df274b1c9d342e8b028dce97c767a8db3f0f35a0002c0d5483a0faf7620b81a4d237139e09d36b3b23d7ad23ee556350baf056093e9322a5d64263b7921381dd2cea042703f5623c4266b7b334aa73c709a3b9347c69097b689f59065a138a99cb4187179e074657bd00ac179d4aa334aa3fa01e06ef48d76ee38e9cfe9d279258feb24fd6184da50dc955d8c9202c8acaac47a145759d609d3cf197f713a66bc0c9501c8017013e8b621b824e2166ea022c99dde1ce2855e0657634d2a236d8658889e2d95d573412127bd31d0f81a64ee928ccd72862ef8c2873f3e62cc8e9642f75d97d98a0b6118beed777d570a5e30a8d9a0016046489341f19a66a33d48d31e8410c2f3e8d427f31c9dfa11322c7b88f6207b5a78a7e0e16774ea171e0769b8cce4421824bba54c085117bf40bbc157886ea4c1191f7c1faaa06d51e23af625e2db1ee9c763f688131efd88fd48fc85f1afb758dccc160c9c9075208acff6bb241f06daef143f45f7c15c4e008cb960b0b80ca97019f2a1fd2e180b749aee0a230aee48281a094b1abb6164eed1ee84fd8231d631392d3d62ce5f73e6a8553ecaf66211ed456aaff6e265a569ef9271ce40838733bed6e92a3af9799ee77711355947090d2f2c3a2adc662dc8d9976fc704921f51e09b5ebbaecbb2e9b9e2b226d4e646670bb537fad23fe914cca28914b7cf3f9d8231bc8220bea2537087094f44cd3db779a7890dae4e163db8b91f73717be7b294dba73c6b03f260c584155e2d3677683e0a10133fdaebf88e75d05dad732100904cdaa3c119b1bd661f3186557d7e72fb5c4fb7f2e5293a0ef8e814bcb0211e38c9ed161df07cae21023f79fadfe949ed6b1c4376a1833c175ea804ab7c44544bdbb5d77dc6e9e0bf8b2577183418635469bc6195553032c3092d884114c3401443fe2773b31bef51e8db716507517cac6ed0831e9f56093d4fda26865c39e7b44d18b9326eed4596b4250b66bceba07798ee7e307d820ee666c1052deed7dda68106677cd6cda54446e7c710312989974a80540b90528162417fe43f0ac43f57a75d236b04a57f5a54966d51423bf725b667f648f6ed9c3de28447f6cdb67447b86bdac8a22be76a57bf554ffb47d628949d19e8520e629d15fb79a7afb8ebb1e0c73b5977777675776ba2d3b4e6797fd75d97259fb447e74db7e69c38393a50764c5642913a52939b1665b4478e6897b24628558646ca98e6b47a47bc91977bd07d9179db26372dab67ddd1a3a78747d645735660ec18329da6dbd41d290de2a0111dfdf3e82547a46572dbbb33d784e95d77936d99ff4f8c114d69a078136342efe2eaf42fee442897f24494ccfdfae7c2c9798cb12eabb34e568c7fa76b59ef620c8c5bd7aeeb2b75c765952889f1ec4a607ca5f2bd2a54d9d053da32ed0e8edb382ec60988876604868d53228a5eb311c8c9e891871479786ea8b28aded050e820a03794064d75407f4089b043fb932a3ad3e747a737a66afadc8931f426c66beecc9db93377e80dbd893132e8ea4ea737f4e693414b707274a0ecc09e4b5794da5c3aed84a2a373e96510892483483288248348328824834832e87e32d7fad4264f8c89cfbe84bc668f6097cfb04bf923a747dbd25d45279d5657810c8940f40668ee58a6f7dc99f426c64015bda139f3a32a636814dccf8e12d4c0b2da5182ce4599bfd07d9c6395ce673e77d12995f33908c698ed310ee3a733cb3b5148da8f6fc88861d8758ed2a91e1d2b72542e43d5163d50f0410b463d50e8811717bba8943688fce4b0ab7fb868a0fef9b9a27f6050066f8cea0251f430ea1010457faa36208ace20628328daf5821ebd4a95d0a3b4081e3f2ef615b998a659c84a2cafe6ad0f29d2a9796ec29da69b8cbc1057ed19314796ad6814ff76b5e7e3ccb29cc35ee89e43298d4af871d5c1982110e58377c01a7cf9925adc85ce9e2ecc020c50ec89a32d94e6c02ce8d073f9ecd3292e3a4665a70a9fcb871f47b97c3fd6d9a9e20be68fcafe01ead4c738cdc5fdba8b787b748acf044e0a980bddc72bb6975905a1944ca3044a44c14ba36427a2e0fdb67bf99b252b08b8d65c873b4aa65c796ff4a5dd9e12b669cf6386c2396c05bf475cb1121fedb1c4e41521ff078c4c7b3656d0f9f851a43dcb0e698f3f18c48f4a3af52191491766e113e5fab07eb87f3ae83213375ed61c2ed7cab9d621ac0167ae5bb76e7dbb653f2133ee7c0e9a9e6e16f1d328e66bf6bbf897c5d56836a6a31abdf28a10be4821336eaaf95684a29168540357d0340821841042082d1ba78c114208218410428b869a764f96cc67fb18e38c303673e46c051aec141429c1aec449fcd53bab8f799b1c8eab358b33829f605d38180eb709e6c3b57ec9b85c128c73611c0ec6b94df0cf067f56dc8d2d5e8ca346700b380720e19280b94d701f32ee01f066e738235a74ad739c11fc84db04c38610f20c7d50dc68b1638c9143a10f0a9c4b9f6549f05569dcc6e9684df44101a1c003265cfaae5ec336c8e1807088e692e85be69a7842490992ac2e111bb926e2d9a2f6fc20fc268c5c59bf11dcfe8c740cdd1da594b0542ac5ee8ecd5b789ec71644b5c5025110b6488681891c0ebe303030920808b05c282d842f9ca4c2b2441a5b5fd731bcfe19396a44c81dda2ee574583790dc792b5e3823e5ad19d59f97c431f7627cbffd1c9dfa64d0f01c0143445f46d328a7658958d6af4aef6551da337d70657c854e9edacbea548c3969729317ce8573e9dcee5f3c39d8e9d477f15c2997cef5e48a72fb570e268704663fecd9e36976994d993d88dcb27f271ddaad47cd7e5996fd5addcc06a1b7e0dce2c9e574f54ce1e2e2129482e93ea3c3e00a538ee9acc34f58e37a44ad708c10f45e90caeb07ddc735b610291846f5db001c43f3d5b83db719701b0209d9c18301d7ec282f4be4ba8e59173da7e3b25f5fccc66bdc0dfa8f7e3b4d735bbc75ad06b10e055c49ee522213b3d2a2b4bdde98ce41834a5c97c0755ef5ac7256394d7856505657aca434d9e40a0aafa0d013942539de122627972172360ab7cc7ed9adcf5f557bd7294ba3b5c328fdc6e9d01e6f713aae6bf6b37e5d723a2ceb1c24fb7c902ba327ccb64569c39eac290f92e0dcee8d652bddd38c09d2e87f738b8f7c91ec20f4137b73355ba842954c6735095d91053ab8d3822e9a4b227b48c47c85ceb2a7f61a8be7cbba64b162bfe6c98976ab16e92e772dabdbb5caa735c22c7670867bd5eeb1caab8d589e56a436b326a223da6b2a8bb494c6e6942b2ce9656d2d1ab6c97442b69ab8b95c0f554dfebfa494a293578cb41289514e9962dd18b50c4e492f39377a9a726593956ed2097da86a2c6715dd786b5ec93f62e6983b76489e93ca29e4e823269d946e53e318d849ebadb3ebba2e4dbbaed51ced35091d5e5076f02ac25811690522d869c6cd52901bd69b16350ccb301892e5bcdca2511aa5253973d14e99f6d295b20a2e5089784c4a21375e562965e94aa9b14c47312642e4aad98df5fab4b65861c7ca4d440fd51f8d1205896aac7dc5ebb3366164b5bad7e3853f2070c15873b437b9a394213e6bc7a286652797c92d69c6ac710c4cf450e67284932d745dd7755d5776ab7e4eac673f6cb26657a35b6d12ba559bf8b0ac18af39afec17c5ba2ce36a845cf4c2f8da11590e2ddbd129292f2cd278b675470ef90ff21cd15e472b240299765d110239ee1117c5340ccb20d6929d6c70d6b38ca63d19a06bca1ad620cfa1aa44f43925d5acfae3aa43a2b84a4823606ed6a6d12aba33b44c029812f4288d44e26a48b43b5d1a2395949e4e36b6acbacc78e9342c1984a9c97292698f46e2b041d35e5b2bd7593492cac65596c34969117965dfc678f4682f890dfd0392dc748aed37b1790e9dedb75d4ba2632245ba4ed344d509dc29c10a2e266fa8768f3c733ae2fda0b8186681c0971632840390467fd68d1f0055cc59d798575fc826a25f3657892c50b772abba68b24ed89ebc942af2da9564352f610dfa79554eb29a4285ee9af245bc1357a5578b1badf16a72a3a1aa849348c1496e1a0197239ddc44660d5525500555b1c2b8907300121e733e07b53c7658ddb17a154e224556bbaf54789b931d5ff3f6b3eec5836712f493ca29477029579bd85caad08fe81891fdd128cc3609bdcfe32ba088ea97aa36a353d8fbc228a54034095e75b1599c0e4c873c46ba6e3d88bc48df3ea33d3a813a45ea42b34e25e886db27996ad7d990730637234697cb939d22d204f78189f0e52d5e7551e4ba2ae72a7aa89a40143aaf827805a47590749a16cd1827072570016904f4a3b84a64853402ec8ff6fab29bbc44984cb7faa2bd3e9dae0cacc157c562423614921833cf1827b394920ab97ef85a17593d82470f5e056da7af45eb3a46743e0c38435d7805e4c475b5f85517bc9a1251fd8e742d565e0551fb514eb2ea94949593acdaeb29edf1ea8bf81cd7ad6f93d3c1b6450707a1c71e245a1e7647a42549a774aad458fd01818e8484d4b615d0aa0b8dc7c59b7644c7847858fa1f8000e2e7477b8ce8a173129b1823b2214dc626e3e747ab39da3ba2bdbed1a3bd3e8ff6fa16e4c91163fa675e8d66cf8e65d14502f022b94a60e76b436832647035327a789ea621b97363fe6090fec5b8ccc7cef21c234f1733cfa587d7cdc72ac43bd18a5da6a3d9695abb1293bb36653aec7cc86d3e7e748c88089122977622453ad27d942e2bd6fd6c4d4217d51f8deafb8831a14b395ffa0cc9ca9225972eaa4a9cc84771156c043871ddd24975564d24aa4a9c7089e5147ec097be5633a0810dc017a046c5ab522f005ffaa48a01f8025fa44044135d93391a01fd59774471d5118d00a0d51740b006f7e46e70d065110cf9d13b117703c9d7d725eac85486346d6439890da743fefa262d27a18293dc605b07b9284420361a8dc0ce973fc8b86a106c52a1c51062e3eac4cb266b5fcdf3e23dae26da26a2b3f6e3c6b31097cba2167edf78dbe5c6f613279182932c99b171f35e3b8ec8114f2f2adaeb8e627f8778ce289d8b12275ba82a719269d782d8643a597f9cb89c606e3b576885db1c127cf97063acfe00d242a070ba90bb017feef592713a381dfcf8cb6606b1d14945df22125f44ce006cb4ce1baa4734aacf35c7e9046b30159dbade485cfff8d80cce081957dacf1ac1cd825cf67212295aab9b85edf9f8c1599cb89a2136aef3ee4840c7ab299c64890d27e9244c6e9f573d000e89cb7ed765f6cbc7b715233df60f723ab2cf8b381df499e56b75e5afd595f19e3a65bd4d3064b55aadeabcb272929b504435c7d73a4a5a89f08b48fb595746edd82d0e09eddaa7e86ab28ee06a583db9b4d79bbddea969b5597f6aaf7bfefc61a7df381dd9e3394e07f6cc7ef2986dd1f120d823bc5cb53e2d5ead2e74a1b13136b1cb9a11b95ee4e50a7135f223988d4770af0a0d4092e9e40fc0d5f065e52452b497c4a6bd7e02ba2436b70fd3a90ff20ce9d40743848f1fd08bdbcf016bf00acb098629468bcb0f40c8d85c685a085fae4e8d489693e040d148b6c83d50419f80e9312cfbae2b19bb855ddff5ccca6bbbf2f206df2e82a65d17530cc366338c3304e1cba48957653b25d650c20b09c6dd73dabad3c6a7539740d3643a0839c677cfd95d44deb80989b5032eb76d10b6577b4828331fb44d6b29ad26dde85224dfcca34e1e368aaba1fa6dd77edbbdae3177856e55eecdddd01ecace557863f62db3d6a13c66e36559d4cac845e9060d5aa7d72cfa24a80d624168594d7f59ca678964729760839ad6d75acb248497a5bdab6661965d6b7965ef24321ba43fedb5b5c7137bd37ffdcdcaadfbd755b3b65fb7f5cc3a61ddec4dc03e60f6924f34380392440c6b608c1749317027be0858e34403a62600bdb823a6780dd0830151a4c3339c00bc700d3f3f6b8031fc8539e769e2acd7ad6b2b7d740df3f1a3094e131c1f3fdac3d118b67369d0faacb02f36e7b6ed5c9ac6d574173333b36448e3e54ba6eb8aa0d6a26942dbb2170d0929ddadfbacf2da2c7597dddaa394f4ae7ea46ba149677033839bee1bd24d23baf80ffaf801244a29a59418863511ef065f18138936a8f1bbb2d428a545e495277d5aba9d543f6a8bc8ae9a884e61670a3b5252adeba894f20b3d5fe899401274be2297ca27609f524a4b1b8d30ab12d1baeebb7e4129e99498b441d356a6bd1d2660401ffad087a00cb31ae4fa7a4feb9746623981ae6a5ba77040959568326df282d7a0a8b35f8fdbfdaa9f77afebba2e9ae69e3bdc212836df21889fd0c537c98e6dcc17262f89619bc43147a7699ade48736e9d621bb78ba37cb517af4d6e2b30aebc4a8c2bb38bce5c8de89a567a57eeba1b87bc237b92b64fd3a187ded5afc7657bd54fe686e435d3cf04766cc06462971f571a19f2fdb841e447fcfdd8800f8ca7b033859d1b322eb5646cd014c14e983236688ae8d4175f77e52ffa9634b1ceba98ab11e2225d98a3df3e9223bb71e7777752f724ba07a1f25278ddcef217db766967a21886bdbb76a2324e3f80c83889e087d7c06bf8e955a3a0339da6b16b1886618d0218c3538028de998275571e571e314aad7b51fb717779b79346a7696d6545c80f203e9ad07ddc732326ad0abfe84d56c8872b437dd8876b35c98ed5e66ec8db16239d74e66aa42d126f63cd419d1a75bdead6debca96e93b3f19308af54223d5a6cd1daca0620ca87171b803113889f008ce1261015631827e2c418ee690263f80bddab888addd69b64a769fea2531f867d62e7630fc2c73266237e980b06a2cc53b0eed2583699ee3a0b57d35967eb574d679d8f05e143cc5e95bdb01c7445177f91aa75e6263d2522257d9cc1cdcd0c600cdf21646198b45f91bb5d6659856c576e12fb37e4f21d600c2701a25827a2a28e88ab51b11f92abd2c11f1b3431267b3c101fb202913fda8b4020fd3ad206391cd47eddc7d6cab98ade7137e6574e1357eaa58936ab5e879cca697a9a7e5d53d9f80b308651c0ab8842c14a0443a208f847046201b1aa0f151f3f46b5660bab2ea8246bd6ca73410c99423423100000003314003028100e0846e3219154d2a53d14800e97bc5264248cb32088510821638c310400000800080088cc4c1a001adfd05896f964af82ce5a905b4e77ff5e289ac022cd8b25e2df61ad2c4dca78f43f904c4916638b84370ebb6a23fb7b3b49441fc45a19249ed0081268e9af6e2905eca9754ef33993486c4c8897c0c23478161c616e0dd1bea5dc8ede15205882ab35f01075055b440b225a54b6bec2176998144eb66529a2ea57b53190d5ed0fbeaa33a60e5491bfd43ca8aa1ff02d827ed5547800492ce681af1b28008f9d4c174dbbb970e6ebb868406d7a176324188697cb8030b03d9a97f8ad6a400d8c8a0427931419c998f0a1dd5a7ef49636b6d7ae2ed3f4e1603aa69aa9e93fc71ac52299d89feccfb797bf70450a8d64145cfa253efb21a43bcb0b22299c1a1b4174db24d5867a327770d7495688b84bb1eff71a06f092db072202ac1c3b3c0d89ec6d4134a896f20ce36ca6a131def35c6a1d97fa5642be5abd48579f0f2811e38e228635a0575d73e0ba81a7ed91868927a184c105ba845f97ece48128464b9d15c72337dd3fd72158a192be8cff2dd18f7030fdcbe5dd86672cf28548044b886604b6edb226bf8c9fecc8131891b0272c59a138f86e9f5a18683128500a3857590937684609e2225180a0344ad5c0fe2408fbecdc5dad8737b7cf8cf59d167244e42861076f6d4389a07a1e10a08a02a57345e8e2f7744cd0b9acb62f8a21b91c080bd0be62b99e7158206455e0f5b1a42cb3025c182c02c5b2ba4ed6df96bae2ecd216fc4c86328833700e4804410b19418c8d68b2246e78ff3333d983ebea22e7f795028a6a04f8ff322cb0811ce011bcd70ba22d493c5f311253da8d5a3790bb776d1bba46e7eee4913bf87b8f3eb25dad2005473e8007076a1899f16c48657e63fa0a94fbd44071460395cf40f9ebbfe1286b32748465062a4819a8eae615303150313450e649e3aa7637dcd0d6079f07014db428b5849c27c714c7f41ae54e51349a8a14440e1c54964579f712f819aaa97e96e65da8e63b8807375a684a4cdd11fd4f07e8198edf5a0f23f1bb41fad541ae19c30672c9f4e1c3f2aa8cddb68ca88632f2f3760547e9a7df51c9b86622b9434dfaf7f391e21cbde9cb4a30ea9d1169bafe61cb2818263c402550e33b1b8f69d2547f7f3556d6eed9945133dd831ed5e8e9e4bb8abfa7d1270682d20f2c334651232d71ab043340c0ecf5ca5f37b210f7d0256d696d8727798fadd5bc0db0014bf439374d5fd1499f9122dbf330ac91f8afb510772e910cfea3bb84df1e4e375d119489ecb6d2cf9ad84f18713d8da5a82424da51cc88b19882627bfd3b59163743529240e3fbab2fe558520f6268f817e855a1ef6f7d6eac82bde3a0cbcaca958d45905f07832d64a350af7b2bcbeede00eca8a919ef597162fb4480b5be0d4535d2ac446cf6108fde8e4402f8aecb54e47d2c7c38b3462010c10772b13f2918f3d59043819ff3b9859b77d971199697336ce026e85310574c14bca6433363192cb0875540327b76d32113149f8828f188254b42dae65e030c17b12aa507f8d2d2117026f72fb6e7a282f467410afbafb8f5bd48625a4431da88cdf3fa079ce4ff171aa0bf66f03ef966eda8552b9dcb971a93d33f635c747b4e02a564dfe10346d54d27011865ae1769856648f4dca4cac0e8c779a39001d31b5809131c562136ba4c908af334a2e42598030249c5ab1130ae5cbedc2533f5efff701f8bead1ed154f3979e700b0223e307343cc302c86a283e0e447271429324e4ef6b29d366690faa30018e56f5df2e462c7b02dce665f8392d47ccfed48d88e131b5fd61b1c06af477da57d6bf84bfa37c944b6c1f135e9a2dc6e7a46804dd9241b4de6c2c834e61f1c46526f3445af7e3341848b6de8687ae2af04c3b758879ea4c7a967f4804e42d76d43b044ce0bc599852e9a4df6710ca0db90d8418fa4f7ea7b2e9a6127a1e8081e101aaa259d6dc3917bc9ee35cb6d693cf009d762da22ab1a68beb17e41fd6addb18de90746756ac38bec8b939f4a84f3f53092cd138d27801c58df01a7b2318b1bb58245930f7a0fa06ad10c4107baf98f6eeabb81685c23c8d083a45b0e5b1db21f893d509b493b56fdd25a9cc162987c4c72a965bca50d61a84a4a49983030419a0603ad1e710503c37b3a2f8360fa99466a0f17e90d4119e42baa887948e486c9f855367c24baa604aa90b6cab6824a2249b4cc7d5b99353aba3bc3d209a67e7e902b916564ca24fe013d68abdc1811bde980a2e2deb647e7e57c90973f3b60b271448a8812018b45a7c81c65b7daacc34e972839c4b4d700efe880a41cec0016ce92aebf3eeefa8ffbe8c0feea6272186ce376a501bc98e7ee8019c3293ab52c84c8112ec1d1825be1184ada1a161b8228e285773ab15bdf15ccf92650f844ac4d259bfc8af90d1bd35f25738ea80600922f372778d9c39ae66293dbc40e9b7736492713e1c08e55dea6b0f0429405826c94592c9723262fbd06c1064c2bc568d890c83e6c3c01767474f02f19396805b6656038c01e365dc994046a49d45451f4165024051ec94768e515069c24743d3b2eec8bf06c2273cad4089adeaccf8fe0a9f5317f077ae1c80bc763fe5288888ad03103090a6e047ae8995b7e16d66c5cefc441d4c8a12f7fa9b6902576db2f540ef939719d3035791ab62787a625d97be48d43fddd7529a3b73337e7c1337fee5dce5f53c953f48b5ebd28209a28dae7a4f468dd3e9aed464e9376df3a0c307949b6fdc8adbb0f419a41c0a490ec3df8f4790058df0a7d21f4b78ac638d2d855171eaaccc7d427b892a266f749a5f5bc33e08956b057d82fbb9e8bc7137524a7fcd62c8875213cf127400a53cb893ff57fba6579a4dc16de02a0b87e87669025fe7a47103c171a1b46114aeae824988488e7ff2a9bebf60b816a8e29df02d62be5dfaf9931e6942d10bf5c4818c7176b21c0591dc262cd2ede642730e55f1aff31507249c92450c77b3b9dea2fe9fd1bee707d73c36f7dddcb0d36dc3a1070d400bc713d716eecae98bedd09706f9c870d922d4a250cee2e4b3c1d1579463334cf470f080ff76131bea873037d95ae503fa9dc49872bc99ac3253d63da8f788c47bb4e5c264a4611735226fa1d0725887deb7e14350a28e8f4fc0625ad05fb04e8bcf7d9ad6aa7514a5fe376fc74958c9de52d29d6f7ebb958e78bdb5a67fcf07b6b3a22d58b5605d9897df2bfea4baaffae91da096c5e32714b3e83cd5fe60a6ee04ff720175db3f25a9c06d1783ac2dff3e4b232bf6f4f294dc219c36a7aa1b276908265a8d258d31322909723f03b3c587c1da8ae6b98019f13dda533230026b325c254cbc1691080a38db688bcb076d0f45b1ddc9f21e358acd5351e2de60b9ae31a9853ae114e2b0373d2839a3c2881c3b01a9e083b6c12bd55d8830eb779823004b54b673a56148f1a778f1ae68632f882b7a25947dd5e3c84f983b9ef51d5eb4d017fe2d1ae80f64c2b73d057d2fff93c085c15d91a18f1d7a0ea481b367ddaac786510d77a0d7abec042b39120b4b31f32ef516ab80c4598a5c74d51dea223aa178e234f92cac5346ad6efc9b5f91bd02f162cdc22e5c044d95f3d69e849a6ea331c73c0fac66ce6d819c3534076e33754779fa35257855c8686dbc0b68e83e04c5aa8a3c0de8b04d88a00ae4006ac9108ba75ef5df1037a238d65520e74176102d29c40d90e985621a497e04b280ca66eb3a522d69fea4006660e051027943f382304c1c8acea5be38a91477de7bc56ed1fd0ccc3c0b37d503aa66887486a935d9727be3e0405be1eb1917ad0e861379f27dc164668ecc0bdd688bcd1a03d37998a9df68437b040993f182bf0692de7a6ec6d1b275480d52ba1606922db80060510e8d4597c2b5f9b4cf8ecee972b5a91cbc9b4e4140209b4e8705d1702e1c692e07888102f3702327e31f86df51ec35a34ed98e6afa0fe3594348cff9a5f6a8764d2f2d9ee5216cab6a4b47653a46105fa8b2b5d7b36c7c8f41b4b77ba1140e215b4f35a00ebdd3009fef0267db3b702f39d4ecec46d5ebf5277cb7c02ce5d2ef29bc10ab847acb2b7f9f4fe7fcd6e62d086959c7ae62cb84782f723f6f252de1bff42fefa88b1e4e2c6b722cfba6362e4882e37f500589cc874860d13e43c5f1cc5e79f07ae9c8d0c58ed47dbab723ac789bf8e02055d52df7df4144462cd581c3c760acc867acd62e050872ad8f55d5b91a6e00fa746415ec276a269da8707bf3bbead4a9a33bca03b7278be29fb1996e496531990d765e5e2082d8492d4defdabd2fe9678f7628e565cef2b66332c9bdbc89aa8a4f0b1b8ebebaaedf64294154ef120c5f4c9d2c4032af99f1122d0a2b0d5f1f5f5c7088f2c333a04d8421dec7ed235fc92f3550daa92a8fcae8528a287efd3864fc074a1ee91f2891d36ae9026f05300c06ede373f750cc8d09c90af0222b670747789904143eae2638cc122a44927180c1f27d3b4a94b12ab218472cadd48d9a6759c5dd51c45b6472aa66e6cd80a4bc7349f6832c3d50182a5555f26052dca4f4e039128fa3e51f7a4630ce4aa7588a7732da1b1276076c160c31930c228ce7341002e7233cd145705fe9bc633c20043014211a782630fb8dcadc816196ed3069bc9ad41915694b65d47b632c23329c28a8403e1365c461fcca71dfad9d936852374b1d2e3ae2865a0ab2232cb730e11a46c5a61e83f305fc92d4fcbae02465396f9333961fd605c569a966f2bc24df4799d835f67f89faa48e52fc38f2cecea31ab4b227f036356fdcaad20e6c2151455abc99ff6a1e125217dbbfb81bc17f48d6449859efb80a0ed521ca5d13b8549b45669aff8418968a2b3ba0423042dc1c810c67440f8ebc26155203650c09940ce217d075a681f4306a8a089e76b000d53310fdb564259b57b9f805d48e262386ba1103b9b0f91abc6fb30bdccbfac17827177fe4e297b972e482cd37310a8eed89e47cf6c39facc51a92d65cb67da8d3f665f3faf47b14d10a4614a90cce651362dc0400d9522c67fd3a0e29fe1a8baca27e3f55a1589c7362f7a9d12006d6c7b3f726faf56c11c06c3191968a3a16c6d2f9b1a25e0b5df392a5f78c949471b356c2206c87fa62a17cc5113c5ce9a10cfbe3e61885db12c4d7a0b1cac94290313cf13b13ce5c232fce7485bc2c5b91f83f8f394357340cee65cff23cfd39ff1727e4aa0b3c1f528cf07adf97d627e85bc5fe4923dc555842f823d48b2bb4abe1f76a9b85491ba2ee36d457494218d587bdb5b6438a99fff7358d7cab865ecd45dc551b32052bd0ff0eb4ddf84d5f39497510f52fcf6b8359de8ff9e43a4c7445032718cdd6cee609f93d8987eeb173af6c6d6264ef29fda2d1179dd13718f52a08ab76e99f47fab4d9c306cbc1d7a30a523eedde5598d0745d290c938a9d230fe0f8f6516f5129cfba0069f15e339461ec8a0bb8370b3a30ee99a0dabe1d1179bd6c6aedaade6e33ac700d16bd859536c0827e58e41298e349cc3f55d1b7ac33f73d8d957dc37d48824dd6f9d3b4f5e6e2de72d06187fffdf627095e2f6179ac6cda5759df88332791993b1cf9e3a68a768b72894738bf48b0f4061cc8bb52f3403fe11995ff675e04b0997af4827025ea5f979951b87966ef2a3b427e4f989302a98d68d93d91b6e3ce25eb1e3076ef05811e8075fe32c7f435cc179ffbea83a4bda782864b141c079a239bfec6c4f5c8de3f020d61748a76b8d42472b06789abfe2142e805d51fcedccec8d489d353980565581df0286c2434bc0d918a4bc0fae0079bf828d4b1c39e6ffdac99728cbac6cce5830e064d1c7385fb8b076ad240bb72de346735348293576eb936c743384dad0e60b0c84b347c8726c921cf3be20fe8fa2900b1532d224a52c63b257c51ad4312c3eb8ab3aabb363e5b4677b716c79cde49b8fa1fd1f471cf481d666d8b8bda5290beaa253164fff29a380d5476a33faeb15c191f87a1481a6f49588037231d6e71996c5c9bebc15bc1d27bbb1c5a01f9566c70189fa5d78eb5b5323d126c047c8080b6bdb3ce00423fd94c15c3d59743dc963fb53f7f814a0613c43cc9799874043aa1970a92cdcdf30ec5a64e1ddad493563512424578ad5a59fd95e9ee659a8c7e1b16fdeb57b5db1c2d8de1acb8d3af842740a2bae998154f127b1771500390a88a666dbc39b9842da482fa0441fea094b005eaea5c2f8155d8e1374d360bbf1bd0870e1110e1f8f1215934233bf401f8e335a0871d15754e4645082e84b46d45bac79f896b88ee396d1be6fc0946c54a96da4f701026e0895a8567f19e306a394547317394c0cc9e26f3d692b810c0510a66586d686e5490deb211456c8934e3d9d9f1874efa013c06eee3f6d383558e527c24de307a73a36115b395d900b39b64ca2ac1105be7a423f86ffa88aada24b427c2b1f92bea554ff883bb338ea932e6043f103ca3225e96f3af1f415b50cfb31151ec664500609eca9e2b9a522a30cf6f013a030f0ab1ccdae6782c1569c407ea63d674a0e9ad39e370767b66325b001683338357fcde856f60b4414b8f18d355e5a9d7824b83ab302f5c46b9b3eb28dec63b51d2a97517bc6dac4ab4f3529bc7119909f3c73139b0653016f76b4ed9768fa3c163056ebd5f0c756b17aa392af37cb1d22bf6555205058ed4c4ad276fa4aae04001f00ab6a157c48117d85f358445272292da42c6b21725fa346b8531979cb9305e939aebc94e50b0b896a0a2bc3a84caf25ea5f78e1d9ccbb54648a889243478f5ec20d6275b898f282d8c65cd866b45cd4fa09594c4100bd78129efab88f92c1f713566e15062553641ee586e2a130e1bf5ff7e7cf4c43bf0f846732c993d7518d42ff6098b8d192ddc9184416f7737785f2720b5d770eb3167431a71c1e130e8aa366c4e26d9e616b01b3c23383941ac82f5e6f58547a68a04755c248c5d7036841f8e10748628dec102adf22445deb2d1dc098eb72a8eee0ee8f3bd66496f8b84222a16c814e9d76227fc4108e9ad0c705bb4cd4d2eee2e13b4064d08397d6254e7f2263136b050d3f93dd3fcb9ae1cf3bfb9345f8f2d3f3fee0392f6bf151a28f72ddb981024328c5ac407bf370bc7def95e9d82a75e5ffe6381db3a1f0be3e6a8f659ec4342e6acc120d2967da3cfd933c9ccaf603958cf6da3cbf05f3225d1bca922ff7d0e363acd5c1a5e3147cf553b2885281e62048b3fe00c5d5148ba6c5f6e866b0c4c2e3be6bbdb0105feca3876ed44ba1a67e484d28dffb955acceb6716d61bcd15e258b9aee9c498f7032e8de159069446552ce699dc6a282bbaba515428e85d115e6eabd027b12312a7f647709cc1e01a13d4aad35b310cfba2cd2486fef9b35b4e9cc804d4c2cee1494ea735a536ec55592d4818d1044ae8e906ab5712a0717aa6ce1f0b6b18d0104dd963fb8c3c4488ee349d38e9e7a0013ededd36971efc52cd6781512c66c638bef9940de177349a918c79d219ccc8cfbccf9bca62560a83e6669f6cf0b46e5e6936e76f9ec31c2c9afafd51fe7fd86e3dc5990f3bb82813ee0be0eab91bf6c83771d3f14029e15672a6b35e3f0392429aded72bb921f8b8b4d918fde471fed907147df78e231f8dfdf7591a9daa4c2e338bb817eb9bbb0c413935de494d19b7d5f55ed35a04615417781083050da7a2a6a0c9589d9d361b19883ae0db4a14a628c4942b8da50d1979964945223b45d7b5006bef7f2882ebeca9808f6e95401f99626dfc5de6a81bb5517da6a82d6c8c2cbdf411fc868f874414e3261650dc0e64e8520218e7a9e6a74e811523f97c2c59762453f125588fc58a67a6de39f47a69a37bd81f885cf77f90ad8b1157abc9309ad036bdd069d2e78304b304d03c8cf441b5987b721ecf724e7a1bd57839a463a067db9d690b8adc1c00d8414d277a84d419ac2bce07e37859f265da761b4629666030f61cb46e9d80e5e86ca51b0bec7f7a33a013619b4a371e9c4d049f59a9b4a1e46e0762d5635b83d66e5a4b11fd5ca726fd7f25416b783ef9423ba6023d77b2adbf81ee000d3d3b8b88038cbd36da670a335f15276e6ff184d664e5afe912867d3ab6083b99517d92251f0351034341d74556e4b5968c986d7b3b32a470f6dc8eaa816db0a43527a4e30dd0b5c051c101e6571d8a2b56b6b75e0a3e6b4b9e77558796b349d22a5136d04a70dc21916fc36193e3fd72ed710256f2a969137214a28adccf681f40441db6fe8d5fb1993930c2b6047cd31715150f169e999651cf4457a4f700c6069cbb1875e8b8e82326901bd818f1262876442a3ca9961a297599bc82a3823e7b688d8c156416d0f3e6faa04dabd81e6cc14751d837ca405414a79d968143b88430b59b6133500b5675921dc52312590ec3550feeffca296772bfbbd2d89ecd95d3750cbe973850692554c97fbd9818a40daba11a28821b8a86bc8718160233d360262a15ffa0018c5168233232070e28dd74678a92f22f3b42226a936c53cf1845eb670b1cbc93fb962ad2e0d712442ca5f181d31368c0fd6daaf58c88085559fe9e8d82b0c49ff156724eeb931303c5f54f2f292f93b7f695baf4cc0672d45bf402efb52c33ce205458ecc89815937f4b1e2f89c5ecce3349fea9a664ad51e4e4a78957fc641c6cbfe333d8d531f1572ed70156536a405c7d98890b1053b6f39084dea435bd3016338e18e230de2f33cebe0a092205cb170f7d195018302fe89c4790b2638381d20143709c257a10998206b13a933360c6d4fc1a67043d4d01f9a8ca43a656d726edf5cc7dfec93a9bd57317f0002e3eeee847406fe41501691d9e824a001e502e74ed6183900c725f17f5ce9b2a953e3cf651dd5bc6e0f18883984c4512cff2a2c49e8de1d999e38c8a659cbb4de58bf06c312dc0f85f85676c979c842aa5051d55ee6874aec142a557d4e6a063c50319077b322be1c42a0654546513bddfc48ee12c2584b72902dc149ae6770acdc177b18545ffdce82f46c4a1465492012325f6d93ca128c6e98d2440b43aa199e510eedf73adbbb700f21a8ef096faaf259dd85857e34def737083314bc6dcaadf886a2b9ed6343ff98bcc0cd8e001ebd1331a844a8a9230c0717159d54b8730019b124a3d22598779a46ca1a85d80109fb249d453a4fc421d71593c1ed7bb0d082e86c5a6419b00ba3d6621018b6d2924290ce2740ff01ea545b0a82e2a97ed31579de07d18398209bb3eeccba634b81d24d650e4a31f34fa0d100e68b1fbf6d3d642a2c6939f0d361e90e82b6c65b58f46bce20f897840c347844aeb408f6046e6c7019ce6a331e0f32b7117b3e18f5c89b5648d49efb51af98b0e68d4b6e6658c1cbf3df557daf904f5087532d8a2ad827f7a585a1dcba8382fab644310879fb19009f11fb88f956898966d5aae60d34f16c4912637726f0a2eda40d52ed1a60c4a7dd8be96c70aa1f0ae19d44d7ed544ef38d6cfff61368f1ab516ddc7662c31d49205c88dadfac7f70ae3fab17f9aa70a6c1e1e39d1fc72fab90b40625247643f513f4f3b9ae642b08cfe3b0f1f74a547648e87051cba83e8fbfb90ec471e7be60206fb253f44ba23d33374098e73149eb48a336bf739c4e522127b45eabc32c09f76e154498f85c844386ec41d84dc1207565a6c4554a314d52e9c8767327646770b9623d4157d445d9268ddaf867e17e79c07826c5ff526c76e932670004b9deee3fd02ba91300f22bb968ae1adc20e99d7b8c5e2824be1860ba402f9846a80831a8c2ace84752c867a8caf963a3305e02177efe3223b53ba670dc2cc098a624e3c3236102b2c4fe1f344b9e68519a885185bf30a43f13489056500b6de380cdba0a19056eb0cb5cc1a7ec545205d217e74146c37937c95dcf8b144c9dc27dc84e15b95e735614afbd324a816a94ce6ee4e64a17bc52749f283a26ca576d947759501e83e9a3b1d61e3231b9b3546935b390af82ed01ef0783314d6b4666b6725b30522101cbd930d1809b430db099ef059dcd8e0294e2ab683216054ac3c3aa107640e3b651edf0279eaa71943d247e2146a241b3e4b482bfda4181c4f4e217370f023bce0098170504f38fa3e5679beeac430161b61ef8236ae0495efdca14308d4c90b4a940d09be1ce2bab59ac94f81f05fb759af3a242f9585b7505c86b59f9a7403da6245407d3d554637262e5a687164353e18e11e66c10d9b61044a4e2f4220081839432895dd172725022931f355b4ce8e2b7ade016bafb7a424e075315053af8a291082ebb460e611c84e1aada0072afe2a7c1dc02a2f7634a874339b9c00c6a63b648afefad57e5c981b51d8f341714835009abca45fbd2ace0c3e42ef656e3210b7a1e166bcba3ead008850ac2f3672c4e48900c4e001fcb1aeb4e0520edf25c1bb7400f952e7d07b82660822b91e8b7a062a786236f8b5087cbd7562fecd3c63e1ea423120be1600de85e710da45133aeb3be65cd30f4def3b5a60e534f9ff4b6f420084ec057147d0424c2df1e18ca56cf065cb570feb0cd162abe16141ef66325c12e180935c6047f7ec2077835bef9ac024b88929d42386c7033fdb48eda7a53fad5cafd29f0da23cb95ae3750a94ddae2c88040b2abaa914fc9e811a014a1bafb6ea3d8be1cb48dd495eee157aa860d1a5bc2fa0a70abc12969a02430ffa5948b2d6231ca2f0732930c3ab06bb3832d60f514c6d5178096ade9122a69bc93882f44f3e410fde06933da1cc06da5bf8c57b0f1013200d63ded6543db036ac32f097aba6717faa428aedf992fd3139b58f939d457123b70f09b9c412c892317fbfbca254f2b07a8d008b538a9b5ef923237232c49037d8a103281f94326cc235533d35f1741c8766019221a1f7229dfcadda7d28fd549902496982a1008fc4e8f3d266ae42823108c751a8a049dd9a03db2ea8fd8d2519065c1d1c1c11b2b5d6a9fc4093fce9b7024609643b432514336a1ab96ba7801dcdf5dc1ea7083eef06e8df4bc83615dd5058f8fc7b137947a50a310ae009daff239c5f164437cf48cbdb1b21ce7b22395359ded2570fe74c37c05a1114a2573a5f2d7fe5a4df84365c09581ce40dbb22b0523afd1ea0fe49e8e8f53ec2310a4a9fbe6a70ed0168ab4a7e3d3a5dfd388f96b2c39808a75f407124a1ee94886dde21877aae1748120e68de8068f70e8f131fe44460a2b45337346efca61e7fb9f42762fa23d0185386fa3032c9ec6bc309449277f51476665d5c4fbee9743d31ebc00b62d0a8ac2354752330f56580ef0e2177d09c346df46b10a4f38cf5201ff2b850a3a64786dee1744652d6f14ef8e57c4a191ffed1c6dae6182511e4c74ff72b02bdb875d19426d3eba04a1dca76f3d5141a3ea6d6ffece38e44ef3746fe2e087a4125709763fbd130745470afe8f813073409e433e5a65c966a846c191e78db0fbe48c42395f8754414330d0496588e8817d4bab3e69dbb443facbe7a40842b1db226524802dee7c4e713beb38da0ec84efdf4c345f9a8da5c5bde82b02ea693fa0d30960927aa40a56214f69464ada648b6570067a8ced0162046f61be69f11b2b11cc1169d0821c45c74ac62898ed7f4f2e85049ae5eb34f56636c179455011bc72b13218dbe452d292a86d29a651cb271d94e028c87ec01c8b5bb142037bf52d5b326f14b78815be044e00f8165f7874a6fc8d4153b0c45565b5282c33a2cb0fa89f2edc6708ad31faa323ba0bb4cc8570b359e2c1282b58032537621892b3ebb02ee91684b8546243818f42615eb0b3a484a0f31faf7805e717d417ac6136d4705a23508208c741b52eabbf41b2cab9d73ec44b9001feab7ed098a5df6745ac31a29ce5bbe9da742d70db6d469f606cb19f37a1b2138ad62036a28885e4a2f7c44fb9315054447348dadfa651c243fe070a17840509a99b0ce280a5f918a453f645c1e9a4606ba03f069803bd0da16e47f14c52a93396050540babe96156719bff5439cd6567ed15ace5088411c6cc9e940fd0fd05e4a761af54529a6fb40d985831ffd945c532c9f60f5b1f11478a100d5260030054094ad80bac9978e8f2d9cef8518b65c6b51cd13ae572eb8e32633c4404f4058dc8398e5b3bdb51e7354b450bf43a4eb04ad86cc2c4debd5ed2a2f223fb2ed6e763136d927b44dca2d60def0657a959969f6d124ae29aada640f35e74b7ce4e3ca42a3705a9ee01a2bbc6154da4c2a9323cb90370a8f40faf0df424fa16b1dacf1ef00ad1df4493e8f661d0581e8773887394ac3a4e4b26713e4727805599a3c15546a5ac0b8330009d795d5ba3f5f25ec4fa48071442c6a914bc8a102aa222fcfe01d9cb781794da1c7a11023bf7b322f74512a28609b63636230cdaa88418f05f2e41ae93830ff170a13a2d85e17b1d54eb4a83912eb7b50fc747c980494519c5c80086de13593f72421fa65d08c4eadf752be7615d8bb9ccf1db7f9ab4eb332faf3ec6cfa88d96641658bf6178538a2816034099e16f909992301b8abce4c0161ccdd1c69e3e65838171ba3324ac4cbeea9c15e8bbf327c057c6284b583f849c9ed0e15a096d020378ee18c37a0a52d86aac4fc5c84b833e27bfe46528796fe35d0a91a4063e3b5d11cb3ee043142e43f8d857b846414b88acef484f0ad575b613a2571699a8e670f99fc9080921afc1cc37be249771c35d578982b78d6c91b88b66ee680e8bed08010b5fb67f0560c2248f4fc1507c4cb36a99b58662bff160818a7410e645ff4b77bdf499f91dd4633dbb369e44cc451c2b2a374aaec6a123c4dd38b5a3a39fec37ae8e2038015f707566abb4a9dba84fc31baf5d65fb8a7536a3a52de8a04c395fad99154804522339e451ad9c53bc98f3604e2b27f1dce2528c7168df2c4a1ef007074b83998fd6b25607a93db27bd7b843fa9569d54e7d1edbcbf2148e486e8f37b5d249bf6098a4edb85a4ac95bf07b8ddd32a0169d0359d57b3873b6829e2a1a8684031294a63d3760c1c44a0a5eb768ae61e2d4ad5962b98ca6023bbcd6db655496a26b74954ffcb031d1c1d6c75907d8e203d4e59075ad3a612670c29e48f56e49712b556a51e8f7c93ca4e8f496d9baab111936a5294143d21d038a9d36494554e903c755da14b175058163c3be15bac7a2c37d495049107c19e73636beaf7e1b3a4f006dcafdc6f6db75f7c43defffb226e9299b417f43d93a1c47f843792fb05ae7c08071deec8896ceb0eb74e3ffbf832d41852407364a624a459d69a722dbc91f7cbfdda0b4b6f95fda1effac22fd87051f8b6891307164529c0cdf0ef1c4612698450c8bc2c6584118463848c35086cc422e877800e244f0252312a123b8781fff7af9da5794ae690c8961ce9a0d0a901dc6822d25c65c6e6c94181e2497da3c89eb08f600cca4c6df481c24ee67f387545616f415df09d2541732e447dd19eb9141aa73f638de31d664134d80eb25ebce371b3e41ea79e95a6aeb8cde137052c1931981158682602972d8f3b0553b49ad15730d871b55256ba5489feacc28a040b5867bde5cce4e3a68b6686d285f5911c720c91569e2d459288ea14f170466db29276aa23077db54aa585d5d9312fa7c15c5cd3714fd5595ca97e80f8cf381542c1b54a44f40d45189c2ef127f2fe5528ad8ddd6ad204afbfaa50a23ce21bd603dd0ef6fe21f6191cbcf8f6c5caa2c4c1c7912de310183137ae9a6053e36f92e1e0adf534dbd3eba0b1d2b2a607e0ea7f9a0847b3ee8d0f78f6928a1559112e0e0cf104347f5bf7463be30f9f81072238784bb8780771a015e5a4aea2122f9bd60e91e699cd5348b45f39f457fa82322e04b97e53e6b8f8facedc1a1e2ee1308199fa2640e4c8c006950a7a07269ff5dde5e074d624d9485b7e9c16dc52019fe8e6c747d66a16002256bc7db1c88fd07430b9891203bb3cdbd07015480bc8fa5dd8e1c8f6bbeb0fdb24137089d1a07cb60d0720be407ffcca0c8c02e75e30656ee0bfceafedca3e1d99f04cc6ff4db9dde567ae407ff0a6fd055b7ca1e800a6881e9b6d21f06a857a41b18bcbff4d877a0821e3b1d5dc901731f942d767842ae206546db830769315558c95f7bb7ea71e48c1a200e50b07a374ae63e1e7f4a2532b61af60f7617e9d1b876ec84a19431f16f7cf6f6b3783a291a368ddd1132d1e049e68c50efc5f90f54535c986f75ce844b01f2be7673ccf4e1524c627412022b4bcc328d162b451d0bab3a608152a72e2ef0c10c42b4d6df6a92ba3be4346f2eb9da155b9ba303db336566448fdc7b6d4b4c88073313473fff306c3064a27e84e37c9366933fdfe35810b32c4535784f259a757540879c000ed80b3cf34f17492ce2e0a8a4bf68fa8b5f05ba9d259213267b6f1d18a8ad68956eea44f874169451a2c66e21b8f0786443e3550f5b2302074a005a2b1db5640289ac11845c6f01b767115fd796f9716570bda608725bb9056dc47ad3a85885bdcd1bf8b6b4864a21f77450ad22ea060562fb896b10eca859886809e33c05986b273c422f2ff7542a037ee48ab7f59a298ddc94eaada80d344449f7e4bee09c1511f741b1c61f40df3ee2a800c1ca4927c80f5a85df38d9e15fbfc0281ce1d7a89dca0a7008f88a8bc1e51b4d1c0e738ef0db4ef6a846b5bf38cdfa02fea8dc2f241da5d1d0a42eccce81b36b6e2e6be778e66f4753df4b4941f7e9f8ba01112beb1a0161c551dfdb190e396eaa4c6ffb0f706f05e8e6eed3428ee506df75c2b2714f40a1d855ea22f13fdc1994735ba4fcb36572055f36d7f31afcc8a9080ca2389e6fd210712b015ecf6d6ab0aa33f4c9deae6b6f58a5c68884bc1e130addfbebcd016a4f03a9c89e7aaac061c173ab99804412a0849731adc56159234499e1d62c2583b0e670cc990d1c1126a6327409ab6137b5cbc7f3ae41281ada80acc51dc08c96556b5baa64199ea7e9916516201314580e0f4097ef78e5c43d3d72ce35de05787e19d749a3f3e5eea438cccbc62d1e4509c20c1d7065db4a96c9dc7d994d2b2a8b98be031a691dc154713b99a482ab033445ea68333876485106c177c21f537fa3abf38740e55e1bdc42c50f3694a1843d43debe5200befeb64610e7785752a2ee8f74d820b598516144e53737f2ddaa7dc572b9e4d8fbf1cb29c71640704f76ec1f10201aaf3084f18058af4833130ed19b0274eb5bee308107ffacfd027ffd9ecf6f344c43548665b29a579ec44149d51e9b48a06adc743891caae7e06a7822e348e1568b757987b7faa351aad95a3f1c2f340cfcd4c5fd81313cd4fa47379c542cd4d19de004b9b1091e754a4e50b3830805a1739ff9ba2a1bb59c602cea95d2625ccd280fa32e0c8cd76ed7ffeecbee0e5b527bfdb7ef34dc5c6c91f26a099222a132f91ff43a2dfd33d22b5a0777488147b3bc14e6b68858bdebdb75e27d791b3c5f3967f2321a141c68cbdd797c085964c6f4f54af55f7feb3cce3552901251630477c5c16b21b6de2c4c422828af91a56b98dd85e8c49b88bd29efdb0d26396c18be4287db6274ecf0f8f6c0a95fef7ff6c7872c1082843f48c288f7597e9e84196dd1f6672fd2a9d104e41468f6ea19b20d22c03c8286929554992490998ec773be9d6066ecde12e4005ad611305ec3e53e5aeb742ba0091517a0cdfd0a7b5347823168158e5776703d07da2106cb75e82671a98601e47f1dc11114caf40f6760554eaee6a3bf67418527e0080ab531dbb18d4ace701c73b81b13ba305425513f40b6c55c54b1b84024f38fffaf21b00facf7be210acbb399aa5bdecd2830d6c3d74828a6abe456e96a17810a323983d107828a936172627c00f50bde814147b2e7f17e4879c1895c06d88c99804475b2312db502d2996c23010f8a0880c053bfa17dec069bf0779240eb4fa8e24fea8b2407bf469e1123e9e9a751a1d4aaf7a6e8fe5c247a4538d8a4e113cedb6db01b28dfb5770d797f8de2b522af591a9ebc275146de32f49d41456552ee22228ffe302ba7ed35cb47d7f5bfd7159088ed09a5d1979789ce7858cd504cff763cc53f4e68f3a86ecdb00a2a0a163823b9de3a2edf9135879a15d8eab2525f49e5bde55960e5bbe7af557c93b86e78dbfba96db6aef34b417da8fa81543287a4d030a578117bb131992dfcabd05511156d6c16495a39c1c72051a3d38aadb6029ce8b10d288e5f2c3ab4006c9b4b7fe1f9b17ceb2960192b0c380bb59595102755767765186c1a5f75abbecd12e51512e7c779f011b64a0c86c115e3dfe46f71309187080efd98431f5fec9c6974e94655cc96caf1f3ba384316429ca12fd46c311c7e1ca812d5f4165c45d358bd5ffcdf8c783ed3b90777df5eb6ca75508df6ef9bd80e9020f815b20a522c504516be21260494fafcae5ac10e6ea713b1cfd5d1db94238c03987d474fe2aac931a25d0607c34d450d8059f8afbd61afa5577db3f8c7024819eb6538fe02d1c8a5a9d48843159101f7ba9a21980ea3d07e8addcf81bad4da9d8551d2564ac7bb602da085c1f6ad39e958235e6ef28c1d290a954f554648ce0c4e2a5ad69ecd31c2c85554387c6b7b853c3fe08a6cf4eaeaace2e25e890e41e8fdbd6f8fc955b78d76d50436807ba37e205bad3a7085f4f7a0825365ae755483c608b5ab04bea71538d0e9d7d866efc20a7c41c4b68a8220bc78495fdb62759fc73323d96344c82454417cf2a9202ab6c5d53c93c5d278c72f76cc8c5d8a3e183bd71185f822c1dd46cce9a981e13a5af29450c45fdc303202c1da4ca142900c5037fed26a0a1ab4f6e08dcb9f6da760a650e8b44e6c83fa620a81727c508d6a98c25b143189f8cde43d37cce036e3ade32efbc0f27e17fa33f1dbf6a3a489b79ca5841bbb3bedca28b14269144d4fd6777105896e387cf72e10988104d0a87ba4489c2bc01a141309ee99821da1439102101cdf8fd344db1098fb91c00e8724a88a1c4e5d0d8e945e1eac6dddba09cb757867c5d03fec8fe9aa760f7d84450fbe7ef27a40bf4f28d23e0185ac4b424dc0c23a8ebcce30f1104aa22ff0bfc9c66d6a7c5f001de4e5ce8a9eb4a45559781fc36f868e45ec540ada484087be29ac49fbeb7b1a62e781e6e4735a4432f53a0507359aaa2ddeb44183e3cdd25cd04b60a7f7a5afdcc5aeba35f1961c8df40353a091cab665779f2541a4bbedefa7bb34ced638d2de9b9462958057692c5cd5b6b127aef44211d14e8a38a6f27a33c1daff9f1faeb58f7c3cc8fe84228e11ede5b01f30ddc529853bd1645f6cc41978a11b7fe096535742ffa558bc1836e37a7b2630c26e16274762be66275631c7814010c34cca6a34b0a3a75a0125c50f244ccced8bcab1ed75081a89bfee6d9a39a2f3d1cb22dc0dcf70bf3b6094b034b3e3cffbee3d5ee194066d6361ff103b8593f9815202111b18cd4c6e5681d7067a014738885f1eb1cce9c84e63d1c543be60d28430810e2b27aa20c50b46bb24597019a5ea9523e4bf03505a761a88fc2fcbba2b58b13677f087b50e2a5d5246368578831dc4cd4f635c4d8b8cece7c688eec19af6599b22531d3e988a3810a7f9505141f807a04289d4a3b6313dd9b7a40c6572b5325079b94f44c2ad62b85a4902a84bb928bddbed0ba7833a77d50bbafd7642f291476ae87d649e05a1e7148add2012755270ab3387b54566ab9c21a46ac160bd3704d53f6ddc31eddbf9cb3476816e182a54375c87c9ab14946d422808c1545e5df481cd9467b8104f91b18747d4d9a75376f25d93bc590d1ba050de74e2715e1e69529646e4695b53c3e23543a96c60969c4c43e36aa7ed20b393b68042001c7d44992d18a3df82522654524b045de503d9bff11257854f38cc1c5dbab780e7132d5dccfa3e04ad4852e039ab08db500545e3de5ce48cfae71e8014671f1d56b8301543e3a6f48cce55e9138966e7ea1c34d327d12a83e2e059a13ee879958d02d3af33dda91049d407cd5c9c139dd3bebbef8cc1f02a5a3f067bb11307278a6be324c5f2dc70d4417322a6fe7e16845aa7bb07af6031b800021280402960c072c101c8355b019f3c213a74e836b59bef1f95698da4a138d4e97c2782fd60eac00e7f64f26e74fb99a02796ede4aa37bd29bd2ae682f92bb9e4ae8f5a98b27cfc0259b4280a9643f19de7c846db6a1e1075f7cd8a3a38c0e79504d8018cf2dbbb591916fd152441002398f74718f5f8224db47f6d9a7d8191a18b39d80036c7f1ac0d4db968bf7fdf088ae188acc3a01a943871a1dc58bff62aa447b30619c34ff97c1249d70bae8eacfe0194b23187de13193a460458f8cc4fd8bd00cbbc23050895c644c0c89ca2197d3bfab1966b09881f69d90ac28689b82e1b14dc94e9d19028b0acb879406d9e73b534e6f6598ce64e4273f1be21d13fe6241e4d05901a6aeea21b9f9727820cea8c9a816f028671e813593a299174d65ca6d556405fb8cc271d46d38ac26b6480bd68366e9db951df8a20bf49024838536b6d807f1cb5a62f06f0179bff8f9e96f5b78aab518505717b7ab8545abc6a999645afece27b30a6df2873987588b222f3642e87330f28a77e93a85ffdb4c8b2c2a9bb6c84f9a51f0e33484e9c152e109fd9493ba560326847050e86d06977b26836321a53a8cbb724143b0c55a59e4ea9d0620993904366784f9da72c92bf82488ff3cc84044c2b374091b200ba6691bf12752c9ec57e042d864c8dad78a34cb75fc22d0074f388b4f8e3f6f7de7e40e4c7a45b78f06312439116140871d0e70044091c3fe6de00f98e095f4aef817552de7adb990fa70f5de06bbbe5d74db8d10d30301c1bbbadb7fba1924e6ea3fe6b9f4078b58720bafabd4859470b2d01557fa47b5f268e871e6f6d5a23f5e62a5ba7a50f4f589521c040f15ab719e85aa141ec0f7bfa776e66e35d7c69cac0bd315571da33073fbc4d8b5affa91b5eb19ab803b082457fb465f66d88769bb29081519ea59d6dfe5e4d7305b5c24aa33cb526bf0eff224b1e167d0fb9a61445a948f8fb71471c1b6a374ac2b5542bb01da004665895da76e9893524f9ffe35e2d4b298d7f22c5d95f344eb1d103c6e5f09bc28934da0ab7540ba88f520f2f88328a0e787440b97e3e58b324a02d762d3a805acb70e74aa11b4c19e5a9a1d2f2ea64e1056960dafcf367547735c264f15fc0e5f52f89764f4fb29b2a9821413809d8f965a7c8ea2eed9a136cfd2cb6f4d905a086636f336c4248ff6e36c687963174f6416826b458d693ce38362d0bb9e50c4b68fdaffe2411c7c8a8ee6b8b2c39954bfac838e698b65e844b380265d6b5929103db731e38d7e70fad5390bf65bf7165140d919c64ac9b07dccc0a5c25074e93b54a5062aa2fc5d3f8efaf025f74403ce5ee12cc7026c551a7ad96eac71a7509496d424c6656e1cb5a25b20f69749291808fd09c445a86b8c557db729fbffac6b03906cbf0d4eee70df608c5b6b73782cefb6cb24fd8ee55a8d3e47c1d635c32fd6d67cb014cceef6c7dced787101a57efacbb48a02e8305db91bf926607d7af262fd279ca538247f41bf436930d587fdffa27317e3fe77de8c4787f3d579b3fe6f5faa5ef1fb600a1e0f6bba6b8ed1665c84e9b10470fcc328626df910489dd922428a576ddcf42d3446633f518cf309bd17c9b7122f4f47f18d0fbe394fb2ae4be04018b59cd3d90a9212cf226d387185fff58fb48c99c8728f241b268493710ffd998c2383f3249539bd8f300b551737e44494af74fe3151b06bb6a31a88e1a9d21238c16fd28ace20e334ce41c01933015fb20311e6dd688568da851b59fefd216212f256efec188be38e8b18e4ea3c9e91165a81bdf8deac6ef1b093c2592a40cdf55e53b5f9bacc4a16e61f7f6c3fbfdcc58f918b9b6fd564d18b62c41edf4674cc57a5963859a9c23634ed028c332b0acf286c397bf9a09de349d87736f79339acfbd99843fbadd5c0306f8dba5ee7711afa0f2fc6065fe3743b6f4c679d6a074ddd473e2f048636b7f49a86801e64e6d6d2c969c916be0059f11fe65c094ec9afdf42b47f2615af1ae5f86e1e3c74586a42604a0ec2373e0fa03f9c0f7565c6d5d7deaab2c1e04070869e28d904b1964db8d1d4895356e4855f92172d5e8978794d9379d342cf37178f825cb9d3a200af42229e00f59c71267e79234bbf7b31ab359a86aa0c8de0f3c9a3e21cf9eeae895bf5fbcaad932e24086c8a71fea3633023aef09feea1fa7778debcf7e58e4f88e9bfa5e3c848ed5cfe66d3fec03dd694ae73fb0e7308255a356177e85f4a8769e5ea302e3e04279b8709f784e74bd048f7c128c81f45e8b3f241a742ec62ba3851b7129429779200c711c10b65323918c9e4b004394f8ee13db13006128d97cfbf18a4e53b6d3abf0fa13cb03137934144583dc32cb559f3bef180521acc1ac589fc7a97fdcb9282d70f2af0eea22005c92b9994864e7fcc21e6cb9bd5959a0d20840adb6ba20fb1550de16b33509b598376ffaa32b5555308881927ada0bca6d97e75bd4e1e8d81cb5e24c658d0b668a1bb2088cd81d3157275ac996f3ad6649595b34fc7f76741fda3ecd129bd205fae1819ac5a6fe38c1546e3e292c01da2a7686ca949b83cd569bfa8d8d922dea2c271e2e9485a7aebad210c3c6069ab557574a4171420d42c8ca46049f600b7f925bce7c0fa4bdd32ff6bc8072ef41c34614a9edfe6a554944dc3e8995769d5db3953effac85ca70d41db20a062aac11812b4ab385ca7dcf0650aa9c4a98623a2705b33669a9b045056bc7f2dac4f27e36060cfcffc087a9753bd4181cb34e62eeea4f1670fb082fba6eae4d9d11531508969591d95c353c649c532ccebe676d94152b32150265964565871c1e460ec5e0ac6890b518147d152333301f082d008e60cb98e45364859dbe9735735d9a41265318d1e423cd26fe00ce6ed9057c22546044cfe7cb6f81694f8a800c605f4f23390eaa5bf1a265aba8f990f0f1129185a7d6912ae87a80bd81d233a6b8a5e0ccd51e95fbe2aa0330a06b3f03ff68b45c14efeaa22b24c80d760b86f48075794c75e895c03aa41067361c80b65f6aacb320fb9a851f895c79269a97a41bb8c5591afda6540903b9441987674b7d7985ae77cb24c05dffb7325a12fa5ece4717213b8afc181a5a7718df1f8d9043c979e7fc2207d4f272eb5712553a178eae4411552530c2063c5574532b46f113feec88b3a8f8348760f729539520f773adf0678e3f446765136a5678ffa971102122688c2b2e3db9e1a9d84d976df89a1bdbc1e1bae375849d8c1fd967c6ecce9a832a4bfbdbe6546f3a0140cd322d3163dee6e6a269e47a43dea8d9cc552232c1f1f8c6d94e87ac23378a1bbaa903c38c0a352b15e32c20022665c692f0008c6e400faed7bc36d0f960ec2d4b56df196284cda0e82a11b94fb2cada2c095956a7554a027bb9095d8ea20471628b5861080a45191a225e020c02df1975cc12e9bda288281892363e2559d67f5265ddd3109a766f30ff1792164e71d7fb8bd2dbf83ed51d75ad1e17c2eb57dc3a50f5490fcb0e40023ce11550920a14dac0e5c5401f407972705fc1b36a398431e89314cf96310f0b35616c11877be6584b81fd1d9cb12038f13797b403f34451a8df0446fe72cd815b0883c8a0700ded3ce2bfcc2e9d08c78e0af379e0054b4aaf0b26936d4ed3cc327afe0d6fd4c828903d160a72038a2337bcecc7cd792a8dc173e6387374c4dab55cc60afa441a3000bbe406c9066862617dfb8a140aba9c50c083411790145bbf295bac499c9526d6a5e139b6a82ebac624600d4046b4046b0020fc63f49fa80b5a596f294e6faf8970a98c401362c7c899e9ebbd22a7125d98de38a3efcff9c0bce7d863cbc884fcfe868a431a71b60cdc9bc1007f3a1f1c0f7ac991aa0b00e5488dbd0eb6d0ef7cfa31f056883e092b0a965b289fb62b78b59dc187e5049b7fa37b1f9e7925ee3f50a9830008a6b878063cac70c877ca80028bc4c9ef576454a866c3fe6dc87e837eeeaa6c3babf970001a2ddb208f7a881a114ec9c4a82a8de45550f2b43cc589da30deaf66354d04b77ee7885e039f0bb4309bd2f246ffee2ab4f788fef5c469a1ebce42f69e3cc95f4cf126e284d9480daab3b18049ee6cb4bcf691ab60a3c724a7ae2c43ba36baade498ebc34a3c282fb112764db746bdd304ff17c01dfe402f32b253c28fbce5963629350b388223c9b39d21fbc0a8aa6502798a544ba927d86fc2930bc37d5aee93947ac96904f18179f0908e9a0f3069e71766e816196c2580a91e6480b16f12b176d46b086406311d69ff91171a537a0efbbb62fb4680cbf4c2daef588a7b0007b97ee47039619e0c42b9bf975b00011ac8b1f51d0d01abb51397f21dd07afabf63006f4f53f537c8f8d67ae963f3971ff5f8446e8f62019c02bd81509886e9b2b3e3e89b04a5a5f35afb203fb2154658fa79a3be2006ba70f1d199c796fc239315a2ae213a088f3954714735e9c72a0acc33780d34d12aa3be43e458651a01911193ad37ecee656881c5545292949c8cbd77577d0efa09725308de0193cb2c2b30366f91f55afc4ce8b65bc8a616b18eeafa4b5fd7bbaee7dfcb97b7a9d9bf2ad03fd4d37a5b0a836cf5d4a35a1fdbfd61a78f4a61ff548b847f259b979252697fb651b4bc7c5feff248fa1a8276e0b934ca3c564dc5f79458784ee69cd9c995808e78ba22f87fbcc04bc80995a550b426008e17127108c135fc52c314dcb436b1616ad7f806ab7eaf415de5ea01928085b1492440d08a551e8cd93a087d904285d779769c092c868e59fcef8e57b606f7efc84e3194336c23c9ab2d5a55cfc7e2bcee2055a2a2c7440e5c9a7be83932c17cc49d6874e3c651365f68d56bcd9695b6cf013d73967a12a139bdc7355bf682b24ca9e849cc6b902e7334bad3f1ce8f31d8f9f494ae5350c718140a8716c04af4053126908c155d82dad02ac1d54db701e6d87f80125558564bc36ee0aca9ccb42cb4904da9dccee3317c25e62183333a43b9073809201773515036e4e8f942ca1665109a8cd33b9bb29d9eab230985e9a890867848f35ffeaf18e674764b4d4d6ada6c7e54e1b9ae942220c3ef60c806474cdf57d8636fc132ca0a6ac8f4f84d83fbf47121be664282ded8c7e02635a1ba77d02f391ca8e6a1585cb7b4e814cb9627e96dc774296f4708ec46632a7d80e0c5eadf6a44472daa1445569c137d7643f35afc5a06f44d3b1012eeb9eaae62016e4087ac8dc48ca939ba671ce9d5b6e9931be68f34380544ec229384ec61e7261b6048b6bea69e4e419aac930ae2f15a85bd691261f6c5b0c91037995f4341932a653bd3fe0ed279f81bf8558fc07a10bd949f80a86bcd7c244e4028578a2b375339091a8d8ea7aa2ff2c8a8d087c86b17a93e8677729d53f0c14250cdeeda2d3c3004145d0aa927bcd84d0a1ebb84062327e80e2af7365cc1c5fc9c10b4042c9d927e83d3b9203c6c4429c471e785b5a22fbca653cf307021eeb3c2a38bea4347ef0fa9366c7d29708d05f49b51cdf1f79365d2a7ca4c79a60d61e5651769fac9bbe20ef296f1960350dec2e63c37bc175aa589eb6d6d0a3b53bb096e4ac7491728fb3bb3ca50f5164e5677f2f5c12e265ce32e244aadeacf8866fe6c417eedeb93ff24e0d52eb117e4761cd1780bec0790011c230e7dc68824f408451a90d849a51a38104433964868c09a82bf531c0d584c97c6641d235664ae8cf030f39cd22629e9bdd6720033d94c40400bfbd947c014925d11bc9ad100084bdf048be145146b76ea985cbb9260a840180c600d367caf56abc72a7395c06b8ea223acd3e5e9e61abba89162ddab0479db49bd20d807780f6bf610fad7d2d653cb11ad0669613ab8100769670ca6de167bcc29eace0702b973d42ebc006578ea49a7bb1244183e6bb4ac9077fdbab35a3acc0844e9146d1a6904a0eeee01974fb4f25c7dc15286cef8de1a7de3910663180a6578e0ee2223206d1d8cc9485e72eadfc206ea0f634649f83acc940612745118682d3480ec3b542fc62f64e9173c51c7c4ac8023eb244edcf730393ef7f058d6d3ff4b33960b6e646a5baa2c9102705b351ff7bfb1c3061897758e0941ef9862dd5e854fe1a5deafa8f77cb604774b2f1b561d96c2e0cde751c67b2259f8ee88ea7a9ca5194ad5c33e6232c2c35a54242af464a22eddf4142c1b11bc016d08632d9d4172a24e12335043f79e1112bc18ae8d29318270243d96da3e01285b578801d6249f2a01725f2a210d3beaee7f4e3f8eeab31141f72611edcee9358b7a301ce62347f662dc68eb6cfc5cfdedf8903751069629bf348b7bd87c4fe1f86064a57a9d8ad09cc99bddd04753a82e43797237de91823a15a7477e7b6b49500b8f7ef43d852014e106e7640f058f32aab0eba1693a86e4d853815cf02122e8f4c4fb9d9b394528d5d9fb4ec5ed7a0db83de737f0fe03d72142fdd42997703c63f5e9db381232b1faf36b634364a36ee9db08b5c2b6a14a6c3b41663113c60b01bd6174220289b734c84ec04cb3a45a8f79d5d20b6fe4ea697f7ce90f56f8c30005ab4f71a9231443e7c6516ef92ad44ef59e2f56771a1376061c0f60fd7bcbf85f8a8d3eb2e37063554ac1ae47bfae1625a8e1275a3dbdc28c6c3dce431c621d438a8301580ed197cca9ea05bcfcdf66a528d2871fe1c6a8583f54ede55d344ef303571b9b0499b60be5d190da52474a79a2dd1555007e9e7cbe91774921eb49ea03f7b5fa667d6b0442cebf16306847331d535e097ff7dd70b7793b73a12c0a3ca5ba180e9a0c530ce6afe357c15834e163ca82f6e1234afbab20774662ec8e75a5238813a5a7f5c0ce52961200a23461bc77fadb1025021c116b3acb4404719a21c1a6f1f1a6db1441cd272a648fc468713e37904df025a0808ed80d52b4c0d1c6fa41c4afa76dea83e5c6efc74f8c5ccac6f162ad0ea4c7554d27e405c765e7a1353151f75522f433251179211272392570475468692b19f108b7fc82ccac6817e04d2f0c864434057cab9f233a1f16b15b0209c78c67d44eeac082d90430d84968069b67324098c0592e04f477da7a5a16102764bc020427bf38017b10cad30533f02c017a910b74b01b8d2b5efd956d2eaa5e397c5dfa39e9ab8fb853b66dd128b31907b4f5a6342005eb8e195d58360e399293d01c046a12f399df414e8808eefb715e38778065156862983626cb259621d7d5e67f462847ea89c78b87ff7b8357d24bdd3890a08e6782961112433bfc7d6dfb8fa3a9f5154ccaee62109d7af604f7672de6afefa36ef3abca876c1792bce6827912f187bc7418483a183ebb5526c2d7eadabf2490c541a9f4d96fbe0e4cf7a570f685674031ae6edab2475c71f59889dc019295f4534836952e4e132b3b76701eb4e8028a7a2bd5e61d6103290891fb99bcadc0e5f995d84c969d6e7940a457ffc5c218c380eaba6ea3aa7a7517efedafca7361bcfa3a0917aa34d21cc586bbead7b58d66cd87c27d268445fff603218002c26cb4f0f992332c9f60a3a1934212a38d8aca8674db90b6b67cca110344f66dc80030689df78244b28812fcde7565e1ecafd8e4c0eea8e5c3b4eba0aba4fcd716c3b2e4b18edbf0086166708b73729d94e4bd5e67f9d2e93fd515aed9d480d1c188d558aad2397cd597a9250a42dcd6e45463a8cc0b62c0c3db9f3ba9ca2a5c7c27aa2402046906ad8f81b268117e6d3a0161c54d3180da9bcf131a6475382f9397617997d13299995a00b8ccb7035c96fa5d60136d588c9f1c3746a2769dbef2ef002875104f5d95b19948a1c740f201e7127d29a80e592d5f29caba85493d9fe91710e828e837182e8c00f2baee5ac5dfdef30c4592cc62bfb84025c8597158f7e23175ce8b4970a9b2a802dbdf592935c81ea1668922220a360e7d6cc044df715bd1ff2bd91a0661ea7c8035fd647c2b30f8104b53df895776b64a37834b7836dcdce156bdbe7f01b8716ed93818e1b8c0c664de7bdc78becc003f3461e866597037a209f7dc6a5dbc378947e6ba7775886ba39517a911808850ba287439557cb56b7175153f8b066fa17e9628dacbf59d1089cbddb16ab23dbb44bc16ad23d7954e1541f747a3c000a15a6b8e1988b91bef3869c344570ca9683aeef4a9a73cb28ce8311b9b0e05d51ab763f1fc0a97b09f3e50e5d3e148237f3c2ab749d892b45624c41f6e9d285baf6f8d483b54ef7a8552021594cbaba26f4ef21642e7f0bae09dcb6e645c6e36dffc863f02cedb545533cf0d45dde6384d5adf8112df903a70e07408b02c81e7af7b843c3b10a8476cc6c8c6f17a9004097fdc3e173c6df90458fe79b3a33b312bcfc647712a4c8fc8c15275a9bd52e135b8276b3aca0585d5f817a26b01763e7e9eda3a6b880cf9aba2c24893e502ad2f196a2a4eab7eda3cd8c2037a4f475f6b1527425847446c8a122a442e0bba089b103b131340199b926c8f12488f30f5582ea71df595c35a398afe746712be46ccdfb6d9e3eba7d3fcf145f5ece256f10c515cb3603198e3a5aa835557e002e735eb1e885dd701bedf5bf868a0657d523196d60842a9c48d6537e0ab95ef4ec408e81f645c0663e0129448ed99a8a801453176ae1c34aea17d15f8806bb2593b274ac30d1db8e500bef587477003852bcacb60c2ae7e609b21fa8a1ce0acb88cd3e06ea98cd68b90bea0c69045a0065a8ef220722b82adb8ff567201172a1d46a81376102123fce9e8f1d853cffe90994bc6f912e378ff8d460037e874a6287192ce4ae34b920df0ac153d2be2eb0c151cb1931b347d36ae2e19c9862feebc4be215bf4174fee9a382c927862531057da52f270c23593cca04ec802cff1dac7194cbdd958bcaa71f92fe448f92f3255dd1d37598137be5783230147a2e23275d18134755f856812a3760302aec3c3dd0cbd8f3650ef6e883a7b81accf2e01d88ae2737f3932ffabbc6cb1b79c7ca041da58338a267c4ae3c6b8e983240905cb7c4e2f40abc0c00c090a0d90a003e0900bb3fb008dc8ac28a542900804f020083f8ec01690c0e957000801401805900807b5e5163a6c8a40fdb3236a4a0b243d009adb567e1d4e1240b41d5f6ae35e3a11307cfe9606b964546469b83bae814b7e7daeb78d275eaf79e4015a249eedb9bf081c8137dcf47d5e425575f67cf6a7a26389de44ea40419db1b508b8f3fc2da27d5068c86176c9035a17bf9b59220f3255de516c4694142aba52fd96d74f1b0b067c75fb3a3524642b5f552e3ce3ac7b8f86eadf3bd0de383c4af27c7e06a5d5b3db54ada920dd11e56d93eac600a229e9bb849b13ea66b2340ff93a87f0a8a4f21ba08de249e7e5659ddf807645b047454c128d0690048268f523e5d5bec0371973b9e9a28b0e66a3f4b81ab56bf5062d3c3be9b6627fbbcc09e5cd9f3a141a737a6eb21ecfd64376ff2dad74998aa68b12b09ebad6a6f4875b99e6d8cb0d3974a57a3bcea6ce512145a899e2888bb0e9367dfa418749ce221a24414f0d2f5c33d8444fb3fa3a3580530c232216d0286b05a061d442084bd87042e651282f47436fb982a13e39108c0bdb3244ba0150795ffd26f45a3af55e80e3232adbb57dd74d54b2e0ce1a612ef88d822bbe928764adcfc364d44d3c9e8d461c79a4f3bec54045d58c23eadd56422bd24dc610f350fbd202f191518c6f80d30196300d3cc5c35f3e687e4b300950f3a1e22456640b9efc056ae972a05a6a45852ef076b723fd99b10001364ae1ce75bc9fea96abbecf4489ac3bd6a14d75170608a0327fd384ea1714d0d724707bc18c616e8d8719ec9d30be3d5afdaf8e741b30c3a043995c214954ea99dc0010692f6dad6449d6e39dd75ba418e8f2297ac1c573a01c32ccab16a2de4617c429ba174e34822ee32d586d4932ac854a5b939a3b05d8153a22a65d15e3b47a6e55a746fec5f0ea3f90a08d89c4667872da7cd03420d84095f153ec4284f51f061ae952c15761346cd25a4498ac48c0288b916a7b7a09289cd68e20190a0ae6c179653a59e901745290516fbdc2625f73df469a96c33c9c5f4da2a85e8a98aa06d037d79e4391524e3570c9903b39483ddc5b008f24450e8592e8c1dffa1e4c2bc18b6fe56e0c0bf14b1408972f7c402a44d9c7fb26e0823d7189928625a006f61692dbb418590c704deb2a6e427cce8bf7d3b4c2e6eefba0250d6a8c3f673501573748cb4933948037621a6d0f8c62772bc48fb7a4e98397931b249eadbb750c7337f37089bacd6201f7548ee0b45a0bbba2471f177143ddba44e1a8f34084d885023db83985a6885fb9c828ae4a3b55f611a8adb97747e83b8f46145268314762c48ae12de246b85558ed57204345bbbfa5a353d2f5ea2c65c3deb6bd0c7b0723e004426178c4c51a5292380735f9d1bb2a9fd80ee5a37d3e535ce74c545b3aff63f77c1f4182688085d7a9bd10a0d60aa93d90fdc8f35de714ea325eb6a56392f2f1b520948dd844d61c56e85358f27d20109089ecf4c70a211176c9d6702c8de4ce83b5b365451829241508075a7d35f925b9648a76a8de7f53b035b3404b237a52c0f3656cc14b3eca28d9e1a36e8d9eb6444083ce69fc7c8bc0aa856169cf61eea692d4eb36282823fbd3d82dc27f99bda31166dc98a618631e46d090702ab1a79fe326f24e0650bf828068c63be83e24d86c075232bf8e8d4051211a03b357ce4d9c18f1b58bc7d9bcfe1c126eea97c3a13959dcc385b5d875b82ee6add5314f47bf69399432d07fd0268ce8f4c81a68b22dfbe2c00691287251f83ebc7e5c7ee757349aa4cf81fc4005286ba7e407f1044f01e460e1ad4a3a2c3325b383be8ff53cd016166f1b033bd8afde7b85cd01d2e473c3d05486a2f26e8a7bde189d409f0a1bfc73cfac1794634b21d87218d72950088f21f46aa2bd153267e691af8bc4a6cc584920655a2cb60c69356898e36dc3302a1510f634332c9f8cfd53356eb8f83d3096195b83c3ed3dc64ebd3e69af7067548fdc28aba08a52ba6d5922a315a153a19487c04b8f04ebd5e4dba4d2ce6d57373987b2e288ec921a6f0a2dc5d2778518492ff17682612a4b067bb12116e0eef0147cd105049df41de74413aa40fcb705683ead4a319bacb891517deee9be45e2b46e050b187472928fae123aa336df3ba1e2e95816f79414b7787583b1e18bfce8ed1be0662bada0a99407b9c882487c1e6d37cc1916be7fbc0e91a274aa2975e339c9eccce6946d56c3db82b9c83e3699738623c4ee8029803496bb2d8d4b7d01e6bff28747358aff62365001374561334f8729e1e2a26a03fe61575cf54c60d461cb2003f1f5077ed28fb78c4a7fc661c87e91922c256ab0ed3eddf3fc41bd8b57a2149786666fd6c8a5c1bf5866e6dba96e7e013d976dacef6413d836b2af6e50bfd515d5b5a2f62039bf598cb319bf2402025c82c4491791d578409a118957dcf74051b8bc3ea6ad9135ef98b85beca32aeb6d196940793f010ac6296ff35c6f417f4f7ba6ddf3eb3283f844ad1c609723c91611e03e8a3db377af4f6a1dcd3e36264fd10f8085904c7375b99fc50fd0474b0caf5ab2474e7edddb590bc46c3b343762d525af2337a857ea0d972b4b6eb0d7ae5499b78f9080cab127aa044d959591f4e232cd20868e778a9e3a99f618923749118168ec59de0a4315a38894a22ed0372d09cf7ea99795256cf4fa43ed80cce6be209bcb1e99d0ce060710127d18f5e3ad7d8d1eb7ffb17282e198070f8abe1eb961922d7f65bc0b944bc952b72f614a09c717eb653bd317566c09b98f239a20178fa4cbc4d6e2569ff58f5b7ede7da497536ab66a67bdcb8f2a68c962b72263f5423d065e60ccc43adc074ef2611cf7277b071096c19fffec42d097bda9c92ea4ce8b1c9c075ec8fe2b1b75a3ad1c4452646373814404f8c8fd99f2c00204f3c5f9d7a90879d26ff72ff38e02a4a91f870453272afa8b586e85dd520eae83689332c59d7982baad92c89641f0400fd596d8cca2b4b344d3effcb49399278c6d5b5e649d196383530514ee3896ebd2250e0915e95dd307b03c6de6bb58ae1bd7b2ab25bedf93bb23699415f7744ecbec74b1ceb1c12559feebbdc1292490070339d61e1cb2eb28ea8a2782f4103051073841476981f7f745fafcebba4b618b3d5eb4a7965cece8efe8905b60c13978e5a3a2089f345e8d3fbd71b843f056407e2c48dd4c09394a31be6c295d564c55603330f7431a325bdbae55a60b3a0c76a7f9da0f972aa21a6b2711d63b1d8574b4f52690788028363db8d0ba39e0b508263fa844c64a4d1b150cf6d76f2ca1fc9c5712a0f794d18ce350c65181606b37cef7facad36abf22f7c657c761f5051a0b013ec4a936c069bcd9921a7cc029952a0be31596f397b9962d61ddd2faed4f41ce7eb3119ef6e45193f84df13ddea0dea16b651dbc3e4aeea772b29621261ce832b0699cfe844cb57ee8aafa8609bf4f9216ad44067abc23402845f9bb1766f04a343ce3bb7eca78c25ffc0db0f761988f50c4ee23dbd6dce85fdb2783719ae4e16cb36137fc3217b56b43025b2cea1d4b65888729bcaa0157bbfc05bdbccaf90609ab3b2fb3545803626d1faacd9b340f2209194d82fd1fd710a8e4664457836344e9dd9eb5bf5c31cdd8d8c64a308ed30364eb1b24ec75e3a5c96077ecef12de1f2e501ccb6b88940e748fe91589a8952ec49013ae088a6775cc3320110452a036958e219795eb315db2dcc676a3538044aea81667074318f54577b60655a77153f4d9b0dd42814066dc2baf8970037c336369bb5c5ccbece6abb5b7a7fa99e184029593b87736380cae6fd93af2782b2bf04bdf3aab4c248881afcc54e9fa24442761b5f7cb0d6f094bc3e7ae6806e5bbd5b9f5821ab805ca70bf4ea0b8dba3fe903c919b75cbe0375b0f1361fb03136c9b5bf3221524d530890ff1a2571db4ed4187faa599928b383582e07e726d8a877102805fa8f78e66e2988b4599318d4eeeb48b7ef4de0de9e38dbbfc6914105b62e23c9b51245bfbd2ffb1d429514070ced91af70fa4e532341c190101455584dc7b69ce4b286d16e0479517f10100f49188af4e8ec2c0ad88bb0930388c3b3dacdc415377267b2fd9ea273857976ca5771d2e1d6535bad2afa9747ddbfbc276639d95162056a61f8c7b5236d02bb484c4833b937a133cdbaef3b717dd27e3bbee86a78d79aec734a9e7c93a82cbf43ee55e06b6f0e86734274743f8db4bcd651569d442ef6635c0378da187fc1a97d47b80e8454d677864471b4baa2eac201312a0327135e73f5da828eabb981fb810898e0b9bf66b82ddee5039f77f3b17dc801abf0048e1220a79c4087f801b451bb2f0a6a0d6d2c23c712bb2f27b364a30bd0395a9ba880f91c5a384541a27e0964307a4890e7b86112836f871590aa29aab4a102606fb05d3f47cb32022fd4d54c9ea186396e0e638751733c25b70c2347b446aa1f1a27977e0977f5c624e279831bc444ec302ebc6523b769123e50a11619f48ecb55a695178fff7390550cba8b9cad78e4129116289783c4062804cb75695e1a8101f235000c362463e902aa65575f90a211023004f83a3882e8f8492c38ac7583bb67e88b6336a8b42a14416d810d491067b21af4dd290a8679dff34e3bdb25046876d44b280b743805bf924c21b5467d2c43d93f3bc70128c4d2c11a2a3da5ea360472a2883acb60d4e09c1124348ceff4e46c78d264e8db103dbc0f194a1bdfada3298528744110a906cf42686a5a40b2c230c0b7dc7cd7b9486526e26e98fba58bab92c198ceae7e6535a68646ae334f3e9ec0903fb0e72f344370ed773a5a9f08a24ae8dd08e8346e42c76fe0c2eeaf4a5b69290023f8c5806fe45ff0096104d5f4bffaca64a4c4fcecc5423894a85ca6f816ee45c58d480500664701404b8e38e0e1249b392445df0a54f69eb07d1777ab3569b128b48b638b1bec4b9cd23cf2062e1ab94340fd5b6a29146cff85451e29e8c572fa9e13d4b0e26fc3e41b1cef610e3061c3c1dd9079e123c52e00ce2262ac78a97e8d10a261d7b8b548123f85a72f8ceded892f9fa34116c5e72dfbce565466f4a96452ba2bbafc4ffcbf286d6e4f3c439f620dfd21ad288ba58ff9d3e5d53e307729d797418fae226cf0b8aeca708de8b9ff1ec48188d750494bb78586fda9ba63d824ae15ac8b28a652b8848429c38015b734ecf48ca5acc7ec48a73737e9adf6b15132320814aaac700c13a9ea05401efad3d5b743ce1a74f05c1a26bfc82f67045f4c8290664480238310e7900989230c87cdfb29c14c74afad97f1b136ed5c38b82876ba087e2b81c45b2785cfa9522909391f48b387d91876b9f9a3d7c5abd328fc1b0f1104935b6abc2103a84bcbc75ef6362b0a2c8ad1afa2b1ae87ee8c621638a1ae7bac3d9b6dd82a222b3175bd4f44cfa39f7604e60ee2ff0b82e81ef9cf8fb6725e57cf1d8c7d064ca21e938b41d8fdd17f0542fa0f5c0902db662dc30f068a11dfba9ca3f68e477bae33497a0908e1fc4a916bf899a7fe7aed38569d4a7b1ff7d65acb1c07565dc780336078d3ac447c4bed12f8d90ae941c6651531392ba6750b5d3bb5ad834d53c828308a1f706aecce638a6893bb6a5caa2b2da26f74b13bbfffd30a8b63151ee08fefb32a7e06d4215c1a289f855d2284e88ad27db72b440696f4161fd493c1d29d6eeef50a8f57e176100c24ab95735cabd402a3a63488eca8b3eeec068e3f8a0228fc8bc2f9ac64bb1e0c5969910e1ad51a07c265a55d6651607dd362c6a1974cb819428cf7205bfc7d3629e14effcc9eda8a93dad7618aed117fcaf2cac6300d203d12f07f83b973068ef581f8cec0620954da8a9bc11386ed626d32fe0b4c6764c226af60264c955f3a5ae8f02c7b2f9ba5e01e0167cbab2591fc7960bc1e44313bd23e331a85dcbcd36cde80c31645197384ff13e1008ed0e11707a0180a483d3d11e721c8ccc7b18318eaf92f6e623b265ec905c80c4d5335c232ad1269be8ecd4a366804a883e81f2c0899d5579fab7b3b8ada0f181650cf3ef09533c77d5beb7effd7851f00bfb133e8808eaf5162abcd2fabba44b271eed7b35e892b262b1c152391e927e10ea1d98998500cdda931c1e6243db7cde5c044a04a9cd268f289fc37987c4bd56a37330a1a7e47984193afee427543180489d156fec24ff0fb62350df8a7ced84a0e4c7180d1de7369eac5fa987ddac33716d485bf2d6899cc204a7cc9fe9b5f35946453b80c520516c20a568270b1fbf91b4a234b91a0ea37bf97c5a20e7e09bcaaf6698f1006e70595311f4116d5f1847ac2bdb2799dc134b04a6228ad427790403e1358ca7857e87f1890b5e67c47a8ed3029db0085a805113538428d83729a0b60d113c460266bbbbdf19244cee49289a23a72407301eaa0d18f0f091d03d3849119b9c75fcc0d942896ba00005194bf3defe85a8d7db4a7e91cc3446abf690ff96a40f51b88f00d7005a2553fff1e0b1b9e386c3a5697de42586a90421e7b1f06d18677bc4e0e09c288720bb88247246b212d07428130309755eb49b18a6c761aecb756ec2b516b1f5ad1f6b837057ea7efe0400f29d46471de2f1f8ca09070a2b45921e0e5a7f67471ed8cf87b2a22dc16929eae7e88e1a77e2cf0b7c4018f931f611f513dc1e7400d508fe5cb41e698175c82082caeca20ea89e82b60e8f9fd53f42683c96cc11b7389ad4611172d921b5b9812e603c2a456622db12716cdd46e42c69a34fdaca1fe73a070aada01d6f48c5e43c7547505278edbe361379472d716bfb5227e8ca9ad15aa94ff3f937a18d91a7691e225172d179411c46a4e6a83a88c8fa4d887f8a20f1ce108439c13c407304ecdae26f6095c259be701e4d7b5e6429d7afc5650af159e6134333bd5aca845022761effd61eaadf3d46d1bc77d5e0309acc579ed12f22c57dfc638b7549503f1598767e3c697da95d2e59e2a0e9fa930bfe6a1f503e440ba06fc60d6dd8c3312f8e2a129d35306b3362a014ffa4333787ad14ed08c210436954ab032732f5466fd82d22a5c4913eacc824cfadf110a818604e30d82fcdbaf1057967d5f2f9225a34073914cab4e6b7eadcc794938cdcdf7acb0b8c38ad9f627039fb66a1bee57c368135455acf0634272767b9989039c22fe75c3bc20cdad96f602f381d3016c73da92c4391cc219081a0ec0fd4e5a3b973d222a43b5ff2fc85df21a44310c405469972f6020a14139d7ae516e3421373f56ff4544bc4fe5750233a1c5c074835a246ccedfe15dc829cc8680018b7311875448446ff2ffc1be95c7e0620dcb59c65f095bb1231182572c62d98895df1b31863fe0a87a6d0deae75028f87f825cd7cd54bae7037c66473743a0f9bb3bc6a3fd57ce5da683b82c87b4f7a8233262247a18e9266d9d78141575eb84379f919a552039513e468cb2446d185fd20f06e10ea43fd377fa97d695138f9f49a1323f281a00ff72c65e19cdc8665e7dfcff3997a28469e686bf40b419821ba3a297e09de4e7523355932cec6735107809295efaa196745dc491435a33afa9b390ecf45dfa8e9648e33b030dca793c53ee22517d1616868ac05173da5f4ec89841d205cf02e6b12ce99d226f46b070c238a1da7827885134eddc6ada3f8ed5374a59e69cd9c5e71ed0dd82d616d8a57d04e349d5d6c3b927bcc0c740a0d4b17abb2074ab8e6a40d54bf6705575db151624995bc40c609c175a12e1ed4dadfd90d398f9ece99bcb89f32ff5971737477e82a0d42022b464d8e4662f122bdb58911e09a0e4f5851d1f60dbcc6c5c7337c78f0524b8ac8b51372dd6c9d7d423c5340744fc5031cb69ee508ad02bdc522989e2ffaad9eb41ffaafc26c87e11a622e228d57ea2cc31156a8c4998416820205723661b2433c35eecaa9e3bf5f52aafc328e2b2a095f4a7e0655f731843b52366565d99f6ea014c9c7063cbe6a8a592f38d6edf9332706ab678c3d3def0b9876fa746d8f5499ff2b5a105f0038e73cfcc8ac310b1df5941eec6a22e7a27e664aacb73875c1b7ba7b1b3c94c4cc86747218917ca49a385150516db9479865470f1605c909da360456b7c805e60837a92bbbe2f9da8279198de6dc8cc6e48ba757d13ccadb7f0b296a4066e001db385f54846e9bf9a6bcd60bfbf87c157e1955bf164d98c84f5ac71e95fb47c91acd7bbdadbf8061cc96060539ab59a39f601593ec9fa812f1b63ef23ec7b294b8ede6184c77a1aafe12a5788edf186f0759f8350d125eb069f81b1f5b3a2c0dfbf161b9107f50848f1d260968c7dea12c907135c3bca31fd85cc5f1849612b842d151a7ff9347e35971f32de1b2f535c7a8650c8077572f762d110a82bc0a2babfb9a6797cdddb76d32d2f15dc5daac3e7f271288922836c8ff64be1499144e86408e39f699e7565af6ccaf10ad5b86a0474d6c382fdf3cdbb60f53aa41f7fc7ac55e1c126ad16a899dd58b3c74bf2a7004d06dd171f1eaac350390067cb9e7d21671096361b071bcf28f1b1b00e54649e962199b8829104faa4e7499e54551388f2d8e58f1f802f0132b4fde6a676bfec432c276756bb01cc579f6945f54ef088d0e50eb9b285f660d8002325bd3888b1c27e14d02bf1bb76f18d699e2db73a3c594d31464d95de98fc96ca24b69bb93fa7a63b108dcfa113e9e3877494ebdc9044c528a2cc918ad2c4df7de336449f73b6807e49a0a5665063a81fdb532f2ac0f6dbb55de7faf101cf87842100ca7effcbb4bba9be936618d3c9102d161c063c503aa881c7b7262d9c9b1cae896c4b1e5c21301c266582e7ec3e21c4224c96d0ccf39dbb3881e0ea42a4ded16f85583d3dc4d554d3c7dcc649c3113ded40c1979a8dffb4cbbbcf49e788c2228609d425b8aaf1c53ee6ef0364b871aa620087d7bcaaa4cd4748ae6e409713511e319e83f3c82c19953b02eb6669c515b63a91861d81bc5688f943ba8e3984ad58275f8c2ebafc0ac75c06b05676f07b2fe7570c5bca54caec97c07e72e795038068d48023ea1f8a032ffb5fa0721fe04a86b4a84dc4e68fe399903b85dfd7d21f1c6e4b96d198e420070e67154d184b3310670d7ae36c0352fa70632ca88a4bd3fafaabcbebd282dee625722a8a6e3f2249c0de0046a5d1bcb8beb41832fc41eae640df7ff92907eea8b7dd36daa7beef5f56d894e41895e51a997591e407d6af5c937fa353d048ace95da46a9119551af7fc297ed5cbe96d72b5c69336224bce0dd00644129606fc3eae04ba6e5910778995a7e0e645f3141e95d0452849784d53e2de057dc0279bf433020d2392dc31fa4b0b5e683d7b1ca723bc487466e29334fceef3c3fc25911f51f5da10f87569c11f3dc455c63626f53338eee5e7e6df505a5c9410642b3f774a238b1a6853dd76a71adf4e83e55b6417cce1d88c0d7dae921d81dbd8b6580feaff837b482b953496238c1e2f075f7bcaa4f67162bf1397f76d7039bb83b48eb703551fa6dc289631208e103eff1ff86a1eb33254df00ea59090abde808e4402d71f896821647aba342f15d6ec1d57de4070aa1896b780246b7bd54db6f1484de6a8945616e0f105a4f45f0fb326ecbb439433e12aa21f5037c68315f99497e8a122440b2aeaa28921eda9f10d09990dd62e57e1839e2e7bd823110e4e1b889ed2f6c02002fb8ea350d33bcfb8390afff48ccbc40ff8309a26f98db6515ac1d44409d8262963cd8e6a43c4bd41bc6362053322b560a14a44c05be83c4d60d4f205e55493af97c11288de41a864e29e08bebc3784b849d8f161569a4fd2270276b0c49f77965f24d518aa5c1fb7f1dabecba6bdefc0d939515a129d16f661ca94d4dc7d6eed608218410b2f79672eff20d3c0df10d731835d0e591cfe51a74a0d28f8ece0cfffc40fed1e913fff409484867887f3ad5373e74552ad299443aa552ad8c3ddea08e726251fd9a8757775a0c87bd1ea01f9f991a99a373ce89e1f05ce667fc48afa054d40fbba17c6d1665ab0b5ba2643333cf89e1ccdf39ed2cc27070ccf36cf9a892f66653b59d434411deb087e1603797319c294482fa6137d80d6605a72e15dfba2ec5692b54fc29d42979435745770e4da2f88fe65ca63eb87c1871cc7fb4e7d22a5cbe8ba683dddc8f7a01c4f1340ffde1f959c28f117e7e7081ea17204d7279c80a743a210b8e8823e28a28f61110d8eb2212ea486794c31e668d68ff4639dd453ac4210e6108d56589b0a07f7d88f5cb9a7c5c44ac5ff60854691db71ce58c6e6836ba81d82887b11ceea753dccacacfcf1d5931fa018ce18f7a30d4a91110f8c4232c2e9fbbb8a1cb1f5788cba31c18c3239cd1cd28e7f2990515f2796e2e8ee7f2b527401a2bc0d4064ff10c6bc4f31b0ab0a70051f31caf92440a21d40b2f7c8430868bfbb11e6eccb951da28fa1455a368b974a141272a4c5206204417b9a4c2d3d74ca3b3b377f769a7dd8fbea64dd9d7fe49fbc1b7263fa5fdda5615f6a6fd0cf6c96018c4b0af8adbf6b399d807434f9754fa8f3f6d0d9c35180c4798eb3ac494d4ecf02595f9efe532cca7ed78b963ec98922a3e94b74950e1352a2afc57655cb107250a320e09a5b47175733fbe71c6c33883989420456b5ae21a49817521f21a59997c44d5f5a8baeccda6b22cd1ed17dd2824924bef737f441a25cf1861941f95524619a5b4d0e7cec31ff3f02be2f621f460604cff8939e3857f00aba2e8135f1cf0b612aeb4ad84cb36b353ce1093086d715b2e4c22a473e91a681a600d46615c801e4c613e7dd2b89ccbc7b8a0737d3ac5f5009ef8dcaa4f70a8f3f05a13bc5fbc34a8d7a70b104713c11afcdf94b2552d22badc872f5cfe55ba4e83309f4ef2695ee376d8e34f1f4c0946c4a82f3815abe083818151900b247cc1e492309fdf0ff3c1862e635e5cc67ce4fcb81d8e09a34c177b7c72bffee29ed2ee79b91d4659d656d427de88fad4d72f0bb7a24e7159f0692bea4ab7a29ef67bca5674f95c169ce284f8c4df545e60b4a7d88fc6fdb89dcbe784383502f2681ca6f4bda8dc8f6302b4dd8f63725d0d66d9c85ed6444db1c785611fd921a3631f42caac89ae56ab95279379de6ab55aad68c5bad2558b90b613b94efa65af17195922d8b763f63ae93eb06fdf8e11e19e9dd41139d283fbe8dadc620c6a25adb0dba8f8a49b4e99e2f51ed6af63760891ec1c1dc29dc8e895daa88264909c49f8f8ccd832e822324592295a27aa35c5a1d17d70d6142dec53f441852a5324ddc7e8a4ec4446f7919d3b678990ac29921e2d9c3e65e7c175a46eab246b8adb7b90be3d7edb5e3752101df1ea882627a28a74eb261fd6ebebad5f5ec4a04e6beba226f2629edaf682bd22464dcbd3765113b1c7915150a3940614e52a1d29a84ffcadab3915a74f6c7db350f5559ccb5fcdb91c83da44d98b3a651dbb0feb3a765993466474cb9ab4ab5aeb9e80c2fa410d9adc94723cb8c7aeaeae26e33f1a24e53c0da24cac1beb0a4ecde0a14d180591f860e105152acae27ed6ea32129f32dccfb242ced8448c621269c5a88f349fd27d249c52cde99429e55015d429538a7522aa9a48d545ad86da2b14d26ab55aa1987c6c44eab74395e49ea8df2eb9074415e927dc8e8bb40363763a45743901453c978550bf0ce79a96889f97ab4b5757eb8db403692eee01ac223d078f7846417daa23202154a0b6baa81a05c911d1e59386484343a415691584fad1a0d5a56980a9110e7dc3655a87d447f9c0d705e77e190e4fa748d7c5b3e2210d8d70864638a455a7a08a4422e55ce6d8f1ea6abc918648ab4e91ec08a854874eaeabd64a5a5d56651d15ea68876ae251e43af6931baf299a62fc90faecd1f6207d741bd53702aae151a448b54548d6c219755967ad4cf1a4dba886dc98e2e347a3932cd1e58f2c1d5274990e5d86dc03621deafc0e78373ec018fefb1f0ddac171a8da6da84f7ca7dd885056355a40e0d40807078bcbb77218d544572d3d8806f1488bd9e174cac2824f7c2a646571f956cecc8c8c8ce7fda5521de1107d239ccb4d7499993968d433e2618f3f1af1704e40556641a9918248414c65d0a441d8509fb0a2cbc756977f6537973f02e25f57ad404eb0cab29890cb87bda07e711bba8c29618f2bf663319f3954133da441940915a21d154378505d64179585ee47db0b1a0463f8510e34e832e6738bace24d93fa613e97ff613e8c8aaf3a5c05b58955489b490fe0037a968d8affbaf360d8e3b7f5ae49f8d85dbcef54543533479e8306617e21bf0f3bd33cbc8d4ae34e325f5ad8c33ab443e02deb17a318fbfac618a36cac83176c8ed13e1efa4c963ad0200ccf4355e4c15e7c12ecc5a11be3a9880208077e92880d00c2a718458e0a9188e7e6abb5d020ccd9ebc73254ef4c642a2073e317466a282d173e5a18d3ffba054617b72dda2db9fd190618bd0f6ee126e08858e3b76748dfc9855ab8fd2fbb509bb186193364a841868c18698811e325e8e5c5840693c9e50c2e2e2d666869292d299558ba6061815106183056c8b0b2a202a4a292328694141431a0a09c84e1e4a482a156d21748a491174623ae0b1cb7fd6c9bc6054dcbb69065981630ec52725d5612cba25c5c4a614c6cfe4c47296f5f0190a6bb6f3f019086996f1f019026c2983873447cabd46b13eaceba00da823df661cf633e143d3d624f0a0c0c188f31c618638c11088c0c7b72bbc127be0cc97ef1ce401828302e88524959301aa99b9101aaa47f32374a4fe982e4e033853e1f4ac7b3298a11eb29dd063a0dc0183e14b106dfe26a542c07b2503f6fc563d4a77d2578e92ce89d78a65f28b8f4ba5cc3a0e4514b8cc7eee5f27a8c32d9af5dec47a4a5631873f28bbbb88bab41b9263714232c2fb15ca533725352594f390f08c054a4c10e9f68d0452b408fcfd2c524f0c48f3d8c82717edc8253d633ee5fdfecf06affe4fde2ce7638fad751f4890fa3e34010e01d9d1f73464f398ceeb3b930f87e304e5358c57ef127ffe2b1679c8e78942a6e54e9e251ba79573a135cf7e49eca8f78aa62bd6b29cfb89a94942ba3a1450d5ea3e8312ac57ef19ed013ebb1479fa32bbca3ee8385f8a2921b8710991044de88bfcef18a304218d511d312530430975a1a9be7d1e84a2a11e842224855449b3947565c6dd8b930491b72ae11172661431dae066dcc9ea9d0ba7c4bc218ad912b5e16462d72a4afd3ca2888920dfbf39b654dd4ea88f3be071a8461d4c6de14eaa9ceefaa3109eef3bc6a2d4518b1d147c59d828adbcc574882d623272ba1d22025d459839a59c8821a2fdf35a8c7ac39f99261d48df9ec15f860ee059359eebe857afdbb0c6681c05cebda9499dd8ccc9537d8939f563eb244c9c838180b122f9c1ad6cdc84c217c2d991b8c9a8797af24e40502732d7bc9ef924e7969591d837a211748c0c38570a8f27c218cdcacd020cc17ef852de525599e46fbf1a538623d837708c337c618637c1231c6df60148dd28b166107efc6d105da85497658704b2f52c2f72fe11bfe47cfaf0fe73f7869fb4df4ff4978c89750cae69e94e3949261f7f1b5ac8be1b582c41b1b5e365565b56ea0cd08000c0c0c12ecc524d88b70a8f0c21bdf50396beab19d6cb751d9a8e0618a3653b32ce8b3bf07678616ac549cc6f34b2ffaec1acde821c4ac9e1de768ab83d72895599671617d92d208e1bbd1a6523ecbe695561059ab2e72c328693baea426bb5be3aa8bb017bfeaefaa3425c442b6574c58560a48860bc970a515aa5f27c109375e52e1c6d388e4c65b423bd10df5f70c394477073a17e5429f1d587135de4e3ae88535bc604715635059c8e51208137079dca93938fea423d1a08b2115101895e760cb8291b99a1aab0302a36135303ae467d0053bbce15eb943da0fe6ca63dd57816b592030775a93fc02027163e34e1bea0e912a8e60e70e552ada210765fce51dd1ba655dd26b967529ef67c303d2f48d9f1079b91aedb0abd11e79e0112f60d5c9e5e585101584a3862348949a12d0e76a97560c22af1079356be4c4de5ca5a2a9744554ae6991cb2e3becd2b484fc615a625e5ebec9509f581af6a8c4a45959a04455e314b99b0e922904e14484440a5f6898b56214ca51a31bff83d3762eecf4271de4cc7e367107b316eb2e26553e5eeb98955d548bf651ba2052650181b821693395c62ca4b8d6a5bc84c86b71f42a9dc6733292561779d8dbf942b5ce1e9f9cd823f250a04cfb431ea2d8192d15cb815ae5a190160af662dc61148d3c5a264d4b5813c83b2d075e4a251289af0be7c69c1b6f64252374842195c9c74915758b3710a98ef808a28442aca00ae6df6316f2f34a4b83bd788fbd68f27172ee9c35f9e088987ab80c3149176beac17297bbd8212679a872398b3549eb4454b51caa586ea33a397b4d24248a5891685d2aa82df12c1d0ff529dea553c361cf2560b81f245aad621a7c34d3891db29dbb8dca8a20cc47e270b103251c11175618228599b9b022a864e29fdc46c5f9f8e08048c8e7064496cc012681d0f5e07e62e1dce0f8e4e00740901f141ac29956518848f341720543e85897111622350021c1021f8c5c375a32091484709ed6f1c31cb895172bf94e020521a05000c6c44f00c6c43ff1ec3a95b209288c829232d2f1830f8f91201c23774049e1263c51ba76352d8b15d9ba3e928332ac5433553e26815a3e2cd0a996c585d80267a5128a328890d26d18431f4448bd0c63a82cba42381a572f95e2aab122139b5a7682337ba56487c9fd2293eb5a86ad1885ddd8351aa10830263eeac41af15fdc8122eed8af5aa16b0755e5422eb018ea224f9fe25150bfb8d35d841ae1b8eee49675d9f50d7bd13ad79d1c72d3c61df6e2e72d6d85a8e7a2d77551e9e3030055f68b412bb8708a788866e973f9b2933e3aa83cc442ecf1f99c0dc7dc123469245a950a3385fac9c4cbf48edaa7f6ec4578c9c8070dc2d4ee928f2a17cf9a68af39a7a4b696544a92528eb54bf292ccf492cacf1b685a76d9c9b6b40d83ddf7d6ba6ed9cddd6c7573375b105e5affbab99bad7813bbbb77d4782a795a7d8cb6d592a5b430298a5a4ac61a2299dddd8d59565b584fa66c51abbb597677374b29657777777777256d49bbbb2dd97dddafbb5b5ecc1633652bd22c264a78356c8bb9f9c298b62ca667668a514a2db630cb620bb3b8ad6e8b5a94ca3925e51c3fd724d9b6ba9278bcb9b9798615a9655956779b5a94adcba2f08229f9afde083f67acee6e8b5a90ce661963146a7c1f526949283fa9655916b5e8b4a694525ab2a5259b4246f185752ff5093e8aa1c65f78f80dc6442cb6c018c831f2d69755fb146106614c9f215fdc3116610f1e728c2bf6e06515b1a70e25ac20ced48696456b63a17d17a5962febbae2161ac718717cf21aa1414641c8cccccdfce69edd74f6a56d96720b4d72aa0e40838c82b042e60bca49e1bca0b490b9091a84f50c80b000b13b1d36ca20c9cca6256ecbd884eeeeee6e964c3458800ae79c53016be89dee9dde79c3cbcb8b8c8c4cecbee4daa6b89a2849918b5cd820739fb9e3e563db31309991820427479bd28af792ddf567c3001beb6c09e93bfb395a06b1a6657a7298c0851f44a10c5ea898c95da06c8ea5a041180a10a9fc78be9286104d3dc001506470a5e414c3f32f98822a8e339a44c921d586a30cbfbbb95341b5895544268017ab0cb3c3cf2c4206221961b4f1ecbd78cc52e63a418d87b51bda2b519123e380cc1c372db644c9661ccc2c1f25b3bd6c64d472846e47f668c8783f3d93440390b88ef06814a17fc155d41e913f94534af6ba7f614adca9c0fa058e8c1442a860af2f057bdd7195a3511f248a45a41012c51c72dd70fb1f04ea024472800b7f467dd9b5c39fdbb7017f6d8757611476f8d20bc30445ae26d36c14d76a302c0a461dc8a83b623d724af08aab18594134ec11d6c01e05a3b23e90219753a2b7acfbe6c5cedda70225ae66fb3bc1875dec927bc24678c22e3925aeacd33e39eedeb5518db67f31b391614c7c7d55965c22e56a3fc231c69e23ce9a80278d3dda363b4563cf6c149f8d0a7b5deb0b7bdd2fc1b0d7fddb8f0208a3ba1b32d1ca78347034c676a004cc418634bce192b12f6d8cfc79177afee4ff986f19f6e2ff391f638d2d65fca04facd7556b4b326858a071468eb02184a753b28497872d65843d74b56624e227fb88cbf629ebaaf6fe0553d9db46f908e7d556d36ecb67cc5ef6bb822ebc65bf4a9b79e6de8055b0cdc5998e4603c644211c83da4941c51515deca2e6a4c820ccc6b853a6afcf7ed429f2d9e209383d8f15f37edc3ee18bb638cbfae5ae18504161bd50c37499614d1eefbd1dc1ce3f7639e5279838a31467ff4e3056f29f1a3cf3f9ad2eec77c9497cd157b89c69fa9f06c5f6a1531c6c07264cf15b109377c8e00491f25145de8a384a14b74a14f128aae3cf42650bf5bd1bad07ad0cac0c40be5493f5e86aab0274b25c956893d2955d8936f79e990d7b212a8df75651009554af4ba919b42e49dd6b48409e4ddac94f1304920a08fd4031226f7172641b205922caecc85497cbeb84a82ee002e4ca2248b244177bb29ffb906b83049129c9b6475bd0b93701174b9f8b9da959f9fbc243bed67634d12bd10969464514a35cac9d94ded9409ec9ac69ba48f149b9fb4ecc4386e89ec5a1bb723fb84d7ba9cf3b109d6c11a6bbb6e75d96747faf629316b5d061147bc2584539a40b11f37b9968d40b6941c9daa28bfe28cffe2b42ea3559950421ec69b8863deb294effc4874e376a47cda1f29f432fdd13c694525b3ec17316b7ec57ef2927ea990e6534893afb8daece68df4460c3b266f5442bb1ae917b7c37af6ba1d9b2775f4dd71d77aa39f99945262a429e5a9c44876097a4c4e0bd99b5b5b993ef1bf78499790bd91ad176f4036201b904dc616d2f70776d23f21bdd92548325a71a5355d329dcaa159b63ebfd13f793f217d4956ec90ff41b2b7b826b62b9f837426d991e536fb452bee94f62381cdb5ae9d1ed253ae86661dbc20bd2888cca34f05577e5eab8979e573f0bc905342bb74daabf209be8a688355116de24ce181f6d8418610769ae46a20fc6c3ebe10be0ca1a6449441acc197b0a326f8d8e4f21537076b1c6f628d7898a365106bc4c3866d139b34848188d71bd9529f309965d9b54eda4f3b6708d24f4e4366a69b64e75ea5f6ac6baee6ba5fb4e27ef21c8a4d4a27a42f8a8d328835b8e7e81c9c1debb412a3609441c4012f77ee5c0d67533536b99c7df13a353a77a95d9ed47116b2d7b110d5eb54496b22bb764d93db31ae66b3a99a6d5996d94dd2e053760b05340570aaa0c6102388c4544103d26c9c95319acd2cfc0af011c0c6251925556ae52ae23631205cb749fd999af28f6ffd877d24ee5f45b990a5e5c6b8fec9b8306a74e3608d3e4a47825ed7983f49b9fdaa72fba4fec8e5f639d3ed6f3160acf159ef7677bfaba3d10de033660860860c192719316278315e5e02f0623201c0e4e252844b4b0b4c4ba944448985c5b2c080d1c15859f98a8aca0c9594141929282831504e4e5e4e6a355512c985341ab58c38aec46d1bcba66930b42c5bc9304c05bbae94cbb2502c4a4f68247dd40d63e2f91c338cd1ac8e6fbc5684b24711c6c41afe0669e6fb3026ca08e5a5d52ac7ce92703ae2c56a7f05e7ddfde00f51074ff227201b5776dfe5217718232321aafc6e50f9711082a8dfaffc75d55a8a381c08ad03f5620f7e65523ae721f75d7255f9debc3eaf5dcfaef9797d629f731e8bdc55041ab421e8beb0775d3759efcbd764d99beb14833130b3a1706194be8fd15f945a1dcf1afec9c1f4f191de649287498ac0856b5d93390f9a64e95131e4d8a6ea7573b04d8c3145f82285a974b2b8f0377ca0c585b7594e79af282db4b093f1d746c6ee4292342c215dd613575e58777592abb11eb91a79c829e15d49ad08bc2bafebc23e6c5b85a73a5245db481ee8e08b3b800b7d7400743552bcfd7e500c0a0a8a4195619f8910518d0fa21183f8d21aa1d71872949aeca48e4e4f438627d66466f90acb383d930f92e3656e5442fdfda0e4991b7f6376693f991b3dfb0b912061c345a27a278f27279d7786612f32df0869da8b4dd8f3227b8cea1b24464fe8308c6219645e20de1dbaf15f0c8a5f4078712cb237bf91ab01e22da11601538c7348c337be8328a9062a60b185f86fe31cc0d40f6e7cd4a27eb1a8e8e491adb8f1710f353b8459278f9a428cdaf8dcbfd8e4c6387412b9e88b55518c8f43414cf070e3590b467db168278ba22fb8433ee922f4eab9a73e7e1176b5dcc35e3c49e846cb5b4426ecc5785595ecc508a1979d7bb660d44785971d724ec757649671e2b16824488062917c945d558fb2b5f8860a55907b825a530f3ac494516bca0e55978702ac74451af4192fd9e74222669b8c68f01c3bcad5163be09d221e22c2384407269135a60318e8a0840e54a0c38e92a9850963248c81960e39d60d241dacb880a830c91cbeb8df763910d734073e60172699c3d01c985897c5c1771657d356ce010c73d8c22d3d5e64d020ccc7447706a19f6286215637725d11ee231c1c2e67341a59533d548db88e73fa34bf75b5bbeae8ba8ab4cf639123591e9db2327b61b55aa02eaa22d16c1e9620600a46a239e7cc768ed4e7e0a80516f5e429a72c1fcf9fc42b3612f549c55ad82792fd34add46167e9321c1c1c9c5207552c1d546db1e84e39ba7c3ad573a7cff5992936f6f0cc471c1c1c792b73effb189d2d11fee86d891ce94122423a5471a46ed4797d9af3f5263a4d541b8d46a339e7b72e479f66fc41fd66ee3c8ca7f0347fc994943953a630c92952ac498eea75d5da44d64f3a1e962d52643bf622da33a88a443d7f5db54e69798cac49dec26ebd0776eb272319ac2e879dbb8feca3cb77dc61dcc7e82ce70e83eb607cd4b1987498a6b87c472be73a530acbe8303a2e5eb1a232d2712207c5469cf9885365b0badc179c1d72a48776ee4346dfec10cec4c3fa03a0cab2438e9cd81ed9af0fd98e5d7688f66c2483d5e5b0fb187127d21fdd07f7cc12e173f146a04927159dca8e7d5a9fa5bb7550a5d52ec620a13b87ee7cbc6efd83443c8a705d2cead3bcd5cd5f3c771ecbb9f399ce9dd76eeefc8673e747ab3b1f89fa34a16afe8b44774ea20b89a8624a1313cd9ae994a9c77508354fe6c273f4b916bca04fd6615d1f2a54997af0aff3af9ba6c93a4774e40c55b002ce6aa592e9937572611228f0dc198b2c9cbbea935574adcb3454a8a2f1811754507524febb5410c6b23f9a2772f768d621ccd73c976fd4ae5426141499c4c75b3632614f8851f15fb451c8c6201814a3fca5bfac15a3e41ef057d0d0eda3a06a4c23e7e309530f4eb3f1a74f8d653662b671fad43eb6ec39d8d4433b66a3c27a68c7ec10ec5afcb9dd5e9faccc96fa643d070745530f38240ef5a9e10f66da0e55dafb356a5dcc821a2708f2e446c169c73eabd5d52284b14753c44344a2d5ea32b5a66b931dbc8d03a7195631885a1dbd8d73354eeff05c484415d486f28605969fbf3ad9976dc9f37c27c3db3d21c461fdbbaeeec94da5edc6429452ca4319a38c31c618678c52daefb7ed0de823ef77c30c4094061d4054a74ff41ffcc17a200dc4849a5c8a0da554fe6178b8f4081df1c2f8077db02f58fe5d584fcfa567e9607433ec615fe96eb0875da5a3c127ec291d143006a33ab454310c3b877dc3ae75b28b7acdeae2ddb0cb7aec61389d621c78c28e518861ff7ae7521e188369d7ec0c7b998dc7ac09cbb0e7e0783dbb989871af8b5b5d68652942b8784653f01512ef54c29e46bdd0a81f608c3ce503258231927ac12922467153222246594ba81796c56935acbdbf919844225d9b2466128f78c695e7a644da6138209bbbbd0fd3a9a9447e8a0974e579fa54530fcbe403c5b2b05a6e6b4dccd6c47d20dc337bf21ccd4f1f6b89ca36542790b5c40aa23957ba7c16901757fea33916101daaf5fd900696746a0ece8c2bf90ea666d0e8d08bd2f7cbf222d7a9dab8f20057c2a0bba25ddba82b72845e291b774dad2556900544bda04457eb68b0a7bdd4c9b0a79da5bb91d269c73a1df1c2e8b4cfa24ee58027edda2cd20e5b9b45571eb626afd255ed2ed849d750b81ad2c5b48fb46b959b82aff68fc8cfd5ba0f7e81088a6175e74fa01874f8f67ce26a1f1557b35f9fc43df685d47480a9ab4f6b80d30d7006451c2fb1861a646906cd3d5ca972150be8ca5b4b186501312ac6952752bfa71ce5289608ca53e6ecd95aa3c8b8b272f3dcc1cc89e27b97c6bc767ec64fd158d31a769a0a633f8c8d38ae4fc6958712ab1f55128934baf6a2c5d52d4e0af6acdba71c14ec511eeccd1cec715f3cb12dd310b4b862a216924073839c823e93db4125a7c3860c654e078d3b54d7e276f4cd01637410c0860edb5d07ca49733a18c6f077c49b235e9958391d74c7bc39e6959994d33177c89b435e1979713ae4ad3046723a7a076f9c0ebe329c0ebee774f0ad9c0e468244e24637646438987f53d1faf222713a6ee57658370789d3614366c4e9e8ce713a4e2a8c614e478431fc08a9152f1b54eeca64d706158b18123408a3f1766decb5f5d20b7bd2cab46d8b3142084f5def9cf1ddbd945e6062e9a52423e90eb428618a5a183ec94babdd931accd423a3cfac8d0ab3bceacbd2aceb4a4918f6aceb3caf4798c25a3af85996fd5a109004ea2be168408d69bf13ed7ec7c123d690ff0470e5611845ba7c0771f420228988e38906f08838a0883d220e0ec41af2fcc327f6630f3c11e5abfdf892ba11404f7ef42bcfc96ff29a7c05340f401a117020e200126bc8cb33932b6f41a11933983143860c64c888118318315e6e5e5e4c3030995c5ee0e2d2e282969652915289a5052c2c30580003c6ca0a5656ae54918748918640918538915f544908921cc4480a8293459b0c84260191c93f60d28b4bfac1927da0920f575ece47215bca2b3f0248d32d0248c3f25184a00f77c43b1f051079c85940ae0361d43c9117d610cfd9ddf33e3022f49885aa6999ac6b5ed39a4018d5f770ac1331603bba23e450bf8873713ae5f5497a5eb441c5eee71d6183aaddcfd37169c732ca997898fadba10a5e535b1fdc37ed9c35b58feda35b5373efb19db3438e74db1e1c5471074739666cc499a999fd18e79ad894cdec19c7a388764c9b59cfceba834dea758b042dea88b3b4fde0cf15711c00d69097cf200d8ea01937de993854fa79a961d7b22cc34cdc9c0c7b7d3bea4c89b540a36dc5ee54d8eb93cbd4031b328f5d96576d4d32bbb426c907c23dd965c699cca067497aab53d95418d55f0905af94b14666a1b43e2e22f397852a494dd49296a452d6dea98279ce2e68520a15a5c69037487f02e193fcec845cf70708601430465e03c27c059fe4b90bc21772dd1cdc00d690d8c65dc3a12818159700e194842c2f3b308950bea1ceb3666b6b7dcd9ab44dbbb6755a6fad75bb5c79bec206f5629c8eaf10aad669488fdd5039dea00b0c639e82b1199ee1199ee199ebaab554fae1d0119c9ae9992818ebe6673a15759807de5f2acd0ce132529b303405389485219c4e452020c601621c20c601621c20c6619c6e0c08ce04d25972832f74bcd0c1834e131d263a3f0c0324bca2029013809270e58180a4c06c148c73e34a8b618c71f38eebb2651c6ddbb88b4bd88b41f78b40df75611876c9330ea35a78a61c812f370a0063e46dc01af20c819a874ca7a04c43aeecc9ca5d44e82fcbb2a84ce9ca4fc853024293357436162af6c985a8d769a0accd7edab7b3fdc1df2c0d2e8cc073a31d2ee46208575c4df675b10deacb855dbc5a07af0ca3b6c75f56863d6e5ec6cb535ea1c20ba9a5e73e7bd17bd6c9f9f92667525a12955c57ada5d21f8fe0542909da5d2fc9c740787fa9140f71c1a00e4166c6ebaab554fa3d4f86882775bf483445e4db80480463e44a8b2b2f231f9889b7e4602829b952f2162bb84307225cf92f0a710fbc1b5cc913039e15f04441e8a0f2b04944a22bcf2fa89fca9533ec59d39cd3013cecc519e38c67216e47939b0661be290469fa8231f1af0e093e2de0766f9709ae6b6d5707c32722608c7c076bc84f4ec775db3293fac9f81400d298a0da8038f8f23290a653d7db6a8bc38e04a3fa967cb441ad37886cebed5998d596655d48bd3cd7013b6c713baedb36078ca983501da27035c830f6e8e3cb6ba8b6b21725123046fee21d3046be06d648b941e4fda08f24523fe8c3873e3222d7330cc32e2418659de5ca5bf2ec719d42525e61d05ae80601f5897f7c70727cba87a7577dc323776211eb4cce619c211cca37bc02e25511910fd115043424d4d3a718fff3e3d327e6f1c974b4adbb9e3e710ecf8e0ee3f429eef42976c7377dea2e07a74fcc2b1c5251253a89372ba1a1b842094a015289020a2aa4e8e953fc11f2e953bcb6b2751779602491c3f400a8e2d12766037cd7d5e9533ccb8c4cc4e953dc9129797d8a37ef2eae5c4ab5ad147d8a547477a60740954c43852aa88aa24f2f5b7750f4a93b1e32b6ee9298b17597a34fddcd745b77327deace2362ebee305b77a53e7557fbd4ddd5a7ee609fba936c00f8b64ff4299e462cc49b1c201738d0b9edc5855cd46009f7e546f87215f98475930f6bdeb27c734dfd0f7e81c8d487f723f2733f7a20dc73fbe56dbfc069a80ed8618f552a77f24783cd870a8326970da0a570f1829595e9dcbec6137b60d8eb5ff1a653f2fdfe8144bf4d8ba61cbabd84bd0e0282312d7bfad484bc5f03b54ada249516dd2edd1746f1339d407c31ca292117edc50d2e8a14c50b492182a4112471d08944750551722ade5c9fbc46909088218722c98218907031d4305fa436aaafc27c25538f38c4260bf136aa6d75a14a9b5c8f78d8a7eeaf742573cfcea4c434c16b73a7f4e11683560179d17f32da1ff2106ea1f6050486524a29a5944e3a299d72523a299d92d249e9941066418336aa941a4948858f87d6943b2a3cf4625348671f46196529b68516127a7e2ccab4fba4ec1ff6078c4fd0e265b961e7422e76a0c5fdf810973f800b93f0a107970f016906f0283ad52ac846aa765d9c13aca2ef5401608a0040003c88a271781a906600340238bc1190e674f81a10e51dbe00902600340038bc01204d1187474114cce169200d1187c70169ece18f8034dde11100513ffc8534330eaf8234320ebf004813e3f04840d4cbe1938034a6c32b01695c0ecf0048d372f82520aa74f826200dcbe179401a18877702d2ac1cfe01d007a449397c04200dcae19f80342787978005200de9f0178034a3c36300d270878782031d803431878fa253f4f05274ea868d7fb0e81af12faef8dfcba7f22d5cfed748a00ca0e384a52a804d220bafc6f948c8d4f8756bd88f9bc8d820f17e1c84ea0cd019814f30c2fac5ede02d7235a509dcb80d5b85c94754d97854d9b0379beac66fa4aa888dbfe05215e0b48baa8beb215537ec0b5a4052d938ab646e4401ba086dc8fce26a08406d5ce6465c328a00f6b3b9356ec46d7410da90b1903d236e713535ac64cf08cb9746d7840398e81a0063f831d18acbd7e20c2e7f8b30b87c2ebee0f247d105974faa2787b87c14435c7e8a8a202e7f0546202e9fa5d487cb6f7131ed017a31ec70f932660cb1d7c5e1f22d1c2e9f0818365c7e114cd670f901f0ce70f927332cb95a128c1ac0bf0ffe340191dcf9016412fadc243809de9480317cac63c01230864fa31b8000c870f9a7325cbed7c5e507000d970f8022d270f9306ab87c22da70f9d60d97dffd0d973fa3e3cb98c3e5c7a0c3e5bf985cf270f92d7ab8fcd21ef83056fe70f92a1010979f3288cb4721c417974923165c3ed78222f74647bc49649f19c63ae66dcb411c1405ab22d7001b29eda4d76673139082da5ca89a1dbcd3c2f44a0055441b495770a0411b3546ae0648ef0c4152bf98d33355367dec80f4ce95728b87b2ce4bcb407a47935dedae23d4ad87819c68d5b45227498dcfd157b528e579e65a04bd73257b4c597281915ca92218d65d4b18818b7ed4443848436315df200d3dbf2d0b1b0e9ab4c12878f58ddc5cd5975dd4be65617377733c9fc915d77461923504e242ae09798d507bf5892f79d444383ecfc3b68206214dd4505a625c58629aefe4c25883af5883ff5d1d332b234c8703b2408f2f658a900103c6f05570d09889f66be1186c5546596cb51573b48dec64bded060d321a3c1ab5e8da2a20053cdc38840b9144210c578b1bc72f2e9f5aef91119389478f932c8432a89aee7296b39c741f2cd61449f7c1c2624dd19a58ee03c65b580ee33e58def216964315f368f903a0aa741b55e93d5a5eb2438ec80f31c5168b72697bb4bcf4921db2f2167b72a84ab98d2a63ae66c4a388c9c5c5a5c5d63ef16bd05b5cac29dee550d5624dd1e53e5aee62891c2102a347cb5d3ee4488fd25b7cb8dc749325c272173ba4c50e29591e7de2b3f67e7cb4b91f04e22116ea539fb8d978608f8b7ac528271d0b35510fb1c73a435e5cbec6afa40ef6e9f27b50b7e7b04f9ff8d755f931a74a6b82e272803df6d13616e27c58933e9b148176eb63999490a7a772e8f26daef4e1c3cb39cc1d97b4b1d49348cfeac976ad6e33b5c6258809a96b996286d7f28b6322b33f2c8e0992fd91bdbe669d1d0d096202ee424cdf2cc772966f1c139afd6cb4cde6d6969bba2966dc1f2e8797eba698715d3eea7e6487b7e5a42e46c7d24520977332aecd54d6c23e07fb28618f1988bd79714d904e7ab5df975912d8dc6b1977ad8ba6d7631c1327f6cb2e8e094dfbf68dfbd67110d037e407e923ee5cd668a83cd4444885d9a7532c64324995672acf4e3432759fc92464ea7848c8646a2234f4d10866b6557e71355c1fc6996b42e599fd54ae15f11f521c3db31fc992c0e69a5eaf458ea4bd12ddd149d7e8563b9b221e7faafdb4e698d8ec97fdab1f7d542fb9264c4a906eb25f25c110f11cac71f5483da9db521260aa36888f78be0ff9182d91787922d11ed14e842fed112648dc0170c831c1fd87dc12a673f64776d32177f21c5c61662cb172cdfec8bef25a7a0eae00e898a783aa6cc8fdec8b78a95b62c657ec677367fca45be237d9cfe6fea4eeb3b9a3a7749fcded0eb99ace1ede224e045753844d555b8425a2632cece827dc8ed1a87bbc9d352df1cff82df7cc262c48c9e0aa7e767b39c8653be9bc8451401a11591683b29328c4de8ccf6b3366909ac846dfce0535b93049d092f9d2854982b6b8415904e1dc7a8d6e33ba6fc6392dfe9c724d64dfec372281cd255d724c6827bd76335eafd58e756674bcb3c96d46076f734a6ccf36cba433168ccaac09f8ea306a47ab51b318590c4e098e3bc97e9a8d4d88b4c8f958f5693600de2fde58d42e7d86faf1cd90154538415728c9f9612030ea8b4dee2c62015fc6cfec32b328dd8f1df0cab88c33e70454b1856c802f724c90ec0f521462227b763408dd4c89ec5bb59f8c936c541281d86bc2281916a5bb988fd199806fe92f9d09f8ae5cbbf9ae09862292fd48cf46af273d3be93fb26bf16735eab4acfbea33217cb7caaba2f8c5178cd2ac09f86a5b8ad4ea23b7a356fb834452c2de0ce2d5c9ebe317f31a0a57536daa66f2662412e933353bdfc4a21fb662663fe16ab258c4a8d1e7e317bc62d4f6792dbba641cef4da9920defaac03923dbba95ba26fbdd601d16e9a22defa78b3dfdab93cebf8bad80f40f63abe5a176f4b27cd504b8737fb49a9c472c8ed6061b1a6252e69e5f0c2380a5703c3a6ea0a8c15b8a272c8ed50514979bc29f68b17c5fe207d7b5442e298207d3b89abe16ab6934e6c2471352416f06d6ef6da7df2d693ba4f5ed257b89acf26012bbeb445201b80f4175c255f3fe294d0ec977dfbf61c4dea46cf54dc1d312d11aff678b5d7eefb2184ef76d255b89aeddca47e9e857848739166a8f5f0929ec2d5906caad65aad10de917d8aceac698978b7c7bb916ce4616f9eebe216d187bdf919bfe825759e6f3a156fe6cc99dfd9c9024369d608f62c270708cc527617f58b37773ede302afb7cb42201d92527c07af68b3efbc609a0cf2eb99a0c7235417a0cf1fa345f92e9d37c900740d5a7780054f17330fd37333fda2561753fd6e93ff8f34454b1d09d9741aac83d00aaa2e8d394b3e8346fca3a537679b6ac293b5f9a9ce0cbfb38df264615d226b61133884434d8f3e8c6dd31da0d00c6c863dd09d690bf3a1a7cf22a7dfc0553d799ebcdba6b5e36079b581e05f59b2975adccd8a57124a2330e7ccd66cbe72bbb58d6c19a9cfdcaba94135843deea54aa1d2abcbfdd9d5dccfc6ee62ce3ebbaac39bba0411b950461669641c927798d676ad79aa948153ec917c9ef53de9a99a1a635d6575bcdb28a68d3720635978c5812d2c0940d7892df6e705f5adbca0d22af0ca390604f4e9a5dd7f933dbb62cb3a64cd35aebacb1e6aecb7ebed02819c3ae8bb9d962a0cb059afc11ecc50ba1c2da400a2a18052f5b51a5204ac21e4183bde823aae66537d329938fa99ab6d4a724604c641ad466cb33a8a5122cc1124e874183309f2574775ca61e27261f99f6ec50757261169b13fb854decc234cc6297161630465a3b96111853431ac187fa583a8c8a90e6083045a900b3b8f21addb0cec222d2e0c214e3cc6400e674810c90b192202a1fae3a301eea373399f0491ebb2e1ea61730c7cc1515fb37c31a665958b027dbd4d68ea583f5c018397349d79babb9aeeb6e1f25c2e2fabc97ad94680676cad2a1bfb6994b26a85347f0895757be3b8fbd8f96948282fabae11bbee11bbee11eeee11eeee11eeee11bbece3d7de2faeae6e94da728514fa714004ff2de5f2ad54a7403c700d1e006da03e9407b28edb174666666662c9d194b6786ce745f5bccc01849d4a903600104a2780551b482281621824468a803d01bbc34583a64b0742c1d1dea437b668ad01e5a8471b8b3356ddb67f1a8e830cea59ba56361a1cd7ee2cac6de5c0dc6bd27864d8bd9edbd1db31d67a986754db76374a3472000d6c07ae816ecf55816866199a573e52d2ce4cad261549d015308803564401a0504001e007af2a5ae31c3d975594217125105d31844b020843417c76e86b463a1dae72ca601b6429937264a17656e5c38f10631593281b0c9c4d2c28282e504b6782c2d783e8bc7e261d475057b5a70eac2b94854a67cf48b3d6af9bae845ed95bf61f1c8dc20494e87cd1d754a57800ea5bbc127c98776a8f1fe72d4344dcb368d5ed336eeae2b50ae9c968dbbc92827d750b693b9847b9b5d1f7298a545cf75d9b4093485ae8aa98735c4e403060c95146e46b961d211eff58f16994dae7cd74d20ae4d801805691194a3d87f93c9952a41164ffd37bfc8fe4d2faeb4130f57da0ba74f3c1791c573e52fa2cb8bab885134e8a44fde72f2ecc2e9949f58d3c9c9eb85939d6427395a0469d75037d893afb3c9045ac2a9eb8a0b07e8c2b954be7219287ad09b1f1b30c53853401c7449ac8172fd3b004402535ae819fce0c5075bae96be58ec90a862698da5335daa6aa47e322dbf2e1c789237d9ef729171b12df6833e2e975502610c5d1271dc2474498aadd9bf0be7c2018d3b04982af52907109572f98b0730851271d0a84d3072e5b57ad58b85088cb35c5a7665178c0be7ca5f57145d388cea26767272786f9c1c71c99c7cbe9ec03839393c79734a9c7ce5867684cc8d99236462c81515978dbb1b2833a68dbb1b28323237504a3234220e1ba5021821c3a9a8a4a4a4a0dc609476699590f8a32b2e6f5cf4616fbb7d8d8b3cec69b79f715187bd2ce2b087ddc65633230208560cea552ebbd41adfd4af145f6a00108c897f0376d80bfa29f221ea19e2b942a90600814f60680016ecc57f90c9178a6efce7356005c17073a38f921fd93849c09c1be3d5a921579ffa2a6feb802cd88b2a5d188a6e0c03d10c7b477041a6d0ae591eec353993d292b9c32c23e3d55a3aa5fc1c2dcf603f223f4f5cfa9a533bed0b10eeb9a99fecb93d9006c2ebd35c902976c0bbf21df15af02ff249700f4ec13d10c158717be64a162a02122e11702eb4ba050c228b1d46494699acbf704184425c79b905a34c96d511efe8cac73054abb91acbb6758016dbb65d8b1bb49b0d52b3721df1d2af7453f01db25953ff5a5959f9e27e47e4b020bf542a75879999b7dea92136aa6afd62ee7357e1ca7f29da099487dc5b504aa9b6d2f56174d4b28ca8482d88b0e26da69e74172f379a3becc9c3e866163bb448bbb6eea015aaec8938228eb60cd46d218ca10c1471f01206bab2347a074b17a638e874a5fd0e504a432543090565db8eb2755fd478eb6fd778ebd76ccda9ebaab554da4a9bec913d3d95506946ef6350be9be3b8a8fbe7fddf67b05cf674aa7788f8f58f7b49c44184955a580b618ceca03eed744ade74f6f37efbbd34c37ea5cac245574db15f2d9dd8e67ae71e711be53028f21da4040bafc93ba83fd9d34160e8a02b5fe547372d7ba41644972979373757c61e54947fa56bed401aa63939574edd7e51ace9da4628b4089ee46d2d555b4b424d9a3061b264c93777a01225d7556ba9f4f78fe053ff3b02a51b353993d292a2a2a2a2a6455d4473668a7a74948eaf36eaea694ea7e84f9f8a3a35039e24cda13f39f42787fefce404e0aa51d4921629801671a1656ea95373a74ff2d7556ba9f47b25ae848262a78887187dc19e2cc118497f98dc9d4eb540ef8b7b51c2436d72e50f04724317ae3c12ef00b7513ad56eee58ab91a545f40a5a84f21c4cafa0dd0b03451c45c01a0128c395816267d80b1abab26da31c08f7a0344abc9fec996249c421bbf0852b9f2d913dec6dc19e944aaeec2ad46fb25cf9387766168caa979f3ca7c1a894ecf247943aa58287372931e9b61f0d25f72addaf74e34aefce9d597279cbfbd79b854ad31f0055266bea9b0e553efcf072d37dbcdcd472d389b8fce5c5f4188f6189b4dc64facb7b98fe12e3a697cbb80c3b44c65fe4163262bc74a63e54ddd499ba247d56acec29d17fb20746bfd42e16f6a9c546d1a7ebd49a56565eea3e28869e1bafd115ca1257cef2a900e77ef46dbda9fd6cbeb8837b2e85711830ba95f78a15417feba64255e9523a1518f66437e24c4a649f666d2e0ba4c12cf3c01813fd6523b52c205ae701cce083041d6e75e98dfc5ce863a4e7a23ad72916f731b2737fa18f1117dcfed4e9545b6c8b6d0785fd92ab919009049a972f8498cfa59812480353584f9fa20dea763fac075b52b9e77e1663733332ad53aec6b2a9ba3d3332b55b5c76eef9b538ee511dc1ce9c0eec59b4aec519f7c24c4af0e59be0039fcdbd3825b0437e665deb0debac671d3f763ce36abdc5dfebe29eebb22e97955dd4c6b91fe673b17f148b8b61580f7bd8bba73a60c774fdd2aeffc37a6ec4d1b44b9ba998107bb4097bf4da965cec518e41a5bf2e6da67ac11ec5e8f6d1b76b6f62fb0fedd746c41e3df7708f76ed418cd2e02634128227fa91fdb46e0bda80b625a46dc906c428ecf45b90262feefa7e37bb15a9f4df4674812e3ddd80aed3ebaab5712e1ceeb97413d2116fcabf4ce7d22c270806b00ea854ac36954d8f32a56600000000006314002028140e88c462d17044a64ae30714000e97be4c784a978741cc29848c21860880000000c000000401004854bb4d0eed4d045020b4def2f3dde28aba8d55ea31ccc71c2146854b38d8de0040a83953dc2aa0940598edfa612af61646e7f1b83167487cb992245b2240073144026a0c8052165d83a53d224a51608d04c233c5cee8f7982b69d748c239aba79a6572d8d8225d1d5dbfb57d9429822bd51ca459f0a4f08629e70f9de21a2b1c7282e96d92857db61d473de2a11104dbf2443236139a6944b2b409893b9b393930e9021bcd5d0264bd0eac01d0457c8a804bf1a873b897540e8bd3bd89c87a9cdaf7b71fa28908d283c856e36d1e0beea3208b0cc70bba4353e882ef0e83d73a6b17142399a442ac624955173b140a12f1c0e5d60b896060c9c1b13ff913f50eb7b2c7772e6542487b2b4882a3e46f9def8a4ad68be707ba730bf132ac7860eef1a7a21aeae8a632a76723b294512fdf4412496f8921f938c882d2f900307b71559e0e92a0868c125ba439e1ad722a65e877be94196f1205ae570573c25f1b991946b9b9b6486595f03d7645a27e5b7fe2c0b4fffe324f2f44d52e1c1325412ed431dc4af920ca9dc18e25175c4ed1ef097a76393a18e504c6f045f368fc91259050af2613af217fcd8d7b347a86257dc8dd9875b88cc7fdec57f01729e6df312ff96fee54fd838cf9cbfe8b78bbbd3c3d45c35c8df9753e957a25d671d001ebc9761f1bcef98657b04561651ae95ccc8c7bd84a1426b42334debf163964696b230cba1b53d0b192586fe32a0426c585ac9822e016babbc4011a6363b467c27b951951221f80df8839507d16b1005f400c363f2947a1624dd125ed6fc9b1edafedd26f1751031c0ab58110259013f358c14340e799856fa1398050232702679e154c1c1a8feb15174f514ea81a200bbe5ce40e16781bebdf8422b4745c2053c1c529fe5723e4a89e1afa1f7e13d3ac4e0252760d3c69fc51b0707a93670b55283c851c23a17fb1702f4ed3e6a54dc0d1362366e62ec8b956574717733fcf9823091a5598bf9a6a8419caf50924f78fac699a64fb59257a12d7225d13781600b2b90c699b3270875873920766e0a032a9a4dcb1b620b616280966d207a7ced2e03caf42aee66b4f966a087862bc5dec9b61ba40525ed31b716cf1d7cccdb5a64e9387f4733c2c092641ffaaa428e252a081e38a5e2ea4c7342d8ef234cc44ca69376ed376a1af75b6d90ed40ab8fe345709888d0b3b17f5b317d97037d18990fb162c7e84487373895708e6557347fd8158775dcf10aa547ec3514cc2f08cd93a530171cb0b8fe6862540ff298646e16028948e3da73e7b40e23167000f5ee0c85725f268c510161319a58f0b6d7d1b1a7da4449f5488981608564a619aae8d6b347e93a8d0f57f5c68e2298d561070b5ceb433a61d473e125d78d1f72cf843e1b9950e54243af5ff7157eb1bf040de286ee9f6e275e281461bf7e80bd340a9415e6ab7e0cb467b61036683e4f1279ed845defbd3068bad36933da17d5bbd4ea6c4761638396e3ab2056f1ec1627c302a77bc320c2503144140b0c375d753f6881e3f2818cfcecf54d9e245d706e01c18b2c029ed8be145e51e8731bd7113865300f81dfb018f4a56e64cbac6094159bafd2d53e2fbe139009dd9847bcc37f209e1b1fd47ade2110ac78f4976139914a27a66debb845b016e7ff178d7e455e401f84472db30bb7f1e664224f0e0a8db8bcf7c73d0fbd4d31d132beba7f9d1884c0ab0eb806de6aa3b783698bc7cf8033b04f92b504ac4d2ab4f3a51322e349dd1f58099791b443c9398af6d3772423adb86394e7f119225c281932294b4caf363afce87098325eddde21b8c5d01102cde2cc4bc4796700d4bd18960e78785837c42992dfbacad8bac3b0a75907d32e806b6349792ec7484e5957231d3431725078a6dc0cd93267fb6f0bb357ff4f4d847992b6394d082948096b70c7f2dcc08edd3cdcf65a304452d784956e13737d1bf00f64f4772085b4bffb4dde45686c59d1673940dd7e56a719d9b74ec8ba42fe041894b4c2b0eddd722de2d40d179381987d4e2c6d1dcbf9da129b41892650331169ddae32e5766a05b7fcc4c366c1cad9dd98a90c4cd6b45c602ca38b5ab1d67da30fb734d4010cbe215990eebe3346de2e17c4b9e48433e39867dd0b7cb922bb4875bf3d0a1583b945f3444af38df71b772d5d3f43b0b83584aeb591392711562552a5db7856c8194692a34bade5b9635f0e47614ddcebd97ab952ab13e2a2d3b5db490bafd134000df7622d8b23eb9d0a59931f4a5401a7615409c93657bcc77f1a1a3f68d6865cb2cefcf31e181e0f18cda867f136c72ebc185da2754c10a221a31da1265ae2ae64b21069e2bd1bfa2a220189c5417cbab8434e7f04940ff4e8b3561bb2f0f506b34c053b03003410973e7587ae0812833151c6731b4c1a728db7280a449133a062eb8704932b3d1842336c5ab6f7ff82184d5ee83912afa0d5960227c2897dc96fa9c7a65d03c6eb47b00393426298452295379d410cb679b51564f693565afefa214f4fdaabd51515f030937a0d02b8ac3857ff54e6a864c6b5dae7e0da80312f6a084d3ae6a1a3e85150e3baabad9fdfb398a50237ab2571f792d5c3d39ded840a0834839413cf9239b2fdf900b942c46bae11c03352206ad9d8088ce480db3797d9feba1f5d6c30c65f1355497c5889a814af42babf6cbd657c8ea7aecbd244d9c33dc954e643154353c80f2c0e8fd286b1a1168e14c72851e57e2e81a3e3ca3bbba0d0e2744dcdf40a02c72b05a80a4acf0bd49135bc166f46b3e8569f4d02b9f83e3d98374dbd38b4c765a07554a41d0fa05507a920e29cb531d651415700841da80ce861a761b4200c41ac855a0d691f332991996305851db9ce440cfbfbb3f8a5c97d4f472c60fca453891cc86bacbe14ae5170a8aa48069bb7913eb862ef01b73cc6241afa10d46466d625b6939dbf03db396e6dfd02d567b6f94f7c8ba2288f0639b442f70f84656e69d424dffb829fc333300d700546ba6260b8a58c1836ff105304ecd2fcfe5eff5f1c8a4c7787a52fcdcfe56aa3f26ee0e6c557952a695d27419addb1b0ed1ca3c46df518e80a354caf48503bd6daeb76571c22c236610aedc7f51bd820df82a4057363b2af32f3012354b7f6f85e9811add87adbfb819b3ad31a6d9249dc639d3e408e32e40f1aa61a7ed2210d713826cf2f3cd7bdafed9fa1e01b355b9e9920ebf774d67698a6529e66cb2505588b67d836ee75ebf9b912b5e987ee9e1cfe86930d260b214c5e6c91cec6d3badb06ff1f1ae8242109a24ef39295d31ae926cd0ec2d5508d8000e413ed15ac414780a4a0a495c7b4078837de56d40d20d89c46a227749a669cf235f921e5431acc58a54125577ecd2cbfa22d2bb6fdbdd00471e062b918a032fa3d206a1084949bc94534b3520dee71b80d61ace021a3447df8b5a2853e126b78347e0d9d6e922fee21b14e19e92bd9b34a4fc0060e9df691d5b642796768ab6b622d0988e3fbe4caf426ce2c2c40a8fd5823a5e86ef59bce889b4621f612100f50aef02596237fd2cef7170622b4c732f6f041607d52c982c651c3d23268aef3b15b36355189f500263180fe30893f0f1501cae22ead8a21cef5d862840e9a013b8a744e960461e8a5f0de4017e804f1da620fdb76aeba2cf3bed7eb2dffe5bf545ee183f2b767fb0667e77262eb31112fe724f2ebd56c38bc129b88dcd46d884384f38562bdc10a4114c5a3868c1db2c17cdc55742e017a5b221470c258277fece1a39fd7b6aeffd66b4ce6aae7740db6ddaca1437e71a30daf64628dd51ea02b6fef67ea354c46b6728379571fcd2111827a914ac34eb8b4b545bef38d23ba7ad691100e9bef59f9a9689bb6f61f62c6715c1fc25fe26d83536c25652c1abcaa9b0706ad8bbf67d01c0bc268a258b4752b757905dedfd99add1e259ea24805410d589324e178247d892145cd440a7ca920d077d72f2fc212c6ed6357d1713c3eb9c00cf9529ce758c125a1a63e6c5e9dd9600829bbb3eeabf601020383da26bd30b1c387e1749102a550df6b1f5ecd13d1e60b4615991ed21d5906ab8c9d9e4bcd4f09cd6500422262d3ba63b4959592b82b49345041024608414cfd69540b3d32541ef62419243742d59e81d6fc68d64cb9e308a9feac664fdeff8be57beaf7ebebe719ac480cf40a0de10fc0522760bb7d9a6875e13f1e5dea3a468516ef986afd057acd64d2310d7d0430525f520a518252d768f75e25b008384f30939c8f9e11eaa02392f8c20aeb0ea4a68022330327a06f5ec39a886d94719ef9a36243b11822c88d7291fb1412b4ba194856f998c5270607ab425ca831ae315eb799b3f536fdc2630c2b739d823e4b3f9816e4f4a0d06ae8fac033198687fd322c27890f07f936925161d737941b3335ba1867f8d69bc59bd35712ede220e5136ebfed27c74e8e5a3d305150b58f0ab6d7afc38ed580bca4e975436b19332be83f2ae60e9b551813a64e554014c1adb5da89848df0ef7b6c2d835b818087ef7c5c0e13f2e8cdfa4cb88a5286ec7d2dc8548056088cee544290fd16aeb1de1531a6752ea7f7d388bbb5bbc7a57c9ae907afd3ca8561b2569553c69147a4abab1f1769235ed9394961d103929c11ef74a0ea0744e20e5aa31d2a3b562abb332d7020d313495cad9fa43e04eeb4da1e5bd5284b9d7e84af59cd066a0d44643bbbc50c19fc0cab6604f6af4be84d14f52b69f3cae4a02da3fd657c737cf5d2251a4d5a1bc4f3ddc52f8948f4da4b5a14faded2337181cb9a7b05c01e36f27cee3ca298e3f6ed5ce296d30dfdc84449dbec17fd4e143602756348472bc2b5bc3f054d1221ac40263ebd22fbb101669d4ff2a1295dd9c86f79c1efbf0a25bc384276bb669dbcacdc9ff0bea7f5c3fe5e45876f5069c5e6775d2bb66e1ffd7d7269a57736a077d31f61cf7b32afe756edb3558f5412417216cfe4bd15ade73ee69fc3861f393c5506e8fdfbbabd87f0be2a047c8357e6e727e718d48861250d23aa675d012894dfa25fccccc5d493f28095489da82d078ca07ea0c42acfb23117287b205759a1d4ae08992b9af90bb587c8bbd8b0dc719233073596621db559dac2cd8074c3cb5a079f8074220aca6fc1baff2c61ed4b029da567a08c4cd37ddfcc6176cfcd12883ee27ab6fc0c0926f665f7f290fd7ca04e67e9cb6c0e003ba759c096eae3ea53105e0edc15db7e8ec2ba328a13214ab0b05ebee9398e821802bb5dac11bfc93826443f5f7830ac3fed7642c89271212e7b57ba0a9ecc287d78d36114e6aa717531b2b5245db11d85015dcbfc9f0f78e0e38cec19501bff0d0085a6471e84b1aa8bb67983384f797777ecb04897c888819205727e9dd16df988acc48e1dedba88575cca9f81fae3b736a6fe504e73f8a6c482a275787696165755d39928be73cbade1284c0e4b42350b7ce091132d3f79f3afc322e7fac1dd172f828fd5c83ae8f79f2e1e4670423fcad6ce013cc0ad6a92c643928b66df51cac319ccc82f863e5a6d421afe52a530ea079a00792c6a49fecf70c67ccac8f49e593243e20844a48d7a51987683dc5afea4204da4a904b7aea48fe29af2b97ca62ebcd4cd41ef0a5ea34b8f4248fc09c135c6902d64469db96802c3de818457c302f7e3379b18e17fd1ee29e99ab72f52754f3ddb38ad54bdaa0f2044500da91cad355dda8a8b98aacce3c1b3797223053b188a10084275ed35e85b6e6f3d4b5dbf5c70109c42098ab9d09999fa5854038ba14a9eea190b2fa433573bad43d5215c132d22da55e7dfbdaec038d73a2730d9a2394a627b30340acba16a27fcb27fb5a46d3625c71424d74eeb2a5aa0b782291f4e7a545ae4dc1302a7649a7b61be5a9890c2af4efc2dd6f16ddd1a5e65ad345368449967ea37aa4680683b5ff736f895520371573589a93a8e0bc13cb158e9d2c05506929c3d877a20a5c34049ac360bc5ad1979b560ca10749b6455051012cf516dd1aced7c8fad554b8772bf6182397e93170e97792f467004f4eae68589118d954364273205ca1fdeb61b6c0420e9e41bbcb3fd6cd91d895d170703c7d05b1fb919a7b29ec4f6b901a4b859ce5aeec023ea3619ccdd19a6706f420c6790b33a7e30d68bf9ad6c96510c50c0bcd1427231e92e1ebb3a2ea314ec2715b93e482f5ba59d0b4cc38c16cbee8563df94afc7bb860d88cb3ca10793ce179d120633612fd3c6e895986131e76a658a30106698055002f45b8ebd3c5a038dc9dccf61ce3009d2401f9675b0bf94164184254a6c66fd5c195147409a15b7fdb6822464400a77869959c0d88027c9def93bfc3f3790eb7da0e97420390a365a561e29e9f0a8c5800a4b8c89c6f9b298d58a9fb670a59bd71d213a7c424e6a04f6c1a297685c4cb9a4975ecfac6413f5d5ed002dd2beb5beb7efe2a168fbd4fd092150d74250905e580ac9ccf47524a3692c63e0c3aa961434728314290c55d79e099754bbef322c9753f7d9d98c1f6ce6f1eaf28e67b9b691319d79e41669b97fa41d6bf2a65d4316aca906a1fbcb0e4c5cb96a9337221fc0b7f1ff550bc7428060a4d64a52c217460ee820a27e9fc4f0f3ce0b5ce474c44c8978165a71f688c71fae9442e364763e87f8b6f6c1fff07ff8f8e3140b2375b4ce7334a3cb225a43ee4bbe0556f26755fbf28b89e6a8b28c95dd6b3baa4bf0ea50e870d7abb44a68965311c5b025e4e3ef1ceaaf898dc64d04fd50cbe18f0affdb1a697b0c70ac3e4a920aefd7724d6de8bc55973450ca21fb1c5c764d82528417c66bb1252882a683df7269f50569314a7a80188d5a5d40e449b8d9424d42f24604fbe110d412f29e4818fb93093915c92844540a83f9239b3af8da0b5faaf8bbce6b4fd7f58fbd53545d119f43149fe6aed698d383496b53cb6afe7971fa6f75862e6874539ba37ca9bb82f54738205c37745b59f7c06408964d3fea0c9894a4b36a3767b73693186e0ec71174fcea41f66992fef833c1c4c887168ba39d249602728d9e130c2dd16d5c300e7e1e06d2ff962464cc92680955c297616cc9aedc0f20b9ad8cc884a78f53d15ac4fe7f43e04125c1467d9f44c1bf4cc8e140d9f303ba2ea53d1f84a2c711d3e516972a40edaa0b533f2044d80998a2f3fd189792c9e62c1258e39db9b72794038a5402a01d75290962f44cd9e8b129df99ca0148950d18a2656d4b0e4b0a8aadcfb11b02cb66701c5679f7906d8a6399dd0abda1d3c8c71b1b9da4dfb45de7e4ba7470aca68fc479d25b14633189b3f43e0d205d58c383d028a8e6a22d74aaf42d5bd593bd23c3e98226c60e1eeebd5b9cb5629c67abbe97ebeaa283f312b148b99a7b42d801ce03e132641fe5013f71678858dde0f261e5dc11692e5231725a341e635188d1001a0bfdc1755b95ce8a0683a944b98ad39b8626db445d532f17768f0426bf27bbaaf6daf6006c302040b30d0baebc3ba312635f3e7e27b77cd7fc2a51f4c117ef35bd3b183743d234ba39c20cab86cafa91136aca573e96fec1c7cc77b8ec660067e0490537085f9120dcbed1c4b4b752295dbfc09cac034ef036d379be6ca90594028ccb40da024c1cdf047c263ea1dc78f5f7302243cb2f8a7176d6e107f00105e13a589b2f7d945957dcc34c559f564bf72d6c6e65c2c924a6c70174471059db98d5af88c8254448fdaf42438b625bd03eed05878b1d46209ecbeb0c634a9e44b07c2927894f9a778188f5dd7ba8028e15d2b8a49280d4c5308124fc18a9694cce96681d226cc6ff83dbd9dc50cf7613de3a3687b35be86af2aa72cb5786eecef0d3820b04194875d2f87c41e8f376c898d92db3cd6bc351e48bdf9b552d7e54a600d9615a6b72b828327255053fb5e26f435efdd73f06be3cba2751d6e0c6273ca5bb91864ec6f47123bdcb35e13ab483fbc2541b612bec88de63bd7713c1ebd040a78b033bb0f35c27c9ffea2cb1c57693eae40f30b10136acda4926cbfca2b5c968a31a963251b3517d23928da597405239d7e3111dade9b32fa0a3d8d1ee2d1706a05bd91516f714bf82f9c6ec43f97c58b1b969b850f53647763d0f72bbfa81e2a2d33e175c856e743f61f7067be0b8692cce40ef5fa8f1244dd4952023650f4e0014094e60d65f1dfd81a5a1855598782a9f422691bc1737a25223eb597c09fadd25389bb8a1d7b3feb5916553f6b8c7e8460fec7affcf13e1f8b6074e2be5548e8638a35aa0ee480c2205a13fb4aef7645d434c300e2f440d8fbf73568fd0d8d24179dc24092233cd5a1e9b6b9b411d3f01cf29036b2b0972099d4eb7735f471bcac751d1e27c3484e80a7ed32183ca9b1f1c2952f8ac9d5c6778582eb81e6ea01f79d2c1f2feb9cfc204270e244fb2f5ac80c281cd6a25595e4636036006201525762dbff016805159bbfa9b58389d3898a072815b7004a812c64cb187541a219c8cd40772bd2cc0445cf963c38f38449e54d39870ad07f406cad715f7f306df3860986d4de3e367d5b05f65ed296174978194b448f2408b4dcccb14ac0a0442772889dc192e828116ea57dd453a76a4c165a60feafb09d44258b049a848d5bea2c60cd86a19509ea320ce1c6ce51418b89bd4c736c131e5877f37079ba36bab10ef4915019216f519f4f0b40d372a4c4def77a58f485694942ee1659b45d2e4bbd41e010e1d66d4508cd20f907080b8883473e8f69b724d3a4a4d055a754c2a7a366bc310829a98ce163d021d0a63f9667294bce78a8418e53bbbe226aad324b9b880a4deb9bfd036ceeb6405304fc4091e43d24d1bcc757621bc7f3d69d7ba5b370794657cea7da400a8ca5b18820f104f226ed3778d8d04130502b4db4b1b9fa8a27715070a9e2b94b629e25d4958689881ba304412c0449ef4f4ec93b3bb5b4aff1c3856feeb11c5505ed6e745e848c8293abc38fa498882049fa25cedc7f9a2dd943c2fe634f078a9517c8976d70ad7cb72c1ea1c40b1e3e924e6af0822af6006f80514ace07347c4b7b88821a50c89c8fd9f31c066e44a203148b858ec2f4a7273ae5e4426aedc7f5a5544259cffdc55c4a580b16a14c0cf99dd2fb50d778f253a5a6440624296bf281e1e30691c68a97f57cc7031cdecf6dbf3d7187bf537b1a1d0b2f75193b77908be1a857f5746522dedecf229462abac512fcc9694a6567922e84a44fa34cd805847b16ca3234738054dfaa22d9212aafee26a92263318c7a4487483650e75eda2b317f73b3f3fe362e43782e762fdc8729a2d54fd851670eb105557dd2031fe59a68edec5c1636811e53ebd5734ccf145c7fd88a487631ffc0061e52128eb0421a89141d9031902bd9a348ab9ac41b7ae2f3468cce282473c179387f232161350078deb4f6a277211eec18cb4215e1ae0ec1a9c08d5f3a3aa93c2d5b083cd564bc16d795dd235a336f7b0fac2ffd9a4e6a30d72c4bce6c72e2938ab83f1fdf881ee1456368b963019ba6dfca5e0a508431b26ef1db1363e6e49cc21d5ad1d07a7715805b8c4fab58c5e7b63b7d0e261a7215d9053d9be80b7e6c8725cfe1c647812224bfa58c4550005f536fcf580e9125042ab1e97e01ceb7f2952956b627c9a59806be9d6b9bffc1313aabc3d0e3510982f069a816f8ff417ceefe29e9034ba4408c4d72d0deb4eba44108dfbde48579bf13f952dffd1662dfc8bbc7dcb039bef04d7e5c5bf68b6c73e60bb3869b4d2751aefe40fc4530e034d1b5724f1f1bfc94ef5ce56c1a0dccf39ed64a5075c5369f029d10b6051364d9d96344d833b130a1a47382616a1514d5850c423045553187053bea2036e90d9b5cf3ac4e63a72d3aa2cf4a636fae039f131e2e5ee08341734c500ab96b00d18b71bf8f644369c2ea1d29d24174277ce5adfd0f0fd7a960e90b346f11fd61665e65ad6169ea97811299ace7bb2fd782fb7afa747b4b4d4d22dfbd7dc520951852c5f9c5ca452a0710510e9b64aa4b9dbd28c7c12cf359a3d70bf2065d1f51f1ff33d9e65c34eece1db55b944bdb90a953d9e37f1f1caac5f4ba3ec16f4fd5e4f1ae712bc17336943269e2e7178d5ec73306d8bd92f406d5826ade5f347d9dfc70a947d25c6948287274ea0b8e13ad7d2284e350c0dda11da894728c7ba841c06078304960a1765ae79fec26f96e5b11df1527843a220e10f00fc35b79b01eff5b54b614f18f683fcb5a46d77dc85ab855665c6f59943ad87c288081da96aa67a6229d1ace2e864d5f9b0cec701a10dc7f2ffe34bce55e2ccb78f1d658e0748c9610a5b2606a64bc59669c7ee1c048b3e65419a6dd54a5db572082bdd2e2ff09e13324802ffdb471dc644e18d250d9b627f02d61c46ecab3f90e3ea26a51177f792f38b0866222e3324caf827c13b769f25aafd7011bc1bdd78baa6b0a65dd9c7315f5e6afa111a2e68a659968f3e91f64faa5fc6182dec5a4523c2fe48593563238654dafdc04fb3dbd76320d3315f25e13b840f64877eabdc1fa9c73a6160b6614b922dd74050ed5b0292f5b8dac87332157324dff02c6b7ea0df129c2cc67a73c8d891275938b4ca6a7dcb70e951d6d3ed9ecaf737f188dbcf9b8580c7008b677e6eddcdf87163175a3afcb36b764c026eb5849394e98f2b4b453129e5238a293f52de06be8910016e071e57556225003f4b793a70aaf94605d6ab20c95890fffabe957dc24f82fb95cd3283596dd8ef81f79da68b56f283cb8ec54c41d2f18e460d5324f6f58d101c8e9a1dec0b1d614e97b461e661480b07b14663e10a63de828ad3976326b4389d1199eeb5b62b46ce769810b23646db6a538b1462c87d13c0e4abe49461e47177771e54f9fc1a53a156b86c2df848c331b4607df34133f4f9a156b56bf187875ab7bfc1887d9aa08a708a04debbe1cfe0167d1412a12b3808bc72c5e1f8c707f4e37dc2516135535a51b0213e799877219e64d3bcc23ca940839e153b1131ff65798551d580c73a5a87d843863c4de27ef20232f9bdd7ff88a9c484c0bea46365cb26fa52863c517d1dc6641abeef0842b8fef47116b6ff12a1b657a5af5c18c8656b75d3b97934f3b410e6f6401e37ab145df3bbe7a4d8cdff98278a43534c47795a7a7941e2faded564c9fd355a9e22baa42fb7a583f564d31436313047647667f75135146cf95721596df9b218c925c9df9294d2fa0e24b0a2291300cd5e845d02c11dd4cc0f083c39509ca12414bab97fdd81935903e5c556b87deaf761cc3395657e5893c58f05122660401afe7102fe244688a1e162b80899b8f341e517cede214cc28b6991c8a0212b2423dc273cc37857843868cc3319df85815940a3236590667c31db2aa7c1893fe7aa0b03435a0af01851bd99f44d0a895f482f1fbda7e2676cfb53daf6099a6e75f0077fdcd2e4dd533843383f191194685a72d4d0582ebf830293096410ae375eadb52b97b179424c72a5f5e638b9ac89e7932f9b91c50ebfda7c3531a7b6519258a0a78e743454527bc6b51ce32ad1bfac8cc2e3382865019069d02153a511b03f1eb8172c64f03fe80b164421016e80f10b6b95c450ddd1a0c9ef317546f089c281ace91482d5a6c36375660fb32c613cb849e7d7220570c2d3a993a3b02e6c0135f3de122468490e106ecd04f150e3b0780e701a1288464cfd32d5c0a50835807f5c10209d60aa534334d217273c05c216dc4a2eec2c640443aeb2618af5b506cedece00b8d9f053a014bcf9b95018e70027c000aab045e000cc30530031c0009b4081e5efff214ce0635b04abde321e2bedd0bf8d62d18775e4388fb5b1adc74a71c57fab58c473117bce63d10dfbb5521cfad96e16f1b006bef75834d678af1587f8377a5abf72b76e3d6b1ee9c4a8e63277c5b317d5e5782e31130c56a49679d6c466f508d49fa5aa6b29a71fc4be4ec6fcf33a69ce2b50c68765dca19ca635b2c67413889a831bd3aa2369de24d978c0be806291fd3a9d9710501a35cfaeab96f27a10b8ad228dae01df147ab38bd10191ebd456b2706ccadd30d1c12e949591e0cd639c8dbed413fd54eb3336de6bbc19557b90d31340afbe476e3ee0f382583051c0365853827846e4c53fc6e04d7c44dbd646606283436056128fae141b1ba7c2d560d6d217a1abca0fcd4daba7eeed46aacf94eebc0cdfb3bb6f5d148b12e2e4896b705a43c507336b45a099c2adaf16b655e63b605f5b6d78c84155a2f023bd35da353a491bbdfc3e0ea9556a37c88278627aecd1c21300c2a65b4cbfcbb74e21c66667a2bd3116b894d335bcce8ca19b4e65e08418782bbeb723ab6975fadbc14b5afa5852489906f0a1ca0eff6b5cd728a4a68d6bc449463e3d372b6278cc723492af26bf2c76fd1155b226f16e47b3466d557d43a5cae78c044ed901373b5568fba8da42a15785171d3f3af493f209abbf008ef21c50e502290340885447cf1ca918ca2819fa229697685815719d7ceccb14fa89384a59f065ad4de9fab27cc475766d6c2ce1d6372b1769250e4ddf1a43c900043c588edc04d6c1f207b04f43d110b8510bcd5f3f7ed3c4a513748b2e32407a68e1885c00d8915c458cfb566939022cbd6bd2fb149882f7a0256093a2691ef3d5d3881acd3e3508c48503f10ea3bc5a2d740309d76d90ae9d7dd3c499c5cc8bf87b5d4892be45d3210f4ed930c6406167e6b1b818e6a467b15eac078dfbc224b337748231cc1e868c407308c84cd23af6c35b086d4fc897041b4b676be37920dfa5c157429534f1923408a755d638e20adcbfd453cde8dd782674e831770528b43a202f1a82e26c1091ab762c950ddb0fae1169985c80b8d5382c09927039457ce971300e7abf06b9c0e7228577fc89f7a0ca5cea9bf6f18e0970ca3acdd1b441320479d93bb59fd15f42b2eb9a383223867cd1efd0a929951e5f24cedeb4a7be2922db36c9b5d3b17ddc90a177a09d5aceee3b6f773f7dc26d6f0412a6e538b7e92df8ebcbfa97b12eb3d0c459460ee885e455142920e70ad3ca5992685a4ce4126181fed20dd63d78151f0894d42d9b333d84168cdc458f2f87f7701293cd656e31c6d508821cd6fa475c3d6c583034a5d452a9757b84ff76066836d6811f12a11bf71880afaf5aa90278a05043c729575a8878ef6edbe580097fd1876a17a56b35afad08fcb6b5bf4a2c9ded041bcc426206c9da68b6e3f59a719977c0d78de973df424a8f52264c296aab053203c2784ab49d91ca3800ea7e5d03019edf4ba6a8c6c8515873fb28fb7f3ce6e621f2b984a4bf34c4eeb094bea76d133f8c5c59b086feb5d580fcbe67eb3052a7bcd935d9a1d31837ee2fb1e16b9f43ff249e07a9dffd156229c243e19b4e0f98077ac0bf52836142338690b92babad8a3bc610687a6ab04c115264686292f423f927d356f30a4874b1349109db5dc58a621027c86034bdc656b1fd1c45454b846ee19b7da55caa1ea6efe07d55e3cc09e3c8dafe2b35cd862fe98869fcdc954fd9529606d86881bb66175b0aec4a67951cfd192357c7c5d1f5d73eacd373547ce060b1f1dee27960d74cc80433407fc3fdf9518327117f8c85716aa9257d806c6edead6f4183a3c1306b8165fc86318c156adec423278cd3839a5dd29a781b83f5f66b48ddeb617dfad8dac0d4746ea16684a9012601f66294c09318d969b2de2218086d9b4f8cd957959c1a09918e6851b2a22e8060d7fbca4bb198c902546c8bc716dee5015b70e837269bd05f98c1c6c8797f645c83b0af02a8135d4742ab976f3f8c2d8c8b478d4ae87e17caf48c1f93d0cc56f0632827c402d7977f23ac0154275e31ed5bc8a26434d546ebe571d1d783f83824bec0bb19dbd7db178236990ae6ca012d4ee85fe9247a948ec0f24b874c7c59c4ff3eb1ed2d26fb35ca153167aa06d773fc36a20e3d1f768047645ee79eb5a922f04482883a1c55bcede99f80cd2271c4cc0e570f03da96ba067d8a9c7226d903e877c741067139ef042737ee9b238b91a12989aa2f1b61045785fa68aeb52a7f587234b18d7b36d6cc23dc2c88548e4b6f25da72fe848528449a7bab7d4321684352011b102fc68d595c0bfdcaf9ba6b4026135f0413770192da53f5270f6b1bc3bde9b9fdb2f8cb1232b7a2caa958bc05cd7306223f993e5fd2d44025940b42a3a6d30878f175d2308ae92f6d95f66947a4513ed3599befb7886f238e89ca525525d8f81e2bf05cf830318f1eff21ed208a6114576cce557984f23c0a937958e35f13b30d9c41b4f4ec3b6e087255eb64e7d2f4d9f095bc9fc9c8a0c414a88fdd6b2ec6f3da4cfecf254ea6ced7289def94cc205eea811828f09c99c9e90671dbec8101ec6721420c2c24b9cdfe3c50ca226f6caed12512dc10ee9eb89229d402dd2f290b5deddf76057ba5b343d7d361abad22140a6cb0ba40d092d1bcd082fd60ef6c6dd53f1d4a9f75d54df41ee7cc43bcbb7729d595963bb5a42a3426f1d55bf22463eb05c747722e76c6ccd946dad4f42617521f3e475198db18a0bd769a3b70e4c00f0ff5cd8f9d0629b5adb8fb350fd326285bdc0a27e69fce656ea00b32884e37965fbcf331b3fa3e2dd448948f4c27e74737aaeab966e94386771ff1b387f2f0278ff8c9a3dbe048406e7b86b7a49d680f4c3644c2c351b594673df8119efdba6fcc4b59ebac083e0b99a38b67a8ce754b2be680d20748cd9bf9f7eaa5c8b1f40b1a43f3f56d1461e4711dc139e2a6e792f3c6d203cf6c8be60191de62fc29e0e161a28e59b3df5bfb578a76a55383385d67b4201a406138fcdfef88474ca75a85d779f1987feb2f491814a13f9c4fc0c26075cd53201c174d9efed3ed6ec3c6a87f922973d18a812a9c0552dedb4b8d7b0fff297909441f8aab404bd4ca0761f197afcd41828cb093782bd1edd64162283f4af1b7369b40ed2202de054c82d1cb964c1487855c3b58da9dd5a36123e2407f7ddf1d47e188e04ef43833d56f39faa71d7a0211f53e2fea63c4439fc7b087613cb5f20a9584a41ff2d9bcaa93eaa618dce81cd55f6c8d17b58c0b07d7d0dd77471309c283f39d3e0f4fe2a08321399f701fbcec78f71cf3d190652c7820ab753bb27c0996e68dacaeb7da9d9434f0c2c3792d203cafb3a4c7454cc307bcedd1c801e0dad78ca2870ea26f798f1e984b587db3baf4d0b0677abe46f050c47c7a0ec87ebfab7fcb08ccd793f4797d289cfc08a4326abaeb7bef9551ae0f0b1cefcb12882febff217f5fe77eece29d6983e224e94d5ae21c2f763f1c4be630c4dad3130c409e2d1cc7c00526818ccb65bab98403e30152a2bb51e1dc9f5d0899e3568253ecac434904671a9b1fd67a76cf6d72c1e7e350d0b1e89371a85b6a8bdb63061a50d0b01545488e87cda421e1215ee31c0ebf47120d9a3cb55d0b3dfd3e928f5d3f28e77bda2f07c66dc8c84abed825bfcc5183b9f363d1313437968e6d4dcc8b2dd0d3788bd1eca7ce031ea4ad6fd39aa743e18ae76d3359496a1467aa7b72610980c7b1de188c7824ac4e44d1eb12256b7d18a39666e602e8e99d057c544550255c79126eeb9347aaf780c003766bb7e9d774ac4d86d9265e9717ddffa3d39947c226454eb079d5c294f3866d831b28e7c5709a8156619821eb36116a1b1bafda52e397682db90ddb81dd34268d6740b4e3c91a3d722f361a67b3308dc9ce55128321fe42cd4a2e141d5a1901725ab790073d8275f92d1eefdebab53b9b1e21cf60d23472276f86cf45818aca8c98307c447a2a6d9db67ef2093f3113734461e5b1d3955b9e4f7162fcac3a34c8457591d058592b19396c6df0d13313098f6466499b6bae6692648c7eda07dc27f01d5edc33933fd85017763dad902103e95dfdf252f5bb784ba223e2c2d9d60a9b647f330e2119b343909b54746ec562bdb66bc19405baff59e4e62131f3eff56230c711c1d049e580a12c52f2e15ffb0d3e4e11fb4d060416081bea0f86b1f1714b0b05ce62546ed7296ec0b0fa2f4d5d41cf71715d1c8aec8074788d1531d49574820a4298b95dd09bf2bc0cf61463c8c52ed42702c580a6f5742b700114371ceef22ea31bb93a27213f32a4d8d4301477d191c3e227477fe593c63058c18cbe8b350bf0aed6c578fe2f7da51ef9eac9b205131f680ad1c2dcb7a37dfe60616d143a3e1bb83ad7c2351a9b122dfc412bb2daebc886b20a781c865d8a9538cccfad3a78a00109470b5734c3cb4157377fb7531d16bbbf78ee93249648daf254934adc653dc07cd4ed1e596a40d2ed32ad7c4372468049912a6ef5555612c2e0ee4795db4a08295f29857e0115cf450222ac64a13b4e9105f7056771d41ebf74c7dbfb1e8a2b942b4b55074c79a4bc987df08442c1b0dc30a4f9dc4d5f3f5ecadbce5b251aeddcd7827645161726d590eca9478b655d327b297470102d945990f6f9e18bd3d82120ba066c7d5aa0a94d28ffa5616489c327a808fbe15a8ca10c566f2c153b351f6a41202eb2420f358f8abc3a4646d0f7f2c5ed0f62ab342fd5c9751417593ea1cb4785d0184a783e481a2177c46916205cd488fc6f98dec92032fc7e0f8822dfe0c08e1f47074d9a0753d0689f40d16db8c275ec76e1f4be8f3ed4432a6e04c03a4db8d9cd88de5f473253c0d3b6fabd5d4b0845da03fa2f61b221d13dc93b302fa1a88a4bb9f393fc81c0e36258eaf181c8ca0d4284c9237ce63a8ae3bb675ae4524ba20103d37e03c2252980d8b21e0ab0236f2f8fcec16bf5e59fab1398113699853cb72697236c6104361ba2d2982b2b0d1549767b6c5c5499dbcd5958a3324fd68851f7d99194490159c8225adfe963830d595df8b11292700f2049014445e301242c5038aa331a07cc4d22b2ef3da3cbfc8eaeece049b07d1b6b82c296bd049871f403720ac0946498c8a4a3575b95ca44f864138efd2946f5d2cc605be924e3aabe8840487a49a7ceab0b8e31adc2420562832e5b7e24e4bae80cc0eebd9d94c0516124343d75a2a6f87947152c95c7a338f70847339be184082fe912c32918baaeea8d899e59041d3f36b66cd626c01994fc5f7ebf8a62ea655d8788395e939abf199f3006b832a9fe8d9107c88803a691e597f8a51ea8d9111ea79c6983f9eb368f9a16b27e91a81f7f39d6bac3de346f83f9c631483b7bb2c8b9573069ed9065396ac84bd055789480239a3513623958687b7333211e8364746b1347eadf310f0aa0765d912995984f6df0781ff4228544eb3b1b490a51fbb40812001d4e9b5242b58320163502f2f6e7e383d6611d6ff38d75049db6c7892f47d1ed8e5ea293d87d20fc6137b8e2eabbbf7a768011a321f487c1472b5c26561c689c79653e2c70ec67897f0e02e0e0aecf6d28f7568aaa514691ac2eeee723e07d6a6ad0c7ade801e33f7a24aa656c46d2c921315d9155fbe901ab38771016b50c69748b20f9d3d9f298c603bb16981fafa01ae1e7184107e5e1b168d8a3fb174bd95f0cab048088835218e3d10697c6d77d79a50c41ccc025ef0154c158c3dea2001e020d0bb8aace414941e5702219604aa41cb528a7d0e444e44525df3268927b9c4b4598831027bdd985ff79772a0b55c4950fa144732725cc8c38b8aedd47f89432f896442d51586e0a63ca47f49dc6571762b28299c8232f22c1def95bdc01b02378f4fdfb9919d1041f16938a8ce45b9d699b82475e3e71d4305117d9d96b42fa6177f0d9cc983c82f504625ce7a50889bde9a1ad552813a355518bceeae0539c690d1a6eb10186292ac314c405c38d153f6f2cf92b294711df508b8eb1cc968cc8b90aca92a472d94391429613b615a67cd76b680ae5feb7093c73ca4c381e607af58b07a5acf12b06024fd3e5546a99ac1c9f854ca7afe1d89ee22845dce76d4009ddeaf7dd9adb2f494810c99c130efde4986b28e1e9fa81a4b2071820fc65077efc4d9e171f29fa70fdadd9e8c576b7479f0254f97e54c21fc3d87f59c6ff41a8552d5bddfb31d02a5ed01f1fa372ec01a3a8521470bb417f503a68a8cd10640c521f0382c19343017a5057ad7bd09966a2bc1d6e06a9a91bdd56fca097aaa9eb6fe868383c356c5c36c0c11d87e10fcc3bca83feeb0db5297444dbcf6553a4c3ded04dbfa118068faeaa31a1c07491fbc7b72b4ab3fd3a50c6fa8493b5c92e2f9ab64aa42b46c700d77b38b5e71d147121b6bb4f11644596a169a7082eb523a141b5531120d09dacc919488045da7f1fe80741b7a7bf60d52042718e32702fb178b1823800730364849fcfb097a52c91716f8ff823b58f44ac550ed12167f3018bba42659029fbd4cd3a023b4a05cf2fb523e80003962377fe9553a093641cfaaafb6a53d086d1b69c348f54fbaa37b8eb8511222268ef1800e070a2be020329ba7237a015d7693155136048e38772b15a04425672ee941bb48d1c42e93df1aba4ed93bd56f46dcf57d97b73be4dfccafdf750251e55901767779b62d8a9c1733678d06a1f4fcb37c53b69e604fa52fcca54fc95b0312ca6557e05a1391086bf4cb37d4b744d5214d6162ffd0aeb27d4b541f4eb98cdcc9aa8258af12f65a7046a27c870e4bfc230d09060239682bda72da0d7c3112b97356a0fcb1e99bdaf634d031f96d0ee70b078bb6fbd0a9b046a2eddae80d1d90444e297055baa5508d7509eccef675871063ab85dab36f3f635ef05a6a3e63586911a8d4f7149a35809b9e766abfa603c4b68bbd76050bfc97403b1355c64e80ef9a3fe5a5ce9a3fc8fde8e4c326cd5eed3d258be9cfba8c80dd07620041a4ea307cf956bd7f70d2ec980c3be40c452444f77788f2369d322108149a879cb1f450f629543e6e22524af3ceeb978be3b1bcaa9a1120553b5ec32560b83e864f811b84c75d200a22a857c9f4e9d0b89d5688b57dfad377f9dba4518a2ef103d40a3906ea34dd3c0166a105791ef06e33550abd2c144f59d8ddd1ea0c8a5fab447883bc545a83ac639ececf98d8ffb7094d8250629f9346ec5660bcd82e6f752d42f89715845d2f860116ec0000dab4469ce7c77199068b11cd76839b01ddfdfbd7a5ecd049665f05407418d67bfc62084121d473820cc5fbfdb8204091d19e70b38b75ec835540832c5d6af68b089320bb8462d8b9c5230e0d8115e9ce7345e36572ff0f390366f97ebd8647503d978166e826b50dbf35b8943de5bd82d77011bbfe0dcc949739dee2111287d4ccc7c85b2ed7395f4173a0235f63748204980845c0cb2f1a9407cfabcb792aebea3586f89021dd9bd9696bc9f9be2d44e1408109cfb5fb3cb39c13a819e22de5e7030f9aa0792d136d312a8bc9886f3e093e73895cbbe2678135a02950dc28cffa0a21ea1830e9bed2402eb2481398d16bb9770fb8626085681d985cff29307765723be0cd9eb075fa15733e1e59bcc6eee8cb9efd2ee34dc188d2f964e273c5825475fdb0c50700d749bf4095dea9a8dab978ac4003ba0186435b70e781331a43415532a4404b3bcb42d3e596326745cdba93bd503e7971eac803ba3f36de68d94501134ff8b5b25c026f4a37d06e809d1fad8dd011106fc76ea8d4f1003f4db520ad1b579a4284bee30c933a12810164e44c650688c4c1a4330faa0bb7f38b08f182370b7f3744eb8adc8e44e8ec61c9e0507451681f59d8ad5a4f8148ea8d57b74d3fafe1ea6eab9f47f75fdf8bd66ec4d7b5d2d301243cccf74e48979e34aff601f63cab9aed277133cffb56432b809a00e117de90dd1d17760125d883189d13c26e01083bd9b669ec5170fa10f79d70de61ec1c92f2c36ba0fe00b2656b840448180cdd01a50206be36c341b68fc44561564a54db0d79b1b14048c8bb346a818f176d3f99edd7538070be431a1fb55ab771449acf45870f644113bcb5a72460d42d3c84f4549d464321c5248017237ff73707b6d0e6297a1346f6af9aa8b9eb268105b26c59b6ccf4c1eb21962c5d813494e120d9da5fce7ee9e3b725ef8f492063e33cdeebc9e83860172e33ce15e0d51704d782d251805da5389dc8336527b386b077fe41137ee157225067ef4f36078959a66679c68d048e98086c0f9724546a1c66b86d8b11a096c246081b50200938d881042cfd57b2b03e75ecf5143d38d2822c1ad456dac104d0359336451b395b9f612d59bd0939d4db024b21ba936532d3639a75955297ebb5186a9fb196440e9d040510e3aa15beffe2367d223c0f48b7bc6f9376af7553bff4eeefbf962f5890dd79d2251a3fd2548cc8de874ff753e50ae6f3b0878054b4fd59c68b4e522a901d56a2c87fcaa5aaf1615ca83a242084650b751f81422234a6ff422a411a8731421804cc50ffd488d544c7285862f1af686ea3d1bbe4b39396e11266e7ac7a8d144d45e2bf26162c0700abd0e349ca93fb9659405590cbcebe0e327d219194c99e20bc4afb51173ec1801ea739e491f28f0be86c45d8ef3a32a27c074add57ca3e40bc6cca358ede60096d9c79c031a606a98f14d1c4602a1e6e4cc20ffbccf126646520957988b7f31308d5dba7a3d646cbabf38360e4a45dd2663a7f1619416330c9ae3f3e117e9501093adf30d74a2e0a96bf4248ebcd7060bfae6605f336d357411b8d3dc49b62f96b97d332798d182b8af781fd1653e2a2f19c8171a5acbe89bc009a19454f51ae3cfb67b1f80883f8fa4fcfd166afe91ff522f1c3a9289924f87642496fb01eeed29a19148e0e830d9323bd240236b7ec83c31cc7fd2f565b1c718cc3c92d3a9a0d4b173dd1da42fb673abc5271e8d57be9be82334b331b3dcb8ead26673dc26d84ec79427798e494e0789d58b3e7401e331cc27acf3c497589149b751df3d1fb6fa8306b874b431ce55b4946a815b95f892418c42e71cc329c5db264feab763b020edfad7261d64aa8a472db5039284b61f45d8ef3a9168c83423ecb21ffa875489fee384e989a09da80b2d0608379d7d4a813b0ea98cd5649a76e4197ebcfe56b55f9a38d8785598e1dfe639bcd057ee0f5b502a61e6d6523fdccf8904c5fb0bcc842164b6d2700e2eb57bc19f0c303be5d981848da850f0e0644c554e6653fc37a73d098e0741db847b15a50ce23646a7abacfd69f46de2a47f10e0afa971ce362c4f3b48f8865dc746866b8625d65ad03d26b24edace740f77e301d60ce59e67c0cd0cf00054c7e366ff1876a0ba062c6040cca5ff46f5bf8ce88ae227d16567b97a2003d6e07ffb1476f57092d6182fea6438b717eac72b04bd409380d5589183c6a80d2df33421043d0caf1dc3567303243934cfd7a403631c414736d6520ca8daea6f4ac210202cafb55e0e7acba888fa22820aaa35187d8b9ee74bf04f4b0857e591aee35f6c2c8dc537b2fbc847786cf406c063b7f53d3985210f80e36315526dd3f805a609d48c3584fe9313e9a6cd6854bde825e02b592d251f7796f34332e1f851faaff09fca03e77e9e48ec8d87939acd09d05b06c62627fa201d9b82e5e22433efb9480d65b64ab3e15f90bc7fc9f9066e20e0bbb8e5846d7ae6042d7e044f736ecc95e908a6b3b09ffd9d86f34bff2fcb5d7a1db8c9807fd01f7ad00b3790f035fa5b54396e4876c4a9ddc3e7a8011861ff9b6847fdca9551e927f551f462dbf946505671a69b05976c46e8474d57787042273644cbdf7497ccda00eeba67e2deaaad116859c5ad3368eef77ea32f2cca018b31ddc67819346d5b9612b4740370a794220e3f03138c638760b891ceb4ca24c07c91708827ffbfd015fa9121e0400b776ab87d17ba5e813d0a8cc588083188308102eea5eab4d6830d77373d25861e98eb45a97964b296957ed65cae96d46d1961866f4ea4bbbf89cec517d97b0ea6df3e92a4d3a9e62ff0d782d70a22dd281dd4d6747ab6207d159166f1e14c0db69f12dce71c92e71a68b09cac49b926a807ac93d1fb2706931c4f66e13cb3d5683a3ffee31ca5a2cc6529d97d3f259521aa688a0000b4d57c004556a3858d0305bd0493658ac182bc9aaead57f3b0db4d7d0f4e977935a726d8db6248571f016b624ca957a6d6d7d7599fed6262fa4fcd3893c0f5d7bf35e60c420af2f528ae9b613993c0f7ad2aee0c51e4859078659f8f70559c3080c1993a8a6702d92148637285cf04757a5f92df56861bebfc6eea04338c9fa20f4babd6e1f1521ff8f2ad41de24a502fef11ae009a664e1ac2a993ff7a6f1362e4df10ea002bf5e3f6587c7ac236890f3d0525d40ccd123c9d25dfd8b47783fa7cc9e86434f6b022144e1a3d3154d0ce01bf0ad6521dde0899c77bed01619bb6dd6422f344903e91a020f58f8223b76c0d8e9668411a239f80919be6c6fbd5784a39ae37074ce7a4a85f7d8c87953068732f908584e6f9b1f78f5bc8d70273b75545570c2c21991165dbc30e4b8ade3bb742c9e288ae365dceb47b101d5db40195bfbfd7106f4e0d67ef7eb9203752d9b898b55bc60e9b4d23c6535332678ebe940bf78922bb49cf4ffcd0bb0e6af823c869b81931fe322ad2697ba260aedd3009dd4ce1af8b8d14640b7e7f3e465100422fc54042b0e1f7c3e63c27f304f3f1c9360f064b69f8f9b30423546301343b54eaf32cf6dd19938cc2e0beab4563e8e8b392790b47d0d9ba42bc2456aae57bcb549325d62874140f0f43737d7645e3465ba20e8ed99dd10a3ba3fce6ee6c11c0b6a9466535919288eb2350d6f7c9dc3ca3549f23413af486194ca39215cffd15e4ca1bf319c3bba054b40ee7e30aa690d8df86e87c30c4cf23872fd7f701cc0724cd754bf847074d41c1c3f033ce6f6b258d85f59d49060a5ce47de7d69a92a57574b49cdcd2ac76c35665645f863f20c9a6c259dd264c3c5206a95bacfd02285c959622794975d6022632cd130f4ed8ddc6d666e11636f5c4dbfe55e7acf2c96c01808ef5771f2eaba984d939cecf6384756138e88f81692358db489930150ff44f6b3c0d7061e8eec6b25814713dc7750448a0bfafe23b4bbaabeccec68955d87d13576e838df7a4c7768040ff243da2c387c132ae5f8a97b86eecbbb26658df632b37bafd4af737a4e6fb68c8b7da8aa4428acf5df65edb11a303646f4502f7184328921fe5a1c5e87544dfa4a49ad18a38d16c2098272ab4667a7f911c76b82d3a12e7fb9a08b028b2538867b18a887072378315739370914bced78eb7cf951d30fea1e1f6404720f77fb5e277d4551f9003695ef1c534f0dceb36a60cb3cf95a377cf0ac9c64bc15ef65d9875a65407b346cb6bec92c6f6f7bee164eaca9921b3e1c6c55414e5fb75a05a246db6f86551f2bf21da99ae5248fed03575bfec666df2d8aeb564177de55b6765ed1fdfdc43c65b9c0c49941149ee4fd36f310f758afbc1f1da0bf774962d23e5bcd8564d91a234605b3353b50d18d7163db8009d7ac32b1d8358d8c9fba428e2e1fe6e5e2cc5694b3735274d2381b4ab479987dd3673e820a57caebf30ea3584915fdc0136b1be5ccac1a69edd2b0cfc7de0b800957b22332ee1309de707cf12fab3d0da5072c885dbd94b46b25449738c7b39c16d2e9655eb4c6004d142f65410650e875a8f618b6aa6296771837a545f5f27e2ce9c630a1b0c757f966a56ac5ac4b32b89905ee2c3fecfa5809f723ca324f1c35858db32f3aa05a8784ccaae3852f823260b1056b52066e9fb44e67c08db56ba3aac337d021844a8594bcd499b0fa76d696a9c3074e7bc8684ea33015e0342735ea7cd0295bc97f7e3c3787207f64134cc176dee7ce8fa057425a2f93f0dae1dcd5cc725d4929d0040154564b1088b0d417e10024396336caced27f3e25c7c7d73f71cb9fa5629269642912955761e3472b5aaf71867aab4c73fcbcbbd81061e9da6842392a06ce3d79b0bb6eddf011f35d0e16bb2124f020324a25fdb6b23e26c3ed41e201ed16687cbabecdf430f0fc04e355c72578ba524866e2c753b7bbc5b164e0333c299744ed00549666056202a08acc21996032084ab1fa92e330db62a2475a89dc98bc8568a7a237ea39e79ef5f6a36398e845c44472be75a0ce50f549cb5a8f03604c951b2399bc44933911d9e7d2af694661e1e3baa46a33518bd3f6ace3f0f58393b23b2f605261e3cb1dea696dbea8d3da98d210797b7ac1800710f2246439e770d2e54ffd4523e3ebe96bc22f41799ad0a60ec8fa19bfe907c88cae6045acc47cfccf41722b4a3062790eb92cb25c3682a4bebc6f28e0db1a211ceb6bacfd43554937cab801932725a920413662a73e1d4439d519fad8ca6327c340df864e155ce863a14c76e4c59bcb9a1d6837dd0859e5bf09260194c269e6b4a67cca52d19aa9b0a18e90b6bc8d16699a60bd9ca78c5a4a48ad438c8ed626c77bbd2c2b3d2ddfadd1485b335c181b366669d6484202f59e1335579256b8338a14469f389f59eba5536d296e5475a302f1c6eec2e900d884a7c20075a0e32eac8501963ba61078ab6cc23190e8516c72369e5b718e1f708e50365606f473613ed3aef30614c99868c7590cea9840e3526eaa68dab55d7122e2c6e8d520546af70bef169afab41c39fe1495a13770c3a8472b700c4d0e520a7556e4604f857519cfd5fead4b4d212895d5c823ceca04bb2db871e0cf00ccf918876cbd47c0e8ef29b7906af6590a6ace051d7c57b0d093c236eb3b9b5ecda425793b0fe08209a5801a52702107f87b3136faa7d9e1619270fa4322dfad5537cdc06de095c080f78371ab07a51bdd2298fc346376011639cc76d616fa8f701aa6d795a7f310acafec464e9ae354d715bc9b6343a950c9c81532643c3d9810ae208173d552f7d85fd85bf936e6580b863c2357d87c49e20bcb46c3bb7147be6f94e56b0e8d3d62f107207d45169542e0d2c4b08bb79e40aa015a18f9018265500be6ccbec5a136b0cd24a6408a3caa695c3ecdefe6d8525a6c11025ff0eb5ac8455921264df8293bdba0136e2f021780679db209fd3f199a83593d2a7caf03f73a674b8c56a7aee064d1bcb511c93965fd8cd83e42d872228629421e926fb928eb651e16979688e56913a1ec6dd50452d9de1d9c1c4a64dc1749a8105aaa3a449673b8d0a6ffc1764e99bfaf43aaab4412e6b809e6d198fd159f0a7a1491ea142f72d70d61c6e03ec752d42c8ad3c5b49921d884c02d7f9e5650ed423a0f3b9a5ef95d25201d8bd21041257d9454bfe41ec13538d03a09f9894a3717c31a980f93cfdbfc2f88c44a36e442ed8e2f1ba75dc6766a2230a2f554042da42a11bd2cb1fa0b56d14aaab33352a0ba928501610c46f5a444b70d482605646c7d083218c73f586ac601f731e4ab146ec925d50c85f7fb41c970d66b56ec8fbf19a29d4a917b3495d9228035a20507b3e17a30689a6a122eae06d0b2322dc2c958df6d2ce3d947d0e131056bc39d9b5bee487f983467c1870d3cb9372b206547911ce80f326b8e63d1c5198f7b05503b7387df5fc24730864dbe9694c2467bc50dacce5f3f50a9477a5b7139c1bdbb559b157d408ec87933935962dee3300400281d1432106425d5a732b36612807a8a62f1592852413878ea4e9b92dbaa57e8ab3518d50880fc881301a26d38ab99df0028f045fef061e32820bee6da63b8a056a1f3bd6b4699726bb84108d8fe29b4b5e7c133a90c8d3a4faba3792dd839a2df652141bfa6f91a27d7c5cf375646a549e219c0f5a9213535a1f7f1692b95e247e02d353ee9f30c8e6023ff8a07745ad0cc00cd95d87d869bb1eb864dd89f5229779c963efcbd294a94ad38383ddd7ae7f12cea2307e1c5435fc336b42c1cf18255afea39cc28813bec7c8c67d58c2c446e20d51b1cb93264f224522eee1b29e2bc76cfd2878e0c71a8661045473187d9c6c4b534186e7faaec319d881358668a56170050e5b8f290ff7c876e8f6ad8eeeb777d04b2377db861cf929b1f15fea7ebc31b99418d57428b24dbaab8f64427fb9cee2b7134e00b331c5a37c08ba10232618c24f2e6271133df37c83aad5d62d5ed7607174eabbbc6617fc75d57f4c25f975a2d30937b4d101ad97d7d67bab0448b2d56317c4c27b6fcbe2e8d3039615c284606e918454d7d8dc656111ad990c4b3115cd46d2c08957810d6edeacb4159444ac3155108cfb440ee8917a0d91991f24149470c41d885d65c971bf45ffd1916cadd6fbdfed31975ced19b59bdeb883ea3b298ca10736c1eacc2a0832e556994a2344a05a578c121049316ee2e94fab166b40829add6458c4f084a53185d9647db66b1d938dee99ad2cff5405a674eab33d25c3062e7165e71613f44b2340f6255e28be6116728759a46d14576529b0968d486db934bc0ffaff4fecf5533cef5c44c8f87c035f64e3f0223cbbe3f4411d9999990aa13e86c880605913efde333ac5ffa0ac02b9bebce6df9975e6bdeb9fcc67b21ac671c2a5cc80fd0112641b1a0bfa3a4851fbe1008e6ecae229f291ffade6bbf023a20e6e2cfdbefcc37465da55d67706465e7f084ef0a83e9079b8020c011a7c10872b0a33018318c5710061be4d108c238e23418410e7614062386f10ac260833c1a4118479c0623c8c18ec260c4305e41186c90472308e388930fdf71a93e60e40c64212239af33e7c6059629f97f5030a702f045c36c9b42413499cfe86e2b7635b36d09999b5203611006bbc6ff8a434755d248182f3161865f99c4c63268fc3bb52f2bf0a7d9b543332ffd7df0d812cfd093de27ea73a2bdca42c76164732e9217458093f785784b4b052bae20d20a4b7c24edf16fee29fca3105c128b13aab2f76d2484eddc661441124e23e0859ef1f9dde0cc01d0734e1508472da60227fb424a6ff1c936d21629449e7866999a9ea9b3d7b1409b87ce4bb187200d144742967bbf719c387e975954cd7ebd6a917cd72ee4d2f9a4b04c0337b9b49f0d17d7dc0ec98c3b57169e4426b708aaa2f3eb3213fa7afcb21a151f6f0ad16dd3feba2c53ff334c326b55e726a47a314034b85e7b9b6633bfdc5cb06ebf774095a66df464ce0c500c9799d0df538bf7d70dd8e283c8a6ab5ae02d0acac54aaeecd53d56cadfa5d41a3af351da92e075eca8e84cfc6cc6953b1d34bdcdd7bb87f3ba81499bbbbc78ec5510c59c6f14826ebf86ca1178706553b41decd15676210942ff564e8bf818ba8d0372472f8a534f7087baa32e3c93ad6c65a4ac5edfc7ffa503b48d72d5f6b57a064217df2e7ebb40003424bc9a50b21540ca39e741ae858eb9fa06de03932ebc91c1bdc8af52e2bb709aca329e1c1ff178188cdbae2a7b29fc1eb68b8b3cd81cecc06dd3e2276c54f480d98d981a81b474250f0b9d259d058b036831fa4fd7475be3f6698411eae9d306c8927189872040a1b8bfe3abe85605f31b88d2c9255b48f04c197f8eaa48cb4545ac7ffcd59f5e91f934aac4e01e32d43e6d29f88906d3a022327a0d9c0759db19cdf9a1bdacf956101c69eca2af36d592fc47247bb15c46a8f76d14cf1145bba32e5b481cc0fc469a9968006a01706c7cc0d84ab4e4e2612afaadb0a22eaf04e3c3c3624930ad60662fd657d335738f5f2d4fa38b9a5868131b85419a6d12fb967219c7d1da843a73d23c343af546d0fdd9df3783ba95c42fdc012130f9be7190ecc39eac47387091e9c97a248b18a69ec9d739363a40fa75ec7eb6b8fcb70e3116d32f9c6259bd25b436c1f3173ddfc418b9865cfd0781055081e004c30b7a6d6ec50db913eec234e10c7ebaa62826428901d6a457770e0c91ef97b677b3af66b95b8de345d1795cef267f0068cc36f753921c84775c70101371867c7c65a4bdadbfc1b28d367073c09defc2b86f26ffb06e17436573c560ed968b820302550aaaf3f963e700c3f0d61442236d8afd33b85a82c85357f2b20580b550994e672936eb004151f6976676a2b45425d3b08e9184e5256685d0f056e01adfd963b2ef348753079b103ea070f5d1a871d67d02eabcca83409f226653c4d8c76b876a99a81c8e28b633211f2e0dd1427b109d62daa88845966461cf11455f0c33bf0277db6fafb77b4fcddf45617720e35c68123c33028ee4bd4e16dde313ff4e421e7ccd1ab910a78d2434db62a9868c321f2d3c16ed80859361a64d3f2db89b452f5d8a31742cc9f28a4055183fb43cba718a1d58e12327d8a90e656f3f494f0c9ee80b74e135f6b07d5fc325d6b7b2b0a478632d1191b7030139cac913136c1c3177db3fdadb690a8119c5c6572c4e46d72ab7b824ee064e01729face9074a2b2bb1eaaf67d76a1cfe85d5a799cd3825ad15d35ddb3c5722c264821e3f3a0d661c45c99f2b8f129b204e91694d3a7609d373c6b42e288c56f934b08572a87b456ef77cc49ba7e66233def61d408b6b3265dd22bd1f59ba73740ded9abc43f412fe0d974916cd63da7f76b109e1fe799dc2116b4b961c23f669ff4b1b4c2d30f76799c7780119c68024876da11411f4bac731b2c89e034d462626704ceb50f3d0669fc715db476aab1e48c8901cb773773733d8e9a58b79931b39e616302b8c60d29d60834ae7db355509a52a001cf1172380faa85ddf8f285158dfadd19dc2472d3e5f249d18e2b4a7d1024974eea7d888d632e156b72760ed57c77769d0709512c99ee5106cc1beefac9617033509fe2d8ab5eefc557b79bf9b5e7a13bfe87f60f3955d68c7b9e08a711b267b61bdf3f8fbe0ba3b66df77f40af76e7dd0870127fa6d5dd28db9188726fbcb176c561a8d71c42d80e5f22e8f88ccf35281ada7596646a5f87713df30881d04b90a05b6c3197bfdf754411c7870506834d612ee6354ffbaad20bfd66aa9375365a5e844ba7209b8a04f36245bd679572720d8cb44d86fc0cc99aa7c886638606448c3b5e8a040e9e9bb0e6a9683847e4363de687d02046b4d1487f0225a4feea7661c998956e2427ff386eeb6f041f48a6ca017a8c65fba41968dd4494aae26d0cbef417d09fead0f2b76c9507e4bc1172edbeb1e0dfd43f75f58e223ac9aced229f83cff8722ec1f86d5474f19e41cad23d0005e705b601ed7e23bdb5a2a72fe985cd7e705fb8600f9f8b4db38958e3e4555ad2f57e8f411e2f383def5835f95ffb2844452527bcc44668858f12091d4096e9821b67f7136bd7cd190dc0650d5a317cc11706dcf7fb80cba3c86c398fb628183ce05d632a50b94aec1ad5b170860677cba566ef6d66f7b3e0385814cecfb64312a4b8cd1b966d0c338879521a6eb3ae78ab034dbf54ab1fc32779755e47d9a59925bc868676c5b6a18f0f6c7fad10312c64b3c60629f04ffc1a97595324ee9cf51a53aa6b5b3cdc104ffb051d72f919857921753027600eee91cb0a01bf0f2106a58e86a02d8001f204e172203ec32eab3c3cf8baee1132d671ad79e79c25db9342790a502541ac4c6e3f4dd846be7ffc5cc3b1b5cfafe02332feae1a4b7e5583f10ccc4eb523065170883f8d67795df5ccf3a1502f689f683f88a1385e0697c0e56e0880d78243d0b4910ea674a3610c01747a373101fafb07672854b1124b544622a22ef5a6b3a8a00836417e50fd40413adf309f9764222a6dd2c295d68769dec585f1fd0723cad855f9b985df1bd50c860d648e3d34d3b25fdf1b236b7dc06ac83f832707064c5840389409bbdc92bdb706b8616646b75651b8f6db09963f8e407e509e8719e87d528e9dc70aaf3af82fc6f2817b0e98b75894f2670f833fc749af6a67256614f7d09765b2c7cca9523c0f74312363683ee97263ed6cccaf7d87700657cc15dfe13af8bb91d887d58c072300e7fc7e043ecc517aedc72956c1edaa20d7e7ee6b30cfe11adc9bb7da84c0eaf17cb6f11d3c6cf17b1b49ca4edea019c9b72bba4c38040a6634202e5364cd0863efdc878aa0819d2c255a1bf2b3ab76f97e5e636918c175afd6d8c4de5a83f363d62c4f38d121c1bb1b54c4bd578d3117ba9d231cbe309cac1cdbe085baa98ecfee6cc7b97a3bfa552bed7c254036d041ef57844462037241a09fff3bc3d472b163b7f0475623c23b6749ab75ca1fd7932856fcb01ae9c4b8867be90634d7ab33985fa3ba02ec32d859acd2589bb684f41fd7376353212f61eed3fbc11e89af665da875f6c680677586d2f3ca6816aa39338b3d34442111857ec244e20eb3dcecaec93a2dd404eaf327b7158ea6dcf22fd9831587a8b00cc00f921db8425195a8af1055252498751be8f385da14ebda20e6c1033d634c847ca283932795642a6bfe77cfb510079673b4a6d11b22f0216428223d45ecca73c3767765c2bdb5751272b85a47ef8995d2013c89b5228c2d15cd65986cd59d0133e679bc387eb25a28f4309186ce68bba480db727a75235c5d5cec1276c1ed78c83dff1b1099e3d012e0c72924952fc1859a45b4249cdaadbb8ab81d7ded1ec14ee4f262984f1bd808c4a7d22ac835875fa31e38d1778330849d389fd0ff6ab3f05d554e95feac64710c8582593024bc8bd1671859d780e8c13b12f9667ebbda3ba1df709887cf8fe1a52c0d37ccd85100299dd42d54dd7420ad8d26f1d3c359203324873daa1098f99aa6a45ca82fef6fa8e92043fc9cebbcde474ff492cfe48fd3d8de5222a720d8da64015a00988918cd1c11262d208d89172e68757881e2b7dd924ddc039b491b0a92508f80099a61113f7cc6c21d818c7148ddbb21cb696a3c83702644b6e366d87b7ddaf1c29986c1898176039565ba5a3282f04550b2aa0861f5a112d62bd7db9a04fb5a36c2c7b03e05f669ddaf4d7e96ddb8abc6fa56f23aefc62f39cbd7416a6ba0e35f29eda83cf8e42ed5e4315f4d714cf1621975b91af4a62087c0891f940a162e90b4344cf55573bc9b972dc9d625078209d343947d6f3f94d0f8a8ed6633524009f85ff64ad390f66a3a36a8981dfc94dc8e68e52a631e33f12a5a4e01faf454dca52e35721ffe84701baa1b81e5bb24718d795b2eb8953710d761e1b800164a17ba11956a170e388b4eb6eaffcb21eb704d318c7d04982136141dabed702cf33a14f1365198fe11021671db075d83c6966d719a1ae26402f3ce33530ed4793b2d61e1436f09e090e98d19d97b0b6cffbc3176a8820235cd260f520ebc003d7db1c9463fddaf92100f5dcb13383d9211d555e22095f843aa54bf33de356359104c52e01865845dd0fd91fcd0a5869202309c93ea0cdf19b364cd188218f10ef254e48425d4b2c2acfae25d4ed379fb24fc2d824a37831b4130750945b4067a2e3b4d8e0b5792622f9025d8c1849a0d50d4c5a37c0e8fbe37b27e698d34f6f072d8e9658579fd6c8bba9ca58693259bd173d5835b3279d78467e7569945c11a17002c918b86559ad4dfcf692cc19e1ce4c90ec9706089f36758b9323cf455b1a81b67a25440064ddea31c9b3332ab065609dbd487c98718e9c22ea2d328244e5b532a9617182aff7e44f83033d4d9107fd9a41d30d0200515d1e2d992b29eb78f4b854cad0f883b358170c8daf45a8b66107249e0c0e6d5fb513018238add2d02aa95423e839c3c8f98c469ff328b50d63cf4566357dbbe32e116c215a84f271102ad67eff2984ba48dfc1687d581a3c29e62d454b176891a193f1d48a6ce77cccdd2cb2621d2391a7fb72d0cf64c9a056167565226bfa69a1170c13c3c4166424d55a57095983240debe0c0f455d79603e6944a5d3d6119a012a1d65c22890c05ef131cc0aae2a605c6bd444e91849adfc3039740beb59091b11723120870cc877e23794579d6efb164d8203961ad5306e95add5120f1671f90c8f6a323414fafef20a121bb0d2085700fe5d68264c2f5d051ef565f97bcaae6697dfa23e3870670011430d0e10a8f1b78d36b791d30d34aa097da36061c5094977977e46c387172916d54d416d08be2c1ab5a42f09becf012bc802dd289db1b57afa278659ad0152afbfd3add4e9983a98181d96607c12c99fb11c68ae8dc7038069fb8a2f24df04b985e55cdf5302e1ab2038a0728226a39abd0b1315677830b328ce34ddb026f1649df3c7cf4e8c3526a83431626e33382e01b4e9f85df6fd6f4e160f7fc87bc304c465bf372770bc0ef0dfd451cfa96fe35ebad1b91093d313d3615db044a88052458256ae241683e9ffe1316e26c8ab995202b26151553e906f3ff09dd71e67247b5d56dce5e65aeaa25ec42806acc096a8140fd51f64a5c1d1e901633b2093719146c47f5b76029dd562a2ef7b1e786130bd0eeb285ed3858ddc9fda736a030a6ee82eeafef6c07fc4c516165ad67bb93d65e59cae4ab1134f522ca815519897448301a8cf97b06a03c1b135d7e3a266fd9f18cec77edc0009b7b55525da537031a18c53d771023cab18d81b741c7d40f3933e4e877ed6cfa512e27112dad164b080dddc3e843de796d01976c578f84e63837e80cad87243c9929e2c44d40e7559619c17d31919dd1b60e2057a87b57912dc94dd0e14f1a155b05bd6d57ac70dd50c3c6c6abbfac50f27a7d400274670f55ede30fd48f9590801b35736c2fa57c875eae2a547813d93cbfd68fce14f8c78c37f740dcf3b9cdde77064d406a862c5f7f3f921475dc59872f45fac3618278faee3a86b70ee6c2d8c5c6686e6dd2b777f18b725f547164c783be4fa405ba5eac6cbb440cac3c2336a1a2025a09bebf6d79c582fe2fb48ebe2022e6f6c5a46f7473a6a78f916b0e02be1b7ab7d731fdc13e680aaae38abedc65eb672fa152c9108b387b414c752a792c7af1db52455be665f55db828eaada7b1a498b36e2f7f22cbf100068df58fc110d94baed8a22654855452d78e4e02cd62e465a441be767ce50fb19960002b0aa212dbbad889ae7ad62241fa32ae7bc261e60ece9f3682906f834a3dd230d643013ed19afa8c133ca13047575b37087fd7620f8bb9b841a985fe2501d41b059249b3fe30e80621d548348c8221f3d05367efaf23536bbcd570b74ff1ebde75eba205581f9bf00ea9af61972f4cfe8c472695f765dc5d30c164840557a29b392571da14ba99fad00e6fdd78e43cb7b9290443ffd74e17187acb72aa8ca728cfbe5e9397eb128a626df502f4c7ac52f3656d9cd1598f0fb121346311bcba8d92f93b393ca96c25d060b891f5b166265ac65ab948971335bb4de48fc515754ceb97e778ad8fb1bf68964beac4c7e6f144f7f7f9cd989e2df6b365fc808295135f47d417a5cee4578113024cd0c0de51f72908816edf43e0c3e1768669b1476d4674b44af92d2503f3b9e425034010fafb0d3f2826b00a8bf92e057ea202ae5d2b8c07c7a6565cbc68508e336813153658db1fc31e782fab894f02af91bbb18205e89ba88f6bc560a641602acac1302efde1de870e8d6e303c9907cb4f7d28696d536874a98cd265b69791ed29901f36de4b9e6a17ded45dbd51afeb06e49595364a7c109e280384c1527bc2acd3753596c996bbe01d43b52ac3439f78b94bf069c01f9871f3c23aed35b3cfa9dd5700f7e5194a64902bf17f44dd72f72028a6d12c32d5a6f37f957c6bd3b3e9d0640c0bcc485e57de7b9827f6c42bb80569a9bb38e6f13fa0744d8962c27ebd3c905e4539a0f4ad0b78d8914a2344ec2559620554d7a0060a9919e3fe98368d6e1eeed3fe132cfb018d5bafa3e0983825104c0b06e840faa60a624202982b599d52755d3816c7e3c597355aa8b9967e429b1400b37afb8a8a59b09ed9f8eda990b91eea019fe24c76e031667addfa52eee947bc6405464d1af3f12435b96b397b16d3de66ff466a25700cc82df7a63b9d79b490d93c2a841c7a575c37637e81fc230fa779512d9d5e5a1f4ee415d465d7d43458e20356613ff618750d734043f821703682d8fd73497f17fb8c27f6d6c93d90b086c456d349b3130ba9e10c44c1546331c766f27150f6e400e5a7e8420510615ec750628137991aa21f91d89bcc12be7ff584d503f982bbbb751f4b6efa6ccc3e82967f99be24c347295d6516987233a4c777248ba56cb9cc41274f30c917f036057790c9b8a949aa1ae50119d1e8b410fb2f0f0a40c12407c5b5e9e35b8583a055b93d1486c10f96ad93b30f043c734e5e96e8dbee2e46b34e3fdf637ba4280317ce6ffc0351a65dfed9684e5bbb79c3d19eb8e7e6cc7ed855eacf805e541242f0e15293b4b0eb8756036d4d6eae65cbdd43462bf33e126bd46514a53b6da91aa26b5d952f3a495238bc3f0dd85b5b68c062ecc4255b173fa195a3ce8807e586da9fb0bf255992d300cb5ba8e522a3fd83b57251ff8d9cb57388d652cd32fbe16910ee6fbede7060b5a7c59a4f4a980b5437e180c34314cd6ec8f7721827109c23c6dae637c0f60cde80f15e0982247c671f407dc32757a5a6f98fadd8971992d9f48b48b294f073fd2d9b5b594e0dd90c936f2a46043e073f4fb2adb684ee237203dc72395be020f8e813f124c15830ad3af0603bf2f443db6a80f64fcf91a03a90607db6513a1b40b9781605bbb69b763c7a5d07f884944c746817520fc50003e2eee9fe0f463b2c945f3cbb436462da2887bb43a9f34a989e79b4c30ce61672ff522ca258071a2e508676c8e3dc5d45286917e43e7a81b1aaea3ed213498456d2620794d214b679cb4c0726d2aa13a331a6cbc17c8ae90925a795a6be2bdcd1f370605e2b88d148adf49876774c20708fc34f409df695bc2318b98b5299eaf184bca6206521a9c21884041d224d4c9025e5fd7b34f43a8984edc72b9c091d228f496c7b14cc0ab51666047982703574c975146d4b8ff5ace8849c5e24c74e992a5f6ec8ce56170d13afd250a597d66b0e752da34fe04d9a128658ee9d35045f6c950cc9c0e3e2341855fdab04beb7d33c92b0471cb1a3e31c1a743afe73701d7c7102bc26cbb37a30cbf353bb6c4b6252902f696dcb3ef67c3518566a6bee27634bf071036b8d5d8b323f5ba76a55225ae87325fec49baa5e79cbb0ea910910bcdaafb4af3139792aca5ed71374ce8f124aa2b007549ccd8553bad8e5cc61e61b8384cc5349bc2621f980480f7e4a104941547afba0e479acfa25bb0b4cc9b06e6c2aa136ec92638f51b7975aeb1b565019964247ca74bc057d3b140cf5bbb1bac963d0134a273cbf9c3d004e37c7eaac48d902238d0dccbccf484cf0eea8d07d3d1098f491a2e39d1723dcee551706636825f233b559861e5d4d928b1b75486f7820257db7bd42add0343af7f04788715b4fc0a409c3abca3c07f2e1a23300747f3e8f191194f41dfdf5693094e1a68422009d2acd5f1b8c201ffe17d36862407911d05fae14e618e03ad9b1e90028a601fc560352857a3b0347de8d737d9c236a0b8254ee4af26148136f12fb9b302d5c40cc9a349862f443f4792b0395422a4a2df176c3c1fac560f40b7e7f39c1c3630712972adad174404b650329cc607b176c00c6e5f15bfe518ab70441c8661cfe46465f12893bf23eb73faa585e4fc7f92d2647198e79f7449ebf30ba8993a496e011710d9bd004365a59d9330bef3efce0e730c3d37ab5d9092db85f4712249640e019631034ca6e36a4849014d13712a9c04ef52b83088a9874299f1832b05b645181bc6f97124b0f3f1dc7bb3b98d571af650ea0092cf60ea3e301adab0f8ac704dfbd85b979ffbdf6e5e57f663f4942856099490ac8c3c227c71102b2452eceacf3f23331933afffaeb85e25c2a441e9122caf16967acd88e4ef3543bd9369bcfe71ada5acec28ef0545700420946850be58909dd0903a90f4df7f9524b3e5cdaecdf434857ab9a674c24b0d62ffeaca3d78f859b015fa33962b80576e674e2dd3018007253a216068d3aab4c05368bd964f04e1881c10f52d68158d08769038d1880898eb07020001e6815cb77a153209c9fa8981264ac25af2fad3abb60803a8db81bf1fdd6eeb6102eaf1aad71ba2db456911531c33a1298bd7fba3cc2396ed2ad500c36d7b6988d2e3792161248ab620671b58ec169265ffee0c46aa662a5326a482ba1002fa965a095e45048a7fb5219b976014f6534d1872ef15aa49b9ec37f4ce6c04e0e3fec840b54e0eb41a672c117334bfeaa50c0587d73409055c02da45aa8261025cfe6f2868b129f4c5e6a0d0a44c42e9062d54352cefb37081c38e8a5aecb036dd399f858ce83756317d993a11066a85db8daaa8bd3886f8dae2712b9be6cd73ba85e3a4417282bb7c3192f3b529074c3d5bcf7165bfdc5f02148eab7c0c0e08f54db37d84e4072d84a17b2c53ac8ca9ed4e7693ee6700e0e964cc1de700ed0ce17de7c0c8d0dfc1d82636550f1437b3295fe30a527e466d0291993e804f5cf16dd54888fe5cea57f4c204555b994879374424086ee6eea9e279a70c8b891a5095a7464774c262cf783247d1dcd5a2cbca7c4e8cb60837a57ed9ea83fd4044d72f20f34c53f7ea8011eece84f600e6ef48b03388bc99cc1147ee8d10778f2a139e2013af0a38e78247373463378c05f98c058a6f68606fcc09f1e82a10fdc010fe8c59fc20ba32b80e378f2a96b66425bc23db7d84cc39019f857c3b6bbcd6f0acb3d48761131881fa44a416bb321709c3aa3e66f2c63e9f29953c4ae40ccc9032f16e2281b8aab0b42cd77a297346d8c1226c30d2ab2d7506f33b526acd6b9c2faa754a0aa6bbb26a5412e5f89f1c8211f8c32e9cf43af80987d1170a1dcb109ae244d729f35eb5a1656eaac6bec57df06b05d38f17f0286e1ea585d6f3fc2563de8241dfbfc8e863c2a4a6f85d00a4fa24e02bcbfbe246aa25c3432d477805bd1ffc17ade83db97076ccf234079ec01fb7109797cd45fdbbc15266ac08c202a8a43ffc71572140c1bfb9bc26bf54f87a46d2c468ee4e92aaf9684c91c7f487f26e464d127448b34280bbd65b4486f613773610834a4c3924a2a420925d20e0129f0efb380805846a310581920d6ab0fa8ddd4362cdba6c25c9f94c3f704a006ea5fbb0ed9aa4ec8ec335cea997c8856b20267e69e88e726c08ab8f1b3c61a35bc1d9b2086c682e44ddf5c5875a51b775277ea593331c690e39d24f23f40336d605389d579ce427c82d3c5cd5cda1f064d03596248800cdabed016fe4add401ab349be3b90c990666f3f8a5044f4e6553e18d990df2ff6ae2e94dbfc2afece1d13ba0622ad83fe9ebf9bee1514fa4bb0c568ad093f2166031a7b234de804ca11f672410aa35656afe4812e903908416613550aa3001bcd49769c673a85a0f29d967de969583a60742fd601a1f527eb32c3f259353eb9164861f4653696a5ab92285f6f78b63030f3a3865e9423193da904fa0b4cfd07004d83a80517c85df02ee7129bb3bb5b009974986a556eacf2828b1c100f693ce6cbf6f8acc2f0e004316297c365e48f7a89e79b06ab64c79a460fac5e3a6e884699ce327085928bd676c17f06ffe24a37d31f59c57e34290b0bdfc100c7b8ad41702bb55e75c09f0d91348db55e9119d1725dc40b4f2cee7e0773cf370260c52689d0b1e35d1b98b49cab7d73097e10144b03b40085edb5ac1f28ff9502775e6bf95b8bf8879052ff01dd761ce3de34a76d821cad50f08b3ff3138e944c570e0a8367d49e49e84a1dd8644537ddb686aaf5e764ae1e4652d87b31bfaa8708162ffed9e7fb569a163bb973b202498c01c8d6eeb555fae56b689af44670d4f3709f4e8d76b48674f32c4370df2721e852c28d4585071beba3dd028f3d3d0fb8b2e0f3f1ce56d071c12f5cb3efcff4d5382bfbdce52f91828693b66679d707301fde217dfb0d3046f4e12b780614b19a00e48661e559a6b68135639d272ca269d82048395feedc991787036cafba4b9daf79b49204577612827707027995735c8c7e8b3ab74fd0e8199fcaf17c4494dd405b4316827da0845350760f2ed0bc18133b9384b4a0081c0aacf08a4f047e8fb4453073ef75e686b97c952bd4b5f11f4941380a72a5c24203b126deeac61b046e0c5745518a1d011bfbfc1e80e1224a25a67c7198421f096fb5bae05803e2e96a9113b6487dd7b29768a5bee6288235d1e89cb9737c740c7e9e55afadde54af9e9b570b4be0d5f9950b9ace4632b8a438922ea924742070c951ed8a5fa44885f59a8917f9dba9ebdc108ff447ac0ed8cb2fa99ac5cddf00193e7880f476f6a0a48574000b18aa4b2d0f3508b95239c5b79c61a0619229139236a6a2cb91cdcb3c68a125fbac991279dd1c83c63db728674e9906cbe91238b1b2080b2f4430c0b12dad3246bae5283a15773b7f0cab830ae407412b0441f70687906be58dd335b849e9f21d844d00dfa21451062fc7254eb3a8c3bfdc204b6ba82dd862e4cba9df54e0de0593a9446e5eac6f5bb7124fd01504033daa00e1d45b6393501fdbbd0ed661e1b1f692588316698acaffa7aa2765dc907eff259fd0ded97e6a8ab05a712875ff75df6ada6543d6944c32bfa357996ff0fd8b65614b26cb75f44098d31a1f4c4e23f90486c91ca16e426abdbdc978a878715c3587024fb24d29e6fdaa8068fc5303f2816a8b2275d2adcf1f516805f363b4009a2c2cf5b680f3b21417007e42a60b230afd914effaf8d8fbcd38ba0d5cd1eb32b9c9ef8b4b6ff9e0c6948b6abfb28d30b3cb36b68226e22e00ff4f3956f18c235da53a117fb1f94c47784bc2e2e0ac6f9f7c8e098701cefd48d36b35690c26e111d1f7d957c5366c14a46d6e68aaae2fed1a0ab2de8fb8aeed390e52924ec47a04500067ae51f45d57b3de1dd2b409892779415eabd43ac68691357b1ac2916855a3d3d67e7c4d261e5003774bf7f75570789dd1922334eff58a48201c4103c4e7c12d50484aa4e48f88b2d8d73a847f938397f34cc61d823545b248a1e1b4f3bf941ee790f3ab2a6e8c48844d81644672628eea1e890d6d8304265de3117c60d02377671aafa59664cc596824c136ae7329c3aa95a75b0017390e8bd09d4e0551e22aaafbfca7ef10a61c8fb68ff39f96dd6ab037ebc373f48737cf207fa0314ca2ad8563b82809c1cb16e18e1f9ddf18012b773e4346f3461d2396d364f6735b472f2a5e30c5667519abe486ec035e01dae8ad0428f8f11b121d677ac15f288cc42be4b505e555a602ca62b0142083c844c8cb8a6b28faa6c14073097e54171d4f97643897414206af048de651a7969dd6d28c3783f24821f31c50934911c24e28d1234bb2283dd6691dc8157c2a7182df588b89881dadd00657a3e6d4ba749a1174244473bfdf6d1b8ac43a3aa6636126561a207f9335593eca64742b0067cd12fb7771622b12fea7136297e170e53988a49867588a45ccacbd2a33104544cf43fd529c78461bfcaac60a2268e7573c8bd4061bad776db4e4f67cf1e3f72c2b0dda904648c90bb329d4118cc5e96c4fdad175284e04098ac5a7fc85afeecd4b329b74ba4648227738182e53b09b1d9b85cf42ccffed28f2b7a2d1e88b92f816698c1b6dc4ccfae541a0f2e5f70eb60ca9d03492d0a61287f611ce76a256dc1cc0b1c6298dda6f5da3ea98d78149ddee324d8c3c86ee1f4c7333cbc9f0f43d4d2677b9f633eddc33dca7ec50bdbc421689febf111e048dea5d816f50041fae9e90bf26db936d065627173a7885baea8bb4f5f5b2902216bfb50dc3960eb71f24fda015edd001e3f8f879672c617631431521185215f475ea3ff6f7391709f6e34863416a093728c1ee008c71d113c05ae37468fa79f0dd8e78c2c5f497552ca84291daa776cb14328ff6feb8e22cbe20d328a708f04fb3c541a30c380a70704f9d64be691501250873c6e2780994bc4d3c8e44b4b12f2d21ef578c8e5a142aedbd1ecd4630db705a7d111b72b22865af42cb6d14fb21d017336fb5361dbd4389aa45f94156f6167a464e9f6e091d3d10aaf9eb45e5e6cafa91341c04a84a69173d4c95f2786a9762701f964dfeea77e809899695e8d6124abe8c4b2bb8bea9fbe2c2d5b14d9d77fd8b71e8b84010efbcefcef8e853351a5ceb6ed5989a2ddea5b399b72d3a5f2d88128ba1a2fb7bf53fe05846d8407bd4cd9d80ba378721e26c0831301d0c22a5674079010f1d79c11202a9cc33915fdd3558fab07d0322f692c50d21f3d45405b763dbfa005c6fe65e6a7f79c11fba7c45bd88da5ad64627949f52dab9dc7f194a95ec69f59713f352a1e998a6c3ccdeb18c7c7fad2011a65397006e73827c96f720136ce1c9277a2fdaad3f5833df3ffdc2c7ba2dfe6dd48a7ffd6892887bc7b50a6ff167126422404af1a77ae633d3539327f35ed23b0d2cfa1be86d127faddd20a19ef9f909d2fdd062794e22dfc0a4f50f534513e8792446dfe16b116e7c1244c5a3f25ce156c62cc15980ffedee8b81b9b315f1d83dbf11dd4d42178fe014d55f0f44ba3d52ed72c7f9c0c3c831f88262de3d8996150c811d798657c41006456a968537c4fe7dd9a2d9fa3072a1e37a9973c33cbddf1ae1cb6f10953d295a327d0b7504fa57786e4bd78c425127b186454a0033f345d485f0e6a5b2cce7174ccdd33553f43d7b52240fd1a413dc9659afab9b3f6eac4c42e1bb6697e5234a7da043b548cb5577ae985ace33cc68ce7f7da8895a0b5c6df858d77c0f2f8b971a0581d8fa18a5a9c190527640c01cdf8351f1369546fe1949951d67f4c9a9b221e45cbccf851256379110f904ce8450bcb51698143bba8150e9fec87c919fa5e4e956ec408d81bfe42edf5209453a8215088f6f5e4855e076b7e3057b542d8e7146243e1971ebe4ace4876daa2493791a1ddbfd3a6ddd8aabfadfcf8de6d9bb98de057ff8e8a25cfe8e0106d7209934c2b3eac71b6e2c1eefb14fe95696b558958c3c64f0e509d9af1eb7051b63dad4c275425990147bf1f232a49bc9d5241679587d90b8dc0e7a4ce508e43fd238dcb5d78f59b342093c2c8872d03ad3872ad8648de2e2eed385b95112ade5379bd27d16a81f2e7fba2a73fb996d0da65b38e19cf85034425269d2263a584556c3c18805ac83fe4d5de908d96380a415a87ec643768ccde103b642b81d3faa6e3a75e1b01afe56c167e1ad3e4d0b89b315a7ec485edb4338510247911772245a2027f2774bc542825e016ef5ab693448058916f6039993068d1353ac8742dc87f96383b6032a25a0d13bf089989c48c24dcc3b62ce98453f24d13574202f6daa19aacd08a41815d43005c54de8355df412ba2816cb96132d1f8d0590380e4f18ef9fee28476eeef6c68218db593c96a74cbea84486ba9a4b65dbb9c6b655f4e7563acc4179c5b23ceca500f217577d2f47d15885749a4a260c0ad5474c42aa010bcf621ef6604927b1ca104ca9097b75a20181aa7036d6791c6e76451c58f202b258ea2fd6e633b079379ebceddc98beb02ce6b71991026af732cde1e712663bde91302e10502a2051c6eb3bfed14f82bfb7c990f76b431b9c1dee5138a7e8242dadebb9bdc7b4b99520aa20b130b120b55fee6bf8531d25dfeca53d28794f439d26d90014f28a5dccb9dbfe9909b11bca5fdf89f8b956644c1cc769fe2abdf781b302358cde0b81e2724dfc01828e5c229b986f45ef36f22182baa51cea29fa2afc94e522965d751128992688d3b7f937313c26400cc4592958d085cf305db5869992449eaeeeeeeeeee9d273d2a3b3a9dbaf44935308ac760cd4450bfa494524a6b95377d43e58d5f2a5b45c060ca74469910060964ab65321950cb1aa8655acb9c47cbb806e8ce2fc2c49d3fbf609af9337ef1a06340dd04a03e02d0f4d91a29e44296aeb9e5b18dda4acbac38a5948b71670c3c421b92aec5a4b6d0695ae8b6aa1ec0fd91897a6b3bfe8a367df99cb7d149bd017eb79fa08fcdbe875af73dfc02d5060c74ff97bbd7befb3cd9e364f3b67009e965f839c98a321ad0bd0472d1447a12a982a52e5c02be274bef2559f292cfeb78df3be8c3f4726bd1743c289fd34c5aa72674e71c3521210dca169a62fc639ce5db96329540051cb95b09f4cea5937c136108c3c5328c115d5255ee7c9aea3aef5cbac76c3f87346a7ac26bf13e2f7297cb5daefe483249028345d7777ab0ce00bea99e4aa592c9599d122ccef72ade296105082c97982c159234f369482fcb16157277777777777797524a29a5772e5d12c9985c825bf4c503b7b8233f8237410aa92a2a144da48ea84330953e7c12a4422eba70a99b639ed69990756ce0c0f133dcb8f1386edcf81d70e00859d2fc8d503cfd833bd674baf13856d63ea5376a3585ade3014939f3222f72d617dca2b3d9115c4db893e423052a7d54ff9d9ee6633ccb160bef22e3d5f81b2c88aa30460d979711459ad0f4a7d0a652ffa248e3f256384e9f8d999b1e37384c7fe367c0f14e82e0d861c53b4238c631caedbd82917e2fe3e17899cfaabc158edf5e8a4695cab711aabe9950f5fdcc4e4fcf8d377dcfe9ad1751ead99d150eabf2bce7b9f126abfa7ef5a6f76c10fb381e87e539bdb5aa6ff5414cbfb23c4ebee79979d37f36088e5ffdcaf2fce3781ca3a7da99f997d101c22113b694f2c6093664c3ab35de7ab03b6fbc8dd3af1e87ec70d81a2b1ba71ba6ee05d4cdf01ca9a1081bedc02e1f974b0692d1e9b45aed60e34f271753286d842c695e2e029d5e2f972963c35ffd5bd3c9e7867215b60e0c0c0ccc7f545c9c32ef0951a1d0fe2a641d96add56fa31f85b6868c1d29b5560c4fbf0a4def45b4a6c4193d995654880a4dcf7a4531928c45e3e9909427b6b83dbb2cc54917b7a3f12325ba748ae6b1e971fc0ca7bf6177b8f1a7c7617770126407268a111179ddb7f2b1b37a198e5e74e38f9c3e88e94f2fa50d72fa1b96e7060f8e3799fe08ac854c30188ebff19e7cd3ea6dfc0ca737d91d4c7f7a1b271bbfc3e957ab679d2969d836e6af64329e91e593744907db59752d4b9c07f35fb8b3b23da737c17cdf17f6652923656b7b5651bb737abe4124161dd3f7f0ee15c3ba58192f48b66cac7ebe07932d5be3ed7b40a7b7f138bea7c7f4abbff11ffecc2b91a17566debb616bac6c984e384e21eb9842d6b15123641d1bb24e18fa87ec451d5007f33e75c6387c5b5e2299d20839e4f2a374fd8fa401a241152613e34534466352c68e29e9556cf03ef5cda4baacab62e407dfed63e81be369a8dafee555ff8531f4dc814c764aaaa8a317c99feed5015de185a3f79fcc7b1562642e4eeb457c5d08f587e01807ed6ed37a962b2ef6708f092fc80372f15d883a7a40d70b9af43d1fc6917e247de056f7ca42eaa8084a2d518fb8530e7165cf9d34c26f8241744cef7d148ab7bc48d22dc08f0a39ab2fd1768dcc53687a1aa15771d1e4d2876be67fa11f7991a4913e78169f3268462e218fe8a1d62b22fdfcfc48db3181bb277027932d12ac03835b242a980a6e794bba30b8e5c548326f09b748607442d467d0878c17932d2a4402835b9d12b13bff7b965ecf27d3c32e52bf4285644b89222ae4f978aed173dda9fa1755a8eaa3ee24f57b0649c634f3edd7bd66c9a56f57c55930b654faf9a41fd9a2af9fd70f7dfdc81677c41dcde86c76e7d398a494c662777e2acc11c6086f425438846be4d3120f97927f2f4af0060f3f180c46827d24d9f75f587a124cb63c20493365cb85e001c13c20980704f38060303048322690646190645720c92409483292aca8a87b1575afa2eee5a51048c99d3fbd0722947f926a5225131e10ffe4c0873b7fec88240fa214ba17c9c892642e7a2e92cc3d97b36447a9a6b906825e54f2bcf49ef77d36c8ff3aff3ecfd297e1f8d952a77d9ffc287dc9960b09d197107d097147b2e594beb8a3d7d19ffef47ddf6903927911f79564c5c5f9518a789d585ec545eaf2e22dff3e2fc6e73dceea94809fbb24df2297ebce77570fe3947ebe8f805d86a4e5ebd27b381e19ff7a5fb2e397ac1715f5833efc373b5617bb346eff3d17b117c98f7b6f0b494624998bf32f4976a717c956f7ea5e4545242b2419c9c8bd16e75c7ef7922dd6a1ddab83491a970113a092f6c7f7ef1607ed7e7fe47add938484843afa9cbfbc09293f42f52fee7c5211353d682a954a6015677dde77e403c1246dcd83130e8cba7de1d282aa74cab09344909dd4b44e76afbdd7d1ee47dafdf73dfcabceeaec74966c4d9df91a298aef9d351e79e272cf94f9f43342fb2e3342fa1f8e2cbbfffcb9742e761c6d20c2b2bb01d29df1ffe38debfed37003f2cef896162d5616ac17b0786107941d02b842002e58e1420b2d746f43854d005e10809a296a723cc901002900c042142cd0d078ef3d8e2770dc70c10d1b4e6cac9aac6a3851c3da30fcfefb992533345a4043860532314cc4a856a09aa18219304bc070cde73dcbeeb7d77e3e78052dae60852cac50052caa90054a162a5c418529583105295421051a0f8641451851784114a0300514b03cc1f204299ee084289cd004289aa0814c601c23a5274026804b601c232517804bc0315272022a01bcc238464a4dc02b38464a4e80490091c038464a4c4024e0182935011ec10873cd0682b1040c23b4c00845604111ac306185082b20c2105430842f96f882718c948040192893ad924bd2c89789f9193b561a16d4428b2cb2c0020b2850aeb8c20a2baaa8a24405152f78c114533c792285145144010514da979e78c2052e70e2a44913279c60c2a48926b62f2d59d28216b080054c30b18215a840054b2c015463471ecae1f221c7aecbabb8e8ba3cfd12906cd5f8edb59f5f5282074a24b1832452a0831428a1a204092f904041172838828b23e8cccf7c29490e929c00072730c10d4c60c414238ab0411144d4808821683084ea996b623ee64b42cc40882064100410310002c916484a20a5043f44f9c10718f8c035f206e69af065be44022d4890450f588c004acf1522b022045c231fe706b00aae915fe2816b5ccc4304abaff1f241a11c76fcebf200b0a378290b37d7a5e492ad1a3456c68e548c29b970d8f17fc6e51ff2055fb275e3a58d1f53ab1f6b8d1f69eb8665a679799722f2cef8f1e605be6a58669af05f361cfbcef853381eb9a767d0c7ccf770e6560948d2c87f09adcabad81ea28e7f55ff3f96805c647eaca1cb877654fdab66c252cf5f95ea672c7d1a76a43276acd78552fb0efa7029f9384be5f2d2f3528f8b4b38ceeb325d9ea6de73aadb20e34797a7b6e472791ae37b5c7479f9a34b58f229b95c9425d795dfb7e42af5380b74165f0e044198501503ea61581503ea611ee649dfa00f179719a44f85094800c7085f42237d47500807cd252cc25cdc53c85cdc96d0881be96bb2383818a66467c7d427a32e4ad9621d5aab8b92aa586a25a012d02c019586e691973876402249927f38d0dbc5b80a2635fe3571a9dbd54e2bb5403175454913c62876ef618e1d1ddf1ccef2d7b1a313b76ef36ddb3c87bcb931a05cb70c087299d407eed282aa95f46e351ab4ab60625229924f1d92663e29149798fe6325894429e5c4e93201752e644943e59c557847748ee8f06b527b9f90258dbb4ce685d165295e145d9bcb52bc08ba7d245b8ec469b4d75ca6f920e18191fb506fb591d155c930df5fc8b43ead43df6d15d2d3830174e8fbb40ee959d2b84f51959171c55931afa13ec6d7d0f437b5fe4dedfaa2c2be32615f1931be3208be670aa9a4d18a5c972fdf6f3c122150d016de629dee664ab63aeb40b7ab5099e3e1a27777777777b703496720d145ef27d7ff8687b39e784bce24cd78739b5c3ad4e39fb4cd9a74b9e84043b267932e51fe005d978f44227bc431958ac97133e91643046e6e97d443397750877e86701b8ca17b78f70f6de348dc0ade94321427a5945c3f87296f27c8b4ce2dad10cfb263a5bd71ce50bafce88e7ee459e81011b221842e11b1cb4343bc6a2e0ffd20e1fa916cc9d0032e942fb96f26405279e4ac2cd24547d9e472df5590ae3bf24fea687bed37ab922f434887478690cef69aceb4469c2522832edb94654195344bfaa51ff1dc915ce32f81eac8433d644bfbd7ac1f49d711d14e10b6227baa50db632e7a10a7f1b993a57a6ca8c7019c4585635226e50703fa29296548648572f90caa917934331a7253e7b74fea8b5231a21eb2d9bba39452d6fa8255d4cac773e66c9f39bb7d7a7c4a4afbdbd533ccb27dbaa75dbd84ea53b5755759374b3f7aebe6a6203c6ea16a3e94beaeff87d27cb49f96a2035ce36f846bfc6fe01a7f1cd41cb8c6df035ce38f03d7f8f78fb370d07e9cd5d77d9c8544fb9156d53686be456edf26426d696f44753a893afa51cbb8c667cba813c996a6f9f8b4cff5a75da4f950d806042fecd7a86bce35fc1d8e3c13a28621424c1ee2223f0d4108d909e2a33b54011308203d8040d51e95078f1f6e74fc1093f2161da91c39f86352a8148a63d90e8ff4de4dede6b1126b53222cbb3d9154bfd1e1df4452fde9f753bb43470e71e5624bfdaf5d647ea64fdfdf06eadf1a7fc904eeb325b36496ee3f324b66e99225b3f4972fd328471d9d9d73fa7f9d167ef45f3ed77f45bf1cd7ab279ffb19dd8fdcd3ca2151a75462e54a242ae95667f99cd559732b01173550c21da7adf4a3a4e6e87843375da2ce1f296737f05deefd696d8e23851f5db2fddce64d9d51a08082d4d0cb1b0a824a27825210be269050baa9d3836a5fe92178e2d24b59874e696ad2321f678d2d9bb95cb3ebb3ad6041e256acb4cc8ab3e44f2bbbae1adad5b2366a2b6cd4323ed2818748cb3cc629f1582ea1f250122477a4527ad8829daee4e8d1704509fab91c65c92cc7e5284bb6b89e8957b3bf722bc5a328a46dba17000e0cbc926c748116f9d050809c216dd33fb62ebf0ecea940db74ab7db490733ac630ccaaef2f9342fdd872bdbb2e313aa7a99c9ac5bdbf89e96ccee9a0b6699f7f33670c3c5c6c1d4effc283b24170b54d50bf8b1d5d87ce39d9d1fbb796ca511e570f3dae1a600c73ce39e79c73ce39e79c73ce39e79c73ce39a71612017dd4e0220ceaf83755be87ddc445ce4ecb5b4aea1011d239fe45b79f86ce692a433aa78bdaa673ba8a5b669b9eed1d04aee9b6526e7fac9f60b15f701b8bdb4dc50a296e1018a75dc035fdfd5da573ba4943b9fdb3a9dcee296ebfdbe0f637f8636686460d68d090a1818c4c0c514c8c6a062ad50c19cc980113031898d416a9940c293264c4881223c60b0c5e5e504328948b162e2ea72c4ea7162c5a5a2a945a4d57984c252b4a25b00a10fc84becfa3c2f3ba17741d690a12893ea1949382e3b628b66e28aed6733ec138524a17308e7790b3fcf6b7937e4eda1a38d087db2272a8611d14823a6a4089db059d8620b5a840244d3f5138d2f7defbae9c574a2463df6ee234db6b21f7a4693bc883a89bed9f3642f5ef213922dff55ebeb703e4895780b3dc6ee003b2e3712fe75d427a0649d4aa645f1a7e37cef27796eda020d4a0e92f2f0505edeeee205492ed88894f50074d9f6e9f0f047d84ca1b497831f4ed2a735ea9f21cf9c8593dc3520487eee92cf7b5fdc8782849cf6d9d710bbafe5b1318c270f90b1bacb1f45163e92cdd44567ec545c7e2a227c972c5cb4349a85cd85d5d1e7a21b90dfa70a34e529374514b97a51841e832e8a3ad1196b9fdc816954d4545e208b679c92e8dcb43afa1239794648b8be3f2501225ddd27d4a961a4fdec018341ffc1af8c36acd2ea7f663b24c523720bbbde677171575390a1228aed7a00fe66eaf95599c3ba8dcf74df0c7047fcc09fe9860df29a7c65be9c768996ba6958dc5af803fe693a6255979823aba91096a0fef2554fa3d84eadf777b5d965498d85edbf672e962e2ecc9b74327b0727b76e4acd1656ec58d9cc54327b8e2add6f1d9941b7379e804b0198e32687b11a176ef6ed4d90e79767be6e2acadb44c16513d9ea2d981be2407b80e830ef09ddbdf438efdba2db3bd2971d167b2e547f0777797eee3461b90dd5e2ef68fdbab480e2ad7464570f8918fae6791242232e8f2f7f03a5ddc5e2e7acf66cdddf23b24b2ba1ac85937f2286e14fa0ccbf5e72b2e0251fdb797b35cd59b119b92d18d36d8e51a3255f0a480013bcb39b94977221fb3a6699a36593233b36566e671c76dd1d9d9be17fcfd4998b8fe407808c9f5eb498c701d779ed2d3c3f700f253fd8728518da58a5e261a499a1e3d3349c377bc81610ab0ebc950bbf27af29b558c2e4ba95274fd775c96528589ebb136a5f7b695b87a100c5368e22c9662049fcbb7341f86293c71d6b4304ce1898b7cf9ae5cba1cf26eaa7753c0e3954783ccf9dbb66ddbb66ddbd6c3b790fe0c89acee2664c745ef2a5d8571b4f737b5541f83df029cd383c1b8fc138800e71c0002cc82c901d236fe337e642f14c0310670174453f87d708e8e0270ce8eb6f1dfd1e29c9bb6f11fc0e502b870f9d92fb34e2c170188391e078c4b8e1a00ae711b9cf3210dce59cd90c139a22a0ce234fe1e07faa01f833f5e9ef4429c1573b7ed51dc1ab2fd64168edf9ef2c72dd56fdf9c4364b5e3a21017fd471021aab0c7095d3d8eb0c60f91ad2237ac6743be345c62e357369e537d8d22b2d5411ee0563b0992ad9ee264ca16b61058f4b71136184cd352bd7f4f7116b328f32eff693c0d991fe7ccc7ccfc286fcccb50654327d9507656f55bd822e01aff55d83e1d0257dbf87b3d43b56b847c6d382f17768fcf66db4539ca7d136cc0ccddbeb1e0967f0bfdfbffd8ae06fcdd2cd568e99986dcdb50bb35c21ce8b5cf3670d6f4ddd48d86db7f5c570211c0d192cba999dac4b4447f9b61386af7edd82918db686c2dc6eee27a10676d60b52384dbb6252ad5cb065677a25cf41e33605232d8c503006180028cd882894824f9e21d3822c34bed78e4bee840b99c5aea8e9b02f0d871439ba3da467a92c9fd8fb8487c9380457f300813b492eb2b22c4ce29410018a77be09acee99eb6f1f7d575207ceb6d7b49b9865a2e3c723787d1523ea4a2145165cafaa8af206513e4ecbbeffab2e5e5574a813ca59f81845a1ef063be143ad1de73417d3fd7b2f4f429b76238a1af85416484a12371713acb1d74eb3fd67d5e8783a83ef55fc803f332de6b09799cd42ada54d1d71f539f55f97f2affbeafd2f8d3f3380922f3349ea7e54f3ff333271a32f6468c097d7852a90eb2334219211049331f269421a30649238489647cea472e9221e3592715e3659462c4f8928c8f51fad4a74a312ccfe965581db47f157d8c9255790c195ebef433bc7c09fc1deabfd8972f3d4fcbc7b03b7c0f962ccfe95f6c0be98c1d447f6c54c8e32408f82ee0f33809527ad0f29c6c5b9e166b34b9711bdba889248d3ba5cffd118ef45c8e2f5471355471de166e40be0cadf3bd470a37a03de5b697133991bfdc899c23495718d2f592ae9774bd5c2f79054a822a442a099112a38e2967b225611226672639e338ee7d8a8b53cea44b368169e68b547e4a6a8b0ac5c541602c213b421ce27d804d1e60528811b9114ec4b911549b120c5d722669a69084c91967b977c971248e72b31e6910c82374c654a18345186ef16416730bd3ccafa2c8387cbb8fae6311a7fc9f738abf1915c98862424341b097a41127c7d9517bf1579a69d56976b3e2bb385d3a481ab7736edc86baee69b1719be6c38b9133fe72f4671729754a2d039ef8e8522ece1b0455f0662423dca8384d95eb31177feac8b1fe1d2a7dfa94eec896f6f2d2a7b6c59ce65dde9f4ba5665b6c76dd659bdab649693f8d72b3edc4cd7c18f1e13d27fb3aa3382cb5f27350b8990dfc535a6ed6528dc0a2a9047a93dba63f8b03bd336e8f1780b9f402d7031bc01c16e6a72002d8c670582898e284584d6a86b91a06ee7c67d258c36d236fd12f98357dd05ecc226c4538421078083ce01fdc2e186706ae09d236fe4900c30a107a207f86f2b91987c55972ebfe2d34323921678d1c07856ef3a708153d1142c31528d77fc3411db9a83f079a4395a19021fd4338214543b82134701137c4c51f75e43bc4593b98bee5c76985c856ebf00e102d8b767474b79eeb5a10b5bee9472ed29c45c55b44539cc5c58073563260c0ac2d8bcd8adea86029985582758e8e28c64aba5bd0d66463016f4bf096c48682de92f05604b3be8d081977dc7eea1d497787966f49c988c12894cbefe81c54dba4da261503f53d747cd536b1ce11db4647dbb8c035325e4605f37c4275ce01626d236363502a6bbf73b423cb38da14b866c74ddbf070a1737ab48d6b6c65c4b02fd69e34bbfdbce470fb8ce00dc6632a0357bed3bc76c71bae1cfb4a6b03bffc0394c0adb7983605c6898076d43934f816bbdeb2c1edc805d906fe7e213bfc7d8704985bec9480e5deb83f5fe1c152cedfe67711ac35fb848be41150be9c6094334602caf59f1f1617dd87a414753cb7b4677b349358364d1eb5954772c6727684e568567484ca05714d683e1cd0ac48ce38eeca2883ee66b419055dffed0acf0dcb582f073ba22359b33c4ed806d17eb33ca4d79e47475a09f3ee6f986c221fe656c264509094b0246a3771d1612e7ad004e2c21fd57ca9a6f641b8d79e6e47748ee86c469cb4db0fbedb175ce39bf5eea1b61de790dbe9451d65d0fc9134546abf0ce260d2e912f18e6214247ec41c3c78a887ae4a86d6f1be6587620309f1cb277d03fdfc34ac85484db22df4a49f08cdd91d3436d085e9d8916216f7dd326ebf70ced75fe29cda31e7a02473778cfc7a572831a6731aa86d3aa77fdaa6616de32f63feaea2b0a3ff0002a22201aebfc6c2f911c0ed28182700307f1e7e5fb8fe33638399191a35a041438606323231443131aa19a85433643063064c0c60605cca758f72bd5ff4f9fda2a3502e0670713915e0746a21404b4be551ab29c7642ae1944ae00040f0bbf93eafe5791dabeb482f90487407a59c00386e73e16edb757fee177db674aee9176b66bf98433c950005576a33f843bcb14a290a9e5cffaf3a50b7b5617eb34db9e83246943450d491d20fa8e7138f93dd0dc88ebfe07f803a32d1f6de8eb603846847933b927776a4d45a33322f0c3d50f141e912ee2b110a8028a04a7577f77b00678d34c5c32572ef20a7e3ba8e1df3fdb9a8a83bbe7f8cb3504492e38190d84e96eb1fa48a64b07638bf97560717fd2d0ff89e6bce392597e4d7396ea46f875d1ac1d7401fa576e97071f05b2a3128e786c3bca5090ab98183b818768a6398e57dcc44c1fc17ce41b5308bf4d359f427b3be7fb50d27c459dd6c83ca5701cee2eba00e3b3e3af48f4a3fce4cc933253bcedcf18b740e0e6de3ef8f62ae732802758445ef480d448ba91f625a0436740e8c03021c3a8707496a04310dc459f21530efc8471f601a7f1e441fae0f715d07ed416dc759a3f6725a1bb49f12015a1017bdfbb5203c609f42403df9bffd4bd9e15759d2a86268f942d591a841876c4895eb5f815fedb832fb6545f18f52da77d1dd459f933565b86d5bb7ec9ff3a5e4255adb70fab43ea69e6453d53d2593c926ea134660058cff7e19549fb33ea426b96f032918f668d6c9fc06e557c006b6439e7ab25f037d3402a6fd6c05e8f83f8435ed3b6b64d9ea7fa4fc8ef078d57d33d4a46d1eaf5ddb7b92a7e5f6438a84105d7f1a74e04132e2a0b924f8726e5207676d52a53d0c61b85cda25a0f5799dcfaa34efa67242687051888bae848974e06925ce1ab9485480101a1cd4fedb11a239933aa5678b8a8a74e09a2ceac843467ad3a4a6e1a0d91cb47b801d2027eaa0840f3a584afd5b0bf9a8813af7ace0710bf50858bb0230d399df0cf6b7e7600a15283ee4422ef6b40ffcf29bd25a6b3072d1fdbfe7ff298988a47c1f6749f7cf8e5286d247ba5cec71d17b1a9c6c7dd6e3467ee458b038cbbf06d9a24ce34f69caa806178bb8f8d5f455d3e72f23d364b263eaf39e2c2245bcf7be085194235ed79f08d194ae8265b2a674cf99b388b36a70b10811a2223514e18a10d16a90add6e941e53bba5013793466e2406fe965cef7f3a71d6b68fa9650bb252faae9e783ef914cdf930381f035f1ad735ecfa5d742922d5f4b274f5fbf37bd07ca7ac1d03f09846f0bcb9a03bda065163fbfc17c6fd0077f73e87d2360e5509ce5d90dac2ee9fd5dc8591da9234d925d427fd2ed9bc859cc854531b96d6c245d4dd454aef71417fd47f76ea24dc65cc17b0ea5cdd71e7c96311b0efdc157e41a916b1afc7ee5c57cab71f55e18239df4b47bee9fd86ce8eaa24f4e7ae1710b152c72d608c6c05896cb9a4a6613b00a3fafc618aeeb425cf4ae42c47b84f325458541e74ea0e6f97a2971d1ed04f28007b8289cafbedc1d8f5ca0be3ddaf35af6f75d26fd0c6bd1adb1ebcf954a95ebb26ae5f2508518873b12e5a11e60951258ab601bff7a05d77855a80ace9947b0cd158c3391f8f9f2447136343434343434e475242a7381d19aa236c6132c928157c0a3524c76fbecc138ac52eda8fa3f071cd1d1fe888e66556d8d04d1feb33ce06bef00d6f9be825ff84563d5ac6a860ffcd6019d6c409580bb7dcf5caecb3aa6ff40554d20b2a59a5625c3f7a89fa1a545fb16ab22b5fcf73deb3c297c1791a83d3c49278cce97cb9fbee5f6d8cd5a5efb1ed47fa16a9a4c3fdf84b233c6d3628b8ee8785fa89a5aa89a737e5645e76b5645ad4a06edbf0fa2fdf7f43fcbe384da20df9b2ccf672790375f92a68f50e9ffe0ebd204d7f8bb085dff93f5c0d70bd00b10f80204822f40e00b101803baae8955a8c5b2ac523b3ba6ac98ec5f613b8a2096eb761265990efaf0d9f5c772c545b7021a5d07652e6eae9b44e5fea6cad9f5c772fd8a8bfe6245fe0c65f82273d11f06c6c9a15ece99efdf83717ace23d8c6e78b6bfc9da86e4f1fb42e4092c6ad4b10d78427d77d89c9168ad2d94becba7d99bdcc5eaa10189b51d2d72f98f51263d1bf4eb93ea6e48b1756aedf49e9e439a737e7f478762109f43149a00f3a492f4ac309345ff3457f2a017256e93d95aab59b75334953b213e8e5a2bf7c2aa1a00f4a11309fad177400950cad33afec02b1dd0c8cc9166a88d6d4a386ae83b1eb431fef1002edc1e701ad6a868f477bd003621dcd7aaf1f49e34e54373ce68b670fb7a421d40fea07f583fa41fda07e503f323aab97ea64b267598564cb0556eb4b921dc52b5700bbfef3358166d013670d314ea3fed621d93aa2e3af8547742a51a5e2acb655c6387d1d7585bc9feea17276f45c80402ab32ad445a81cd14bc904aa42ce3a12922ded254c892aa4094d265cf49f401c9110189b2fc699da8f3c1babd0f5e7887e38a2aa058549a9231823badeddcc76589c05c69c3576b319ce570cd7e51a7e64cb2982f4719695eb2f7b6e784c41627a5e8dd3754d3c5c74399f7a1013fcf3fbfe9352cec7c1ef4440ffd036df7f9f55cde79dd93ca5ad7ca174f16d2b7b823c9ecec4ec1f430c11245dd2255b0380c19dac29ddeff4a0f999c2b1ef943e41de0c430762420211643dc83a1012200faa42f5bc9f2ed9eaa19ec23837601e2defdf56a8a39cb9177574a0efddd97ba872590a09b6b8f6b2141228716f1867beff00b8ef4d125e15ead843424adff9e81b708db7bcbf07c9567d08d4efbec5646728599e46024ca7f4ddb74e0dfd464a975b7963b22305bf14020165609d1e403740eefc022e8ed589c46837b5faf86eea07faf0c0ef6fe0154ad34a5d49c7d56cbf0e1da4ae467842b020a057ff6ced3a2a623484a50572a3835e6d6e2d35764e49ad4a9a1f352bed07aa6c0982b76dcc3ee472dd1903d99ddcb2e1411497ce38d983c26c488765770898086fb2008022c0b66d0654ea500f404471c1909d7449bf7b5b00f4f0b8056dceed67387e5b48e4bb92499cea3a993a7fb3e3773bd28f5dd77d67a9e8d3d270d4e4b6cd27f25d69493d7df05eaaf69652ea52b9df56d4011e0b95a767a3f25cb9e8c3c7e7a296c2c151319b1d87dced2b0edaddaa3368e447b3e7ceaa2f74e7f7d516adef16f47d94821b7f977ea73b4e1f5ea9b33b5cd45655433dcfa5cf85e3dcbaeee5698883cb2e6acbdfd4ed6f2af7de2986791f50473e2ae9c0e32cd2d5869cf069bf9e4bf7394ba3bc928bee722afadb9d57452d4b8165715bfe14f648bbcec71632d7c83a479e715e4abba7e0023ad4d3f0e5bd3007bfa8f7505a83289465f0878b8b8d618da72c8df2b65819abe357db43fe2fdc1eeefdf8e9f91cea2d284737eb35111de9f7908b4df436503bf6d010059f0ba93532afb785a2063e833eba86dd8669df42da7ccf7bc6389b6c995ee35e6b02b7749040497e523e54e7e16acfdc92c2ed2a57034f5b58412b5dc569b43f851fc8d33aa0ed2149a301516930a4753f760fae66c716beb85a651d8db940a2e3a36a7bc6359a0eb2d54d601aed352249a3bde63f4968d0430e449db6888b9aff007e83a17d134ddb4324a83cde025f7b1d80c8560bfdad696f2a8531e14a07d7a498fbeebd1209b5f2d75e87b3b831c7d5bab0ef8e2835108093289c58d17d2e38017212e404e6c408274a3ef9e372b98ea02d504a2985c149115cb33d15362722d89c948069607480c184306cbcf80111584405408b19e48045544d13274da66882c5e9c7e5720d91a38992264cc0d0a4496df13caf83b95cae2200d0c48726433479995c662e972b090b4e9842131e4c323ccfeb689c903961e4c4ccf3bc6ee672b984109de0c28922a631e1b8420a0d3ccfeb865c2e9711379c58e2c41354b088f23cafb3413d5bc3a0e2073688021146508327e8504ae98af39c5081132da8e144122792f0642e97eb04d6091e9cf0c109214a3142285481c5ef991831518206ce30d9019320303182e779dd90cbe54242a3065dd04f460b19783097cb558298272c18985cc122df91f3805c2ed70f2a264ca2609b4ee672b98298c1440913156c251826489818416bffb85c2e1f524c44c0a4045c43a21d73b95c40c8e83c4a298d8247050decba8ec630c212baaea31d90cbe522e2c5a35dd7755468150a431356eac9f3bc6654e731a5740ba6e1eb35318569f8ce4aadcbe58e4eed7a3775b33207b51eb9dcf7a033d6bbcdadb6a07a9a0e14a660916ff755b0cd76997374a01005db308e0e149e700ddf7949618cb39cc56d8f7231664add7e44dd540c08eeb6800de5ac4d63eea9c712072017c391bb597983fab9d8af591b1c04f208953b51783595a7c7ab718bb5a4be633078430e7d6ff04bfa1f7d49fe9d7eb863cf1acb36f651fdb1b35cf69f1fcd472e1ef99d5dd9e7a9f147747cdef4a3223d896483786fb23cfe1e8ee72159195ac7c6119db15f630305c18486888a5a268d98c91ecf32732c7376e5b24f99f1a3c79ccae51fbde8f2c6ec56523fd8e0f23b0d38c77dda867bbef256aa18718c1c97775c26fd91bf38e832ec72ccefa03d1844b3aa1ded358ae34668436615b2a4a911b2a4b1a12c9234dc87e1874b541f92b12ea41db9900e1d3a74740e0d3edc535a2b57250df794d6eaacfe986cb99531cdb6507b4460a2f13a7c7c7c86da867bee67c84faa7f646e2af81be8a3f4a8d473a08f96f76e2a8cc63a5f01b41f6bec3d94549c867b61e6e58c1d6515128d1860a987fa0b2e312e24635dc88584c08d9b315aaa33d6af4afad18d40cbc5be074b31627ca527d9251501dd7fe4722f81bee7c0e7dac8ab92a252a7386c8b86f12812572dae6a4a470bcc28632eca08dda7e772cfc92fd886fb2a2295f7d94212e17273a89f380df70da56135c66b2398fb6855bcd547f253a95a8d60cdc92a321683dfd39c491a9fe6c1a7527ed4e2da91c9d4626fe82bdc969e5b9884ae8c714d897b30e4feb3326746b8906c69dc3ff926292694ccd9b891e0b609ea24b273c845ee4719bb1cf79c119a4f0b5165ae91690a8fe89442be3121ebe8c8b183f2a8331d97d33167aa70ce08359850eb7191fb0eb51f17b96fe1fe1422b9dca7421a3a674a816db8e726152ef72307e1725fc3399334dccb08e711d7705fb9afdc902db851c6a88cd5262928977bd97cc27d8c96075d977b54e873b92f7dc9aa78de91c71d65ac0651a0cb71dcfcb99cd0e5761cd131825d8e7b26b556c434dcc98eb4a4155deeb5a392750959a7c58ee266c71ca096c545ae057573b9c83dc96a472e7242d78d24a5b59efc4aa945c6240df7da12977b97b1162b63242b63e23d5937c2c13892075c2377c03552075c23a9708df4826b64175c23b9e01a19e3c10e7440c58b2eb888e50007379862831ad08068063288c11652a2c060886b3851478b2cb08072851555088957c664ab3e27245bda91a4e19ea3d587a8dbb795311739eebdcd86962fbdb76d5bc84323e95b0c3054002d0890050f2c72a0e05c31002b6eaa6809b1a878e1053ba610c01317a468210a1d50d80cdd003c51e3821c4e00d08405276898884de008bab1c4460b562ca8c1845d41a882cb694bcc308e2fa1c138de0219c67116c4308e33c1351c8eaf6006e3b80a6018c797e01ace81b886c3712562308e27f1c2389e0214e3b812aee1701c8913e3380ab886c3f1232ae3f88b6b381c4fc2351c8e9f00641c37c1c7386e84c7385e04d770384e0489717c08aee170fca79fe39e631c1762631c0f42631c07826b381c47c2351c8e97c019c77fe01a0ec77df0e11aeebb0501a4df4896731fd24fcb8bf3d9d1df15c9e652cd35c735d3f493684b85f9a176a3472408da41e0b233c00dbcb0f638a1fe827f8f136e2109a2274f92108aa2e4e88e7494d20313b3ab814f29f1b9fe31373ca64c09d3b3c7cd0d8f67cd79d3a91b1edcc31d4ae5161043e7e44000b336229d6669bf0387f45fdbfafc3a3a07d5ddccff74ecf83eafa26e727071d98b1c06b8a1c237d051832b65060f39bd7d7afbf4f6e9edd3dba7b74f6f9fde3ebd7d7afbf4f6e9edd3dba7b74f6f9fdedededededededededededef3c6003705b821c00d0faf4d5860b02124b0c09e6c21f4c44518d7741b35145c53439122ce1afbb6959689b8d8f6e57b5c4383f36b7022ceea671f72db2e947ed2b0ce711eaec33ac773077d7cdf30c6996d64fe6ced793bcbd234a2615c53d4afe6a1eee91d3847cce103cca2eff339c03937469ac5d56003b33c6a7ab14f3bb6bfe1e7d139edf343db1a5a7e9cf91ee4d1ea2169e44f7d173fd96e588b1d677ef050ab86cab664c7d4cc8fd3f8740eddd1b5f64f6737af837137dd8d010c50007bc78615800004e0c123270707670003b8b969b558ac175ed8b143000270c185165ad0a1c3c6260001a8a9c9910300006081051a1a51c481e3c60d1b3656abdb35668d17308e95760ac6093dbcfdfd84713a8625b88b6014348bbfa5b18006d7064ba860d13b8beb2f63703f4a12be8208c6e917704d3f691bff2db0b8fe631f31e3c5cc0c8d2e68d090e1424626261613a3ca814a3503073366c0dc000626352595926103193262d420468c171abcbca08850289719b8b89c64703ab5c4a0a5a56e51ab498ac9548a522a813000c16fe8fb3c2d3cafcba2eb48589048140aa5dc151cb759b1697352c13852f60b1a3605ace5a3c45cb1988c35d3b06c3d55e8cff597e1ce8e9098901d2131c95d6ade8979415c9c94ed8e8b42c0d75ec88c0511b22324c8e55ec838ed8e0e90d974d15543948bf38ffe0bc1f07351b6362a4ec3ff8d952bba5efa2db6517196e93bba22599634638e19d7b359b99cb5dc4c5ed9a87832b646660c4a1d39979c291c39214e26c4195dffd3d37007faa450d3b2f4a09cd0a542855cf426a28b0d7141ce3a35e16092523bbbaecd8af8befe01b386d0db1198d502feb87d2104ce014bbf19a1734aa61f37265cff4d099c637a9f39abb1300efb7b1b95a2ebb323d96a9dad47c68f1b92bb1911b429b90eb431b1c5bc892228c62dabd0a8640cd875492c15c90800000100e314002030100e084462d1603cd074710f14800e83b85474549f67591243062162080000c0000000000010186d2a0085de6e4c1dbc891fabfcc2849f9518bba019d09cc1cbdb089fb5d73d8c2533d3a7b4b0f171eea526d607584bedee823e00e6faf9b2c6304e5b5ab8adcaaeccac66183d73e9cad9174e1ecca2f42997f375e4dbbc7e89f5514231815a5b6a58cf3ae80cd67e0f3b588907a515d01b18a348270b8bcb321ad42a4de7ecdf4bea33d41bc99586aab9001b2bf4527f0734b631cf7e7508c23708d17dfa52e11d4dd01201d3176707b874e5427ba840b256f90f861351adf7a127b48e90965989b717eadbb6279dc7cef0ee20df99c675ea5ec2e295104963d7a29f7340b4509765511c4d9521682ad8a195ae3d3811a474fa531b716171394ef028bca81053c7949de74c9a9bf86094890bd6fe113ac7564b5097bf43b220fbcbc1e5cef67df51117516ce5f2ef302b74f806c337a12969df9dd534f3477150cf335e86387c989972846484d7d88ad6d30bd156a41c26a82ebae560ec04a70ef5f58d12acd0011ca5397edf87db6848b6a6ce776e11bac10ee55b2aec3ce15e1c3b823fda42ad2a6530a13aa1901854d19e8c726c7f545a8bfa838e5a150e205de8aee1a7bdfe4af4901ce4231da5a57788a899403d1d93180f1e50c0ef5d6e69488bc2c2f3b3d493e85198dafde19e0327d5530e0c6f122cf4a62a4540a5f13a4fc30b1d2bbaa78438ab37bef8774583a272148b65f4b39b3ee9d8ae58334ae8ab92afb9d693ac96ff2a4294156831c3bd00ecc916cc093ad6152fe5cf093d436fc028ee2397eb4863c1492a6e0317f0d5d6f327c9c67426966f3b987eb51e56fec9f13909b558a5b8ff2bdc8e3d328f0f51241b0dc6ade145253a89258fc3b0400201b1e5d34cecb80d02b5e81f7d6922340cb5f61477eb69165ae9c48dd31dce9c3e94d8ff00c42fd94a780efc2f8084855108f9f9447092560de0dca669df789d779273bb371859e9cec2974e8d01daa5d7f43b12bc6b3d4f453c6c1f4f63f4f995ade9f7e5a63c6e2b9b88751420c021cf5f158975ad1efcaaccae32cb90b683e2e827821ba07b5f6942b352b5f064cf692ef4e4e6175a5c976d3acf350eb347b236536146f353a959ee3b05e15e5325b1c505028158aba62ac3aaeb532b8579f8a8bd4ef19f2d890736d258ce92e61c0821128571e4107789f703980f2bae2a101c7bd25ea3f0aa0dd2a4619fea1e04f70311b30f4845a938c6193d0edd92b9a93a3d55b02596037572263db1f2b907ddc4b086e8e339a9b21f7422bdfcf64112710a3f0908e27bc8cf65856837a7e2db4ca093016c9309ed7808b28faf858739befb8f1227a45398bb06d98bc8a2ac0fade23a80c21de5e101a404f9da16fba0e4f9facd07ed69966303bbb3484eaaeea99aa33f129ed8bc8001c687576469bde250c3c4b26df2da7071c130a40aedc8b03cdd2eed9d8406be49fe2b74260762d238e1c06aa245b2b84af2225ce1b94448ee2cd82da628d4b13fe67f47ab0a7883f3518916ae3307390ce401d408705d1104de1395e45083f3a440b527b6110588c6a0865095b0f54e4ded544eb4a327e2a066e9a32becab8d6842d5a5162aa0c45bbbbc942c5c0706c0b985d7dee153a02c547041e1a22aa361c3cd678c5e47c25cb91d5529753a823a7231b2bf4d170994e1a6ceb9c57360816c056ddaad1256e346e7cd1694c2d1d2bf67787c71361281f8070d539d79f4d0c7734b4b6c44bc92b14f509c1bf79a44e90dc6e510a0dcf6a67f35eec70af12f25bd6c992e332c48e1316235e13c5097ca9894cc636b6e34b0c87ca24e1bcde421fb59764b526be1a4ee2d54cf5b4ebc7052b875dbda8af6c24993b4a1a614e93b0dd36cd7b287096c2787282b9fb909f954097e85e63a23ef8320c0832033cb2cca1e9a0118e9ab31cecb6bd7be6176c078960eb4e3247932b06ef13c8795b43f52676b9dd4dc84affed1bb9f43ad2702d1afd867254d5038dd0c93de91a8a9fb7aa65c5958585c49dd774beb59c5692d042ba90b5be041f9032f52c7db7b332b777f01dde7010792957c9e13a6f3a39724decd4802db34a8250730b984ca6b859533f6c3b436c3c2e8a6acd7cdda24a528a5cbc65140338448c712ae06aba22e9f393e74cfe4ce37861f3d083c36b071f0b6faa628590257fe5a0982bcbfff030efa286ab2cdaedcdbca7a7c1d3d919461d775474e513e9eba678da35d2bcfacdf942475208134eeb7754ce01119426c5e02f456fb436135480bae7eb77ef9bcadb0fdab272f8526e6a5533b222f7da2ad65091afb7ab25e6975eee070887eb2924cc560c1fa6caf4bd83537d1773aa12d997757298834231825bacaf97cd40db788c1b1fc10f65d748066168b5ce5d5257585245e5e6a6ee1a30e22c8bb40f0bade5e61214ad825c868a2e66541208353b58a2d454439e0a4fbf0c4a9cd7e0b0fcbbad85c845c8ae00a31362e0762b78203e9918c6c1fc493b8fcb3ec427d559192928e0ffe0f42d93ba11acb5ab63a7b3a866681126d7398c7d46876c115adb1491c07c7a83a2c6f078aa319a8b213dd28efad82216191898ecef22b04cf0286dc7552eb507123fedd5288672fae8412b0528893231db05e5327a9d74386ed8ec199f706d6f913ad40211c92ec1a2305c8eae7c3254eb09c469bd392c58843153322ebffba333c0b057b012f3172d81a61e085fc7a28c466b12894ebf78edfe8d243786c4ae36c070fb4a7076170f49a00b062412cfb2724ce49ac44028cf9e3b6e0acb1c8c215727ca68e9720507d43f84c745814b8ac8f9e4217940b8121962afee4d0b91d857d2446fca517012d70eaf6916a787a26e6709a070862628bea0b7f9f05273a95ed94b84491f2fd2a2a83707e528ce40878951e72a99734415c151f661ecdeeaeac92644d4003bfcc8c4a3f2775e239a6f0d0fd2ddd376871c873ea555c44e8c05a25e8bab5ffcc5a4eeb610140e86ce453cfbe5eddc89423d9c767a02c9619d5fd3628602ad2c23810f6e5cf72052c1112ec37063fbe7c6f6dbc59816ad891c016023ddd0d9929e25a04b75b539d362217754baaaa587bca60fef2aff59d725dc38b4b4813182c983b3833d96ce6327c1893a8eb5200432359e66ed8e8ea5b474367aadb64cf86458472946f8243fe37486a10048d13399960bdfd35d89d057289603c7b62c3078ec8a01f69e9e7549ff129f0ac4c43e8266b4e376f8f41904dc63fa3cd1384ec29e873786fe6bab7150796fc6f4c21b4ca71431524480f11a28a59b70851d132965f8ee457e8085365993428df0a65c6c4f308801939084070406305aac77c8c2359ec3b6a171a15002e4675feeb26da356e4d3a54b0e8b88e549045e683db854984d95b4492e8cca1decb221d4a5cdf412e1423374d8c0f0f765756c52e66b3f8d7e450931bc4288164134577804d5474350878c4e7169440660d5155ca914df0bba6b9fbaecfb86c5524fe76d9ad464e4661a3303cb47f3988607d48a80862e224ef77217ecf64ecc8a0f5f316a187ead676eba0595f086b6ac78e4c717ddc5f401582f1a35915dce1a64c531b1e46b20c7dfce2c0026ad59d1f7e14a3b2a604bf1e5ca096ab8329c534e607428b89742aa1629133e054db73bd36209b516e7f63bf5dd213b6d496dc5c9dc984c54549ef41f74a1773c10e83d412c87cff893b73a5f5d8218a26bc9106dbad6c342030f9f317bca066157699c34c275e56e970a7b014cff5fefcd76df36a2bc9bb5d315e7c1075f51cabcd67eb4188992dc87e0c481d795771dd673a000227982b6ede09c1c4da3b177d12563fb6c2f29ca5929986dc4694fa2c4e06099eda6b74c62a8f7c09120a88f6db19bb08c829ef150d703891b5ce3103fe05a83d057b0ca6843956e8769766cd317fc45e15469a0a0a3b782e29d73a0f13a9ba078fe6b9955a4761e7b8f0772a74fa66e859f53ac590dbf52c6380c223323224da99b5e063ff7ed25fc30f1b59c353dd08e274bc846a2f1d5caccfa25014891cdcbfb5e7e9b47d5c08b8bf0dab8073cfd11da1ee9c91a51d083dd7e3b64f53533e41c514494313cb8c286e69b90d6b976436ec33516e65ddbe038fd3f1fabf54351d9d3cf9354a97e0fe517223e52c784dbb17f0ab780091ec004eebd981a0183f5bd9492c02ce4de4912c66972b4f6473f81fa7aa19c7b2544de83f2879bf5e14fbc862da43e5b3ad8b78ca27078b668f5d3f1d11d1af45a07e20e80d377471bf960c9a59d9eec2d941da878345ce1c632c376227c935e2f60b26e574a83415ac2d07368f73cdccb7c1e99b54aa1a77c5aeb9114e8e14cd103bc1ebeadc83dabd377901ae0693e7754f3eb01b32e258ea48737f3094dc4d4d48c1edaa66c049625660441810dc776eca05d32d707ea85bc410a834fd6e462b64a0e022cee04768ea3c6158f5f33136a3f1500bf2e4aaef3b47ecd1eb6e6807a46004897634323020b2dc835f677c8f7c216f5f57b15056f93d86ae95c27aa3775efb3eb4b43478aa99a37702e0f8a4c49080142900ae9444a25718af1464746e2a1ad28c2119477b5b8e7d2d21e5c219f26b5b8161dce017a5fecc4b966360877d453bb0dafa1ef9590f80b8ebf145a273e3369827025091f320020eb330901de8e976ab5fc1ebd126712a87098c4c2b77fceca1a24956600c24f6bbf9507617fc90e32f21009c34cc39ec9b0a02b4542f7b0739d984ec74c9606380a87ea1880af7379867bd2400cd787630f53660f9d502d57a1cf2d5d8587dd5eeb5e9d780697f70d3ddacf3ccda01f8a6d195b552773a134a90121c6545798800d995bbc343dc21803d87010c2524b494fce86f5c6da81a949d99b7eb4270040be9574f320905c4567fb9ccfbf1b4224398057a55fe21f842de846b90e5554e045354ff427d086b654ad31c4611b21957aa89a381d4a205f20834c04e8f78b235c4146d941b15affd82b69377d3308e467eb7a7869444214d5c31a7119fd1061c00474e3db972c86aa6b04626c4a56ed001f5c4568a6d4a007bb5b1ca96d80017151d048a0386b29d72bb5b382404356cd276dda2bab720e09bd911c9fa8a471465aaf88ea0a1c0dcfd61d029d894093c76300654bdc4a63cf95cced30f1ee14c8e84f647590a8835ded29348643082239aad67bc482fa0301ea8df9e3a2b72c900b5580016c9a53f937720ea076f8bbccacfbe54256df3ee3b743c489a04160f5f39b464a23f11b6e6f03112894b0952478fe9d679396824c8111468f53846ef5d69437e2abf8ef7096ce1fdd1e42b163ddbc484c40fd04a6e4229735571b38d204ae663b9aa8b01b342a5bc0c021a36fe9f6f4c481e260d5ceca34f8b0673e7d0c589c77193de6ec649a5e8621544667c4ad01424d8eff2eb433c8fcda96c607437afb544e4465c53b8fa9ed1e0e4d2d2e4ef75308204b30fd276cbb803f264852206cdde888780ec4c949ff5a940aaf196e4b4726b425835e55677bcb775c055318bb0232216e27728573abafd5f816f4756a57538f1b04e51f9fcaa2e7f25e8bf320a604f179032108003df2966dccf45b27008e6bef616d9f706b944248acfc1057222d4ca16c8c2b20e458822d1007ec704ff9bce9688fd11e6a73fe0d17e379cc8ffe951115db34e8bd8afde57ec20b7e9d9372bca26329387561fe0c0aee1ad9e6f14f4c3ffd8bbc33d46bec7f85f41607df473e675c560efa23f2303e31cf9a77935ade993126654034ef1452579b81d8ebf48de8c81f157fd4da61f976a4f8abaa5fd0b2184f0fcee6f8e2ce3d3efd7ab7b03755feb2005ad13afa7c2f31ccbf8f4c8f5ba78e7db490493ef7cb95eebb5a620642cb5dd81be1d3d30f1cecfa1d7b66d0066ea3e92759c77364f3c28307cf7770bd7b64619f880e5ef6efc5bd807b0d93c4563ee44b3ed5992091b9c684f0e22603e6a2ef991acf6f044f8242963784f74fe10568760d21906e82f640b401fe3186cb305ab7911995eeb58cf9c899759b1f9505760c34701c51a8ffedee88b2d401518bcbf608977f6865cc3be5086fe4cf852a9af0061c9385c65280960012b8e5f24caa3dae49c82a51bca37c90d8943ed0364cc242415bcfc9222af3efaa343a7a2b1f94fbe247b0a50fd3c9df494c10be62a2a640f39a21be4677003fbd67da3003d21bde0730a7bb801c11983357f2ea60c9da8af2afa925872471e3b552fe4bcdc13622d0e0674f760c0a99f77614d03d773ac4e2bba7eabbd93622cbe3b1edbe051e2f33619307cf8e9a8854898894c81fb422027bb7db8efb703d700b09876d25fbf3851bdb2cb8fb76de04bee89591b94c636f81b07d6f6c1cef6f4d075e971bb3f2e725d3c11a740b9037a68043ad34b469fce8ed5425122798e041eda509879e58ea3342add49f4b0f493169d86422e9fdfeb8b852ba86a69ce45851f6a7abe6357e0f58845072c448494d870ea51c919df39ce18bab29a441f27a1816779bf8301973a195608761b08daab7cdc50944ee39f310a2611aed03535134e0e0b8033f3e994d35481bdf9e9dfb878eec2e0c0b48bbb491c5afb3e647090781793a47f71062fbe96eb46d8860e75b13d0d6626bc8db92741fbb23090b0bac2746873bd0e898d300d22da28b532304879f6bbecbe4399bd2b7a8bb9cb61db27f3b7389f82cc591077345d0c7d1f999d911c7ce0cdeabd1add81d87cdc386b7d86f06cbae86be9c400fde9b71b918762dedc0c57ad1e0c76ecb558fba9a534b7d9fe638a79e28e2008b30901f1777a0c88fd83ebf00e9e67a2b310610978f15240b0d3e4a10045ce1ececb9953d1d83326326bb6800a255572d386e1c67ee62d8251fa81e60d0fd6a8605721abadcda7dc8c24a471388ca4037bd6d8432939029d94f3c39e1ed406ec41da61ea8bd799599ff52c57d34ae6d1780c1507b52331b601a85686a878d612485c49303e4804131048b90948d521b45bec48bfd0a83ea0d51940061d09f4bda339ae1ed3902c05d800159f5bcc8a36011f2f4d6f9855e4e9be41b8daae2fb38eb863d0f292e320cfc8a867923515689785bbda641788a7f82bce0e1c0f66834aff215d2439ce773c4de1706d5e095917f2afc332bbc28ab9089c1d017d53ebd7e37fab212933b2e3c91355c61f2f16b431d815d0c8206950b270bf4dbfbfd287f6a1cf94d8e5c28b9187cb4ae482891633922d6e8f4d0fb749f1f0b15a05cc3a579b95ce36f770573c610040a2dbed212ad48227e9370cbd3f6e15c67c419f28718ef2533dbbab84a903b49de3feb04de78a3b8f6d7dfb67951c3509af40bf3c0eac4cbf0947dd9e911b16cd4bfaa55158ac4bfe62f5456c4c8d8dccfcde363bcfea314b7c61c416d71ea3fc09a50e9862178d3163b7ae5cabfed1912e7a5f0c24854dcec28ec8b877556b732c4cd62a74a162006b13aea3b8dae0398c72e12cefb70d02ce8f68187af6f6f6390bf8649d9d7f187eeed5d6382f3da22ecc66673bc0471601b0281ea27783a017f1c71280693786d736765e61e51ac9267e526c206b43f067e9a4dd5895ee8056231d5a292889ce798919aa344ca25d5d108fd25388d558425efe2c62d54b91949f8244fd729285a79152594e42c149c4ea2e932e7782b89a2564cb4f44567f1159e93348a82f26f305c6d85f431f9beb26dcf291db6c7f3a0389049c99c544b02f886fec03998dbde1e2fbfc041285f8a83855999a2f00883cd86077c646e57c1936511096cc74fea3326dce7f102fcc5d8e30ae0bf6b7a90013ea618fa920afbf00903fdadc0b76d3a8bdb8ed13ad2bc5c795c87ed46e0c3f5ca23fa238e5d0f0f4c74cd2134555cbcad7561d48623dfeba96fea3397196feae6a2786ad95ddcf8c980ccafcc59680291b2cd8c78396e8ec64305f1f6f65ae5939d1bd563069110543079669a404fb33f1be540b104cf83f535b310699efcbc331b1f3da6956ebf05692a773eed583822e290da021df2af542e9ef049e7f0dd79a24885c1381d905db59a4ae5b9c35954988357f6903e05304172e9bfa509f7d8dc3937c5a0b91ffd0925c7d1bf929ad9bd20550e49705b8bf3f95606067d92a9f09a3c2c69e99d8f6371d57aedb6c037b7ff2d2c639d042db069dd6bc0cd1150fb8b51c7cc87195af49ca8d0110b6759e84b120f1d591b5c61770e2c45cfa38757235bfddba2a5de706b951d2fdc710c646ad41fc151c93be2ea62f84776ae234b3c368f5b7c950cd0fe97411ab301f9f1539747a40bde551cb3337918d4d5ee259149d9c378533ef1a6b003c68d1da7582b12820e5e028275a3b8abe6138569606c180d7e9d5f793bdb2463d65c7d01274608585cc2ba566a7b1b0579b9c71787dfcc926f0c59b0207ca3e00e7f6223b25eae99738225929cfab64bd952c518aa003421a8fce65cdb722ea9b186d4ce3dca0186b4e575471e27fcfb31f0d8bed9d01bea2153aa38443e73f3c0f3f040116306002f516afc84b8d22220d81e21d0f9d1c919f818cc73d14bfc802ae999d0a78506372020506551e8769bf70161bf4bbb189f63655b5aeaba49bd1ac5c948d5b3472390c78c59edf0d08978a524b99848decc5e1947a4f006a651e6c79095ccec6d18a09c3afe2082dc9c330c91a8b8e446f2d570c0c8e791ac43ce25ec99f24b72152e3877f36d75db6ffdeb853467cc6d1aeb014708738557ad883b12c240991e995f8fe7591788f5d18262df31b75bbc852658833fb39aa5ad394abdb0c6e9c964a1f6e68e9bc2c2ce1a705e12229ede8ec11ed884b01ae690720c1ca75a8266d34761f7705fe003a8cae80dcaf62cf3b61b5d17a1f4d79c8474ca601a19a10b0f03c91cf35f9409e7b857e30640b2d9a7dc6f94ae99435c0422bf5ccb21c61c98283073d0256073d5cbfc185399180c2f3601e6b67267778a9502204a583fd7d3e73ae864d873026590c79d554684ec3ae20052b8e5192ed99086a7a23842e24d8090f6c8d8f424beed5f728457d26e6c150cb3bcad00085c56d687d6770b3dd243d898c7f0ed2027a5cfd067e3f1bc981ba437150e6353ea5b2f62a4ffda7b1bee718407ede9f9196298a782566bda55a9a3a7a28db55850bc5fcd334ce25b6792a6a3e0a1dae183757c1acaca509c174ba340b3e12d0f1ab45689a27f98d447e9395972b87fcba479a1e2797ae8f06c2a4561d00b4d4fb283c699c6c087ba7e9a38cfe52a7c08f32bd9e5e369de11d57a2e78d2354743d6f1703d8d04e48fca06f44c41f6bedf3f646d72ab4c0a41388297c3fa056d2590e8148885cdba7bd0e67030b748a84e751dea91449b039319317901b09cdc7582039370b3d0138a4fd372a8f07c9d1b17b1f6116dc04c2a0028e8d099ade8885a025fd5ccca26aa38a6076aded421ab197776d990a985701a1d5fb9bc7088b2a0f31b8f9885ed0fc890ac9b35a4296bbc2c3a8adfc7d14172f184fb2d34068b12b51abe4025b072ec7e7219255ceee2fa3588ad842b8aae085ec6b31ee7a221cb6e20eb84460a7ce19e982ea44ae11c1706e0a04fec5867a3c4a99435cd8c508ab036a3a08c513d198d9ce44c64e27da0bda1a066479c74c25b817d3690ca5c928f55a07251668a5318da2c6071557427f898171aac7fec113c8870edab329d1b3820c95b44c9a80b766e2d29c4a497703836a375400ba135af464a456c8c5cc9422ba5e3f9e499fe88f3da819faeb0215c0c6ccd4ff8378208004c73f19f36c38fcd329c80262c19a68062b7e33d8f88a36c75bb8d4f6999106ea1244ac9ac2b17e2e19667fe843eeaaab6b76fab63534427dd829015a39bf19271abc020e8e0091eba8027e9a55a525247ec6fd799f1689a661257f1b364161924c40116d26aaf5e30b0440dcb96e67cbfaab45d815bc1408e396b4220bb55a242b8b347e1c7c101f7e98219d090da7f286608e38a0be06d5909a6ba92f8eec403e31d0234ba4af254f03606f811278178dfb91ea7f9b04cb0ce55f6d7ae0c0acd2cedf5b59e499fd73b793528a3b3926fe636cac15464ca8d1b6b0525c28eee2a2d0859f99a79044427d0167b4149a45c884873f1cc17940622ad01180dd384c3354545b5e694abee444967b8d36e19b16f224690251d062804a56d0ec4b6053cc3462cca541e1ede98de65adf506b9a1b9447026ca2794e223a76e63437b0bc99a431fc5297a9141558d0780330f20d968ae275ea36b5a4833e0868b18eca662047d70f218fe1f5767be0cf44cfae8104ac9d6c80df03911ba5e9c04730d168bfedf2a9d40395730f8a5dccd16f0a3d3417186fb095be14af2dfcdf0c2b25a81ba86999400c1460eb20e8ba9b30c16e6ad0a015b0dc20e31b19b1736a00b7b3e1be3b05b95fbbbb60516f850263746412afded581e6ee969bd47811161977240652422a5e93310dae2d4c4423426436b598b376c49f3f7ce2b9307e49e0ed0bbf576397c7bca5cf1e563382904483a22dd91c77ac702cd3759fa1c99be6d4ef9fa5199aea3d90e8b4f2ab5189c8ccc70807d0275215ed4a9464fca491360950788dd1ec5aa9dbbff165e27ca60ce61138767e3436f058baecf3e258fcf7c21b1abfab696d4d62f232c4e1c0b5acfbe8332272d4201193f98e3bbc645e243dc2b27389e956b9c32ad1186274b18bd45d753a8acc787a91445182f200631bfcae97f1b30deee40bfdb536c829ed3b314e78825c1bfdec3c015e95c747020aa307d88dc48535e681d430fdd35f19dbd74a6883d8dc6b60818284d84019e7d64757842281af94868e16742323287f9f1562cd3c83e8ee44d340be4f43350181fce4ddbe5cec32d39791b5b6c2ddaa977882880f0efa32315311a72ec7e2fe6d61d4a02397179fa98cb2346d22af469d8848422b709425e5eac300d2a901255b39163e8c349aabe912c8b060c1856c2c66a2d2002862f006e5d950f3cef48fce26f4052e04e22867219715183ab26de7b43ecc418eaea91695c2a92f1c1f2d6f7f1d397689bdf998dc89733d9e5cc3f933c0295ad520ab709e0603c16105f40416e0dc44f44e569f9f1d4e889562a737b7754beb85351cd8e8baf8b799452d3c49a32bcc6da27afeb738b30ed819f8296912cb05116ae095e9978212e6b76a1f7b1165bb7daed3cd67af9a7ea97cf36b8ab342d1a19b6a4f95dc4dd81f1cafb2619d86130484e3deec01867c882c689414a613e54d70bd8de9b00e95d5036a1fc5b3b3db36c70111b26785cb0467c8a653ef64f0a5b8036f61a09ba9e590ebe28993c22a51e02e5501705fe05e5fa5a09713535db36e6e733269f9e1c2be1968bfd051eb46685c1c282650f14121ea5691b1116c201e16f56a6243c2372eb8cf37af0c3c3e0399a8a623b722afd03e1216811654fb4b9b95a87dd647adb7ad58999221fa1d12c37d24a165f753025d5b0c96a9026e46ce73e06b6937eaec7b58b8d25a66355d7057615ea66e58c0333d639a64c7a0d5b4e87e1e803f62608d89e151a6e47635a617aabbe8e11e2f591002c5c7dd98c6d429e0d535f7643e752bc0970ca676be6544fae18257e558de5f85ea0c3cba0b7a474aed322ec760729f7a60326bbe529d3d7a8abce06180113da9e2a3ab33603ce21d6e4c42f30a0e6de41a096362b00609bdd8aa82e48679192fbe30c7676a31361a79ec0473710b366dab58efdeaba8163fa03fc57f5335e893e48c53e379ef91a4d9d2ad48125f44e1e14d3bbfc30445b9c106d02550d468f595d9818c8137ed00c8a12312342997c391853ab745a143a168752ec49f0ba246752fd205a535447aa24b67dbf5ee0791b9724412130acfe7e8495237c5c6abfb4bf50b44e9124465e1bb518176f0d4f94e72ef8d7eb5d7448a51e1255285a4865f1339f50d26725931b0121cad7655fbd3b81cae4d5d190cd6a795bf566f0c1edb8ebdc21b85ded1edddd28613b1c83bb8fa4d918875578d29adbde9d0ff66372f756a39b6d7d80b7bd3aaaecf4f86d63ba9665f24cfde12680112925642ab08ca6eb013bc6a45670c3d4c54ba8788e45d44ac206e1e40e34a656eeef586f7f512bdb1f58992bcee0d03430581cce65954b47c681527150d89f670d6e0e1aa7ae3631c8afce37c12f1341f57f3a5cd2b58b4216542b65381f2dda3ee0fc1a63e03ee406c86ce34c407f7d4bd20da027e580439e413d69bc8c6693328e9eb637b64019fc494a227b8fa67505795b4f7ef65ae8c912672e8fb2aa0ff4233ae9c74a8e62e7545f248e3ed5e1537c45beb6e38dad45b3d0cfab9ff5554ab6c935b542e1714a59f05f4244c831ebdcc87c063e637802b87088ef61b4e5d6539ac09161a580bd10f773c298fa361cabe8d17808adb53ba1906b60dfe6adb5dd71aeba7a2149b66cd2584d5616fa7f9fdff527f802fac5723b299236aeddf4aff48c0460e98a91c1ed5b8f9da37373c01465b83552371d4c29df654fb7686d7598be67ebdc138b46b6d1f5afa4bbba35c48c2dbc941bf06a27e3a0a47a97cda43b32f222610203f9681953ff2936092ce1aeb684b39ab2349b40ed685d7ed0778f85d04f854fd0ab95939cb1aee38ed1371b93de3eac2498af360736c0c3ee7e4db0e00bf3557935f0420ebeeb803bde5bb8bb537ab12210e37860b8bacd8aa0c615399d5b065ad3d437e4401542185e97b9e4994d9e5b42eea81f0743f544391133c7ec0eb2f026932bcd7d80508dbb478ff24e21d1b041de943509e15069e31b097279c6c5f41f88005294858de5fa8453e2344f664e0a5e702658d6dc334f448b308d258ef616ed37ee80d11388238f5f476f999ca8792cb4a798486cfff4bf2146158306a419000645c04ec2c16da3786fc200d3818befaf2c4450e3540692ba7d46a451ba537f768740cc984ce752dc4babd3290a0726c9c936d2b39678ae631056db774e30ff28b0949e7c3e4d22665e59b380a730acdd60ce72b37cbfd61c3f940dbda495986af6ce259f493dac750fcf87b1922242310160995d1440a84c63a86a83dfabc95e60b44c21b01fd39c75ea6f94900b91f998612af66964e60304f0887ea371a00061c86e8130c10e0cf3fc5f7fbb171ba79715c9cf0a0799661a77ad9de4ff300f029e5a3e57a3b4cfd49eedcc0e7aac1fd47db40706ba7f1424825b784766df9c047a59d15c3c27ac061506e9e3785f990f1454c9ad956db2c8416249c0b61c77d1281f2052884f0543b38a81cda27ade65b83dc3ca3ea231cac5431699cd8b80ef6da6990a98381d6c5291d221d8979252a0144984b9bf6621b97bab3641ca1c6fe649b932c0ebaf690b492ee6b5107d66a7ba7790fe3886d22bcfff7a1e8c4201351cccdfbbff3125859853388b0171c69818f6c49c0f401372fdecd716634da602c78d34d192738555b37c2825349f9a06389cf912af4fd9b95d5387cb5dc10207281753f1c64980640b1e191415bc99274dcaf507e78aa7176192c654da4dee10270b32e0439ea41f0ba51d121c4ef873aee716ec94a989d4e2657b6872e7dbd72ba00ea500369e91d3ad09f67c1522bb37f839de4bab1daa8853ed80a731cded0cb3fa361974d975233e6222eb40d2210194317df9219ed71924be821b100ec2bc06da75f74ab037924465944e2390d2b9ae0dc1d22090264c0afa3c99ab6678a8fe4cde0b276f488b39fa27a6533aad67f167df775284beb811782b24e04b1a63b9c3e9bb86f78c12243eec067c3af252f2d93556b93fcb100887740727384b1997f33a4d098942e11dd2d8493146ece752e2ade23be252cb84e477ac1b93af86ab1d3f2e7c715b05d2aabc28de2e329a1a39d2039dd2d1f4ddf689a8cc1667abe159f4f0bac406ec857e13b8c893fab2e9717354e2a836874baa41942dfade93c8cc23cbd1923d6d99b6be89ed9d2faa1800cb2286da37b19794ebbe46add37d9d8f77e78fb4e38bb84b7d4e754c81145e04e71087244fe71211fe8b9021742d02eadc09da027b98313a3e83d9c95b22231f3465ad5eb7ca88de669ce395991c762e7824bbbfd1c11f12cec61efe6e20adec648988a44313ed5771d977106d6a7874c01c7001495e6fe8c5955a2e2f7e93c7e0dac11a4d7c8eaa8078035864d786a44a1d4a9ab7d58b1323c8202f9f1d04413251e8860cc92722cab7b2e6c5e4dfa05fda1d368c6ddd2a7de1678c5788fd11ebc8ccc3cb26095626624f5f6ab0c5ba28996b9adaf842d963ea945f069b31f6e9b3dfa45c260d1ec3ab8d3a6e15e4957f40377a3e83412f1c6ff346fcf3741717c226808e3c9a418cecf872b3b5af67c8f2426b570a63a6af4cbf266d26a34c06d2ce607a12a183124d9489d6e704cf1acbfdee9c946e0df1ffb14d3480949b5638a4454271c8257a102066cb968370c602d6a88ccc8e20bfb84c9947d1c100e3ed60ea50173c8380e1ade7170093a4d6aa14fa1d525260eef8824ca6a1ced1289150762db2541d165f1e91140701919f3ebd59b115831db147a429aef40da67ece661cc51f425f6127f46ffc408ed1ff2fe094b0bb5fca752f5991c69c931b96f73aa736db09976ef35310fb7c03ad19ac0d3642c97a40519c54b509e26cd0dd358d0aacaf11ada384c8e1b6289ea88c525352178616f1edd1712d47d11de1f17a18155e2a64bde145ac1e6e86b46b26d3703c8405ace4fef6f8c05fa146267526e348e680ac4e06fa29e80727564a2b06e2cb98ec4e5a29f8cd4ae8c3ab93628acf42dd6d5e2fa4f86815f803fa3401dc6247faad9938b2364f398bd21e651b886cfd6732f4fe6ab52fe9f9b3ddf3533f42f32b97f11ace9946199d49436249d3cc156592ae57ed56ad4014894e03455580d4a4137176d412130746299b08c4a7a5b76bfbfdcaedfc4ad7b8f722553477064005a730ef3f0ddf7e12e034336ec92a16f47434b5a470d1533192024a015f75257b9896d9535a1471329a20f6711d7bafc7d9f0ab4835eb6860b38b43bff29e80fb41743fd59e7c04efbc2608be0fcd3ca91fd090466521c320711578070dfde91881773560382526cc4c0ca1995cd72e9dcc97702fa6bae0bc0d7b822e0f94b498bc3b24b588ae5dcea821135322ee61e29504b86da3d0a30b8f2b3c0215efa868c194f562254f7831a225a5bb38fc2c0c42565dd62ba0d70048db78cc2960aaf3f82c181e67fc104697d41300e0fa57c936c0eadccaeba6ee924d85d4f86e56f6b0742e9ba3560bc456873281f718f95e122b1fb522b0a4902255a800d7080f6ab440a76694374952320e39929f4d32aca8a5ee570f2c824eb292c8ed2fa9c0359e52bcf78d9b7096c2956e3aa27514c81eb110537925462932d0333208acaaa25d0161a15385d8239d61215a04db7aaa75b62f49e19dc0d607b521e9e7e99e6cc8837e0020e30cddfd27794d828d956083007484c07b82ee7387a75c02852e2fca78a1b868b05562a5285069c50711e70d535f3a373c03f53bce9349f6b85f91ee6f4e57f74616c250b04118d79fd40bdd95cbb8cfdb2b9c176418e857197696cfe635d472a05e4a1f0e3e2f1c3517095af5df4c6d4a81bec41d15338e5f92839c4aff745f48b99dd27f3a1fcef41c9f1cf45d06548986910af7933a8d260921ea29b1e4aa297ef3f91ecb705a2baa69dbff39983892f6900a9de8d991f0a874d29a5167045c461c3feaf38d94e05479d747aa4fdd06859a6928f7c254e9da1f5779883f777b35c64694ada2140cba7a4aace9e499e440d08d9315732fe9b84f678931e269368830547c9d053278652d8dbc03be542535162a055d12794c61dceed723e62005f583cd19b04cd698d0a6be52225d6bcd5fc167ad3d80ef5a1834376b54df2a21e924b7c3c06f20f81285a23ec8579c7e99f28394ec05d5507652a826f4b4be4500e15cf26412b847d2e39d80bbf3274d9fb329329fc7aeef8a313c7b3fe13ee9f39600a4741d657645b9a05ec5e1ee8d29758876a9f8f19c3ff737fa8dc6694f0d593fbf23622f20d49052d58c1b7825cb812d9dd10e4554c220489a2e7a767e6c1052e9188a9e6b99b6a4179a727ca81e7b97a597376f7075cb4f221073636ab06498cfba63ccbd4c34f41902ad1a249bd02674693dd3da3e78ae4ca9c092d3f9e8c2586a295338de671a8036b285859d88940f1df03ab29272705dab91cb6448f7ecbf84d08fc47e1d578bee36b2f41739d145ffeb775ce089e8b27d4e1a2cc1c051b7a020b9bfc79686839c61efd23bf833d185762bb78741f4321e6ab88b39387599113f81890bb0254b8f0a3657a5cedb9e632156601ab713845410f4e69da8d9145c5413512c7991f98cabb3879938458f5d9059a06b24b5a0b208fb8e824d5375cc92e2845859703c232f84da3ed100611047dbc322f89afad9f0a5d07fda81e458df7e9e1d4d8b2edf41d4b4b4f39d455ab8fad14746a298a45cf6bb0eaff986212b196e3b820a89663c9a88449b5730b7b2dedcee4af1a7d4858ddabc96c931f1cd931984b3fa19accbef2bca02e81438eb640518b9a1700ad3739def0bb19085fec8f37b05cc0b017de399f41abae3501a03444f080e9b8212a6e4586e315d25b1a30669ff139dbae426c6cd6c5ea999a443bbc75792196a6426fa9013a1680534bd53b555133516bab9dbb93f3b10cb1f9d8f676940c7d6e03a75a00cc8d537db2bd2ecc361fda6ec3311f7fc3e7a4e1545250a2d19a7582a1a1eaf417850e1766e5914a7d3e6a6c231ed1dcfc2d44a333ec56a25a63f866082b1591cbc61d9f5fdc674bb10e16a46932ab9d084bf1686e9a01c399f32d1e887855eafe3685acc83efbdc07a71acc85c45d71b8187541edaa58d50f2c2d2997f63fb7aef40ed057da8e31d2d140ec37800f7df6847eda9380c08bfa74ae6b8543313580ca7b91a5695d2ba9defe407494930fa15c32dd30a4e85b6e4af81e3ab4331fc8a69dc3ff729408a96ba093a3140ff3e88de47957edd18cf2839f388adc045752b641066b15aa4a355cbafce7eaca39c04aaee13345364ee822550118da4e135de6e2e6626d5e3da32d11a24870395c12d3c8854e5021e103646c3145a7f2c1fd081e1c683c81f658a665081d56c2e7cea47b7bcee8e99bc037a19f3eec6ca7d6995390eb10c4ca82063d26efa442ce303aec560101809823eb7e9d48c30a464cdc55797598363d2fd072fe704c91808a2266f6f963b9e15f890bbfe8864294126934a1ac2a7fb79b402f438ab46119044c62a4d1c8765ee6639823adfc9775a9997344ccb73fd2f2bc0bd4868cdf1ae5cc71e8575e9e23726400f2a2ed4c99899567205c35ce72479b4c038f54cf79016dcadea2f607c5930be352290b2af96cebd4cc76f442e49bae1bb14879a3ef78ea5cb8b10d3dd74423711c838a03c5b7322c04b8b7165cb89ed5c27aa11948783bd6ed39687062819d6de63e4ddf437701c0ea098b58b6a562152ec6b042b8a2af8bd6178f8c73b0954c0835062dc72b429f2102a3aa755936aba76ed52d0beae102061cda3ff98038e8aff6e7aa24ada8ae645d7248b954c7eda5c3a488b343ada10d714474dfa506592455b6905de42c9ca34126f5c155452fb9ab68166a15c9f5d1c29f6741b76a81c7a92076ae7e6998a07dd8880c79f29654786c1ec2586c420f186930d0e7da41d5efacbcb7a3f5cf62ac0720eca47d3cebcf85363cb604b260649a38d063d59811f85ce691306fc6acebd201706518c82ceaeee029cbbc09a42157a878c1220f063a4191b4b6aba1a504a5df6997ab0da3ccb3f75749817358ea3fb28503774188e42ddb437c7ece11ae62d9683756de6f08feeeb58a67b254d68962e260eb93dca5c0f9eccec053d9994c60c9ff18674c9140424509474f81c4254fecd1fcd03ea733dd535f0716272c649526ca55098dbc7a55903da30591a3ca10e2642924349485328f6863de523266e2f7f5f4919404947f57e1a3eac6e7002f60804c626547a4d97174fd156810827eaf1ebcff2464abde5f22579b412498ea506a1fa0f23c281d64daa76a9d4b501061319f7ac0e42ddf41ad4a1cc80ccc276896ed87dce0a1d810c173f3ba67beacf6ecc40e9b97c9efb05bd1019e423f3f937ec694f7e39e1e4650ba998ccecd4af56a99b673ef034e2c2b559e9fc8efc4a04f97d5c60641e32dcd1b96f9064ff7434403344213523e441a300737a3f520dac5a091ccfe51be1e406af964d8a08fd76b9a264d2857f2261c881c8f235f8d1963672232e1c74df1fee51e38acde8326302cd509957237c33323a58ff0c188f8e37d3e45dcd22f63d5f1fb193af653d523bc29fb8e39b452a8f0f28387bb90069a00701326e76d0d4450f2fccdcfb561469519c1df97e0602980e8b83c1b27f376a2010c0051c9b7f7af66ef60ad4c6dd97533f701f03427fc0ea099961a8f00c76fa6ef22a63feffd3bc49a2b321ba1282b30edfb332689b420d54cd2a6ba6c2d3a0f105a879d4e971484cb00d668ee290cd0096c3e4874a49c2d7ed02d97c0a13616133417c143c1f7bc572c94096bc360b504b7988cef8bda2be3b3d4727c538c38a565cf885b5a820a306e81910eb521965c115d8de351a926c5d3b56ca468a0563514e6ee400c118a68982f02e256d471d83be595c2faf7d927740ca3818e5249f204d8286300d934e3e408b60551417b775a1f8c0b369b22b738fe1c5ed271a74c8283fc28c3df6250599cea4697abd908950a4b9846619900d783d5f831bef2f04a86b71e38cc887b7d2db541a57e4db8e692078b8a9a0798f9c0fe2af3ee3b299d3a16ffa1178027dc50bf97f33a18e477c15b0b34a6c6c947a369f823187fd9365ad240ac2c4615e0ae0b68bdc3a56379018600607f8f33ca98eb3cce695d880d92465dc2d9c6c4cd2de04387d9fce1bc189e27849c588286fcd6fa617b944284d8678b76979eb78cda297e72bf9e88086145b0f30c78de2bff7230c4ac86d2e7748393ae014abaf493dfa6dc076e3c7f900f8255556ef4b4fb3d186266f986f946a43c29a90dc1fc5764bf61213ef5a00c5e6642e50a18f741e97fa2525abc896e52b81841c5d46227c1045379d179ec26599ab8628fd11cac2629c7c0ee98d5c089fff5cf58acf6ce5633c83bee0616e8c58c4cdcbccabbfc481bee4501ff95e379b8a00dc8411e5c272ad1d695143786cfcdb5e8213f64b21a5acc58e5c5374c3540a72a0f8affe7e527e093e8d42c99831832239025d394461706cedc4b05703e76847520e14f74f231559e2a03aa328cc9407cf70bb001496a0ebb8ae891ca9c7833deac60432c072528524ec8dada1c3cd3c029cc0e558b2380d2a829acc0f4a462c7f640e794124bfe16a9bee4e9e09388380177aa2297eed1089613f644526497ca4e197921e95c227446d6c5d3d1d6e6411b504157c6fdea8cb4669fdf5c2cfdda58fec843dc31bb3816ca743a6f81644cb4d44d981c25d94da54c32ecf24db3364758c841821c437260516e85580538c7443b76a1708e71035fad83d724a5d25f108f77b1b4ac0c305dcf2700c6bb12ee306ab8e3631638e1355c01b0395bc43308965109b5a4a04ae0f22e2b78c10c869437dee5df8eeceec0753ddd83200c60dea1aa3e8446f08f05f42442450c5b25fe4e4eae5630580d17851e73fd08f4b6b4fc089466a4218a919d52c1b51d97e1ec6e91f91257d29a58e4c9895b42b900bd6f6e8919c63c07ab920c9004be53eaf8f2a3fb3e8630b9621dce2a49adbf603b92b75947795393679575c2a0b710200a3b063a19acf34e5de1d4bb0f1517c62643b48c809e3a057dd86842e89aa16847f466940a6648dfaa867ea2cb3ea8447fdcdd06f420072f3b7285d128ffc5d61bc2fceaaecdb295222c5ef43b6fd970c279ae36b233cb279672d3f011658ba20a3ff1f6e435567041eeac9e8dbd9a0a43fd880076c4d99b488c604ba40d1fc61f2f92b675fc5959c034c3c0b211b93ad922f21583d946ff1e9cf5444174fd56706c282767f5c2c661559fb706b75e9f214e6d0aeffeea0ed4ee318b4efb2a2ae4f837d7c13f26aeca9cb021d23aa29a6a6428c3e57c56d69a5221ade72ec93455a0277b3fa18f317d19b5f342abc1ee46178d82941d99da84ca6e2b0d29d61c4521bd6f353702ac816eaecb66df978435ebb06dddbb13b20042e19208b0ac913ba9025e35d68470cfa50fce576350a36d8cc9a01ad8858d816e6ceac9ff2ff55e20f6c8fc6298fb49be87d130b05f145214b3ab439d361ca46419af450577ed2362c8c44953d19a1249fb1a5a1c4f259fad11c804dff4de6d43b7fbf4ea6bb4e5e88381caa5ec00c9d2a7438ceae98e249057b2bc584f620f65c87ca0ce0edaa521cfae64e6cad2011a912a527f622af1f1325e100e30fe83feb8f80fdc30a97858bc4fcbec633e4bfd46302ba29ae33fb97cde0ed54c529dc9376d5abf5c68571ceb6960c9d2b733975ae53f5c2a60a6c3c634ee004195fa9d698e66c9f568de2d81e8bbde85c150a68f16ad42183a2e4c1e3344387111da0491ff70842d5e4afcf34e6996dffd2cdc00a50f3798c90fc9ca0838beb50222bb74e29f4b0e35dac55dde9bbcf101f534fcd84d63b2193cce254f410a0d0c0d7b3d62410c24c84e834179db4e9c426dc314e8ea4d64a6db398ee2d3a52e68d39035e5d9c53786bc4fc561569deb5e60b81ead2d6ca90c22a0684a612b71c09c9b16552a28d81cfee02278388f0f28ac82e91563d41b156fa5a406cb29a5548930f1f0332ebee087e90f438d9b5a1be15fa6c7fbbcba6079dfcad627335662f2ba131140e309713c1cc251a27e452a3d2879da7e625d969eafe58bae8fa8b80ad10cf264f2b33f7d21de5155f5d54a949f9b4aecf5cd0b2bd2fa8e17d0618958bff09ba06830cc45eff8474c26fa8e93b5e1646c822758dee4466d27558fb5b0865da0ed7c9e44673cd732a2b93506210706466bc1a912d5ddec4459f7d10eec29f0df909a2b3972c5531860243ea1067e5f053ccb6163d5402d4c05c1d17e87a7b339c0cc269c929f018d7d4059682e1c09f75b1d9fb91c65e3cad2aa8e9a2c4b28788ec23b324f8b304f050521df45d2a55e9f4c26e16fdb19820efdfaf491ec1a34e02979626db141a1622245ed9b792d7e719e7ca018a0863c0b0c4d0de0eceb594bf63a6853e6363eb4d6e3c962d087012a30e1d38b2137e377fb2cfa0c0ac65055122aafe79785b1e116ceebe5584e7b76caabee88d67126e4c6b7b9fc04b6841d5281099b2d14d5abcb8235bdf0f14a5e5f8355a658cef6f60f82d66220d416689e665a48595842242d746529f97442d66d7baca82782b9cdd1f64d17449473876e8b8e2a551aa665e3d6e7083e0f3f0b7c4461be7f8ceb21f762cba2a88cfd68cafceb90394e5436446f954dfc4b7db136af4dec5f5cbf3613f6a961ebc284fec56d6c832dca91ca09c64f68364d3efad2dc1b32f743c1b36c43a7d85c8c170ee61fe171ab8e33ad67fdb68d5401c46bebdad2343227a5ca8a9344347c191ff789038fee065b8369b240f6008cf7d44c84bbcd8856eacee53080a3f9ceb375775667df6210922b1949151c0b2f3bbfa2c48a575dc543253651278d5ab689aecb5a9a868e7581f0bb134154599c946651d318d396c2e3c4f64f599e6051ab15d34a3b056b2dcdbc660690bcc06f1c7380553ca9043a69632e4e585a8dbf81d2e4d196e491460423a1a4aeb9d4e3d323bf682d1149ef69ecbe74d8c3ea980cb2dd06fa3360e14baa7aef1df3282e3ccfbce8c018d9b00e26ad26d7b3cf83ef12b713a41093ea3a180891088672499a646796438580c2bcd388ca454df40b81030b17101f79738a054feee9b7a287794bedf434a4b9947dd857c22c76f80557002792759111456e1f7cf176835130ffa58fb0c7d9b07686dae5bd716efa52b5223ff8025fd07a52406005d729822c6c0c99e8d139b9af85178d28dcd732876014c13325c73fc737d427b5aa711bdd7823103dd9c59ec2b5d49d06b558ce2e07b6e0961c12dfd8a0301ad4358606b40f3e1c4e7679c41373f183b0fdb8df3bf7dae678d8db0f99454182a7bd8a9723e7bff41e9a67534da3290cbd576944e922cfc7a465b5c8db325507db0d5194e61699b1c877898e6ca5b435fa26316aa954dd078ba076a4979a0f37a8faa31208378d521f18e4f14cc1e07d93fa1abd0a3b36f081c8e02f1a2c146299ff539b070bf3f0aab232302ba09976ac46cb8362dbe4ae9e52bb64d152daa6abc15ca7113810325d7d86b4c0dc4081a9d70bac7b0b84dd7e808eee6b14d3cf7082407485d04a18cd2ce48e1a03ca192300f2b22a769b9c4943e16ac54c2f37af270ab9ca20b139f2727a3aad96c78d08456cfbf8f2c5eacaee64e312eaa3ea40f1a1baa1ba3c93ee10387a21c066832b2bb26b1ef57101244384c68712af55c1318f7a0e830bf4449a12452520897c54e200a6926a86b0d6e09d73e05d7c6a0d72cd35b0187bb92054867f808e151204aa1f98fe4b54322b286845511ebaa240ad906d92faa6b87e2311a7ebec614d10495f80ca30d36f734c349202f5f604b2b89bac075ab845aa4c9db8778b493ab878ba4ef0b252dcf489078f0c3b7b3cbe4867ca999cc5cb2881e32e4b75cc07f2ff888a23913c2aac7b584e4ef78ef67d1fe33457d994bb95f8532abe6ee33480bb333baace8ef7d8ee123832dbe098a9ba2c418ba33aedaaed74194f2368e8b44423f06b89545882a101fc1370d03550678d4e5572ab88e896b7596b5d19f5a8eb8968447eb084649d26ac3bd66118655f966254684688c34441a0f23df5c6ddb53935e9aca9314e3758d13aa4682ba9df054ce7a0bbfa12b742c64b6a285fd5f23da768e821c3b228362aa6915e5ce32c441472dc4de6c5fb9fdb334de7dbb7e5f73bc19e736b2a32d1f3a7ab8e5b20e265e5efe22cb45d92e2f8f81a4205958a22ae83068d6193c6ed00eea68d5f99cc44a6332313996772263399e9cccb2cd39993894c673eb399cd7c266596f999c84ce6f67fff7c7fe5f684cdc27b9088348fbda77688441b10334b348b1d8e81d3862994d7b86bdf03a5ca1411b01840b98a616eaa0392b57f5baa4d3822aa4f29429831cface0104b482c8ce8d3321bff08f0bdeb50eb7caf5885dc2bc70c347aeaf20acc17154ca6cab717c821071a67a6331a77d65f67b1343e4c5804b531ec813c99b6ddb79a6b4a6ae3f2476c7764aba7d6bfdc06dfa768e83328e331f520e7cf65608850dbe21b221c0d39a1766b0cac3d825c973cce3dfa30ec37ecb00bd00c65f570fc33220f92ae566de752bb11a4bd9d6fa9858fd1df50e65f2e6e32d63775db0deb40ec7a7ae11aa007cddaef4f77c0cf104c7d553e3a31410c9e058e72abe9a522fd935b9f2e843daa11a44d75d6ddd45422a55fe3561e36801c858bf419c6dd6fb14a125911d47163788b15d5b59fc1397968dbabb9e4fdc50fc5e0621c533c3fa514ffb19ce4acef0918207d6c061b14cbffe6e37992fcc460bee104cea11b5b98c2e1560feff947657eb2d67339943ae97eef254f080f8ab38883c0bc452f64bfa22cf5e53fb17596046c53c1c1411cc69225a747278b47c4728083649e43e3bccc36b80ba1887b680e7ad925a40b3df02a582724aba9025d540bbc26a648fbee838bcfcbbf7a3981b98e1102b79cb34f9772e7deaf1934b270026a10d5586cfd57e490b761a9e6c56aef0e0b09a6d132049c0275145d343c7511ec280a0b56dc45b4957d4b25cc7fad178eeeab3d72b4daf26a3aff2d5ac938cf3d01d14ab9797e311498dbc43f57e4b3525b8a2fea2fd00a2f80aff1879705be767f8edf0f3d470c700b328766bbcbe45ad4810d18cd932dc277713be6ff1b7a478b544907b37b834573a8a0f8a7cc26b8f04119cfaadb0098c7b2b140903c7cd43941cecd3ce8c6ce3f613c6f5a630de85edc50a80ff894b2d2972eccd6dc12003b0577b7a792bd97f3118589a91c39a53201ae45a727fb777663f536ed3f54d3174ddd1e516202938d595dd9be08673654e16aca03b22c32344a6462f4438aaaa1142079345b95c8fda822223b8a2d71a410ee4fa79a70034db537bd5ed13ca26d91025880f41d62b51a201845e9a4c7c8d7fb7027dbcf36d7a8bccde6d0e21092d62e33ab8a1075e6ba056e7b8f612ee5f59ead481c41cf07d2d9037734ec31551a5801da08cfb0086dd778a297098e7443d2311cd308bf88e2629ca091ab05510728e690ab127435622b4156e25dbd05f65e91645d0c16426c8c3b7e53e1f1daecc1dfde8f3917b87846528d51fd6b3f1c455ac849a32acdd16dc16313a354339796a07034e83cf6387fbf80514170ca18bafb542bae42ee8e88848a4e45508d15bb80f2e7ef51dd6d0ae6682820f817cbf914b716437e438cebc51f4258d621ce4362bce2c7e3bd4d8775c2baa0d1f087840f63969341ec7a04124a5e1e9ad3de3949f579f2968b934e726edf2c1e496ec5c41adc2491d6acc7aa7d04afc3c695fb8b1ff125a43357a4c73610a8349207b17f204884a8ba34d7ee1e3c036d0da0f89120827b16280f93b9dbcd5618154fbc1674c66c570a138fea1283ce65030da0a1c692c56814dcf98146c1285638329411c45cf75ec54fece9e58fce9430f500b4910573f6f143db32a74a93fa137a095c639e947a213a4e81ca8846c16ae753630ba3649d1bf26701638581c7c8bb3ad546cc96e16270cc41895658d118bd60b42379cbf8e5d2b38b93f4accb0c50b5c6c679afa8714fb836d25a73f85f0356492962eee88710b5c9aef1d10a19b70ef62e6ebea70b3817bbcd520c0984321f4e5b17abd9e29d7c6602f5404bf8667106a180600f32318d4d6957d22237fd2b9d422d23056693c292a376e679d520f32d72ce53fdb18d933e45acc12def9f221a05616d8af352825b710162dd25094666f517a27f3324c093bae6033f5e9475fc31be6646619a99f359d97b6eaa69a9ac9fa30c3d99e8974351c7441ee829137ba2d4b8d684c5bb64442d85bd141c7990d24925fc87977057b0bc86a424ff1e03ee8cb610faa0abad5f94f97912c9a287796071e57dd6257f68214eca2037c4f705408d5c88d00ad86a76d78e051a3c7d80e110afa94d45316747fb3cd598521d42363bc3542a64d67138ca3f6c0ac00395606f385815f13195b591f036caa5bc79e5270ed4c5337e2dbbca0811c04901815526033c866ead6ce05a68c228594ce3e999ea12923c5cfb5b8e4b9840239dd444c3c574ba006ed2be06df45180cb149d17ca9de9e31fb97eae198d9dfdf17e4a3a02523855e7d6cef9a939c40e6a60b392d36b9602d52a48784ce50c1a94cd7e7f3399e862ad486c08017ab72be8482a86281593f51c7d4c01b6c4de6d9de6380fa9aa54db48362d2e0d574c002bbb8ed600197e5073e1256420a275e56ca016ca30da11ca83327d5abbcfa2edad871722e57a0e398bb14df25d33d04838a48db926024b48a98498f992012b64c4a9659a3321283fbebd10f96d2b8bf7d8f02bed4f5b0b288f01c4bea5a58bd97f02c724992ef1b22d07d0c370a16030184ebe7c791c714c3da90ac0f2311e5bc375bbd039ef1d799ee3648f270d2b4906a7666e3e4bb6f5a984c09aa8a6c9f509592cc00cb9fbf9fa221011d132408528dbeea506eba9e8cfc9ef49b2e053d042b7d87bf9fd4f8fc1a69e463258452e8250522b905a6d5fb8589d4fa56bc1ae68e1232ce07ff07bf39425729f9f1fb5b0b9cd70336e6344df752948aab5cd9c8373b1996728c6281c00fb98a7798d2c9127d5272757cdaf4fdb6fbdd3570c5bfd5d95161cb6d37e402a205f045a51fa031051065d400913b35251e7d3655e68032d79a0704f608dbd81b271d2d7514e11ce55c4170cedc57c59a089ded23cae43880a060fd03a4f5639a9d32ee582a1c7f13c00da61b72f40395d3e154e5d04b750372e1dbb74fbdb9a12b4f63a5956c2126a57b0fdca72b65785af069db4453397b08da90a4211f6785d7da0d3a863d27b540b0f4aab8611e0669a3e774c97a62a00fbf607aa5b91bb8e8c39c453c814607031c8a93e301aea5920dad86c74aa8ea413b7f6707aa9bbcf14d8854f89d1df9f26f757f24f1832f05d06366afecacf9ce4ee3a269376cea92ecac792d35ab886ced38bc8f9b18cd7767f2e26aa4d43f0050a6c8815faa89201229d812c44698bcba563822d3a66f47c72174e6397144883b5ffad6a2af4a3063c234c91b76422dee4df5024f966687601fe9a6a2e21c351be7bc899de3c9d751b6a455d4edd9ea79bcf5b97d37748972b2bd459ed08300956d631d4ef84ff62755e93512a123a0469f44c7228255b4c453bf758d4738c75044b07c6377267db428d0459efe128e6bb7f6bd7f45158068f5d0eba4c24de65aee94d39ebeced73b39ed91c999da6f922b42d41bcf5391c88987dd5a3db7e73bbdbed3087e4fca2eb512733a0a6c9edeae02d17c0807a4e3f3a5513959fc2d85729aa671082bfa740f325048fb92e9b42dc159dc3906569e8bc04b861ccd2f2c903db87362ba071b52376a324344149a456a2b6005081c3da30558dbfcf8c3510ea43aa5a05cd9a910b6c844aa24264657564f08535b65f0af12c5906856b53ed0b1dbc441955f1180b4fe74bc883b042be796ba5b84ec2dce45766116eeb08851dcbf95cc8933e2c33773213e495c3e0d36759318f7912f9be1ba1cce34a5619093e700c81154ce780e103cd12eea8531f106b5bfd3dfcb48d8bfafd9bd85750ded27fa236e69b00c05d9cdac71d7a12cfc5f742e4d95d9b7c92a976efd1ae9beb0611ad3b0a4b5c289610d311f84665f78268e852fccab909bc4a279151d43159db9549802206cda076b08f70fa4677a0834be63b8075d8b70e21bf7e88447000da926872c64525e26b31f43bc94a1331f258e67390b1a1b480ff6ed7c95b5e0ca5fdd090737be36a0a5211becd6c8684c959bb0bd4662fd99081a0c1b4fc28ea165146691b76c7935302e6ab157c979d53491f1f958cbe4f5e9d417598d5950e990f5dc323fb7f582e0ac8751a26d48b081c035c19b0df66c01fe0e92f40c2d5f281961ccc1814c8d8f3aa240a2884536974f6380520b8bfddf1fc207655fc2ec667ab0fe9cc7217a2cb0b2c66d9323a97d1b9ec028d00e09ea6874dfe98a7411fe27439b92551e49006f76e3cd4382c8aca511185667b53d1e6804a3f9dd07f332e7ff2381c0e38b400f4082ff070c16439cb07ccfb11e47f5dc26a16f41c2b952acae7a9ec5e8dafd08178bf72b40f8edd27553d53b9a07794ed849a1a63797479e23d1726d6ed2606094768521b81132ed3ac1cbc50bb3632b64ec39bd8f210dc497a9e1529503c815dec14a5ad06a6c6250e97d638fdaa9818dca7f80f4f9ecdeb998017a29415cce56c14cec755ea9f19ee6b26fd63f675308b2b37895e5c31959012a0041a01a33b67e4dff21ac57bd518ecefd2b516f9c730955ca944c3389396c64db9e9bacad4c6996005ee9b3bef484c6115b5707f566b87a7fa8cd976c32e4fa19f148d04b86d84372517df8e8d1463c4e40e20b66b89940df74f0fde3439db79cff1f9b18a0c3c2c6247144bafa3049e361ce3d8cba0772c28c5bb5670bcd121304def610247c3885bdd4b1e76a755090654328bdd7d2e272c23926ff048ade7891df87abaae7656f4fbb52f9b21d549b0e8146988be33df7bf1aef1ad84b8e9a04678d89ce8d67f9fc3d36e008811d28f4d1d60710a8d45b76eef381749e5cd1007a140d1aa2c767b1f43ca24791de9d57080d635b206f3c7719e802d02a56df97b359c5733751d11b62f761af40a43f3f5df641fc848e03a0c96eacdbde1ca490880478fbbd396c5f17073d25a16ef61402100f9f5027a2e53ea4a11d718d2bfc04235c54603cb01d5a988952dadcbb89f210ae8702cc7d1c84176969817c790659d72d8d78e4923e54674c8eccfb7ba050ccf8a5231bcd39f3ef58abd40521ed8466cfa3fdd5963aec45bb528ef20ccd6ebedcad10606f3b5cf55e590fe788cb75fb36d685239d1bfe8cf201ab136003674548806f46874a411307d066a1332787c5ed0f43a0e0064ac9eef5956114933c43bcb1628f4d5de9ef5e99d38eac2f9aa6a7e2d1af78765234dcab78966eab620b91803f8ab86dea42f05f0f66d122fc4edde895a7a4b78d5404f5520f201602dec68df92a52de075ccf4d603b601a90ad9de727d27c34205b4dc83308c0564b12b6325aa16c68da2a59cee61410226b228d34fa1a336812c8510353c3b163ab602608e280c6bc72b2766535a39d3dd14be688931239f30d3e82e16a18e62015b7003af50880d08dca357d73f3651931ee6e9ea890d836af3d9b47a60204f8044224f5bc632cf9bc20c6320e35f2e8ab85ac30954585c23276392da60634877cc68ba54288004c8b8101ef1e66bd49b845b0f58d3fb95c39179c9879168b5ea48a41d73fcedf21fa64be09c14ca8167d7d8524b2661ca98f1c4a2b1bf987fdb3dd625277eb08f98f26befdea91017f9a178da1bec307aaa5b9136ed882b816517c7808ec964db63cefb6908eccbbf11ce330f9629e7fa1210448bd548e48c51d674e0e50b886dd8fa76a935381c190eff7afe4ef28c7e00cf1adfb3a2eb928d27be3378aebfd48f9feb89edec0d261a050580c853cb0c5667517b8b1c6e41cf2d1cdcd0797d87c3112388b7ae4c7c595bbc3cd76bc289cc88ef8a93038d6775d388f458e3d6ca8ad27ca4fd423eafc2bc16b12d572acce8d9d8d1b58bd21983c17b83e5e3f50826ce20fc019400d65341dd24594b9e3e4d8c84dfd6c601be2a6f021b52e7af9d2cbd432fa823f7c68f59532907c2ba090d574069b5d4ebbd12333d87a4c96a0c9636e95fd32805db30b920a23a248c24fdd790b26aade57503afecd14820cbd1fcf201501438eddd22d7c2506aac2d0cc6e4aa3c2d8bc1552885e46cd243836700d1ddedca0acc0ffecd601e932f1fc6c193dca35f8eb3ec0e29713870fd69239a0ea8f49cb99abe59425a2240a5f49bda4255a93d6dc4adc7d0bf61bf803440ee4a17be3ce87bd714168d9b0900a75c34249b8b7f515ad76c0c3923644cde143dea7928959142e12724bdb85d613da606160a36cd9544c7717a0d749c55f1ea0e2902fecec4a67f9e7698caff6a77138c4572197a6530e0ccfeb4ab05aa04caee812642b99228d24f6f1af97b84075746db0f5bc522b58192c0ec4d68004510638db802110468d2f6708ffb5b3fddc9142636c23fb294f814d9a5d53884e95d04bf008a5976886fcb120fac371efd1c2f917df514558c7067d2a7ba6520de22fc7b3c1aa22d4e25a2006a189519f0d858726d8f36b074793a7efabce005ed784404c01217422a0f4e50f2f691212581113e42a1e8958387ce0c335c235d937c3926f65732d4024ddf7f90a6c32b9fcbcaad6ae2953fbdac6c2009364185e719ce430cb42f3d994566ea4ad3cd82acdec486ca8b66dc0fdfdbed71684126daa0d70a9964b6e64c4c5b85720d8ae728331eb23a0f5b810e64feeb986367c64fca7bd3f556c1be1dd1466176eb079074e9c064adca8864036db90faae3cd1311925522159080295219b6fd99af3f02a97d1b1607a78739817f1df950ee58726f61dd3a3cf8b69494b5a19b91f5e47d0b957ffaa34404712c34b08c63aa86be6be371198d431df7fc1d1955a2d0200a465de09657e911c01a4cf827156b1146d84a621753ec8986e9f4816b80dc37329dd0827db54ece4c7c325c99f24cdd0c1930de11c8491aad3d76a0481aece2c64b92ae0a07f39a8dc92aeee864c5d5c4129764c88484c768c50a763c2326716511156d2d8a796069d10dbb33a1a0da1f4d66fc35a4e08fce43d13f8a08c30177de13836bf09f21a518456efa40460f5ff07847f9698df6525e3dbe29e49b5a84e902850555d6d0c580ca199f46740de36b87c341b7b9c1aa88af1e9daef98c3caf4ae2fc688af70fd0b7357431525796a04833983006a628216bc4f6b524a4993d0856ad7aa43fd611f8ba1ccf6117880659c999a3a1352503e9209b50ed702598a6b2f94f36c8aa0159f3d729e0254560b6af94965e45476e429433c94ab0e0fb62d85b5077c86a4638b760e2fa446c430cad236be67afe587b19af6ff74ca45fbab58a4c3c079f580785d57e832f3f1ccbcb9c9141b2c263d0424e05456b31d65ec3cd6c191b072911735c1be88e723f389be6b88926700efa2572a7fe8d5d357b48c87b90e455b3940454cee42bc8d129f0617c2ba6f3a818be33bb4d7e3b7e1a1d8d843ac3bac4948263264222332280f781d6627e01a5cd99d7d6ec7d448e7c7817a0c3981cc62fd0c64ac3c99e11e8d333da40e525d376f52ff5466a71ceadc5523ee46bf45fb775da47f9d93556db395e9b774e9521b13ebfe406fa0530949ea157d8e1943a1aca8017d8182596b57d9a67259d9dcf26fc27403c54838f374b9d6d2bf0ee48e2712a6196b03daafacc88270df9b867415b02239e56be9b6e8ac1a5a06f5549eb358116f2746299542292a713071027130f151361fa238c2fbb90fa3a6ff2ffd72a47809032bfe69142b98a12a10787dd30d4a3cc27cd32ec86c0d8243c1080bd53a42d412997024fffd5bf84a965b465f469a73c181dd265806298e3b98aabb9ece777d97f87fe3955ed17f60c7a3383d760aae851050e84fc03271642aff60cad984ddfa3cca1454fd60fcd8310f6078f9660642197ab8b4dcacd9ee33e2930df20f2d9ef08bdb1ec14bd883da5a2ec96d0f37f7374d87925d64ffc37cd1f7fba5522610d603d19da298fffc9d89ac0bad188ff7443de3e9a4feba11b35ac48fdfdbd3599f6a397e48297a1ffdea00ea054f908630c6affac7d10a8aeb060f92bc0b1ade791ab6c106edb48113aa74b5c61d8eeaef137d5586cdf6add0a58d95e3a12d4df3d46289342c8ff08774b1fb0517531b7741e926ea5d5ff309200b5daf384075a69a6bf54c8ba8d46d4a1da95f7075a592f11b207752c3fb853a518f27e838fb56109ee2c5d48e7177e2a0b0a8f0fa5ca9f26a986ec2b616eae88eda9be1f4a3a93c9c89f7a116370d1d9ee1586b319e5582976bf67423e63c00fc1c3dd70bdfefedc814f7123767dbc261a33955ac2727caadf821bfda0e76d3e31498419eec8d032a48a0b723ed0c2b3324335820aa6d5e17b7d48f334afe03500f2e83d0774586846099cdee7450d25cb43a822a2d318a819f566465ca907e85269ff8e0a88bba85b925bc3af8acf74d6a18d14407bf91f2feeb24d720c4beeffe6104bdde8f6b8b80dc5ffafa53a082218537b59e519eb9f88924c9e76aa9d4df61e04cb82b52b09df700f37a2230c0fac41bdfff959928dddf2f719cacec7878af3a4850b43903ec30ab5ccd1ed578d43aaca7a17fddcc5158160a8f6f46f0a9eba863d75ec57fbb8cfb66301788e7a322b8211b40e88166a89231fa8a1aac4cb8ad30dad0e78707ae45e9721cc8705803572cbb59fe4ae7dcee8b021991377edf7027247548163d3283424ae15911f93713343d35009d1df4cb6b19c51b28622b0678e5a3ffb489a3033bd18a00f09e1f146c856f6c9986f0854eedb2f437b76f227b6eff0ae3f4d0b093cf3739645f42e36e00bc65ccb8ded7145ac3474d55cad86e40583bbb4d11d6a9b982ea43ca8b65e16e6557ae96552b70f03ff6e08131b1f9106005152a6ee7c8f359afa4625caa01fb46b61e449d3daeb42263a58b0331315443b50c0ae7f7c641ecea78a4d20a29e21727faf667ebbed39d8b9b1f372f83119d7f2e5697634f1f904ac921f79e8141167c942d5be96bbcd49d4aa668395b4a656b9dfdf552e73aef58344caca86e53ce57c2fef30a712d36b248262217f63115ad1612be1a94fe42b0dce35fb50eb50024fbf9b9ecc4e99c7d884f510fecf830c770027d6812f075ac5ec4d4d209194d1c2f4520c8965de9941565913932dfac152fb95774d64f31c68af0d45dba21879ec04b046184975f8d4c631a34baf6258aa351ce69759dbef4b03b593decf6a215624ff858b11beefc6dcaefa631cc30b11d403359ae1cb06636fc72d23faedef755fbc8535daf3d49309fc9a0183862cad4155ad693bad738194296e5e9012ea06cffc159091c301507b0b179271ce7a659745b95ae87bda7229839740641b58bdbf4ae44d45f1b61f48aed3729c78a0121eecbd177f9802996615be4bc851af6df1866150b9619474382c9e01f23103bda1b9a82733964f1fd269446ac7e39a43416d794ad74db8ee9f296fc025e5f161972ecbd825cf2f890f324aa19156e569c4e2dc339dcded5ec6b8d0dbe41081f7eba511acbd918d8c235ac1a6046ede7c3f413de527fc65b0d802cb62ba822802743a80fbb6d9e0c416037f3adb196e5c65b329039231c557d021694542cda3caf8fe77db0b5ba334239d80f222fffb22fde1295b8b3c25d27500dca8bc094e1d5921a6c2e4bd6499196d925520f8f8c3c8a7a24d4f0853de7d445bb448efa199d08ba3434415b5296555251811af70727119bbb81c67385eeaa19fa0b9301df6b2ea10b8a601031b100143476d2d67f0ea13feae812f9f0633917f696567683ccff2f2aa4474742d80ea0e47b0b5213781705d1c396ace13452de2016e8a4205c6dcf4d8990d31831b4a7aa0817adfd96c29d4339a6a60fb6fde263ce4d9f5c92d4753b503b6d6396a2e175db03c4515747202d95f0635ed58b6e5c69282e19120fb09c63a1840044df333808c70fbbed6c49ec629afb0f352f003036e01162774c0ac9760a4eb136898271bf1a2ef2eaecc174a7272debe34f0edc473c0264cd333315e926ace4a741b5ce2ff3f0f7ae425ea2e38ff46e37d358f9ebd952c9096179727038c58e3065fb724831ebb0c4441298941712e357a0b5883215bf340fd54d0c97b8802a363ff64494d6c78edf5eaa8ca2fdacccfdd40627ef22919b74bced832721272480b0af71f85e009761299f4588d19a91aa48455c35ac197081f1a44eef9a2855b90ff25f8411808981fa97500875cb2565db9b11001f8aa8f140301ab0cd68d45ef03dd2bb572567187d8632a2044263f6d46671be12532b2b99d7814d7f78214fe1c644661560a05e6f5966ea7a51a5cc01d5bb857ab8f6e8f971e9688551d075a98cb43cc3c57f9904d94f03d3b714af7f7ac954b06adb7800f12e27461563fcc4dd3dde87f9a306ac8b24c7e589b59dc82aaccccad61f57efbab4d65d3c7725c097f76bf35c1eddc60a02aa54fe754ab6bbab2fde789e5e7e347e6c977b2906d20b748add61a3d13ac499415c48c30ef58a840b35ea6bbc6fa87a4d4e2eb198cf170c1ba24363ca8a2bd050035d45cc4bcb4e22964b0a564e7939a25ff1d5bff62cc3398fde91d9953f2258848d92fcbdeb1db5d93d64e4633dd9a8570d16c54052bfeb4e1f8a217e880e05c23c4810e1604278c27fc82ac5711c3bca25fd6ad5f686d228c4e35095896602e5378f7f3a830396c8d87e16ab0bf4df77068483f46133d5dc717e355334d72aa7585586c435c72dbbb34dae5d594f929ea8a52c235e9747c1edf1dde39933e85c9a10f67ff45ccba0eb25b42ccbf294786d5c4c7d46c18ce1b30318342a7824900c426deef74a90470a9eaf2c19ad72058cfcb305b38f16052417616ad92b26fb7cac1bdbdf4c4fd2ebd5c81bbccc2912a348373e00ea4825aa0e67e26162c699743c53a4031ac09a3f9b618f1d66f6fd5f9d63cdd70431be9f443bdf88d8289314ebbd634d25960f3f346007751ea6ce3b012a689573c071c1e56bbf6707cc564d4b98730940f54321661287555c2b2e418a5dbc8a30150f25b203e1111549ac4582030d0ab7c6a9882a1e5beaa980f5888adbb22be6ea02738ee37e9489b291c76a68c38c5c8cc69f0c678c478c67c48207f64b723ef2cab4ff86ae61a171c5416628541bca23664ad2876065910d918a4f5d0ba7f19aff96496e6c5760b39bf98aa62451ac9a53daaff4439a807dd1804919dd97fbb10300bbe9d06f0c035c4b6a668acd67eee25ec0e3ae06c4672f7016a49d11170d0bd98cdfb80bcdbdf8767668436d7a1894b2c5e49373199858becfb5e8c1abbc25d1900f68f08ebb69eb833cdc7da4a2416badf11621947c831c65e2130f10f0cf76530388361fa1d83205c3a51d05e2c20f57cdfea41c802a3c611c0ae2a08611fe54d519463cab5270d169747c20ad79c5359f21c2cdcc1c11879557d6abeb637fa7138c02542227a6b01304cee50c4109782e082a865878df0fd7432d05951210b058fa5613dec8a4227e724efed1e51097dc69762ce6fea0addefa99b19173a1ae1adf29f300d07de216699451b5b2515479af215720b5965979f11c1747155ab47382e6293f3e31ddab423435f03be6f3699965fea6e5eb78fd55ad7ed10252996d38b958360b4db1dcdc525e0d9832b5215fd3ec7caffb84b5f30676e5d6dfcc0b77bb1ee33d429105c529841e4647f44d689f5e38d60a17e12338734809487eaf23ca95075684de2e02017dd78d158d4f7ba5b3f223f645a9e966a31d1551c34035c957b5cc58e49c0265af33bba6103aea7b3b060fef3940385d84ad4da4b805bc486e70aedba29b76094835bfcf7b85176ff6b2f11c69763eb8105ad22e500afa91334e1511c2a226d7e369854df43bbf48fe2279775a1578953f85d56a7e7e4547b6ba731525aa6d7f8d53d01e6bccfc34e9dd70a037ad14f7113908958350cdb20fe2ce8ffe669f0219572ca78328fc1b0efc2695f32e2a47be34a1a83c28d4fd6c1c88472d03bae4a5ee274a532acaa471e0456592c208e7c972900f851c77926b9d47173c3867e41dd99ec473a71fd50f522c603816e0293b14c50f0a3b25c12b44ada3945da1ca691517ae504718d0a10f449c09c9c42a7ffee769465620359d227b5df0576b4922a5bad0c2e1f739ed339a0729d0189beb71a71e10e2c354defffee92528583915bfb30ca6399ec2a3e7c569b41372f587c7c4a70988ccb4cb0ced614b3842e442cc8a7c33f9f3b2096bfaafb903e2471814a068c34ed852509d3074eb35efdfe5d803841f25dc16ad6bbed0be4dfd5b19f782f0d75539c7d83791d7e4f8b72d9f3140fd7c207659cc939ad751e8834d923de2dd54f9c008ee17c1974afdda577e0fdc3adee7c8049d10a443e1e9fdd195e245e1c74e9987b2644d33d24de84ebf33320749f1b51a9fb479c1e97e269ea9e88d113dfdee8cf59cd6816b20470475f455a7495000f0ab83dd26782ad721e661425f8640f89b713336de3cf46d95a9f2ded7ff771cfafe1ed5a3db265cc1fc0ba855e60eddd9ad858f1ad061c675a1bd232522d6cfd6bafe0abc4d6aa3528cd7c88957a9cf7c1b4c3639b6c9103bd9cf754963e43d77c1c6e9bad48847afc181d362d54684fb196afe24f22fff3eb51e9ce8e22f1476d0bcea1f92195092dfc98fee591897a2f8957284c4e36e65b5e29d7068bb0128bbb57d26660ed8839ea2cce70e1bbc2377ae79b35ead271139781c7995874339cdc6ac0d4e76d20ec20b1856e0edc033bcee5cf1df1df794e2bb579003ad76a674e08173cd641542328ce8b11ccb0f4218af92c95d7f802f3809d9b1b8ba1a915e927c623dcb63a0405489de65e898730c61f25c0e0db114445cc07acf5e1e7d3952d21a488a17635c0d146c6cc100551825bc8d44419bf7c88772f8170981fbc6a340c54184f7f39c03073a838270ee6cb82e6533b7679e1de45bea287b6790ac3eba6fb1f8bcd3266c8deafbd27d6173b05e5b6abf67ea760e8269742a67f38d9eb130fdbedc52140ead6a81438e356b8c59c0701710adbfd97fe7dc1ee49a1bf70c858a14add81b8eb787a159b5675186f8e574a13c997d19e5a2bf8c134376a17c304f14986562d24432b7605b0d6cb1d499e78d45c7d915c93a963f71272d3f52e6e7d796a22abfd1ad7c0d8fa109ea6b7cb78ab107e0dee0f52d2e6700fc39fbcc44e18721f888d895194825dee0c8507168ddf15ca2a4dc6cdfcde8bcecd37dc608cb028a1bfbbb5a2496185667c7941fb557976bd8b590d41f58cfe7ecc632a48dad4593b0323978680f5cd31153f8a91dce6809bd7df0fac74f0402d75d975fd067c721609cdec85233adf75e622cc7574c1699c1b246032792f72c3388a4bd1767793cf42c77528a7fcc870f066b663203e44baf7289af1356482e99b1c17bb133a3d7790dda597cd7f68f9823c62fa2558ac1bfdd53d2aba3fca7b94c88625247bd1daeff49d307d046801697bddbbeb1d5e1d0d5eff29a52a0bc594118ed37651cb62447915989f0e8e16a4426826890d386d06c45ebbbc87e6f5b0dfd0a686ab3ed0c16c728e2116ad83d781578aa74362ce066d6e9f4660d88dddf4e954e8c17fe1b2ee4f371a2bfa902c3aa0352afe2a3bd52255c7c882fca369aaf9d7291030cc2ed81cf2521121fc18f2742f70f5ecb42e7fabc6214e88447aab0351b0bab0aa9c10011076de961f838c43fb9a6a039805e79f4d39727e278c8ecd89b25e5fdeacacf9403269b7dd567b7986f954d34acba17f8e8ee5647a8872dd64406db3baedb65c155d9b0767f90b5f8d4fca89a51c53fb1432c1c83b94b6ea480aa9fc6371de07e6fcddbba6ec4e943ecab46d61c760cc69f3596db36327491aeadce965f8e7263cbac4b155b7846f36c6a7b04d87890d583d249cc25692c55f8694849d96c7adfa061949c3277ffecba0df5145f354d1d6d14f2f2602b10998f356bdc89f7f70483b77c74c9b8792623f58a85179c16bb5e5ada65d7fc9df7cdb5865255d141504d6c1892b565e51c099d0804441904caf0ffd0571050086b3ab000328fe9e4f7c96f689ec615e45e9a9694c2c94291e594f892a086ededadc2007049f5b6b5a21d62eb75c65369396994ed1c0f52bdcf1f28b891f1dc7186aae96dc28c51e5de7ee86fd94d76db5b4a2953650d4d0ca80c4fdfe66dde9770dc3cfd9ba39e9bf7a5a11efcf4f113f5804f1f3cea01df978a7a58473abe22d9a912835ad179aa7de8cea45576fda8a6b8cecf15254afb387d41361fdb919c158ae877133efd9f16a2b58f0a43e2516141452f986b05182ca7c26a8e31c628a25d7eded3395fc8f35486fe2021215b16127aa51aa4cd710b9141cff3daf53cefa2cc259b71668f417a85d1781d6dcbdba78a32fdef63f55b51a6ff9fbc5794e9b7f9e8f74499ced9ffe927ffff49164b9469fda028d31f8219eb0f716ee96fad008385fa4351a6c9aff15994d1785194e99eb7e1a1318306a9c7d688411bbff33afafa0cd6ecd3c6d3ed621031a49a7ca09bb3261f266af263faf5a1177e212b0443ace3956a10eb73e8d0a15fcf62d12cca6c2e2d457974d1209da020b028e722fd7a10c46f2d5150505090508c18423a3a3a41f87368d346246622fd7a8c6fde1365de90ede675866cf2907efd8d26dfc51b9b67e1c8f1f4838282827474627c184328460c211d7ddead134482151614a46d3e87366d70dc641b4d3e0e9b57aa18e3d863512686a2cc06fb5094e5f045b1880b4b402f8ab2f05b7f23ca6e6eac006bc16e7c4b937fa395f32f44d98b9fa76d9da7d9274793ffa35fef620e950ffa3fccc99f265fff3ffdb11ad578fa39d588c68ca7ef538d7cbe87e75d4f7f7c181f8e5b2e30d23dbe49b76c2eaf5429964d1fe74377b9b7b0833b26956d838ca149f23a6cebd7d961f46be8d161f469e81c87d19fa15d0ea3efa37d1c46bf473f8f0c0d73187d970e7218fdfec5d32fd5e8d3f91d1d03ccd1be5b30b4f738daa417d8f55f68dac5b7a87d67daa5825bb880391f84e479ef79ef913d7250058909f2a8687656f6194b8535f54316f0be56cf032b4b06179b2532c9a01fb230d8a2eeb45a7bc39678a11873b8c46057912967dbaf3587cb133994cb1039b6e270f101c7bbf7b6b078a1185f70c9b23f91e9c5b6ff611b11061707c010ef35bab9e34d0c2d62dc8c3867706080a0e712651ee3a68726b615996eb67d1b434678adb53c327a10624746461add6f4e0f5a726664a4d1fdf33c8fd4620aee31b0525afdde6a83ece186ed5e29ad7eaf91f740c376afeedd7b5bac9d1e14b0e35e6b8841107c61236eb13f91296ffb9f48716e44346278a93bb516c68803054e88930343e7e62472b53686c7c81e0f43ec2b3285dbfe0d790822e4a9e1d3e2a145a356ea4e2ba5d56bf56cbc78a1186d78c862135a51acaff025caaa1679b00203639dfaae23ca6a98e35e29ad95d2eaf7ee18e5648a797061579109d30f776aa5ee94bad36aadcbf589381077b8a256a4d1bd525abd565718e3fbf0feb89f27feb0d6f3e91151b07b7a44fae1f5e103db435beb0c51f6f9cf106575fbe0f860034ef661869db323ca6aa5eeb45a5bbfc6106535bc99e290d95664c2a18e34fa87f4ed3db3c7309b8a4ce3b6df93a9e8ae1d88d8f6423182d9c1cbdea13b3b0eda9809d8f4a72a258a212cc7fb3e5b045ae8af5c63b68a950441a46dffad6c6b9158206eb544190d73156d6ec617383072747662b864f0f4f8cca051e33569e3f573030816c39123486888a848c70720ec08c1e8084984a4241e238cc0e3e911f8ce438f4012498d51234a9200420e13f6585aba3d6aad7504ef0fa73e58a2ac6acf75d40f65d686dd6e778125b7326365859595951a27f2dd83c79c92853f64a20c098987ec8727ab5e8f5c36669f85642586894926caeae71a806a23ca6cc220426a10213df21051465f88fd90c8095e8408884291ba6f0a28d80d1a49e18811aac21101a8e0bb0e40002b0c80b2b0020158a80520009202a460a4fb1a00c93d8001c02407a8fb2a49623738534297cc7cd7a62594d6544b9a9891eebb99944d983835a93999b527d3f60465bb41e16e1e8573129573a2cb9d3aa9f38914942751a0488942112025010898928016a65069618a4add4d2960b70005b8b0002a171840a5c4685f6040035ea8d200075479800360788015182060250210882102576290c01519243001196698805360860a5080860a60a1c102582e60010c5c200b063290a5860c68a0061b34b0011b6ed8000e37d01c70d021070ee8a085035bb4ecb085871d6a0f3c70e9c1072e3ff8d0811f80e88007804862b4f40322084c101284a5513e20255310802088ea08004102320d228810503b258816320d410844e054423095a908443082ba138102321dc108ba2c60045dba908052756140a6242041095e2041094a2084f52a257040a64208e1c53e40081832f5e2c50456bc4020531398e0043402268821d3139c60882b279040a6430cf1a5ba0c434c20d32f5f8898e10b053225820814d80a104143a6284001182c28b040a660c084a9170013264c1159c214518411d46b284203991a61c4113618b1814c8f38a2cade70040e995655219143950e992281441295034868c93489249470ba2509259410c3831262c4a4808b181f324d410a96f821051dc8748925980062090f64ca0413633ec00408321d33a68920c68420d3269a70c25a113431824c9d70e2892e4e9020d3279e2053822784c8940c1915782163824c55a002284ea082213285028a157c8182884c57b08232285801984ccb9489a2d630658ac8348a28a430228a233295420a1654498144a62c6081194a93608112999a31d30231665290690b5ae082255ac044a62e70c1143ec6054d643ac51467a813538832fa4406c16c829017bce0cc9917582a5ef0022a6a155488324aa9a882be155588324aabb0a28c15a2ac92482a8cc2000657dc1ac515f50a5156eb1531d862067a45d11118c4d1157f38a15d6c2c479e64268361c0dca592548b8f6a54e4821854594ba7c8140d9a4f069ee755ed2e649e14763fcf8433685e20031988324a9a482e1fab2cd66ef3b58fb699b3a90cc41ff4a90cb2883f7c7852255970a10c883faa46b00a2ca81599ce600656970517b27fab46f35a59595d1a784e832c6c0daa47b2506fa5819515cd228b2c6a90a6ca06d506f6fbbeeffb57857dffb1c81af0d8224cce4e03f3fad580d6a006374dcda409427050c56650fb84a9f506f599fc7583bf9f366197952bec56b2c8c7a541066595f5f8ab95f8e36eca817bc4e81b7ffdb21099aef8364fb310753feeb62145f2c7dd99f45cc8fb906691733d02dfde5a3d0c52bd69727d16d3d3208678fe4a36d49f3eebfe8a3c89f59ee7d11f442295ca401ce27d258d3c12fc481b501b88324a29a55a883faea705a5371065944452613607557bc6763039d8b2a908843e12d52bb890fd7bc408d3a2ca6aad57488d59132cd2dbf759210765b67d24af8aa4075176ef26bd1ec41f765f17aa1e1089dcaff5ebdf4ade0049a55a88326ac4f88358c95bc458bf0c89e4425464a25c44a67bb7a77d8a479ab0adc59a195469413bb0851a355b14ed76bbddd283ef265498b5541bd920cc9b20a41ef9d4987dfb740b515649112cd2b6755b30576bb67d24a4e95638c845308ac478df846d4ae5358417604bd4755c8a83fc7912ddd4332b694e6dd6f35c158c7753cfa565a3f722118f7caaeffd53fd28db3cedae33e8b21dcc0cb6ec11b683c1c26aaf508de891dded763b2c4b96f6c8010e5cf40793094002104448500e1c3118d08d2127102982420a468ea8208001acc002010a80c4000748a264b684c60c9f265ac9a48953cd7cb241dd70514e7a7864e474a7d4132851a4202001535aa032457754017401d4054a4519405fa00d70d12ad401f40114066a8542804680c640af5009c4d8d1c98181f382ca40274067a014a015a034502c3ed0202aa53970cac5c6d6081c11d2008b186cd7cd10563865809a20d4785113468d183564d49881c53cc97b9a835317b2a4798e3676cdfc9b071835331cd5a5eb91d753e3315f03aaa11ad558717da1577a3db7356cccdb3eb3dbed7e30c263be0408c5e802d7151ef31b5879ccb779c387b68b3feafe5ea062aeb1fa30f3a2d9f5835c65604864760563832b1e43ee6e7777bb4ddfdf56ab804abdafb412a197a6200cc3cb72d041a794b29cc522bdf7ebdd1bba830e3aa5f4faf54ba977fd5e99937974658fbadc5a273dbff47ad7ef75bf94bebb3ba5ef97de0b7efea117356e0f411074778f7a9fbf77fd5ef77bdd2f88fdf10a30d8a5b7e5df1265eeb37dbcf4de7befbdf7faf57beffda27d491b49a7407a33037b743da3a7efe9293e1cf1fe92eebddb184bc99a5336e860a04862fb5210badba7b729f9c4388e5f6de5c00db5d4043fd2d469119ff5fe3faafc92f8aecd29af24883e7c2f7ef8561c62a3f10e6f6ededafc0df954dfe6bf20f66d48736a8bda972af8670d721f93fe7d2c168b244d4a52a1532d6ba508134510dbc14491c3b81d4c14336cfcee3df85150a90137bdf1f757d87a2bfa108f7cf29f32b504da985758257302a0f21a82f9c29b67dde0b75e002426c7a79c5d4522de138bf448f00af14dc9a7d11a516bb5df7be694ddfa7bd62a12f9de33ed87ff7de85acb28becd7d1b51f662d4557e697cd79e36a798537625a7780dc1fb29e353f11ac2cd7b0da10ef121e07bbaf555e37fa1ed8fd9655e6136e2df1735c8fab3ee29dbf43ab59f54d61179d6fd7d644f906d6b9524a3838102cdbe09bd1ad537ef937a9fde5dc9b33279f6a9754b9e75536a47ef7d42d6e8ef1f0eba6c5fb31d055b08b11d27f446308b20bcd08baec34010fcc8ef6b503db7c53ee0a594d62bb3b9761e5d99baaab595fcbe0fc418fc6c3ef5caae2dc77a9e2873e220c6e0addff7b158f559a028736241a4f1e2156030af0698c4f95024f2faef71cc7b5fe75dc466dd408fd30202fa308e67424e0ea1201da0ff7e88f74061ced87b7c91fefb48d3234d8ac520addd22419149e75b4fcb98b9f7beb5b21165b7a5a9191e192e1c38ffd2386f82cdc92114f4b268d26cf3e85b40af542d167484d7b78040781048b35aabdd7aafe0e87a79af96357a9e105ec68e7781f038deab11cbf35e6490afe5b5c89ed7e33c7eef4a8c777b347e185ed204f2fd25f2fd6dbd454347b8df22f12bd9a3c779d35a6dfc3a1a14995a0ff47d0ba7f5bd08e61189f4894cad7ffa8ede1389e4ddfa8fe75dc6f7ae4f04d22cda388f038934efc6691de18c37cb0eaff65e9a6ecff3dec597f65d4520e10622efdb2b7b64821169822190e628f43b48d315f420d8d72bd9171a3f4bfbbc5ea97ef036873441a2cf419a63d10b91a6eb83487bf401a9831c49f38b6a3c254d1711e93646e36390e648ee9026dd38ef511f9d9cdf090afa182f24a403b3c16c301bec95ea7d7a4547b057de7a9c07ca4106c1f11e8834a947f600fdebf17f57f6885e3d69be8b063983bcff826d9c3769bc59b4f159374e0e2a32e1fc9347ce781789e48df3f48a87344119a4f72ed2234d1aa459b45f8f83343f070e69eaa6f6fd19180369ba8134dd2d6f5fed6dfcf86e2020e1c6f16148f3ebf540da9cda404af5f59e286be178a6def77b1cf07b2f7fffcaf9bea573de0cda37c867df375bff7aef7befa7f6d5e685edd7e3c099da2ded1b479f75e3787d0e6ddefd7a251bbedebede624147f0fd7a20eddb13652ff268b4563ba41948536a2686d05f4f48289be05b88dcd1f78931e8f1b73ef4829eb55ba3d1d422aaac6c1bf43a3a8804af7cc8b1687e58e27bc5f13f04bd0d69166d9b6b43923640a4e9b3816c3c499a779338b158cc491c10c4799c57b2317de371f40f8cb4a1815c150604d32610c521cd9c8d137b529b539b7c2aca4823ae14516687368fd528f64a35a44eab8d4937267b82788f9fc97bfc53fbd3e66d611baf969e7a691b6cdb202d169428b663af64497de363fa07c7c55c6138268ecd576b46d94ad5460bfd8fe611a4cdfb42384821cdda5541770efd61fcdd341566df8c993262c45479f1d2850b976dd7acb9b2b24263c64c193162aabc78e9c285cb962c59b6ad567caa11ddb0ff6a94e3611fd22cd588f28cbe24e4dadf532068971fc62f08927671aa462625c58cf74d3f4373aab022d5c806bd0c1b1b7fdfe54937be67df2b4a64ff929ff321a9699811868dafa2ccf521d228e3952a8ca7e20f21ff013df9e4bfb4e9b35f8f5b6fe3e7f3cfe754d8cb7bac4dea42d8e6b10efa4ffbeb5d647242bbd837dee542af57aaa4beaf645f3a07080659a4c2ece7689fef1575f747be52b55e154a64bf477b5e153a82bdb256e808de152018988ee059c1facb5261f67df4674385d987a1bf1c2acc7e8ffeb854987d20fd01a13f2f15669fd4df97af4a7f62f437467f64f457a6c2eccbd09f99ef8cbea1bf342e64dfb3b2f33b7f3d2bde95cfaa1afd9036c8cf8a0afbac3e2bf6477e566832cc0aef0a06abaa910956b534f805fcb26d4be3f80ff62cd08b277d0953c554231c3954700b0844350a022ce3497e665baf1a63985f177ef45d3929f4a127e4592b9a66dfa4d89b747f38dff75f0f9b874d77b8196baae5cb98953198b1a638b4320e33ce198b19db647c93f198f18b8c71328691714ec63a19ef641c236357c63232e6c9b827639f8c67644c23e31a197fc63a6332631b19bf32fec9f846c69a32608740196b4ab54358c69abab0c358c69a2e60873832d654013bcc91b1a6bb1d06e55028e3a18cb5f3608744191765ac2363ed3bd8e107198390b1f6ab1deec8587b0e761842c6da71b043a38c8f3246ca58848cb56bb1c3a48cb5db60872364cc2363ed35d8210032d69ec50e49c8b8848c9532d63e831dee8cb563b1c3a58cb5cb60873d32d68e66873e32d61e831dca32fe91b17618ec902963ed56ecd0848cb557b14320196ba7628701c83848c6dacfec5048c6daa7d8e1908cb5bb608727644c2463ed667658246314324e216323196b2fb3c323196b5fc10e55c85800196b57c10e0790b176323b5c2163ed4fec90858cb53bb1430264acbd891d162063ed6376882463ed4cecd000196b5f628707c8587b0a76982463ed6276a824e359c6da93d8e1928cb523b1c3a68c69196b3f628765c64c32d65ec40e9b64ac3dcc0e9d32d60e6687b58cb5a3608766c6da89d8e153c6dabfecd096b12e618750196b127678cb58036087b88c358f1d4665ac47d8a1938c75d20e73196b1176a8cb5823edf0cc581fed502a636db4c32719eb1076082563bd63875132d620ec504ac6fa831d222063ad638709c858174dc95813b590b11eda21958cb5d054c63a08eb1c1b6b1c0bc858c7b0865165ac81b0be81f50fd62fac6d604d62adb17eac6b604d03eb1958fb60dd83350fd632b076611d03eb1dac75b0cec958c3c01a07eb17588f58dfe01a32d622d619eb10df90b1c61be7c16a84f3a2761dc61d4419ce8743c61ac49ab571b40e1973206bc9585faced0eb10f6bbac31e28179bfbd714222d1af366df9b7d83d8eca7fbadd77f1a7f4b5bab3469f625d3688ba6c26ceb4d8ba6f54a56f62295aab5aa462df2c9dd68aa519a6ae4a2cc035997e9be13072b0c762fec3fad8363479b9f0db68569b3689b36d86e3dcea14d9c7fedd05ad9a9cfa6c1da45acefb7b4454389be9afd7b1789582c28d147de1efc6ecb607be44bd44aa9c2acb5aa30fcad9f6a698b0525baf7bf4bf2b05478d5ffd5cbfbb4479a45e6eba51de3686b051224fb2e44e587a1ebfe2ea925bf520d7fb493316dfaecd8dbd0e659634f926385c5be8a3f601ffbb08a4c36fe3e29234918ffa37d87367fda3169e6fc683367ffdcf87917653faf5461f88641951ff6fad8dff8796aa61ef9125dc2b157eb47f7604fdf0f5b60906b524beef9b7e410f92f7e24cda23db680dc1769befe669bf932626a5479a1d185cb8c2d597cb0582b3db6ca1a9e2b2b1968ccb8ca888951e565a70b179d2d5972b0d8af55e89a0ab3f4ca856cec63a0477e57d7bb96cbc6987417225954246b77e37f3e0566f6fdd74dd6df1a5126c2578d92b6059302ab6a25e86f8effeefe942c264d1c1f24f498347f3c0dc6debc1bbf694780bd49377efc304d9de87b20fdfd0d4d7faefe097a4fe378accdf3fe0869f3e72f095658ecaf0efaf00f19fbdefbd877f5ada930fb3192552588f472e0d0e7dd1fe961a930fbde0c573c2c222b6a7b7feffd30f979de9f779bf85fef893f70fef33ecdb2727537d09bb0ffde34f1fffc47667bc588ffc6db209fdc7dffe9c63f7d8f63a51a7d1f23cda81d7baccdb1c7fbfb3839f88a8dd9c7ef79577abc1cc61e8ffc81f3dbf4aedcabfb316d8efbe992e75f32a7c25a4faff6edc008e36dbc8b40bb10d38f7417c27ff1bd64ecafc65c768c7417fa5ea9b2ac5423935e7d248baa1a61d28491e7dd3f7f1f887cfaf91b3f36de3eeb4a35c2c915d67af2ab38e4f537fe479b74bf9e5ed13555ac54232cf6eb164f82c1a54bf552abaa98a36dbfa2a123805457b68a277ddbbec5e249e1b66fb354bbc59370b8d82e9e24b4ed5b2fd508bf5dc1b66fcb78128c6ddf9af14419fe88d8fc475ed97717fa48d323cfbb5fef1566e3f52feddb8636f36e91a499b35b5a9b2df256d838be36ad996dbf8636ad986d9f8636ad976d7f86f6d13ddab456b67d1e6dd6352e6d56336615b3edef68b37ad9964bcd62e66cf3bbb268b6fd17dabc3f9220a925bf4d367311176c17a2b66b6accbe37438d596cbfa533e86131bf0f3f0c2db66f4eed7bf7d575b7be2b3b7ade0cf6c3eb4ba1eb6a19cdef8ab56355a946a6bdfaaeaad19a5b866adbb757fabeae7624d68a917e4b89f1fbd67b0bffa75ba459145464ef71b4f7d6dd0eb67dd31ed1ab1a73a3efc7fbd447f8ae9cc8fea538e4f17e9fe90875b7bfcf5674c3eff3fe8e9ef46dcf3de903cf682a750a7bd48518d86badb5f6ad05f7b53e45c822736aae39f941d2a4b2ebdbffabb57ccf3a6fa6289d41584d993b69b51954c43cb2c14b290442efbe7f20eb5dc461ce37e3bb88b3b3f32eba7ade79de451f1a336abc52a5ff5494fd53917ca4917e7dd7b864faf8b73bf2d74b868da72fe3edcbd8691bda56b46590b48a7e5224c9359b9e7f4563468d5c230d0ded547b787c5a3ea45718129e333fba46b01ac9c0328e8c31765ca08bdcd1627260e8b0348c1723ce8783f442178d3b6cc41bef867c89b0b095af76b57c4016b6f66b85d16a64eb08b300b03fd6a3b1c6dcc8f3ec46dfdb1100e044f52de855a35b8f7cc906d5b9018b4e4e35ea693dfdd6f7b46af8f4c3afffaa473d61fda06ad4939f7efefa45f6a82757f1e98bb1afefa31af5d804bbddae87a5343fa411419a13a43122cd121ef3342a00f21c4645260829baf75e1b5aafd5c69cb2ebf7a3fee742dea7d75cb0c26e3cc9fe184f07638efe476b75b5edf3b0560beb2b09da231689646300a8f225388f2a484b2c12586f9f044faa6f9fd452a56889457a8d79975571e8118be4c183f4e392f6556123927da47fd5eaf23132b85ea5471e1974df6c8994ead1c806617eccb97f2fec5ad2e4015a076f76a1fbd6f42f160b9a321a08bf244e903f903950031a1adc88108d03d02820065715e635d9d048e5c3671f16f3a4d0268d26ec0a1b5cd4e8cdf70177d96220a4db6f785f184919e1d0586dbe9e8d39b5291540e86f83d5aef55673cc15167a0f74c0030e595c51830ed42cb9f7225758125235b2c1cc588d88a0a40d4c6c4a6d04c272acdbc1b42006d77bea795ef52aecbadb7a4d6f572a9046ef3f0f01a1eb182bd65494f4e1bb2d582075b79d80daf412b0ed5b27f2de8a40ecbee6878021d561de7b22901bc4564bad0deb416dd6ed51930add560bb53984d68a617ddeb5954a01842582055464ac146a9c94c20a5bad146470b68391e28b5f1bee0b23fd17f4092c4f5c79a28a1357dbb54687332bb83a78d1c1091dc4f0e0e630b27edc2c9065cfcbe5e630daafacb79af5697f72f7d3473af95465a85eafc5c25aed9bc5a2b158582b7b654c97ed28d80e86892d76487d5c48b6892edb5adbc496ed2dd80e664cd50e2d08dbd685649ba8dad62e597bab51f8fe3e84f5ad5b8d5824a83169c2aaf8037cef95ac17862c0d92266cb3ded317fc6ae227efe9f7b0de37d8c362ddafa0bee46731eb3dd25a3156f0b2c01ef07debea9f0fa1bfea6f1d78ccc5ec586e95205395305395b0a22a615595b041bdee6276a1eab9c27cbc1ecf73f99870a41e89695e4a883177988ff4458c77eb68ab9fb94388f1b2ed570bc46eb7c3801832663ce662aa88d1b3c31b313858313d58311eb0efe1cdad46e679617408796b0c2570777777dfd4a91af00834f78832783b9823c41ce1659b79d7237ad8f5f3111c08536555a5a66a0d125448c0402905dfc70a03e2156659f482d5c3f66b5d56e881f9c322ab650386378ef3e862f6441bef86c5d23c2aec051233bcc8f9906ccc7a5e0e25a9e7f5fcb04c1b143f0a23833b3ca18e4bc60cdada91c143c323af17234fd966c8e3f5a4d9ed765a904883c45512bb24aa2411438dcdfa1a403b74f1c7f7b7c2785498fd5c61da56d1fbdefb5c2f052b8cc7267c193e3334fde8f77d14d70f7d2868f3f93e3a830a34dac520337a288d9c1a5e673c0daa5d6f43d397cf8f8d17d0df88d9c0f143814419a5415e4c9479241297b112814091b88c74e8038f0804b06887a823841722110a7ade47bdeff33eea7d800419161252b0dec866fb884428a5190931347f39874960c9df8eaf469e7b39533da2ac88b6800843bd1eefcfbb4140820b1241202184c7fc28c6ae217a64cee75907af209103f5c21dd9430a290bc418b7c2effb3ed1bb195f5c18397627864b064f8fcf8c0ac2ff834029171b4a869ef6f18ef47ce48fba3fa3d6b6bf82129b6b8c7d13ec473d1fbcad7d5224e291ac0f41dd935dc87ba4dbc3e848e09b3966de2c127f0ecb23cd5c61394a8cdee7ee66f21efcd67b7accc14058e1b34da4165954c2b61f5ecf1bb3dbed74a8f2c2aa0ac3aa12c3aa2213c58ccdfaef6787df0d3bb058551360555d40c60ac1cc7aafdab1aaaab0aa62609147238c1d7e99a56fd0bf722accb4f96cd6830fe62ad604fdaf38843504833d20e86092b061c3d8f9a8460ea62a886deda63cec314930b141afc70e80a8f5dadcaaaf316916eda0229bf59147f69d6ad103b420f4973986577bf6cc6eb7ab8189154c11032668b0b3bfa734764899e80104428051e289ea7dd9ed765c96dc8f7a2cd185c7bc01600c230d1e6342031e7326b4c082bcbbc5b4b936f843c0cfdf5764d3a20d924fd68a3188ad30ea154659f5de80ba87c94206cd98edba007debc9aefdabef93bac9d3de7d6dad23a09e74adb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5ba684ab69aa8856cf5d0fe34956cb5d09eca5607599dc36a1c56c7ac86590dc4806cf50dab7fac7e596dc36ad26a6df55b5dc36a1a56cf88215bed63758fd53c56cbb0da65750cab77acd6b13a677f1aac21d0b71ac6f6a8d538dba356bfd89ed5a3d537d65a9dad0eb747add5787b0f5623efea407310651ea55683dba31eb5d6ea6bb5b5baee6bb96cafb7e68c600ccb31029b7e78538ede76301b7080df50616ae93e03bc9fe2910d2861e9fe25ddc66aad58f4381980a9ed3f852e71d14d6d7f1fa0b0d67554f9915dc17d736a9bfe57bb8dd918dd55293210da160c412ba54388d9431cb15d64bda1a8a888c943ea3488dd10593605e91056867861d71370b1b30f66881c7c2c5343df7ee9a69487525ae532501b04dcf4411cc2f0f3aeadd4dddd6ae11a7dacec082a0a8221bd7cdec795337e19898503d80241100c7dfc9eb6defcbeef035be0b34ebbc1a08f4be8afbb429116c6f863b5b4f93d78dafdfd910afb3e2115f6f999fd7d688252857d6e5fe40af3c12344da41913e0faad78540d9f7fdcb7dc00749d653cc62b14cfc2079da8ddf62c09533daa2a0a22058c56fe342dfbffef53eae9c2b637dd185bea7e175e58cd9853e4fa22608528cc4853e137cc2c4ef583ffe0ab23c7a666707d7f670fcfedeaff7f3c6efbb6f7edff72425f5751511860e6391e053cff3b036bd6791a7dd9e477e85795e100c2c5785c1305690e599ac07590f7e7d02599e9bb62916bd51d81d64a2500716b03b18f36ed31bfbe10df94eab28646a88aa290e5776f8e0d3771a6a33ff13fef07b1e6c33fc2a8ae2df7ccde3f8569b2058492de3df78d9bf7c5b14b1c60fbfea1eadd7c6c66aba6d747d25fb04beff35c37791897e58c1978140c01b4d6e3763f38d976fb4f855db3d8a1fb244ab037b358aaf54c50fdd63f1d89850b6f875dfb4741699443257ed9fdfb6f9b0a533596babf5a27d9bfa4ad5e626e71bfb748a1aadcfdaacbbc57a1b26d6e74aba07b55a267dffc84bbae8a642a7c40a66d1e45c847737561b303770d9e6f55712d29d9a2dd56e313a980d6ca0cc663d0e9fb4e7429ca4f5e9dfffbe7e4fdf575ddfdf49fc6178a9697e8f9ff0b3c420acc7435a8fb1bf6eca8909850b1e74b1753e66cb0c0fd8e1eba6764892267e30c46694cd62baac289bf5f85bdb7b82b058e41308b2fea3fe226f07b30119f67db0c22ca6970721a597d25bb321c20611bca65e69610eed001809a4d928d41b2050657f4e421a6aa0200d354c800b2b839820b403fbfb4f063132ecb68391400d7474d3afe4937daf9bba50f52e7e381809d4607fdf5bd2a9a6319460bb7662bbe862873774939a0e060258b67d4f0c526fd81f9383814003b6f7f5fb2a06b95f9fa42e54bfeefac4ad8460873740905c48b3fd4d290928416e53ea0337fc68a5a9613bf12ebae881cd364f2a5ce0d2c036cf2d1a08a9d8e60903154072b02004dbd4451182ed4fc1ddceffa31f991aaab6e7816d2d40b56b6c8a45cdaee184eefa61d5de254d0bccb0abee09e279e0c9fb273af62f911a7b4a3fd159b36d7d0f6cab69ecfa260da29feadff73cf20c37181aae48b3fe13ba6b6cab6bec7a86bb5a8555e66f47a72fee037d9aca85a8efa796fc7b80b4b6934e6ef613273ea49615eca21d5e33fbd354fec5dba2e8e3627f9aea5d5012c3a7ed76ed3cd89f7641490cb6d2ebdee7f5d26bc3fa0f3dbd432a1fa363ed277537c9d10df4652ddc13655607a3ff15edd5e81f5af187e75ea5d4e21a362694ed757bdad56c179dbeb8e4586140db927704e60ddd49170c0c65fc5ad1ee60a453a1ef18efff0ba6c4298db7440200ac3c5835b2ba07c8ddedf6f777dbeddff7aa461f99fb587f7edb3ffc30cd9b45d36cafefa4848db53ff8aa464e6817b9f3dbac20748aed8476e1a4869312367521d6b3023015c422e95bf1841f1f5251661fcc2b281973976ebdde176daf88e7521252d4657bbfa31ed9250fa66ba64f65f52b1984be4f0e76d4db0ff8c0f67e4f8901981ae27bffd0e68fe97b5a770ad8f4abd1cbf3281844e8fe22bb6e6efd908a4e5f8c4e8f840128420a175490811b4cf065c973e8d55561f44518cddff48baa118f4dffe9bf1e17869ea72c4f11cce582aa5ddfa7da2e605cf065d7222a45aa91f96646d8a693d9f77bef7ba4cfc80447a76af4ed4f035ef677973e0fb33f8be41ae8b2bffdfdf87d9fa7c922e902498480347e7f755ce87bf04dfb2cbf3adb853c52c767894552ebb3aff6d921d2dd36c793987cfb7fafe349335cc8b595aa5727d22f69faecea692c054217b6c01801078c0272a8604050c3cb04cf6cebc3f51639f4f787d18a325bd1be6f5967cee0f817c65eebf57d383e878b2d92088efff2d574cd8e6adb6fe17c18e6ec2253badadf70b57366ab4541e19abec9ad9693a23dad3c6767396476ce7c7c9292d939a3954e679212252ff43aa8596e56e46dbc0190049550b85327d5f4fb87cacfe15e57d349fda99bd9be743a75b7322a6ae66400244eba99539292866b2a00921fcabd6e06a5743a7fbf0d2c6c9871f7201f6d00e1b4f2090eaa4ca1a4e17afcd497085e2e8caf26ee0ef3f15542961238ad3ccf1a94ecc7f6a3e4a7a887d3dc9d878f3f36d04a00f87883097707c1c71b596e40dd1061bc11ba3b918f3f667012a800951ceed49529c08680aa00320374650452f242c008f4c3dd937c04caee238c05a795300d54408a06c4c6151b54367cd8d861e3e5ee4eaab122cd90644831e417320a491649a3add06634192d467bd140b83b546d66ebd19493c219b9d54e5de9e3863b754ba0704788cc986cb61994111cee48ae64c2446ae9948a3aa588d06c38275d99733a5236ddca5357d32d91320205672b976825ed26f5e3c49d00a53ce147ae64e2d4342b53703aa34a1f36dbac4794d990d2b66466b3cd7a9cb81368b81eb49b14eec7893ba1a4e17ae8683729dc121322a714115a191535cb1d299be4664270b823a5946d26005a59bb953ecaa6db2c77deca3205daac4c619f525137204d6e382138dc91b3a93497481981c2d16eb314a4dc664370b823baa65a14eec80d57d3ddca338aec569b39f5c09d60b349fd28a54a29146eb8da59da4a1fa56dc9ec6caa3d919db81368e5a9939a394591d9a2a47ce470b81e3720b4f29c1d41fa71448526339dae1cd2446a49e9c3080dd7a3bcd54e5d2d57a47482f2b459497b29b45999b3cd3ed7e4566b92a295b9bfd51e0acec62457d26e527f53e1939a6a4d704266847177241f67ecc09d09111c931b1029e55329659b3da1e19a92ca7366d3dd66b953971b8a9a41111145cda0929272b833292929e9cce1a2a2a47449dc3d878f338eb8fb8f8f33a6dc7d8809ee9528d13efa5871f79b0f95cfe92317bb710716b8bbd7803480a15c69b3cd9a6e352625ed7535a11f92823b3f57eaa41e479332020567b39dba5b2da8743aa13c35954eba12473b71b814a094b7a12628e56df6312550ca9b12d8d380ecb3d49160b3cd7a242591d0a4c6e486ebf1bad91fe1c1230a6e69a8a8a828a848c7e7f81bee95d86cb326255f3ea99db327b55c3900d897672d07e5977c7c79d3d166658e569e35a89a9017faa1980e189117faa12449ce9b14aea969f6b7f249adc9cf1e0a9753422b6f4d6a4694cc5e574a299f74e5396baa9db7d2e994da2f63cc28638a140fe866497034299e2d461e2c5076cf27a57c4a72963d637a70187b06e013fa5ca726b5124a125a79934a82a349e9784e307277193ef2cce0d1d9e1a38c17f4607777f9c8b32b43824ec64b8d952b07971517956b87ebeaf8182346961854317629f8300092d326a52b730540f24365d3cc16f54f38dc89a349e97eff10adacd9a2a2a474afabbd94f2e96936dc0852ceda792b69b5a7954e4d670d8aee4f9d94f90640922b7134295d019094379c0fddc6d1a48c8c3b0770a7954d6e33a71e52ca20ee6ec3c79d1adcddc6c71d22dc9d56a3491939228402572d1f779490dcdd778ac61d98bb7b99ab49392953a0364aee2ec4a8268dbb43d14a27b625b39286316e8d5042d5ce9b544ed724377b5a89809a6d56cb95ba284774355d792b9968b8a6244e670d4a92b2496ee6d49493d22581aacd6c4d4d497034291d8e26a51b72a7d9e6ee77c97e702b6d0f00123e6ad694044a79d3316434a443a8a97c62b3cda074cec508a3c8dd8774a5ee4f9bd48c4949fb1baeb42d91c2d1be5c52fba0594e6a7f0ef7e3879a0c95b62535ddadd4fdeccb5b0d2a579e25ed71a7d35983f24f391c949762b3cd72e5ad6ca27b9d94ee56ea6eb8a6bf953a9c53d3e7a4702cfc904e2775ce72b3a8a8d9d370b9a8c78103773e132635daeb6ab9199472e98774510f0583e26cc139c1dd09e0e30b35eefef4824c181fb9d88d2f82f0a11e5f82ae76964d9e56f3f1ee2ee4e30b98bb9be30b15dcbdf6e38bd1472e765c2c1043d40bd0dd7d1caf7ce462e7a395bb7b0c5248c00d494a3ac2e36c9a4541e17a40c1dd8686fc9092b3d425c99536daed495926b9e194fcadf64acaa7d99994a402ade6a3d449cd9aca25b01f6a2a69b826981414ed367bdaacd4bd8e17fa58b9e4713adb4cc9591ab91151f24c70af2b4fdc09b05712d30123a2e4857e48091025391c93bfd59ad472b8285d8df6a5d3911f52a2e4a52c795a5963526b2aa3747fdea47050b32fcb1bee7552b8da93321735733a3f579eb332d7e44b294b6e65b9e44fa09b6ee6743e93da0795ba9953d4974ee76d16f5365b0dca9f407e285746cda2944f2b9f704f6e359b6dd6f4ba9ad3911f2aa16ae7379da5911fb3fc7033c57803e506471653cd6853c5682383918f3648469b6fe462e7ee3b3e8a6946d7a823461945ace6a394b45bedcfd97f0e57d3e1a26e4074b46782fb5cb9044aea84f249ed946a2aa3945485a11a935aae7cf2654eea9cdd9ad48c8ca9e5ce9fe96eb3dc912570b92f9bcc72b8d348d510ad3c6736a926dbace9cf99d309559eb53f7565939a8f2f1ff89897a0d112dc5d878fa253a41c35f4e592a7d9a4704eba77d2cd9cfebc95b95911777fe1ee2778a99b19d9c0096cb3da792ba59c94babf952594b35cf224d070b55c59044a0aaa76ab0de1f1a76e56dafe9cbd94259f6bbad57ae0ee2cf88831e04a4e9c4dc93b359d33a81367d389eeeee5a909675bf2a5d3f9b7da974d37dc4bb1dd704f2bcf192d4aea2c75b39cd46c96939a25494a4a729636db2c8acc134b6ab6938808a92cd2b1a38909918e0f6645472034eda08100c20ea4a2f248a83c67b953b7444a47a43ba5704f4da55313d1596b7205ada4d59ee072515f2ef9532705e50e03308dbb3b615a49c335ddca97623b9bca5c0ed7f427eef6b37346fb2f8a9a9d3aa8daa9cb0d953a225df9c1d0073b868a84a07433284252ce5a6e164504c207484da5084b682288f081515353a943080ad734b444cae9ac3591923b75b526658e08d724376b1a22aa3935d5a0884a289c1391bbc770a72a8cac35eeae04fb733b02dcfd003ee6604c0c9644571b7a6a9a9dba2425d42cc764e88c529e375cd338012246560cdcfdc6475619775a7936955151ca9742c32df997724641954237dc0965d30d7782bb834d9894b4a6cb5a32732549dcdd893e2fe207a8d50de0383e46518387c4bd00ee0460c15770077db44077000250e108cb47fb75b43ed5484dc15170771f2d0c5a8b1071777f61053fc187b8100f12002bba036102e2ee26b83b138e2665445736dd66b6d9d22c8a769be5986639a91d05353b752554ed085479eaa4187177aaa50424c80d3c89c0c9dde9961b7628024388aa2377a725c8500022571c90012fee5eb7a0c1013ec0a5080bd0c0dd290c33a811cb793c7a70774a66c907452081809316b87b15222b01063000c1900377af3a318cc982062c5e9c7077ef0214b8a264927aa0e4eed48a2d2430650d0d551cb9bbc5801296059c9430a770d7cd9edc664da18f75e79edd9d7e3ed6285545ee5e842e3774e6703aa2b2a966d3b93b8f7b8562867b7502bb7f3406bb95b62126b652f700e0f1b41ad427d14a5b6dc62457ea7433770772a754b8fb093ed23048ee2ff77ae4ee437c54e3e4375c4d972b05d0544619796a2a9d7a9436295ae9d464e4bc95b99c540fdd0d573b9ba472a7ee567b29b719d4e370a72e3744c341119d504cca1cae89e883d98e1d20cc42289718158930635234a319892002d2d14c470847452088505404422902d21152132d04a2a653279523d2e5864e28265e99dcdde5a36f71f71fee4edddd73b85caefcdbec69e52d277596b9bfe16ae7ecbc9550a52d0aaaf6676d963bbfc9ad769e33a81c8ec9cfdc5de6ee3edcbdc775f7257787e14e73ee1ec447ffa2cb0d35954f924099e5889a723aa2269ccd362392929be596d46ceeeeb9d72277f7f1d147bb030e84fe65b7db6eed0e9a08417bd4fa3c665d2dbef9d34e1566aac36f695f0ac307c1f7441434d56d017c5ac9167c38023efda99d7ea18425fb585355a14bf65f2861e97e157b50b89fff88cd2d4d97720b54ea7fe4ae3e7d9af3e3d67b220abe04e6a7ba05fc14c4adb1957b585fc27eb2af454a7d1bb2f247eeb42fb53455ebabfc12fe4f53e5a799dc51b540c53e2677f6f16392aaca2fe5b722015aa062bf45eeec57148e8845aad025fca06e69aa174a58c25f852eb59eeaf0ad28eb41e17e7e02d80fffd354e07fefa2115fca24fd16f0d7165a4f1f643d5dba4e8c4f5aa4d4d722e5fe7f6291fa9fd883c2fdfa47ec532a16b9ef6211fbf47e1ef025aaabd42a97aaca255f00edd1141f8eb0bef553a8aafc9277e47befa74ca152df3e15faf7a9e0079f9cf2c22f79e4142a98acf24b94caf72059e597ecb3482a1fe9c28d477ef406ba075a7d5930dee711da0fad8c3279a44f591a80a0777ffa4621688feafb0bf485fbf4aba6aae2839312f6d3bf70491f9c94b0adccbf6c3b004a756003d5222c47b0c2c6f0be30ee8431ea57ab57b577945363dedba21dde9247c5d45a6dad453bdefb778d393e158787c92322f497e9f423e9d147f2a831ef3dd2c4f1aa31ef3deff3bf906870b5bde7e179f5de56a45dc9af30cff3766cefbd1c24af2e79de8eda13a4c6ae7fd23db595ea1833b7d67aabfda8bda3b596d6b71616c4e3de7beff79141ad6d9fc2aaad7f831a5065b1260b1d307db1aea25bb4c3a58331dbbe4fd1b6f5de7b3d164b07a9f423cd7bdaeb5a427fd1fae68d4be91eedfb4569ccecfb3b8eaa099e54ff562002a146a804eb97aa5339cb14423402180000005315400028141009c582c15812e6b1e63e14000a92925466421789b224065224c718841421c418430000040000d0dcac01f00c7c3c9ba498a48767bb4e1b8d273f968bab00b0bb27b81764c2085412aca5398724751dc1daae92e1a449d3001aad1433226dbb8a7b6ca40e0f87e0cdd889dcef1e07ce6bc97f3a2eb1286ea70f020d5d64fd1641cf67f8b6b54ef7ffe657d9f8b96ec96d8c047cee5cbe9b7e44362f3fa4de5571f7fdc66bfb3a19a1016e18b3e7e842e4db7edff9a79fcee2838b2d4f4975d6a1388cde713fe8b3f793c9dc85e861703dcbe18aed79a6f7fea85c8ee1af32d9f6035a3f4ce34f0198e6b76fa6c1ec43979255a7421c7a8683a7bed03efa8eea70b3aaa1b7ec9ff79afdfff73da0dd761c9e643ddeb8d70c81f595b03eb434427503f86d64f100c257f57e0c81e19d908f578127beb048f137e8784d148b7a5b831031600fbf39dda49ad7a07f93e6a086ea6142a1de07249660130c4b5eeb32f7dfc5c53dfae64f5dc09f0a1b7eed2cf443911bcd7adcef5709585f04eb63f0ae3401643a52fc2c7a07c682e6b52b37ad78a72553742538c28d39c8b0d48beb0ea0a48fea4765bbd879378d5b75bd8988295dc1c26f5770ef45b4d182217279f05b1ecde7ad6affe071b4c431eacc58add954c87838f21dfac5f1648ebb9b653a11f862149b80a96b00e4bdb793bb0ba7a1f6ef92140fb376dd6cd05fc01384bc6a1ebbcd156b6a3f91ec52027f7ea2ea7c3966f38754d874c4a4cdfdc26a61f8c39d7e0950c43c36f6e8ec84a3a1cca3087e24f1dbf6a861a7b22c473d3a66f25c126f164ea930f5baaa06afcebeb102303c9e3ab88c485630550f120a144f1980900edc4972d8e1a6bc1f5f58e07afd095c617c33580b1675c7715c8ae89f5197311c6d733237212db162ae7074b2593e49f8a61e8e8912bc0721c681d4b386d878f7f07fec608bcab543875fe446707e1f96e2c76ed54d0a7202eaa144721bec17abd9351db7f5830329d17936d40f2f9ae12e90655e01bf56c54be3f13807d1f3e581f7bfd7fa05c582df86e1c39fdb255b63a9f7fb7333bce0235876920e5f6f09cc890ead90c471d06c9733b785e4d154f3436a9219c66144cc2a87abb27a0f1501af26bff34ee4c92ccb273b37e3c6191eedc5b1a737749f4e60a5882c8a6490f44fa9675b5390e658ea8d6cdce0bcb68bfd0cbf91e674adb0eb66dacc108cc9e97a1af98a9804079ca69395591831010cc03eb2bf64bb2f047326de56df334a9f290a7200937381a2ed65cdf22107215203ff0147271a64db7fb698d93507fef53daa73f86bfeeda3dfe4a7b40fb600a3f37c92a7dcdf6648cda21ab4751577a19dc1fea647c1cb0f49cedbf8a876c8ddca45a086e1dbcad7aae4e98bc7b81bf94a495774283525b4fd12768e2c48a7fafdf1ec3efaa31d737722c702727e59cc12262bb5658bf5fe1744d5eb0686b4037c1d9d2d570bccbe8fd5ce7b43f33df9407440e7b649ccd6f0bd811620122349f93eb3f05e590ae0fd6334b613794c1e6fa46e1e5bfa84cea6ece51ebb576f0307ebcef531c9ecfdfdc2806df50c2c37d8d4dc3c0bed089d5cc34d40ecf414936434b643f48a73c6d6a01f4da58973915d41a0f05e1b9bf3fe965fe789ed0bf13faad8ab558db997422171a7131bff5cd2a5df46e5c08eba9f13dddd44e2b0957da8616f26c1c583447f76ba85e1cc064f68db6e54e60e17be39a73442e7e1b17f6b9b523db2130c7dfdc51ac7a0e30a7278b1ee2668be9fed303d3b5df2f095e695e607dbaef2922b8d36f23647bce199cdddd0dce38d219906fd6d62872439fa729683c7d1c02c42199d140e9f0bd7c210925f58423d81f499492f3283e8e7773e6baab84313854af6feaa89b617c4486fab90c1b1769bfc29ac2cbb0ea593563c1a1a58faa31a6cfdfbf3b887ffdba89515912e5f8b5dcce315c1724739fa277afacba7a3f328ee7d06c72f2ba6433d8ac0b6cd76ee5bd67651c2e1f3a60bfa4f93251682c0a508eb0efc77ed22fd0de4e10985c007dffbfb627dd94755d2f06cd957213fb8ed501c8ca69c92a3ee6c08aee1b4166fe6e13d706934bfd59aab180df2ff2d0137dec2f55f2d2cffeb915ac806d1288928fc3ffe63be68a89ea5a5bd949da813deb2edf133ece42f27eba3e6e0d8fb3551eecc7e55247e46fe73b439976f4ca711c420ef03c2c76ff3a7ce60ce1aaffbcd07cab5b1f5a3df1d43fd0f528c51e5ccb78a0343da721937d86f47f8fdffdcdc3e34b75a0745ad7341d665f61e2f720dab688fa2bc6f3c28b9f7f45d3385e6bad8f1c0b02d5cbe0d496d252acf6a42cf77edd639acc11e06a4a8082b3be4e9e5ed948dc2bd7e6b7bef6b2ddaf1c92d14b40e47010017427fc88ce8bde837f8f76226ea780024b935490da7cd88d6d70e16dc6b11cc4f03bfb1d21abd725b7b5aec2cda5e2c83db7a74caf4840ec1afb8734139ef3f05bda385a0cd304b825db1f9c9414738c4c5fcc3e050e391ce072cd775ba3a97168b8d6fbfc92bca2181c028a0746c5a298fd74a9c1dba2507777d1cdc9cb655623c94ea1b0955c6e2e467566d71c6b11ef3551e774817e7c79dd849c4d8251a61a19a3863febd9c67bd5fdb8ad0bf353550b566643bfac42f1525c07d353cd08a6a9cf05fba87ef9e871a82fa2ee478ef7c9736bb7771d23f07a5d91fea011222e2709973ca71fc5bef65ee856ff7cf704917a0daf59720146231374063a43df3f37a73742e82c42f8557f5a4ac4aabd30a7b44c38619610340b29c9148e5dc42ede49c2e1e2dfe453b3e9730f86858aaaf6de7fe13ccc40520dc31d60fb5986f91fe7393e0c29cb2dc694614fe4a2889ff99703f9dd74910a108bf23d701f401f78b59d39692925230fb05587c6c0ff00132d25d37acd323e5210cf43b54d8ff1b6df030b6c1f2d249e54670275c725b6eb60b70e272c36e0a389c43df62d7d10645ea8b9abef56dc0e93560e3c590f0cabc7655387b31bda7ba57fcbaf82ae81517a8a900b142260036a88b324643479acd5c204be72716bf0a455c16aa1210908e90b206ec943e2e367798880cac0ab80200aa9c65650c61c0c20a2211e86472eae88aaccc505ebeea56818673782640c88e2722022d98188cfc3c6cce49688aeb593894a1bd1789da708006ded24635accb74b3bc2323a17878fa91b44f2b133f0f1d9f32f0cefe38ce41bd6311acce23d6efcf309624cfda79fda846165e8b3e55f148f2014dd411bb5b7a98aee41d3188ac2085d20dbc2d7cc534c4d7edeecb928ba414164f92387b05924b136d356632865e42ff1d92eb3278281a7d05f1699da84c554220628be1264a07cf46e36bc3f32673830c4e31c25609479e88ad00521623d4ebbe6c447d353dfcd655ab6acf7a72b989ba47a1cada0276dca1fa9c99d4d8b1fa60a54550f7b84aa624075340c114211324253fa8c3ecc0e1b36051a5a6a99c8e32ec2435939b274bed70bcc1ecafb78cf9f68fd5465831f6ada9d298cd0b8995b906c8e5a26ae97dab3c3ad9ea13ec447d52860df892c8eed5e9604244eb16257db7cfec30fe5bc78f63119b605459e93ef8d5cde7ef4f1831842f1c29c2d012882a1b7593292ee27337e78b42a94d38be1ff4107f2655f73a7e4175b4a8cd653081632b3c48a6fad7afb22a0b0af6d5a56da2b52fc8b2f35f168ed431d73fb2b19d08c941db10c10026132b9a1421f55efcd38b54be264b62f3526f1759b653508f97e6facab0ae7af966923c5cf433386f5d4e2c32ac4f45c195e35bee11b3c6dfd106cd89d1bb4f2d45ffbf7ea052ddfdbc1484c3add6e2a9f12cef884acbfeaa204b5853d002f5d0de570d2e4e0fe99cfa60ba4667c54abc4d1dd3d0b4db415eb5a0eee86df9629901ab0e9d409df9f876e38519bde637495c65c445f39a745493791b1044af90f2d1a45c45f38e2f41b38b4f46153e88b5fab4d9500be0accf9047648e10b95a20c35d99831b165431d0d020550404846bb8eee2418817a17e36004a6d8f8577f89c2e934679ffea12d45b6bfd10cf9b66a3367436c56204f270b065669c5b888cd29b823ad13d8e4fe9dec063a6dd485945d05541b74f27c9c4eafa3ad3ceeadded1fe7a5b9e6b29e8a6251674e4f56988633c5f8d16992cc38275924fd01fa6af4290ce33c49128858da87ecd6f5e605210fe5ef77b68b89f55de6adbd7a18288ca29e3b586a100935cf24ac2f818fb8a92f497fb1fad2e4c9eaf254b404bdfb04b134eb4716ae4a4f0326796dd08d001ad25aee34e68288b0390df9663afae84e7ad13c8708948a72da63782e2d687b126daa503c975a932c29fd6c1e16a8527efe5b1d91936a502fae49f530d8ad686c9905fd0775fe0b11ae11978813701bd085f36f4ea8c61fb7076fa3e1f4efc894550bc982363fa0ad82320643936a26b250dead2c7548199d5689156a861f15c34b9423a91d943562586375178858d2d8ebb7ecb4859c3d6a25b0510efe3334cd338fe482e17e49679aea2d81cc9971e7956603fc98f9e4bfd6b7c089791e2268fcd224d16e4d7e4ce6a61c6c62101c0f7a72aa5a495711cea3c9820a6eb46f1283542d6c2c6a7bf83baea6dc492edf0a2440909914b5079bbac54b8e3b4980cde742f0f044f4cb3e4d63f63e4dc11e3d775969a991c00499b3456048b7a111d2825a6f10fc359fc98f001da52caab7140b34aebbc3ae30ba553a90fac6eed5ac5f4c9179f81c974a4e04c4a08a041500688d8926e88384a22a6e4ca92110f5256e462ee0bd5f6cdf8bdce85a7b76b25c85142686c1c1b0d44f5ca4afae928e1b28b349fac44c425f3e45b5ccf9a7a9b15c2287b41335314c2a48631699773f800092c7148555dd717cfb46ae06a151650039ec9b26e3fd3c92a28c0d9759612c701118616e8c801b2147b68fde901c6f0f4d48278450f8f8cd9417b544c8917799173fe7789ddd3f2ac8277284afc0187b4ee81b6f7864a4d623db5534b315e5d6f4fa429f77a1acbb1aaa78206575b430c88a6068b37df4c3d05c87ab592071208e536c4ef1097ff743e0c78ba880aa6d10a3fb1d7c5b37a9823044583c0702c4023bfc816e3d464d25594eb0d1072eab80b588c19a3274bbd8a00bc969f149046f442e17f371563409895506155913a5ce15f988afd24d7d5e03f948ea8cd1928622847eac688b420b135b24755406f9999a2ea05ea9ed9eded5ca98ec7b825044ca15f6cf8b207d6ed35a7ef8a88ca2c381bca46bc805d2135546e4935040d6685b7b8f3f3c1c5366c4f0d81abbff151f1747c0893b0fc51d789100801a4723344ea346539752d38b2451d85d161ed8f5122f99b3c3ca5d5dc072a83ccf7e7a16232346213d795f60c5cc56f0e8bb0303c9c7a2e12fc3e8183875e85e2db00e23e906d507953ab334742d9a8f5558eb4420142532c7c854cfacd3165d665dca8dd65c04ef91735181bedfa666257417d57c2eff43134c9c516806ac41a60017763972e6c71d7f0ae29c7519a0510a558fab3aa9ee3609fcd28135b0bc66a8485ed0bcd322d8cd35d5ae8e8dd5c206df3de67aa2de27a56fcc66aab82d93ff5164c9f35a743fb6b6b54b8eab1c1257137b76802abc469650b7bac094af651d8c20cc2a81c6bdc8c778629fb471951e544664d8ceeadbdae5eb39ef25a10a07d2fcdf6c8f0d2fb6a9366a9c9db98ba6cc95c5a3bfefb8dc16b6df537a60e3775c6d53f72518caaf2db8f8086235cdf97c100b22eb625c566bfe8f1fdca1e19f90afe93bcd09b81c47a277333d49170e0dfb447e76b0dad0c062b57328241943f9c1fec8e9d585357187a0d7cbbe3f0e984e7cdc325415e36e7721cefa3cf64e4dc6e7211fc2a84997d5df37a598106da2a0ea9292f2af54f7c0c0df2e609bd27ce1bce6c00370c20d745ed81bc6865529e981c380715b745c64c9aca7c15a2f9d7bafb29cba43e5660557d82e88e1b6c0309c035a0e95ea02ae49e287fbc7b837fe21b09088e21b61fe5720f6e94c7cace5aea8ca77f3a135e4817138d5cb93cfe855ea5338eebd4943d059d1a49adca68ed53e3f88cfcf9273162b292e465ed60c3e4b0eb392a43470a5a341f9388df0f1d0e21c040d7a1ca77506c79149213e757cc1102b944658bdfe3db4d664a2f41f948febc2c91fdbbb805547107de1a61c0e1b2d54a338bae5602e5d19dc3c102ca624648a44b12dcea92688d64763f15f306f2857c009d0776bbd6e4478f502bb3157e445fc4694458acd9cceb29a4e20ea8b384081c3c9418b68711ad44bb6d311b0c41e28f60badc7045222534e855de190f541a0fd6675eccb814f19a527f64043d6565958052e9d6d6ce97b87231e2ae5399f2016afeba71a3aad77ec4660ab87df69269d79d63f6143a975cced6cfcc09d6e82b39308f93b815f9f551a43926049dba1fe81014b6f22f7ad9e68a3c2e0a42e94a4897db8737bd1f66840ca3d4060f46ed6d65f3ab2d6854bcbf6500beb4cb43468bec7a3ee4a83052f710e8a3b5e45698f5254dfdd9c138f46e9759c07389ae78d6eef0e4187cc255e75f91810e9337cebd3bfd96216781eccb9cc7ab4d802f5bbe2babdfd4ab5ad6f7fb39507ee738363da271207ed3d146f56c44e93b9a97dddd460a9d195da54610a119644f0506e3153fb95366e7d581c48cf0c9f0b35c57f033dd96892da6df35110959360c42d06e9edf56b6da947a3062cce58bd7439631c3dae185956cca36b7b38fda58bbd517bb7f5fb9dbf2894a1b1422e5a40e93f151dcb7088b13f9e0d5dc613ddb6124f0026aad8bb59a48500c11c5d9157fca4797d6a2af7d7addabdfb755a24aa462088023ad1e92726cf736b176b5bb9bc59ea607bb29a5e8cc9230a90ced4413f3247cae11c4e7582aff618a671fab0cf27f798317a3b0079b59e2401d10013fe6c9159a29eb9a9e91dbe066a3683a97c9244c79fe44094defbe0badf76a939d400a8a504c3d97057d92ff25041b8ceafd82787ab08ad5763d3d14d218a6004be7d87d5cc6b407149f7b8f3d2df0c568e9b5d594f9683a4adcf98879248cd9891c6dcd4a0ea60c45768c33adbe09b2f1e8d2c5385c00536c8b024e107046f8e5e4cc3bdb694c1462277dfdde57958c23317fb7251db48b14a704357f266927a15a910ed0587a564dc0ac2d6687414c12db50fb3e86feb56bae6299c7c5c56d43a83102ff6897bfe1437069ab80b6d93fbc0db98d2808ad3c6cd2a98d8a669440a613c9de7714d6f6256d544f53e75b111ef3d5fed274820d19939bb017223ecacdeaded7fec3c2fcb1827a27ab10c2f795bb55c0046ee894c67198e91bb91a1b4c94831bf96bd5ec6d1b6d3db796df6f4781900450e14f611f4702ee79811af7eeecee2f44e540a693cbce9373965936e5c9587b17678d9ccc1b56424f32cbc24b3e8e87ed8651e9f3341b71cfa0e4697fedc9c4adae19678ad8efc6902400a1710c63a2173293ae2beef79c5a431f88f7ccb55caf7f0b5704d8162ea293b20e59e4e31803366084aec5307642d5759cb97343bae72b69b8687c263efa7e734e06f109f70408e428ea17e62689c756438cf2317a7498106af31d51ec74bd8c6446812d88bf455a4441004a079ded7de0ee81b20020f1f8d77ab8d71c9ebd097b8cfa5aeb191154e9bf8a534f2ac14f7c900abdb29dcf4a709661f8f1758e34b8646a419e3df497eb19ae5aea3195e00c22f7594fe18867b5ae11c4a362e354ff4ce890ba657b67118f4c6c7ca38563e51c1d528aa206416bc154960781dbd3713e3112f00067256f32cff947a3d780630f908df26b7839185faf3b196cb45437cd1b1005f1807fa0510ce3e9a33a36eb96612b741bba6158993ab02de11ec1369150e70fad60d53ffa1e943df7641cb1df369f5e311f28ac0990e2ae83bc687eb132bb61785dbde075e4040b1e6008cce68fc67b267038f884bab767556c52a3b3ecb25531afe673865cbe93f2595f3bbfd90f36a149f46d861c80af133b00d3de0d9639c2ba8b60ef959fd9d9de087a620067841cd940414b6ba4a3068827f70b82f736fbef8d18c81e553288ec134d90a1755675e59a2c53a4dc108f80691f0075f903101c91e09b65a47cc53c56206afc5e627b157d1c9ab7f5a14506557ac94968d2572487f94c03695a5bcd1da3d67b6a9ac6c11c08b0746e53d2c1dbd74d743f911ce0e1058ae451458ee13c2ed557c1948963d1b260802b57b9ff1a4cf9b8446d4c3307c124a6dd9b11cbd2cd68eb85216b9599863d4c544d9fda7b031c9149530bb60429a6eeb70964d5673427ef922f47ba93868174d9a40c1cdfbc58a11998cdb8bbd4ce8a8d49d934dca51cff4d04c545d36e4d12e54a8d03045de2812c965c4cbab6c29006879d27b7813edef61e22c92f01e836f93cb53a28b568a6d8463f511e639f867b970db4fceaef486291b83ddfb0b97b89f2ac61d46985a186024a7028d89b8020d923e14ae7d40352ebac9b3e4ec291ccc98560519f3835ad408fbe282adc81d4aa9a1bc52a126149cbc50f320fb41631c2a70c13e89e82f8ad93a709bae81d2865b0883631b4870e1fe0c5110b9302de02150d0abe02cdb19dd04b0ff72c83420d72447a0a0bbc31037872bf619f2bcbe10b132b578bde99e3b9600493a2c7003d00b0f999e043644d53973922fce3ac47576bc81f5c21203e065191443581842e64b557fcd8c64fdc9faa19842bc2f6d7e7563c8f0a4aabf6646b2fe64fd504c21de9736bfba31647852d55f3323597fb27e28a610ef4b9b5fdd18323ca9eaaf9991ac3f593f145388f7a5cdaf6e0c199e54f5d7cc48d69fac8f075239579fa81fed230184524bc81428623b21d0466acdeb29054cb5b0c03a9a558b24fb636d66e3856bb1d5535fbbcd32730a976d6671236db1e93fb6dda6bcbeadb67a5a6eb31d03ec96cdbccbdbb6fb23dfb2959fff369b79de5ba50447a3f39ab8d8ea67c6dd86ec40ae36fd6b72b31da796cbe63ccfdcd306e3183a97b02b2e0d3b0d4ea01b1e59a08bd276a03b6293170c747143c9a5941cbe152474e13d6540467e50f816346e759aeba757468bfcd2cdc8519ca340772b6642576111e743b75c98162ae0bd8aae5729e5a686a4f84dec042fbb2f032d39e3b3fce196bf351faac9681c92d511c1ccffe4bf5bf618e8e108462f622e58cdacc69b53e1cec068bfc03aab219085823e0ed62b4ba30fb2072abd36711031f7f196a107ff70f5040d38cb7da89e4090a6a52b695e17372604a0eaf01f118c18a1d02a040e317c9e77436cf91eff3f84ce2238a1d210c462844b5b8c70c92b38e11868b7259b6304faa2f00da1c8c351fd26dcf79a9b5a7318d630209825a5082fed3e349686008349407fb47920413512076800fec798369e30cc89d002c83cfd8618663aad4f9ad28f94e6605e9984affcef2b63168912f1c1ebfbf7bd3c3c32414c22d81956e918a6592703c277c464a8318924dc0d4ce7297587bd1bc3cc68f9241ac6af7e80a28fcb7851d22c2e700c683fb206d8840da1c79924e76a8a0f62850da17f1094f04ced6256390455ccc2d41a82e2f109c3d3178d2056a241d138b989d5d180fc25b0c85366902aa7fe82c9cdf0fd30c43639b5a53ec2ae488cd323f75eb9b14dfcf3c7bc8c96853d4a69ac6b9362afebb9482432a41412baf7ebc2ff625d25da4fa046b96e719fb06a4f73522322ca8c6cb569c4df6f61174332f8afa423b612e0179ac8a91706444886fa64edc21a157507f8d43861ea14c3f031be4ed51df083ed413f60ea408aec05e7c7ffdd0607cb2c73cd51c8c6417707eb117a2fc233e533ce8d2c3dfe610a711854e7ccad8b52bcc53eaa983ea9217585e93662ae53a8e1fe1430b3b5b176dc3ec52caf75e3e11ab856421ce23352660f9d97232944549788fc0d72cbe1062ef309ce8a331315b2fe3b3dc4af041881710d761afe633346dcfc66799b7b78de168604e81da63ff9ed22655d20f677416d5ba14e0b13c0cd7a3adbfc9f67b3554ddde9dcc055808d03e2ca935aab77456ff4f1c1ab99573ce22c3b89796f0d0c73b35cfe5fa24a51dd799930694a962789ec9ada8925995d0d8477d4cb0adcc906376a5ad292c8648684eaaf678f31a61ef32e6111369ec5c84be12c37536a6664f7a0a70bbbe8198ab591e17e100ebba4a2d103f2c2275d3f17f39880de90ae780b6f3e2649ec96e8bffc42be95184297e381f92d1eb4a3647e93db1ef6dff0286c6685651fded66948db4e1a5ec0be1c0a2c014da54080cd6d3833dd87e7741f8c3bffae5ee6ec920519e2e08ab5366a28c0ab1d4d61cd0537e42c7690a135dc2e6bc31a3b4eadea68035589954ca29725b18b59122cd3a82f908e7c6be3680929faca336492a7f3c1646f9497de7d8d393cd6a4e8f42da3ce934f941a50ea88d71f513aaa9c5ccaec3f93f1bb08ca571b2a75acb5c7243ff59d062d26c3a8fe327f9f582191564afa24512adb102b345e8825f71614fabbad4049e45e41e40c8115a85d8c91680ed0cf156ca74adc35d8675c308ef85dbb8b53ba6215db2dd81932d0bb7b6ffab104c83634379bad0cfb069426f36afdc538694f8cc29ceb75a3403208fc93147a15e0d99aed6d3678f4d0e7f261482ace7bcfb12ba0ab91d0e89bf47e997de955fcda78e5dbf5782e33a7217ae58674979c75eb0ba75bf46efa4ebec59a2c38164a150660b62595d79d681452cd4154c52900a7b9c9a6681f9547872d280358a8850f3a519a42bb0f5f164e0d3cd31953c2fb11c56c960d965289cc1252bf888ece8f53a88527c6d9320dc0c0d62cc9f6a4932c53a9ea266608afb279016d7263f872f42a66ee345cb648509924f4340141fcffc070632fc0775242566010e8f1265ef6eb844730b43443b99dba18940e81dd92b596c33ff0db86efa69333dd05a13924aeb6e3f5c36e16300a6e33c341b67b80ca979aed19d2a074fd7bc507d55e51e900c349533a89be3e9acd3db1481b12a619273e08ed880010b37633fce125034033188720195022a89e1d08babc0fb801545cbb45ee0122741acda860e47a5faa03e7eec753109ac23d24d88946a49216656b1cb1bd495159b91c6496f2a8dea54a4b19b806007c198e9fec8eecfd84ecbc6afb06b2c33ca7047d7532157e1e78741b29faf330f14d1c71986f6d14ebab5dc75da349412fb601a0639ef47816cec00126a9001cc7fbaa08320f4705813cc6d097ab421c099bca2f3aa29ebe824411ed38eff981df8d31826e4833e78956fcc709ab7ab470e2487701f55d03302d5daa992555da58ea2a4cc93d71f02a4065e3ed4f992a08b2c895d4fc6a1cb1bfd16bc185dc0b90556ed89c8eeb5060436a74e6787ae289e1a2e65e499da511728f0440f5149eb5b99240ea3d9f8257dad2da4ef05de07c419cc5794bf325f65424c0e154b46f0928cc2462be512fe835478f13456761c41cb115520c169574978ddbd2ee5751d1a555502cc1ea7285af00f0ba97e96c36381bc1ea47e21ce0fb5a9bcecc62b2540ca025192c4caedea241416d8b14ce578feb4aef9116cb0a0918810ea1b24a791d712c0dd5dad56e428062b876a9658b5d9ac615b53c058897a40d3791b30f47703b68770b74ddad13ad503793f1eaeaacdae78c29bd05ce404c11b1d1451bfd87b7ffe29511d83bd752311db6efd7e6a07bb61a9208ca83a2b46a36859642ce9aed84a1dbbee106f69a2a0158fad84a9267da453faaed27253d67700ab8fcb0671b38c1298a925c7072b201a8df0536f128fe7488188d8a8622c7f11c6855279c2502db2048e75e91e7b34a01cf0a36f982d80c20b6af6b53efb05bd2fda4b59dfbe0699891fa1da280386cd6ccae74773536a1583b8e180e7db7885b2f72c13901046ed627a40ee7d81228a034c3ed14b1c1f53502592e7ccb9ef137ad18e9a29c4cbb8cf1a0b277110bf58ac7256f1494e646a0ce88a7c8b297c9248bc5022c972229aa0baa3df9e44e05059839d220d15c8351cf3c8d2b03af70e58e77c0d308f4cde347ca0a303e4015a5211f63374c116e33235c47f059e9473e54fb3c376647a928cf51dd07d5ef98aefa480a6c20f1800e3207a2ba263a25c95c8b44180aa17736bec85970e5e6800daadf6171423af480f82acf6f8148b2592ed756aaed442e2eee6317ac5b0c2f85909d09b51edc347e7a480457350631e7188885bbc149cca8d9c92e50da9dc40b1bc481433a6ecee7e3dbaed5bdc33a4d036a8e451a7926c28a7a3c04e451d732f45df86b35843ddb025a01445cdb26590c207b6dcc6e6cb0091f0b105d5df7cc1b1af704207cfdefd2832fc3560bd69de28d411811e9300d5abe76895f9e0edc55f6d901c9539c3a5b9c52e89332d65e694ef7c52db26baedcc6c378f54798ca3b6665c2e62e0dd8c0c31cbc6b12b3b7af87d550199363c4af8f4f3869134d620f85d809eac074b1036c3b86209f42a6f500d23de3d5a02cba81e0522872f3011c22883347516520ae08428acfd8999d03f68d32999eea219d76ad2d79840307b43190b6ea95e2a94078dc091d6b2782105e21ce7ccff849d8d7fae8dd8dce973e34045926277d5844b85454108f05591c381d045ce3ea00971d402f2e22260b8d880b7c32a1703830f61463ee8359a1a006527c6306cc45eaf47a534212dba2233a83fbb6bd3b60ad0fb5fd8240992731344a19b96fc55e479558f4df046f29844ea3f96ad8e512d9a6d385ff4efba22e184067c3f6e078f25df0f7b1696b3633b58210005ccf2e867b7ad91e386568b0d980762af14cf1586c4c44494c1c4bfdb8f7c466678afdd1d88453d4e4275092736eb226ff00400da34fc402f080ee5a20287f30645d01f5860dd1361f12fefb141d256871b260ef3c12084246cfa949073f57c0e4cb7e94a7eddaea2dc00dc7fd3ad84884fafc74d8698cdc8d98819170afb6962818003f5afa00e5a9c037f293822130d4ecb1a7a00040f7fe56000608b6183db728f5a5c275527b376f84dd3e35681bb7c3a2c702b8330e36994a001abf6df0daba187e11aab0842055bd2ff273fa5601353e0980d4c92f75f9c6c9225160b6b38f330943cd8a3f79218998c0ea33d5f859b082423ae477573de7ca1c37908352ffe8c42722575504c6c2742c8cee9525db515c7429af7c4ed719bcb1ef22064c6e6ca3fedb960b17803a22de6a4653861e3451a2e1c92e1a3380e674a20d25691a4da96c68da715856c2795b155041c7dfe1d63f8644dc8450995b7677f01f29ffa8ece094147c51b3dd415e1e42891bbbae0481ce2194943ce6fadcbb24b368692524239f455227e883906c0e5904bcf2f2ce1d31190204510d5b1653b8a075a92ff99ee084307ca629d11f185c38165e9ecd6978ac1a88a35e3d1d23190b357c0ac6e5145961fae4888648334b596b4a40afc92c340d6660664268617300149626f6ca6318e419f085f1c6f8ce09db1dd9c1bde36fb805d231c999a53eb56b7105923b2fe59f400c7c97d217abb6012c4e1a7a43406fef6092197e084e54645bdb06dd33e1b7f0fa0591337bfd0aafcdfc11ebf5009d7c1390bdc95da6c157fd92c965b6c1ccb54ede6a114d31e364c2bb5e4796c6bfa9e944b6397678e202add190619455505bb4c7f64e07c5f2c7a57491e0fb1273a97b386b09696b619101435838454964a5475042ed142c0351051a797a42fc6e2015f5c653caca02bed18608fd314778110cd65cd21a35381b2f6fbd3ff82b884c80dee3a6af2853788e2573bcf806cb91b81849c90b5fbafd3db080e9fd03d0fd6dc362478764be58a69a3080bc088b39ac1304214fba3e8e7d1d3f9b715c58816537e9cd8403ba6a0d7676056cec08185afd91aa9e55a4d3fa5d0b7cc48393013ed1e0eeaf489436cbad462a15ab609b97a2d53451981fd1ddffd174e914d9f69de92987e22a99e9df9327d43463f0a2fdf9e1570e97f96bf6235a2505488a54301ec48b81a4102aa3422a33b082ed153861873dcfa9dd176b9478716db91c04ad4378d08946a2e2004c15d1fdc7762c0be441897c69168a62fb175a9b08c9a7836e2b15fe23ff6c8ec14ccc911572ca6310128855b6bf534bb9c8703a04b0fc31b840b1704c3a758aedf5c7ec80d77460e4fe5fe3f9ab05056e0ff4496aa2efae215e18bfea4f619cdd53fd8a6bfb4b786ff5069ccd5e144015109ad4fed052a5fd06ed8606c8d82126a684a55833dadab3a3c3316bb1545568f76e2ac977d9ac1969da687db40b6bd8a6b64b147352229f7bda4f118dd3fae574bcd644343b0a7b2e8b36fc9e93fa9999ef2d3fa429fc3d2381a9346278c54bb89ce63e7aee74ff25a6462b32614495482f0eb1a04535c3989798d8b7e30efa88283d4046d0f56be29c48b4462a9d9968f5d36183b407effcddecfccb2c7203b3b65f60b6e4b24c53178b47809c569921a56806e61fd8fe8c8c21e63e8dd69ecb78e50ca3c6339097d59069abe9c45d7a461d6a2756179b50c2587393b709b0bbdf66a454df10c0622d4aa50613ad9c134fb0565680a2a58961e682559b8ac4be88a8bab4963784c083d51424d8b20c45c6b64c13fd8a032720a0fcf206626f36a5cd654c55f260f9cfadf617e06edb9001575d6de3c687d12d75575f956802cf59a546c580cc8c5479c1801104fd277a76d18f183f0a37f217e16c306e32632c296ccb9cbd0ac1baa8650476c1451af01ddedee8c9400ed852628a169b1892b0e377456405c752cfa09c09033f82958c3811a33d1fd1c7c491a5c998736a6b7c6ae7cc42c7948e5d6d72eed25302f497b524d9fdeec932e9827f0c39bf0b782b8d7e35c59012e585f8160adf472d7168cbee19c28b06c92b66d1dc9f2ed86d4280b05bb78b9f00159fcbe83c2cdc608416e42c56bb152c044ee7e7e819d394e25eebab7f474b6e249de3dffdad4dad0f030ff76a92e07278d939d72fd461938c240d94cab5ddd0ebbb983727776443611f1983b264a65bbc880feb75391e48ef6c63c456da251836eb320b4d3bacbf019b1ad5666cfcb3d166534bcb8b7699e756c07b9da3ca05a8c666cc3a4f0309ba83d11a54f376156b39b0313742c449337f0374047e9a3e18b437d62154de4f3289d2f967ba19a3747536bd31a6616642b7181b594989ca069cfc30c5bebd8509d6d85df1d6d78d4640e8363e59dbfe90c60ad37b8ed1dac6c6bc9477a4393af923aac60f33a380e81508c9151f90b904674eebddd15db948bf8d02a8449f07cd5482a6a410a891b7d22c0e09c45adc2d1f05e02ef3caa62026924ea54f009f040c2033d53fa73267789caa9f8c529929a15b5df2947a0fe37afcd2fbb3d6408e4190a465deb34e6cd862640e8c7eacdf92abef1a3e84d42d242a834455ce2889bd6f85981ad2d343866b16c2a90be98e835fa81f2697f8ad36a4e55686b09caa70b33cfba853368b2e3ec8e9647be255b3ee727ab0e9301ecde933858a212d5b37d472d48459be7a5896ad18d6f215c3b565f8aeeead65dfcf415c0e88b6c46c6671f8c8fd2ce99a2dbfb648cb6bbe849ac3e1581dfbc8d2be58ae9401bbb2cbf0737e8ed259c098ff2bc9c2906f7a6cef8f8fdecd8750e479891e1e343561d70d34d6df610273078f328512058de30a10913ac84f812bd0182b1ef1e54c8baf27b5fc724ed810ac71a980ae80f41617c460ae5c2c2d5665f6883e7a1f0afaf879662030e634104552379da697484719704de5c18c48fff846407c9f1212c101892016bdd982cdbfa2196966b6bb0c72bf41643bfcc4220a7dc3befbd3e541086507966488e6cff78f25cb412ae7cb2a151dff3842aaf34adab80947fb6bbc546eac90cc8f222ab844208e92ba448e70d3998acf2a081a2d4392c764136560a0c910faae1f7358a36a4d3a9806f56a22ac0b4ffaeaac21bbb8c2f49c4e703db9f723d8de9bcd3ee230e11bb2c418cf7f1abe525aec51e3f263abe5f11b3c08e07f922eee504c0ece1345f117d99e7783cb201201333e4e62aaa36c86b930c2a3551e73d4724249e521c6ac28c634a6b0c648dfe48447da1328da8c288853f3a210c9146b3a839c41b0e64ba4e581eb04aaf95bbb988e97905e83369bf1690bbda8c3139b95c1a1c3a6d3bcfe8162cd7010049d3462891380e65632e828c4a3344193a59b80503ff1a503121bcb4b97e9d975739fb0c1268eb9349135ec5a2e00d6b0425d1e04a3e70fce00bc1d3b4e57491980f4498bd45068a2df38351307f11275a95e7c8ac1c2ff0c550d55176c758e29dca25aadbd527b189bf626da80428cd3b48b849e2e323849d8986fcd5850e96d0f118bf035a537e4d98223164115a5173985775ae85935ce4a8c6c89309961fe9a8ec8a95fcbc4a30cf6839a0b6211146bf617870cfd3d0a9741c9225ca19fb208971ab308579b59844b45358b70e9bfb308571db408d73b165a84ebfb3b2dc215fe598b70d5872dc285cb16e122668b7081326d11aefb4fb745b8a85fb80897fee2225cbaf11c17214897112f4bde1e5a9c142da20bab9599b4f96a15cdaa74fb7fe7d49cdcba7f7786cde5ea0bda4c8e7cbfcdc9899bdd8c9cfefbe6e594977056ae9e16e7e48e81e44ccebc33e772f7077426577e4ee7e4c6eb3a23573fb5f372c8ce3b2ba77fc37372c7a93c93739ed17339fa883dfb72930fbee7204da4c1b448a8f09f0646309f197310406be6cd419f3b7343fba042468a263d18de4657fc072274cdf40f3a6178d3f33c321d5ab1e4384d68c287400c72311c444a7f6b5418560b1ac61e830084a950aca226af57122c7e7a74f403bb0e5519aeac43a3c47620dfe9652297e51aaa17d6124bdca4651e1b8dac3515bf736074d08f67f06bc85ec074612d083f101034643fbb94efb77dea0e834b06e9449d7df9a42b2ac5058ec9ac0400675ef1999f0fb49b7ecabf44e3a47b79851258796d990d61240d7f2ded56bd3d6744160d7899eeb0d43aa8f5b5e9a9f36c2e1a5606a477fe096fea94131b4ea390c7c8f3dba63f5b5e661da59b2a9d195b513b8270706e7951bd764f4362ffa72781199290f8a50baac56fc801062346caf7f294a66af1ece3a408a915b29484b0c342e151e518fc5e59f0316883c607931a9238166fef00323d47d9365bd65173cad51c01140bb40c3d34e64327444c0902ed321c0b87e866f1e4ffecbb77b8a550849c5db1aa14a52fe4cacc0205b860f1141ac4778d60ce3af06d3b88e21d2c5600315f21fb1f483c0c3a44dc623f21e5bc6dcbca67f4699889156381006a6676867b8da7c0ffa44e39ec029aebbd62d2cd441c9b3591ea42dd9b07ceaa140c8031669b6428322076d90aad029823e37fd6bad91758ae0be0a6fcd3b1739d44dbb7e11193065e1a933ec4cb173b942c3ec27f73a0baf0ef550051ec32e60a73844b6134fcfb623cf69763167bcb29498deffdd6c3ef16ae836013fcd36462e883f16203012819d1a48b84dbf5d1faf017f913d076d7163fc6a8263ebcf3146c2b400ea9b5efbc800d95620d74ffd6e004844036fca398148d02678fe587df2487304c70146b2a0e99a6e598d56cc520016f4a4c9338c83595835c1339c03189637cd338ce35b539d8f068225c991c595f227dc66ae6332dc730a7b084cec7878bc4ada372a037c06435cc341ff3846e256271aae84b65f34f1b714bb568b3fc0649f18485c22336e75d916b9645829075c8337c8b8a583197cc7fa65174d9967d697dc9559f8400a40408e8a037f296c9cb00a99d50a5d80bdfece13aafc0e76f916c03d37182963353210c342d5f978989cc560d62051b23a1683cdaaa0a8cff28e84337069fc8a5ae5e5226bbac929647ad7f40d6ad33d1cb27aa2169b5b4e8f587a0f8bbffc52531ae9aaab979299bc146bd619dcf5f9ebca90d9b165ee98920fe38416054b1f09578692bf2e43e81f856563732bacd463a80e33ac405a4f205fb66e0ba7f57cc490219fca32ec035b4cc1356692204c7dcfb3a52c86c90d3cd51173a4202630572de8a39061ce4b241692700f98314f435c7d7f40946cddcbb840854cc91e6ace5ed3bfb9afb5d893bed5d93dfd112669395d20114560d2d78bc47fec01502989f56684be454272cd159b28ea311168f8d78c8a1761d878747a747c0c59dd330ca02abd26b1e613b6df9a4a0fbafc774fc803cec6a1bd6c927d1b3e877ef388126a44dcec6653b6d562367e39a096a7f6704354fe9866260c6f7569e3919e3554c30ab014df881aaead692bcf6144e5bcabb34e960aa8ecab1eeb27ce4d4c3b51d786f85f3aa61dbe4a4cb52edeadd7abefc19094c56346826b83ecaa5b45b9c3dde724e843fa82a28928d9b7f3cd4ccbf5c180de4fafe2be82f7aa9eb7982e7a5ab1073e6ceff6436e41e709dabc6c75448956fb2b61a420d161f6a132914a472484596977d9810053c652effac9f961fcf9a79f43a4457fdef96f205dd8d6f83ad756b9bb634cedce02a51eb927ccbb93e555842d214a2b5652b660ed549ed992332e856e94b2d1ed77a3e374abbe09b7799eb1473fa87aae6e5612dd5fea942b8c599b677f575a0194f6eba04e20e9bbe48928cae2f75b956996aa28fc3f5747bc37203289b858f50d34873b6493b1af1ac730f9d1615a6bbd327b727f4d4f9627e3c0a03c175d8b6e0e77b2b18888c48ab7e3ad70fce030e401ba2e6d788554b97e2ad32a9d5644e7c31ba6c2a084596555a3157164532dfa3a678bd38083a6bb4fcffe825a3b0db4b1ffc82f9a5d6fd178bd93a048445f00f9c0697d9e8c07ad9672cfb2e1541b19ff4f099e1f0d6c782026da45338607af12ed461ca86ad09c4f271a7e7884beed6627a4c7551e7a893552e4109f9f725846e75921091b1418beae6917279710362557bb9b1f3e7204edc4eda2c237602e477c68535aecf2229047e0bd23a9828b0398c376769c3682e6d2fb6d26cb8a4cc8f360b00143ebb415e20eb97a43ed6c6e383519c6b29bde9c6d3393f9e2bff8a95dc71e927a2b562d39b89af81c6560dda5d95ea0815e036c1e85d38f4887fdf62ee1ab7fb158d987cc66c024e78ac0aa956a4c4f23b2a038c1cee2e913d5fda1925ea89f6e571fd97ee2a14f3396aa3f67f303f3db0e8c8a5d95040673d8dceff10892d44ce97f644da63dc34ff031cf760eb7f0808d6d3fcb77f5cfd62b40a21c2a2dd4b6d8359004fdafde93bd9fa8a06c08cb1a68c052e368585ba7a52b0f9b0eaf15257af51ca33411a83556a3b6b1131506615233254f8f104e337c6a6009ae9de56601e667f1b64eed21e488d8e1806f32b823fc15a3c755f5e259bb6afd89c66647c04a964fec91a1fdac0a82671ae4bfd13741a25e0bfb25001fb0c139d8cfc3080cdb0e60b5c4569675fa6544a396d4ea4b361e3a960e5e22cda93202689d754f9e06d80a0bf5b58901e5feae24132a14580ac8ba514fa890cadb64ea7d3d69292cd3f28c3146357981c77b7a19bce14b0868a54dd8a42f8d39075778c370f500fa79d28ed0317f0d6231d98a4cc2c270038fb992b50c52809aa25e846242373a078a97ea044080e23d3431e391dbb03001f29e76a3f50eb25fca857f2cc2bb201fb6e68aeed6c53ac0d2c72645320b09fae3a690fbadbc7e292533504c6fc0d8324cfc25bb5e25a3bbbe107a0a24d9423759efd6d2d63da6000a1acb4b0420d5ebfb5f06862b07e5ba8d2e24d548822c58c84d4ed809811370e441b9349019c16eac11c3d9d30d0a122e1e7cd02d2fe9a40c58c313c6ec9d4ef1a7db7cd7e83753c8501a5beb0f74c75474a10292e71b1cec88ea7eb7d51d8611560d06c53e9aca06589365e46958a2acbbba989d33780aee8cac80f0138ba174f1bc404108d64d630357d1b35995d3e8dbc2a681f8e988157c8eb4556fee91eca15cfe3dce613c66b0af42826febef25eb8e3d2f9d23e2f65b13f5245ad94df32d59990f4877ea8665a1b901f36c56b6e90ecee44f88d8d2956c4ee95f7d56389406a5ff62c631dd0198d23d08176a21920af3e8917dad7637785d6d8b681fd727f0cd5366c29179076236303ec05e0ae6c61eaf85bb05924a6b5fff4d63a2700c404f22d525fb290d52873b10c721958682721e12be08a84785c32006c6f0e8c933af8594077e0f7b78628e41ca4128725f7b3ec7e18f8295dc8289b952d1d90d584ea84806bcb1ba877ae0d51030f35de8fc25a115bff1310a43b90fe0ea21459ee8f2ab3c3cc415f03034428ca7072d5d0579ac2b20f9ba712a8c668540c6ed36e0add6df6bc50806fb75dd5ff932d4067c805796564ec3105f132914e9dee24aa0eeff173fe201a40e9a4882f946c66832a4af9709c6f7bf586b30d998c3cf438633d3252d3009c3df1d2e6b533dcc2a74a098684b7270a2d6f81b6d584504b87c5ec5f49e901ab36911a08f0b3c8a7a68d225f108b28980c282006dac5b090132b3420dbec2adb53c209583551243a3af0dbdab1c11eecac79c9cc77382dcd83a55d46e1cd28a5aaeca3de6633b249e615e23dab89f70d1b439e1d2a7caeb833f77b9bca5a9729e3a2c00235589e652077f06b9833df881d2dbe6718f729deaa17865a1cefc889c14f4599e295722b7f2fc7e2782a168927f9a5639123b1addeb0c6d2a1d6db8405783c95cb8c83980aaf1d83d62fd97c14eb8e86e9fe9cf32f5178d32e6746b996affb95bc066054cf8b30cb1c4c6dc6c52bdffb6d7cff3f4a4aa683bf952489155ab843168602c4dafd0bf2cb80e7de264256693fa183416d1ca488d32170a845347260208d45e168bda6ced6a08e44428a99e0f3a4a2ef0afc42261f74c0ecbe4a3741d8715bba9f4dacfd9524524019f6a6f9b9116d86ad320569d03fa3b5468c904bba97fcf9b281d1a476c027e5c452b68f3f19e9260e64b83d77d63c5f79a25b18a6fd88d01057a8946b39dbf7e6eb23567bb05635030383b047a89f9ce6523e12844bca6c8bcbb66b9c24f27416c55180d460dd5b84038ddc5e0cdd3cae3c70a2ea09213269c62e0cf9c2a41098c6af793c5ce6a0b60a4181004d6c82b891534d3c3857282e1a8a85d32c346bab431fcaf022653c438fc039025833d04a86a2ef5afd27e893f3010b2e64baec27133b562a493a5b03335cb4fad920277c6e0777b77db6f7d75425b1ba06686a5980b6ecd02109270564076d550cd982cc1a9d98d4d2d93578445232e19414bfc0cee702aec521a58371dcc1879f584f5c49c3c847309dea0f59bca98ab9533988bbbe5115713df96a1a0c56a742ebcf26b729d74c970ca538c91ae84899ce1a24de63d142df1371787f761acf692fb1dae5d742fe1669b10149fe5ed7b21469fbf52af516e0f7926280bfa3d1a95c2d0c0447867512f0afabe423181a744702789715540c14049b2b28bd7b85f4834882672a707079aa6ad4eb82c8c9e298c778b6bbed78c668d85dc880c3d5a9e38a00fd7cd4859a00e01ffa84202d77fcd00bf488db412151a56c84e86f32a32c74f5102b42ebf98ab9140dc34f772bdcee4043c269d784f82dc558e88142ab2ec741f126b5c650dd5dfec2242dd6d6d12168e5bdbabec5b1107cb4d0ebbcff1381dbfd8983f3ad1c7aebb223f81f5a7554696b16c50dd08c83fabdceb288a5822723927830ecf1b9fe1c985365760a4987d22ac034559d9a95fa8e608c6514103c93577721ee6b260f671fd2d2eda51ee1467d7f4cbdada525b6b75da1c65cf837bee8a727bb61e6b596b34f495ca9efb5128c26aeece2e6631c1a3db406e13b377129649aec2b31a1ff5999bd6527269dab083479ed3bdaa273517b6040cae0c34f3e5175d0cb0016be51b08bfc267c05dc686f6fa95ed766cc477f8c8770fc2331d3c5cc31df511cd2df8e7587d47921a888bdf8142893d4827f304f7fe29179389ca17ae8a356819d85d527f09947a6bd0190967c0db2a48a672d4ebc84bb01280b15f7cbfac297d93bbacdb668717d6cec27d1b59fb37df10f5f2f6b1fa687ef2e7e885c57b89a5c91a1d68b78631d765da68c4ef2197d17cb6736a814b49ff889efc1f0a5244a5e695e4fc492581ba008cbcc22f17f8651d471da2f1900a407daafcd406c0a7385568f5155332e66f40468813ede720b573647c86eac61d5643564ce758c63a84f3bae9fc613e01f722109cdc858619a94c04b5d56ae8649db7539f6da17a430d9ed7049fa51da006797e84bfaa0f4caa6ac5aec014245c1e115b1d37602ff5627d60899f694f3a74d84a8c981193cdb2fc55dd880d5ec6cfe90cedd9a11c34378e4290365a0bce3adefae3afe585a08f93f6e2b3e588a307125e063cc349f1e020e391ad65d93e890f0cee386ac219cf9061271b935ef6727418b7af2943c69cac892e6e978c616cf6d053337b17f0a0d7277a9fa1fa28aedbac0e812c2ca2382ab2a95e88df3c25ae1622a2f4b79f7d4f5a13ae59c8bcd2c599e699d426658f2a8d54a73f3f1bd017042c8c4750842cf07b781f2d93301463a06607f30329ef53e81c9169fa471a1747ccc62c9c3ce8f928cf9a68b3c7599ac7c26646bdbb8a570c48a6ff3575c394a2a8cac9b0bb40bce09b30b8129f7ab5acdfd9d801ca60cdb2add3e9614f15c249d3b5a440b295597b60ffc640f18ee595625a96debd92d3216ac79447516bd8192ed48ba25ae651533f412c4acb43fd92fbc6af27029573a55b702012a1ed6fd05f47fd51a26610591f8505d46bb52cc58345dd258472c367457d1af1533164d9734d6118b0ddd55f46bc58c45d3258d75c462437715fdda15454257b2c67b81af94b15bd4b216676ead74c18a26a0fa6dfc5b4c24d10ba03d1c8a8c434f6937650b4296a4c6f4820cac34896d4ef47d109fbf3335a7d7c79d1bf533f1a5facc7b6e82b688d77e1d71f7cb29c44444af691465361cc5ff925244f70666d3676b4f4e38891ec5626b2a09f2bdfa26055ce14d576a18c6a141579b9be56c86e473f36e8cc7675e6483707aaece702dfc401640e0e92ae73d159b292e7cc291623b0d0c64e4f68f8f5ff25e0cd4922bbdb3b8f065369cf46340ec44febd9b265999fa8f086cbad777f366e379de6b37865a252458ff8709f4bb8f3d58a923d5314eb83e880697373361d83224974389a199de0e6d13790b6d19f2c6af7c7b7e23509248cceaf61f1436ddb830868cb9b47a85fa1ad1c09871f93632670cb1d2dfd866038cc7c7a846e3c01897b5b41c66afd24a86082a58c50e82eaab58fce033af24920051723245deb8a9f2c6cd5a613fd6e8c74b64459ada99af557ecbec22e9c83eb628930ba541f288624c2e928ee8638b33dd1b494801e6164a85fca845995f2a3d92c714606ea154c88fde266776b934481e518cc94520ed42fcf96e9edfd2513be50af21caa457dd26b69b2acda1a07ea513a7d3df20eaa4b79caabe471a206b593d722efac9a94a7bc4e1607ea513bbd75eedd2bc93aa99e9213ae23cf515dd4a7bd92ac93ea2939e13af21cd5457dda2bc93aa9ae45857ad44e5e8bbcb36a529ef23a591ca8d3535517f569af24eba47a4a4eb84e90d0f9a4256018173c3810b5d9770eb5c0a92b3289bc362850d963f903bcd811f1dbf840b2f1dd3cc4dd185dce66ced7f0a5c64c00f42a67ad8091a3741127d26e4629c03368d080541a13a82ea650a14fc65c1eaa1babf451fdf5fcc2e026cdcd15146810308837ede6947c94bff1ee770e9a186ea50023b7c7d7fe51c4188b4297f7b3fd6931acc54b5f9a21349d81a6700995660c6d05b7786994309c4ae7d0c167f8524f9e611a8d43f5ba329497eac2150af410588a8776714a3ecaf7fdd1e258ab4a8b9787b8c80d6ed0dcb8d283ca237eef0637692eae047c866faaa41ba2d17028af2b737951dd5ca1400b81e97869374ee9a3f9c41f5a8cb5a8f47879ce8f268e5b27e0e4eaf1c90e58839b686eaeec41f1122facc14d9a2b5778d079e69f26cead7cb4f21aa2d23834af937d78286e4ce943fdb61f5a8cb5f2d2cb6288a631d0c1677ca72e79219a8685f2ba999317ed66141e548ffba5c5392b9fa60486681a16ca77610e5e949b53f8a83dfe4b1567ad7c9a120c51681868f84e9fd5c93144a563a17da76cf3a0b818250fdd2b7f34316e4d012377af8fff51c430168f9e74c368740ee575ca384faa9b2b29d02060150fdac529d442af9654cb75d27eb03fda265e731f5369b52af05f6be5e39bc4458cbeba5b176c588bd156b61505cd5a91075175b53fd684c377021577c7a9b1e34d57f3b56e6253fc5c51a18ae6898c52b230f359afa3fe84852a2d6dc8a8b1f2ccf7b2929ba567b7157e5e57ce013274b13e7b3ac4a5a1ea16798de3a08321775e38d83c57f744fc0386392c9bd1cc08e0170541c67d407fa37e4f163cb32169aff65fb45c2e13a9e98666d72216037976cd605deca0328a2f6f25efbc5326643847cd9a1b72d1d41274c3a6b72de8734ad572aaaf4a75c3e3165c1df1ab2e9a241cf36a48bc20dcdff5e8f85fadd76b926cc1929f1c370c97055c9bd1602cc201c2681a1a45a5866ab454c74702f4da163768664207728c4fc137a31c452414320bca4df684d100752e60b2ad976c31e9cd4bd25e3cb75ffad24fe5ba377ee123f201a1d6c4a570f7c37cd1bd3266fa72f237982d8378b5f7f5a59acf600825404117c5c3260114fa6cdcf7600fa1dfeff20366d3e19ff5e49acde18397f0ae65a3fc146f80cf39ed42aa02c10b9ea36a81d450156dbc5593da6df21d876d0eeb6e96df16e0ed186542d654b779770a1d941fde2a204f5d582785b2128b1c9aeba600bacbe29724546a97b952749a931bb2336653b1147ebed69d765ca8011faaddc2fc940d6b6c07cb1a883ae31a6a8d3898042d031e7327b12da604cd0bb489726ea43cb3f946d0c50ee020adefde15aa6169f75133017eb25a22b9eba99347a1969edbf15bddddfd7c6e7e1af9d9cd86dfce15446d79efe9f0dea6fbb44791babd038f95c1ae19078a814103718c8fa0f8f1a1887d57b8ade407c0cd9d3817245bf5336bdea1d9762fa242b888fdab8f773c11982ffd111c93bf5752882a13e1dddd9109419bbcf75a3f079e83811568f84cfe49464bc3f2d911153cc7f019e014b9a27fe88dab6861b71357e7d085bc8001ae0b7937725a66f621baab2796c9144d190d5a2e4b36c1139bd296f7dfec8327399af31dede4dbc8a259fc63172d6cb7fdbee8f242f5fda919e76832b6c50feca9fbe29f68b6f3eb91f658ec5b029578d6e3074872af4a8aff1e5156be481c2b79ad84110fa2cac434e6603ad1ddf0f37317d91da7227811088060110759c223b8309789cfb9fe10479112b24c9abd5190887d752954fc414c3bc1a7422199c5b6d65b7489869e7ab7f3fd5db539a8b409b1940125ccb6acfe6fca4ca668a6997f9dd52da9662a85d5ebe61759312206eec66961a8cfe14d3153af2dbf6ab644dfd3a13c50d99706817b3720074882a4e115720571040702fddbee039c7c4294c6eeed61d39065ef941c310299cefec0bcc414a05bf231a7612e39da70004beda85e5280da056bbddfa427b9c99cfdede3e7af5e8e65f741f04296e443aae0d1e4220a82a1c845cef4be5385613a3c31ce7665b87c6091b61b995f62bb0607cdb9a4e6458f31b042a5ed830287a58d1a454adf69687837666ec9c8cdd8f0fe399af9800d016c542c800aa7d28adb74dc408569b56fad50412d12ed4ed61ff211346a3ce630815b309dfb24ecea90a96724fcd60d111d7266c4b39129a423339ea84dc79217213a09c2c1fe1d12f83d46299054c892010ec2dbfeb14049ac0048e47c009581f9ee4e4253dd4c3858f57ea259646574c437b095692f9edaab2f83b870e3e0b61b5be7dc9351debc307596aab72a28d710d14a531bacbd09d9cee52df4414ffa04dd65ae6d9d4fea46a6bebcdbfb70a09b417880a1707bd89884b48178b2587abf953f7b797f8ac9346dfefbd2b6d13c17e60786b088581edf1739ebcf2194c75b814a5e9d2d687d41a196b1f2c23f0d1f5837f95b5159f9fa1752cc59c3b0e69bff5dd723701b72373f304be8d216d2860faa79ab055d6d92ad8077618be2a22fa5752a7dfd47f873d3c16f8e972470a6e57a2760771fdf13682f781251cf82c1c35d3410088c88e6568f236c556e8a3c3ca9b8fa045ea4c8713cd17f92df565adb0cdb6259764d9dd94943a25fcceb160326e8a583be755a2144553024acdc741b3717656ad5890eb63d12c50ca9e22ea1c7eda56e7038ab6139168439151c27235e9500e0eb15c1b41734b3d925197cf552573297182a09eccf21bc3c9a4da437e714e7eda4db7ef5e925596d70b4522ebcd66335f00002935745495c1f60da2583c753f5ad366489b8482c16a4449ff27c88627609d5e5cee7b8bd5d9abea2ca1aeae16a51176658b22d4684baf621e53f3b55fbe6ca4c5cde17b18616d55734921e2ab5cf14da257a62648c612c56a1d95ebdbe1315910c9855a31deba5ad1b6120a4a7aabfa9068708fc07b01d69c58540116eee86f3001db5214f7cab1a716c462593d86535370c3cf50bcf28c3ca3fb7855b117b6333659e4fe0d3181be5b71ecc13cb993e772ebb377f806c7859aa9c004d19b12ddbda2b94dfe57b3574e2f318f0f344d247538c9ed37902e92a82f673d047c3f05f108deda1808ea17b26807fc32ce2c8d38bbe4805650c30c1138d4fefdcb60952cbdf3754512df18849f7f616d1651a221c0560c9dd932d0d3b5c46a7454c0923b207373ca13939a612950bad05ac6ed22ca80f3aca7ed1c2ad6c1523b954349ebcd59b7deb1c82d0de246015ab12cd8f2ecbb57486078627cacffd378f974834e1779e502c36ae9f410b3e7858af8d66641c9e8a5eb50708c60682e98e85871edbe3592a821c312536116db489ecb3c6e35ab5b0e53542255d7428dad6b7700134e589128de39b994fa2f3bb41c0acac2956f094cc2fa72ff707405e9c1f44ab36a5f1867115fbe3ca3ba1d92d38245898b8ed429fdbde4e8188c3469d3a0d2b4b3bb4b59c446522dd78979a1517489cc998fe03bb63166bb848d7db788721e5494402c0a15c33e3223ec5e8fc42d0575aaf6198fee4050d9f601fd988ed39f88161a4d4110a44e7c9b8de2fbf7ff8ede15d4151152a25cf62365b5433639262f85cc8bc78b1b40519a0dc8b670eac3dbc826be8bfa8d003c19158ed4fbc1a3a7c4780a68251c6a6516f5bcd5ece60a550a0f7135bffabf03f6a2967824b5acc93821579384cffc505ca152ff5b3108c496fdc3d325a9c5bdd7cf2618cfced0aaaacb3d730b37b73be560d958e89c7da6111a1af2006293c48ad391595c93f409a5790899179076f83cd9d61de730ebc2b60bdef0ad1e349e88f5231a188c25b944c2572281f17ca40c090b3ea795e59531e42300c3701b33b1338cf526b11e22dc5f4e6b0af4258116af31b2f801e87c5135cf7dc5ea3673219081b605041db8d84076be509ab904b454cd121fa7e482df8020ba205c15e64a8b786578660c4d544fc4b4f950a5f0bead30ed31f0a924bd9a7d84d8e1a3d1ea5b2ad0d28085a000a0502b5a58a4087cfcde4500c3263e61c8ae3dc360770ad7071484beaaebb73340470bed9093a94e10ec074b09e736802c8c2d1060d2442cdb242058164a83320b59ab9d8af844046c65921f5c8b6c2285f06d33ad2812581a5c5965106bc5db2cdf237590bfeff53dfd76a00a6ce98f319b64b03c92687a98679b1f44c3146fbd2081e8260c01772e8b23711507470f3d2749b5d3f158beacf459e1f6a1d079186068c872952e24212ecfb93175a249188a513c3e728f3530ec9992bf94b27d30cfd269700382a18ea7f4c33f7fb724f305783cdd89c569219c830d4e6266343133d091e6fd60eec826d4fd031a65fa91b93e00f15683d3dda86d32de04cf77efd5d8ef201a421b1c516702eb04b8aac4ba8651213567b8c099b8b7e618f65a0c4689c1c06fcd6d186156c2925b2810d7435d6758557e7a4c8c85c6b470049356a1fe1c740a8137d709b319380dd9c1465f117dda55c170b46cfb5e3fc24531104c803d5a39a2d1edacf2ea7ea266112ac78bea03c8e909cf285330bd53579e7a71854f3b823b4a48f0e5607e09851d2b4f301c272c04abc342883ff7c2948b15188a04961008cfd91f623154f35b9aa6530bf94b0b863f0e14341a2b0f4f00d97dc4ada058208cd3974fa7a6bbfb51cdc8ec04615bb35185d6520446be483cd94431f2eefbefb81bcf5e77de047242e5622becc90d1b665076dfb4d96d1461854e12c9b80de90e91f47254b61087ba3ec79bce225466d39ccfc6ecb69a4b26a10f36d1073f26ba53050a3c6f9720550879a71a91d68fbcc88726083508ffe78993f52f21cc160492f092b70fd1bd140bc295c3b1494444d032d5b04be7d45c1114f107849933688456803371b0763a6e1cadfcb2d1f4803cbe581a72b2a9a1bbe6e04321a214d336a2bb9b277450d82f8e10a76608157a066dfaf4422975676375a51a1b84d36b42105a8fa40bab5263201135014ad0fdf041c54c091c67bcf34e27293ebaa79e19bb65f4a97bd952570f0e0bd67011578de1b71b9890a8678ef554005397759890ae078ef7531e272131520217b271c8914b38205bcf728c0936824242b68f2ded35660e5bd3781eb7a27f88ce10d2fbc91c71b77bc21c71b70bca1c61b5bbc37ac7883f446136f2819831b5470230772c0318233dc20c38d2ddc90e2892849b831dd707123016ef4e0468b1baf8d33507ae4d1c61d541b75b421471b2968c38c30dac8a1ae8c5ecb1e394eb4e1e42969a326a00d20da1862822b904898de3e4a08643af59810a8da13cd122631514251629634815a0765152b48824cf9479023a2cbbe94691b6645979ee362f43b0139ecad605c26baaecd61a5ebd2b09089131181a2223444a088e0250a65798b68682003208974fa77a2264992241c8ec66177d2923cb6d540e8c2613941b788240265264a0c147111e46c349284467ed320672b227006e795c0f92a182c02e24b41332268e4334d0911c4f92a22d18c1233939e4238af84840cb8b828b0085829064523502482a228a22844a0e4edb45dc1ba3e7127a8759da64921fd06df09584411451401411c490908834f2ffb9b8008802050952d97e08fb4a8887e810838e37446126800e00364f840133e20820f4cf9c08f336e808611684c34e640830d34381a326894018d30a081474b1a54d28049c30734d8908604d2a8428d256a60358648230b69cc208d2fd4c8420d6d8d236a64410d1080000e1030c1c61a625803873546b0c6176c2461a308360800023cd880e2bd97461c6cec08b4b0c1051b3c38a3e50c6278400d0f98a2e081e8811ec4e0021e3610e30c1d3075e0094f077a18e3070ed401c7189203a627c6b038107b188309075acc18038a28200887a4f56c66d3b66d89d6330cba6cdab63d145140504cbe4454a2c862e088cb4d5ca09491849432b2784f89323e50c61c5c4b52c610caf036a0c3063c3465e0328894017b2883a58ca7012e50410378dca1011b68000e0d94400d0d8451ca4ff69bb219ad86e3ff4fa42cd16a4a5a122599f6a4bf146dfb0764da93e7c3c647688c30de7ba5119747a713d79ec0ab0891bc240324085d141056b8e25da6fca30b6a1d7429524437b2c14a451081dc668395e09649fb39841890e30b6a74400a5728f404ca0c8d94254d846a96387112132514bac608c3185b2091b0cebd4d3675cf71a1eea4712df4d8d685b850f71c7705ebbf9942241256a5ca964bbf5d06bc8e5482df6108eb48a712fc51972d81d792fd579e13e3e5c160999a292fdb77d9494b72e53b328c30dee34f45c62009cb7db4bbef46685de8bbf64f6304c669a612361373a33de9349205b4e0b4edab80a4fc24a87590eb300d3b36e2b80db425681a31f2a4bc39292eb005275a2ed0c5a3524c9cd2964b51a6d036d3055a5ea87b1b353c3074f0c080e3bd1702c30c1336e2c0e8de03e3e541303eef3d0ee7ab84425f50e1718f7d71c77b5fc8a146a661a12fb6785c88f4b8d01751bec05f94be68f1e20cef3d2ff2784feb7846424d2007a42f3ce1451c5ed8f15e974da76dd392c04b0a1429529678617aef85425c50a011f79ca4ed6f429461afa14862a800d1b6e512e4ff1ce4ba9d257e9e7f846d4f03bd807558c0b4bf090b3c61812616789980e93d9b4cea10d39f3270db9112976f3a5bb454203ec8b31c2448902cc38ec348f04d38a751b7b15c2291f2169912f0dc8fba20418268dbce2528328095ec43a220423413c7759b662a619044caf0da4ca0d7707b2b9f95b42ecba328a190130ab0bcf74c18a91bd946b62e2f61c248326f05ebf693485a128efb6c4acb0422f0de23e51315a5ef664045781122d9043b22320edb469da9f45d1703411d974999a67150e3600c046179cba6180e8331708b2152b648630b2e7001c47bafc86be1e20c2e9c9800102ee8d8e2232a831a868c2127800bf9450b2ae42446c851b4d0418e227b93064dff55b2a8e3bdb7c57b8f42924516a4dc6d1ac7615c7681a04c8338590c04759fc19bcf222882a615a8412c986041e4bda7450b161fc0427bef650153656b4ef637c155d99a932c282cacf0dec302e625775949164cbcf772b068c1e20617b8414e8e1e79e4dc202727043964e4584199c008efbd97d3e5f09c27ac28714894402d831a075d320c0a345284bf0b11a8615bce7e731db76937d0c582e88510e61b918867a78e3b29b9ae1a11cf4edd0884a29bcf4299765d37ff2483725d35228ef10d84d3613c3b691ae693c6c937a41ccaf20e89a01108e1250582ae3cc954e259debecb30d8fdc66d0821b7bd49db4c2ea4bcb10edbb84c093402419b66ca2e4488fe65449b48f4252d74f3d9ffd643379f69a31b9136ba11b94809aa28bc30256c05ba135ebf2581468c4010c73f49f6d98ca66d22c8614544222219f7dba6c19bcf40454433a4dc69352222f0c471d873986122d1ff262382db77a48c8d60aeaba6e39e5f17ccc6b80c4da72a9ae6e4ba6a5e40af21e4b0cd08046988934bb033b9402e2f8130475e10008b6c6f45834460c73921054a244aa011c8b50007b0826405afe73292d7db947f94041a01218054ea462010bc405d966fe049c3815fc23a05581604b9501189a0803fea6820152b0338b1e1a48353064efc5473ba2180151e5899c3cae8c6081c2f70369c27706670284ee78a14aeb4e0cae9ca919b2edc88e02607670e9c3822304604a0888090f7de015ecb1558b8a28d2b9eb8e259f1032b72ac70b1c20708d400025f4020892ad2504510aae8a28a2470d88053c74da92b41880add952e86ccc0a9c13d21f2b1e56c51442defbd17fadfba4682ddc806dbba938bb67d1546322d835cbe898154a2f8ad77cfc5402a5170fffdb74e250a176d740345141054e47feb50eb201178a2120577ea72c7855cb40eba94b4ad431105066db60c336d3fd7711bd669a066a3c5ac099a195b974d2f4543e3bd2d9ba26181bf95edb997628aa62bddd398dca00201a622749ce6a4e34e4aa870e246e3d9121d6421c8c2e8c28a2e23653c8ba2e6258b1991ac25633943498f12164a7894ee781054c4a5cb903f117881de26fb1bf8db8f6eba2b9fe190fe06760c8afeb4752208e236adcbb06bf000dd730728c23dd661246c63252dd3f667194604729a48a499b8dfe06f7f03b9ed75e94ba38d8d6e8ae8b28ed34a45289981dd73b04acb146598428d2bcfb3199a2a1aa802f3dec3f84cf75576508448152dbcf73499eeca3f21f9f0de9300a901efbd08bcd04c9163e24f4cd1044f11a748c014404c3104e342c8095430c26bd92307ab03c3b02f44776018f6c47bef89c0f0de7bd7550353656b2424d755035d465c6e725d352f21d0c665e8524434a5091111d8615d1eed51a7e9de35c8ffca7319966d3488f35572d7b4cd04b936eabeb46998953c7acd61a5230f43bce35e83703229830241cf65cd4f9d66a5882402f9db6c9a91df321b8c2b9d382e431cd2f7cc41adcba38e138920ff6ee7ec5d607725c36c5e7398e1dbf06c0371ba98284a9ec44861c297100697e1d486c1d65a36115e060e0652a7659d05a54e44cb4f213b857e083fc6d7fc0e362c1d0ddd8e3e03ad870d741c9aa4a3e8a85fe60277ca51be74e25e4aa669349a560305e795e89ab64559b269a697f23bfbdea17c973b9a2b0abc7036adcb3ccb25c833126e031db92eeeba4437785c2864faaf12ea68703a191b4deb2029dfe48d674fd2a08604c213d73a1209ab72c40a8c81467e3321815474f0787e2554aef06c324c8a1fde7b6f0523c598fe959002e6bd2552e074d9631bebfdc46533526ce0bdc7615bc7bd149c0ee3d8890accc97b8f88d722450fdeb369620e2a7094804a185d50b1a2a3227a828a122a2f54124005082a43debbe2c2f92a31dc0682a20def3dfddeaba3e5013b0409124488e833ed8908764464a3eee25df6db7521f15a1e70016ec3e93052ee366d09d0675a8e81a04cdb9e67192361574e5ba6659d96653909041191691c7210d4f199c7b61a1803415c87695a37132546cbb0d16bf8dc1408e21a1fd99cb44d6bdd93ef7a861de46e34d2c34c831c6e1abcd1483a6b6d33c18ed39680209cad71f937ee4f54dcc0aec10d8e3ad3739ea368b0089649269889c00cb58cc34450ebb293d6b7f60482ae689a6799e318d79d34a8610c047179264a0c0475fcbf0a8ce64a5ee2ba6a4430c3be0a8cdb320de3b4510d843619f61bbbe9f2166dddfe297eb4affc671a976159c485ba2946fbc4419b0ce3724744c69d409bb66d9f04823ec31347d2b8dfb42cdbe4ad66b4f3f3bf8275983b53e939ec473524d2a9430e835236adbfcd963bf89896ed4d836fb36512876558e9b477de7ed4610fb32a308e93b45187e9499f6b258ecf7c298bb42ef49b067174c775d873d849cf612332355360ee326d8b425a57823627fd7c899c25dab0c41d4f66a00ca0074fac807204285f408989a2479433a23089f283092830e1051316135cc05272a4bc80060d1a2852da4083021a29bcf794782d353e6aa2d474600a102d35409852c514d0142480d184184d2c6999a2864e13713c319d88428b136338d180279e60e0091a3cd10507f878efddd7e200eb8092037070656609518b10a2259eb8c14bf46086133d8478038f19dc214410ea10a2094e6c2044169cc821c41ad4c0c18c218208638822bae802cfb19c5c51321a22ca134344d164081b2771882a9cc02e9cbc21ce38c3102dd063881e60618821e4318415f018a20c77b4d40115f0de7b4ad8e0bdf7e0f5de7b34b0c94b932a0033ac78ef41e0bd57c5935c2087c1aec15167933d29822a281a318295b87c03ff884d862140066a1c872d01bb4d335d79c8e1f53b9b387825c320976998cd6f93cec0de35c8bfdbb44ecbb82efb92cd731067d34a5f826f05e3b86c92f9c17b0fbe1619313009c07b8f0a1410c608a402057c134e07df4a1e41adebb6dc714c12f0de2bc06b61d28409cc108e382287f79e1098ecf7f853018d88f00803c0ec49a1d07b6f88d7c2e4094c6c00e2382d89911097471027939e6f6f25f34ddbf2c352f63bc360962157aa924bdddb9cb813973dd43a0ee68ed3367c2e6b9ee16f999431ce33d7715a120cd3908a08677b2b8f93f991aac3ba8eabba131208d23288934d3738991f9982044ac861478a701d969d88c02948608cd145420e834474efe43b1ccd699dcbf04b99abb269a5dfde04ca36d808de6823c859e170b2a9c3200ee93b2cc33a4eeeb891cd49cb3efb911310c49d3a093ea78d6e204eb76513fcd39fa880af6196f7635b97814819a78a4ce25f3a71fa4a2ec184f1dec38199c27bef0a120e78ef59af0509f8debb91920414490841c2054870ef3d2b9b4c97bd94981f49a8e0bd772a7d3723c46b41d20612279050312498f25a62a4bcf7baef7090b428812d49e848d282243c494b0b923ade7bdcf6519458f1dee394b8b428c9821215bcf73653de18cf72932532ef3d2aba80b902c361a2807102836188c0f40073c4116c04e1081d1cf1c6195b1c51738492235cb8d084973a6c00070e8a68792d2f6abce4985ecb1e396dacf112c54b4dcb8b92d7b247ce0b7e89faa475d909bab83cd7362967d964ca25180341dbc3c7b64e9f38b89df6ef0ce3e01299181a782da981f2c4c813509cc02161556412e45fdab4bebd0972188769fd372c7330c3207faef41d6693613c7bd3f3376910c74afe511208e29c848d36ecb07c936107f116789a605ef637617d8a782d78095acf662cfcdec39680a97979d2896b4b94b8ec84cefdb728d608de7b1a75f3b8e3b5ec9173e7c0c013370464bc963d72ee163ea820424059417a2d7be4b0210ae30bbce6262104ccc597c86bd9238712628a9e87441cf7242de38f9365c8336c6b1c9739ac08974cca55f21246ba2b2fca46ba2d97b88e94b9ac21ffee642a71fe5b1e7138240d721d875df93e038d4050ce2efcbbec4b97d6390c661a06a2220a5d57141114f09f0682328d3f37055ea28e94398ecb26a87527538671dfe16878933798614540904db637ad670f21976d44b0882d1289601190dbbe7bd0f3bcb12f69dcf61d8744ca1a14dd7cd6913297bbcc616a5e465c6ef25c4b02e30456c248212edbc0c0d4bc74285df6a51b8d679f6179b48d641acc787e90e93b0e76d9979e77270da988aeab939e460445de1c86b3e50cd3b0c4e51b1c52e620cc75d5bc641ad699a084ae9c3288a4311b8cc4390c52115d4b44504017d289e332ecde0a46ca90cb4fc2463710279b20976fba46ca9dd6994cd0657b2b7fa33581a0ed79f61cfe9621f7dfa196c14ccb79c36c06827ed4715b269d6c7e8319ba681cd4f8f619f61908e25bbef90dc20ca1d6416efb18f8de33e2b5807c30a203232e30c28dece0920317d37b8f87d7029202547384e6c86b01ad00b41d0981075aa8e8bd57bd16ca80a985f71ecd6b991b78ef39f15a6612720a0b782d7206d2f4de83792d72463644395aa228d2c4bc960880f839f20216bcf71e088cd052512d350515ab47b45031b450151c49c1912f8e687124bb19bdf7de0d7721c28033f010833b18f004185828028e22300f3d28a2881a51b86c504401411cf71be7194723999e5389a2cb1d97410e138548f93911b4c9301c0d390c72d8a8c3c9373faa810880200d6d322cc3f25bc17effc6e51b9c2d631beb9fbdee6086361966e5a475b0cb5e0abc4497887fc7bd9219d1b6fdcef24df61b74812e1df71cba6cbf691de9d439eef73e65d835c8e55112087a0ee2906e3e134123904a1456a0880282380cf2dfdec606db6a20a8c3f8f3ff0c06a138002204d0691a0f44024004008aec20448b0e44e43071d8b821f706224264080141f8b3280008f7c307fc00e1e950efd3040f1637a0be94b38f070b1f3c0e33e521941870c4bcd762842f5ecb1e392c37bc1ca4a104318fdbe01a865883103560a1c3b491496186d990f2a6811ab6e85aeedea6450d2c7b60e1891a349d21f71946329db4fda3fd44933dfa1e3d18e1a5218e3484e0bdf7389bf6229ebde835be240d3c0d5a1aa89834f864eacd74e561876533d896ad40347cf11efc2a308e050d49a061a2c1050d4d3caacace1dcd1980b06d4b443013751a1308d296b49c418b3390de7b2013dcd9a9c32bb469d26b376870b21808df84036b8ac02e1381524c58638624cc60c40c2d0fce4017580635cad0c57bcf911e720e5ba20c6128831b668841c30acce000336833fcc00c64c4f151f2de9bc11c0f76a1af924b18b78178c71d01811e14727c49a3f94c7b927d15da26d33dc7c5fc8d467a248f29e1a493e604c7b3938cf644dbfe013848320de3302b989229ef3d19c4bcf7625045abe1b628da13291b0cde7b57603c2379efc9f1a30eca7bef052e78efb58084f52453f817c1e93012a67336f3dba93bf5ef32e759c36ec334cc32cc366ddb4059ceaf332906c47da7659c111c96b73fb2b1edb3b771c15e8b1e4e48a61216baa06864bf159cbc6df911f10539de7b3619d66d9a8e812088c1eb0b0ff882f6a820a5df8a10e136108e0e715c36eddc8dc8c00b57de7b717459ceb012b66d0ee3b074ca1e428ed39a7476d0d285329ee889083ed79ce0fc376ddb9690729765de7b2c5841eeb292f7de157670810a1cb5a9600a0aa3200087ee4e252570347c8e59c178de0017afc34e36987e8f8d2d5c7978ca53861dd63f0b6ddf61a192b6f5d07e137764bf954a0b66545a284387693c6588dbde44fad1c6ba2f8d3a6ccb47b8b782755809db4c53b464e10cefbd146c2b18875dc34abfbdf75040dab6255b239162a0e074d8cea6fd567ee891059722504322100b6c68c18216b09047167048c3187649a3118dba8cc3e0158e8528288ce8b40c724a724e6285313caae50a3ebcc7659b2b1c0bedecd447dcc964a46b46ba9376bd87d3994ada153269267899345366d24c50eb3a2bb08cb893095e3b3b6d1db781aeebba425772a90a733cce88a9749aa26b316fc2a9a9420e707899157a783a78ef955e4b15a03c2bd858817bef99703aedc9686779d3ef3d33423cfbf7de093636326d5a0987a499421cf6a5bcc9c02b1ce336d091d095a068842361dde95d3105f8deab929d469dd67139773153e8c014bae036d011532e2d79ef895e8b14462fc34c83a222444c79bbc94ed7257aefbd012ffef08a821e13f0a4f1defbb1838ee3f08823e0deb8cf0cd7b223ff5ba78f7099a685036a6692c4448949025fe0158e49200f2e4868e408d0dbf0cf5d56b2247759894d8691b0bcd5701b48c3de923c9e8c1b17847264060a73bcf7cc78efb5d1e52e2ba9764666d21999ee37d34bd1b628d5562bf39d567a25536668a66c6f25ab76caa433343cfbeeca926a67aa95992243336552199a996a674c797362d2992b79896a65326c896a65646464aaadb6da6aab95b1e1744cb532990dc6e198aee4252695c9b025269591919191e9362a682695e9b8dff2ce4e5bcda4329ba69164269521619f6452191b4ec74c2ab3751aa9d36836d288a6da994d7ba2da990d4ab5333c8ba976664ab53353aaadb6da6aab9da9a24b52ed4c15a424d5ce6c9d46ea349a8d34a2997466d39e9874668332e90ccf62269d9942537a2993ce4ca1b18229997486745a62d2197da2997486f3984967ba6c9bb42893ce54d1259974a60a529249679e49b532efa45a998e49b5329d936a65fe49b532542ca956e6994c2af34e2695e9984c2ad3399954e69f4c2a43c5924965a63c1326efe49d306152edcc149ace49b533ffa4da992aa85852edcc9467c2e49dbc13264c269d9942d3399974e69f4c3a5305154b269d79ef952123f3de3341b533efbd124c3a73a36d4c26c556e21919996a67269d9932e9a4564ea1c153acb4720a0d9e9191e1597352ed0ccf9a934967689874cfe4bf868694b7e6a47b26dd7ed2d398b4ed8adf309ecd904839098994934879ef91a0cf6c48de7b666c4878b6e439d2923e63d24660d29e3c49e76cca732dc97fc7614e70a844d13d1782228a7cf34f208883b812863cae84fa1e6f5102144a10e3bd9b7fa2840f1e6a18031e5ca0021e4dc00308efbd4722e5cd6da01fedbcdf63414b128cf05e1021fca90812440828481021d8e8773671d969cb8204118243cab42e772d5f7988250c85820411f29bd659d198405087e96afb6f418208e142212e3b8542a1108994379e727e954cd2232e8f24293fc77f23e5efff3da475a110296ff9493b44ca21527e8ecb3691949f13c17b2f04ef3d36a8368a1082f75eb7312344a14d0b8990c0f03799b0ade3ae12976f5eb80d04dda68daee7b6b7f2db88cba322905e678d5066839172e8abc0c94ede7b6a7c3e9f8fc7d3e93c9604b03060086abcf7a0a0acf02c0961e0b69d76115484b8082142e40a78c57b2f8df71e1aefbd0f087179ef9df1def3c07baf03efbd0f12211080d0054200721b681bedd2978ebc076081db40dcf69c849df491aed4e97bf30e39de8310c23f6ddd73a4dca10b11445c5b4ce00e2e1eacd29d96b8d1b64d43022f91085e425c44227875fd49100a1115815d7f1211d11df40e22ee10801d6a78ef88233646e28ac0235e2091235e20b781729779e839f1f4c8113d202520eff3803c1f3b50409e0e948f015039502cf3739f878c8f10403a2c2c3e3e1e8a7a9d4731f141827a408cf0f13a8fa2284fa7094501a13a14e5f9514587ea50403a039042513f2820af43e100f2747efc202204529f4ee71306f5a1a88e108a0c1d2ac8f3417d3a9ea7a8293a14d56199d2294087eafcf874a82d74a8ce8f0ec50445008af2745872e0c30324076a00142500160fa506f5a343511d4f88ea7c8404a99d21140c0be523019e259dce477ab00e9682e3060e74dee77544407d3c443e3e3a94e7f9d0002505ea755e4b4bcba31ef5a13a941728964e1114d5f1d1e978288a524728166a48a7d3e9fc484211d1e97c3a54f4806ef0816501140e00f8a1b301ca47c707ea4379a8d789d28142a8cfeb603f1e145160789e0172403d1fd4b5838e87fa417d805038501e333a1d96cb43610fd5e97c6067481022940f8a02123f48ec10a98e901f2c1d8aa228201475519d0e133c3fa8209d8fc70a7580ce8dc70815e4860ec50284ea24d111a213842708cff33c4a07ea47a743e1f069f17c3a3e743a1dea07f5e95490045037f8e8503ea81c6e013a0df87143900ea5598600e9504c502c14e5e9501faa091544c7ea00d1b9a103a4e383f2501daa734307c887f2f8f0589487224205a18650146504254447880708c5f2a13a147551d48f017478a03e1dcac787b23a37509e8e1094c7d3e97c3a1fcaea74a81f3a42a82014cba74351d44505d11102c4437d583e14455d48e970e361800fca4305a13e3d5041825c374051002128047ca84ee74707c8532d02883734a1a80ed5a128cac803f24cef3d29ef2961c713536a40e93105f4604d14b07047cd1a52e0024d8e4264220a79bc280658c2831285213c1403ccf181276b68509ee429f468c01a4288412603112d03f47004472107376ec62101760d2194cdd41aaa3cda8046a5061b9e913cf610c2258f12745c4423d018a0462c8201d0e50b42e4018708a1060100f0d408009527f221c6831f2ddef3bcc7b3dfd80fb4f003233c6e0365d8663af25cdb5876fab1851005fc20a708101c3c418000f12108101f1e8f0086d460f1e4002c447e0861c19f213c0c01e280219d07070f0e2c7868d1819c1f39748004f9b8e0100446418e902686f08f4b0e58746a017c4cf9503f5e7090738413253b68d1f908f9382992849cc705e5e33261d1f9fce03172841c0644e142003a20e1c2c3040b0ae4f810c489213c7420478600190b27a40c39a20cb40009e2c1c147954f05bec082e5b383470e8185194010a408246cc172860de4d0b9c147123b00b13e4a3c14706411001f4484c8085980a8f329028895050cd66092c5103070648b392ca0839c1b4edd035ae03075a05e90e383c5420810eb8710961c3c7786892708213240b0b082a06169528025324282341942c35f6c90d3f271b142805801c0e187901b961c408a11e40861692284f622c787a7c507f583891f427c18f1a38818246e38052182a5c90f21407cc821890e427c9e0421000f403451040b912752168085101610108a03bd3351800cf900f9c1c7e5b141867c88804900090244c8e7880f253e3809ca47013c06f031801884657b2c337258840c20c8c5228c1cea86ca42e493804f027eb49153440e1f253e18e043882009f800a183f40491450ee808e5e91e231f8f0f081c408a0c681910705280823b6c00470ada0881052470c515ae4aff2d92228a073cd1c4149a284e1ad0e4c294c802148000f8d9011d48c028e0003ff800448d2000810423606209125710021872c30f1dcc1183139480042160630d353e308508111ee8807ec017bc10d2c6c000d6618c1002a4046284718328010f1394e0b22c0178b841080b10200af0021744f11cca9306ccc82c41e30215a00000f2a866900214b42101279ab8b6071e3e43b8430c4dc01c618300f991061a686000ca1318238818427df4805ee860a113051f79504be824a183842047186284ce103a7374aa78a6a012c012840f2070f0a143808e00281e7608800f007476a05a3e39746ef021a4138485a5f3a13c14f5e3fd80830e9e02786890f30123e7e3e4471144aeb494b0d84104393e7c0c01b2802560f159437e083024046efcb040cec74990010801a2072d728238e0f3008f1037743f86b0c8b0e01f423cb8881fe4b0c891c343145804b91e30b6f0e0e0852150c8f1d1861c1f437e4042ce90ce080b7282f490430788113e8ef820a30b01dce0c306b2f87c91a383015aa0c7c80e47587ad8a10d59f860000b06f2e2d1c1f3c2d2798c7c9c2061801f427ebc91e3b9e1c70f1f971ba487fa0cf9b80891f1c100200ef8f1c30f213fa618c2c3101e8210e00601007180670d59fcf8c10347163eeac851c0149f120c292088cf3544871f3b7c288f114f924f141c0400a403c409202d3e7e00d9c173f910400ed48f1b3c3e3e433c1e4fc703c4c3e2092204888f07c8142000d0218a901d80fc004279807ceae7c88762f1c19347ce0d442a37727278038b1d7e7c0ac0a2248b0f14b2384008be36b0e10a4ac0630877f4a08e930d4d1bd82046184b902071c4d5b22f78e108112d3ab00081e201509eb4410837b0c1101888666c20890e40210976f0a0062f4801098e8016103a52c6a9c300b791010c7a34e10846a0a30512888014513ce009284f98c80c210401069086396490021444e08a50104068d9103ae40085275051c221a70d6c304319a280820003d821093cd8c10d6af00217a8000317a840480a073801e5c98c1d42d8411066604613262cc10e21f0808e1ad0600421f0820b2dc0a047128e50031accb1822d729ecf2cd901073daa400528f4800e19c4200e138801c67327669614d901073b84d0830f78408c2d9e4bd180199925465c39e0f07955a0821d42f0c10e64108338546082312eb0059506cc1c61c475ab2c02801d3eaf0d55a0c2137cd0831dd0218318a8c0046388710130b690420b4254a240e208480d7b385142871c9c100410617ce1c5134e441080e105ce95133c213f40e3056983870d9f35f8d8a3930616373e6d744cd02101353bd21329d00d463a2e1e0678e00086a082e80001e4078f0f9d1e7c10801a4090000000009e968f0e38e4d082030f437cb80108213b046161f901c4f3e3870f1f1eea711ba874ca76c0f2de95f8deefe087f740203af21015210233cc089c2d6f740c818e1ed0c1861d63d871013b72e848821d20a0c38c4705040241d1350837adc32bcf1fd2d142c77bcfb2b0752d6b5556b5a8352d6945cbc2185f6c71852ba678628923b62ebef7da5bdd7ae99d57de782d8bedb5d656b65a6aa795365aabc2d5ad6c5555b5a2d5ac64152babe27aabad55ad95d659658dd5a2985e6a69452ba574524923b5269e77da59cd3ae99c53ce382d89e5955656b24a2aa794324a2be278a38d55ac91c619658c1172d849c32771270dbef738a0031e72300652ee72879f69cfb5ccc8118ee699b18132409ac9c8f6a68c65137cddbfc3cfa48c95b40c87a499ce78ef690006e6b5242ffb9bf897d16a700085f71e1932dfe120c1011938d8020750e0200a0e9ae000e3a087f732c03d979ff463603730638f1bdc4009703c1cc12a3b775cb601815eff6f29249d398c082238e99758026483e92e63fc4b250c72443c49e79a0d09bc40a629a4bc3552f69c637ad3b80c831aa973a4ac35920d7f9209da64da7603b93cdab2dc65986682385b973d077996f795dd685995ecf4269cce48a665fc93bc4703193479fca9d0b29bcfae6b89bc21a8143259c93e4a4d122d835c9c210523a16e3312832b62302ae50cfea84624d2f66f5a12d112089281a03de2d8c64e3410c4df663beddfa01c2c7234210711e4280306028041870104e478f0056720e3c80bf22003c91d64845e600332703878710b80a022fcb3d36622b20404e5cde52e7322322c8f984010d6b32ab9d49d349de18d9655910241fb4d1c4e7700195c71dc017626997ecba30ad3d040fecf5df05a10470b7a0b5ede7b62e053145cd1d0b80088f75e182e38e2bd8701adc4051278ef5dc0054678ef81e1c4056c78ef7dc1712de0a1059fd7b2474e0b3a719c418f3c5ecb1e3976c451471c71c4a1461c668491f35af6c889c3347ae2b5ec9113479238701cb1250ef85af6c88963481c4a6660269d36967369d37a86712edb8fbab7d13ad89d4c90239172112210c4bd292f0141457297b9d6418e08ce944b442007412211c4d1206d33d5348120178d045f43d86919d44422d1e9b7efb012876579b4bfb4f3d6bd158cb48d74231b8c04b9ad9136d67118b7311346822218989a174ea475fbadc05c044743ee37d36f44e0121d97495fca5968bf89134d7a126919ec182c42043e47ca321024128d3a8d83fcf4a7ed0443de7b12782e8fa29c808b13809e64c2b69a136ce0bd370549d3f4a453b41a7e022dbcf724a0f56ce679de6c4c53b8ec040ef984147891022929a05070021474810224de7b5e1479d901f18a8e1b96d559e3ad2dbed7caba0dcdefad2cbcab9758effc26b85bc61eeb9494ca2d6f09f4d7ca9a1bcb986575e7264135e9ef7c2b1e77ec96754730ad7d296dc7947e9c4f45b0edb6b78a7f7fbea5f70c41c5d2aad9aa2296bc8a55b281a7ee56af56cf55bdf46307049663fd555f6ee97c3f76d6e8f5f63a29a5d7caf8da621d35689ddde6c877d4fbb1fc110cefa4515dfb3d568cab5965ae7ac4a483c6f3d7b1cf6b55384f9c79e703945ecaef571ae3cfd5de9d332c6c5599ad9eafadfefad1e8784056897befd5ddb1da95b43ac0e7cf49eb95335a525bb966041d0e486ae3be561533bfd36afe1d0e123330bdbbba91be552deefa4bdfcdb8d1d9c0cc935e4ce5ded7aab25b1074cae0f8abfa594aabf69f558aa0a301fc59727e7f4b89e3d758820e19185b89e99d74f2aa63cb4dd0c9c0de124f2a2bc93bb7b0e69d31eadd7d536c559dfbdff91d3178a656bd56cc5c463c69ed8451ad8ac78b359794db1aad181d0ce88a5efdf7d62b7f4eaa2f60a59d95f78ff372bdf5ec8011a7adf7c6975b62eb763dda9674beb8daa2b17abe6fe55c56edc5fc89b3ada6553da6915a0b543f6794d6eaddca58e90893814e056ee77ce62829d55fab9c23d0e902773df75f6d6dcf5ad34b819dbbc6f2dedb2b5a453927c0676555ca75d474567ca7ec7091ab659f5faba23863adefe8bab64d66bf89e6ba76670b0bdf9d2faf6c8cf865cf1d2d62656939a9ce56ca9debed647167adb2a498523d79d43d49070bcaf9b57eeedbabfc8e7b4c27c7eafd2b5c457ab3d53364e226d58699fb96b2cf6c5515d67c8e70b62e5bd26579e726a4506c9854eacb39ff88378e18676a0d9df2ab2d7e3eabda7bff265c947831e525feb71a24d7a5516a90d8da3c7975e77d3a751f5d17b5c7eb5eff27ce93df687d35baae34441c2d1a2d4b5fdc31c654eb4c38db7642a1e1562bf3fc13573fdf5e170c4ec7b66f620a7586c869ddb9da6c75bc9a62ca0c98736cad9e31fe2e71d4341755066ceb5b395a59f53d39263dd6afeb49a6538d4591a16a8cf1dbeae26af79d381aa67b26dfe120a1d8a0c69073a795de33cbbbaf9ccf314189815ab7472a75a796cffdd5280c56eea9b1bcfde97c6b87c0602da975b45dd64a666b6b3dfea5ac6c7e6d45caf5c711cc671a29c9757da691b60cf505b937ae7ed6feb2ce8a6ada88c4310b505ea056a5fbea4d358f965775d2d32963427581d29fcf63ddd2fea53b7361db97786a6dd5ba35df780b79d2bcb5acbdaa7de6aa051e73bedbe231cfc9ab3d47d77593b7bfaeeb9aa1b290ab9799ca8e7fe75df51e5dd76f26989a97075058a8775adbe24ebfeffef25ec1aa1ae74a56f996a5a5adacb0b5d5f1c73c71bc5dc3c0bc3c49671717122927717999725d2f541a5415aa7d6ce9ac2ded56defd5636064351e1565be5aa73fb337ed4829a029d1bd76ef5ea72cc33a652985dcfefbde66aa39e3f47d795b71f5151b07af74ce3ecbadecaabcfe323d6f4ffb796b7a23842214a6acdfd6fabed56fe7e42fcafbddaf45a8d2d8b5f24941378b46c9d6f63cf5bffed581507504de0d5b2767ed4f5a99525ff2d09c5846ded3e6ddfb1da1aa9d54ba8d9aaecccd6fe58597aadd175c1d0504ab0b4e248eb8dbdbe853fe21133a5974e6ea9b56a9c370991d3da75a77b5a5a2312feee7b25edbd6b6e5d298f60efdb4debe75a65cb92b18997282823d42d3badd5c25c525ebda68a5023b572bd38e3182795960c4504b97bafacce3bbfa4d3ba3643b0769fbfa9aedfe3ef2defa0b4cff896fe4a5bb6e21f5d570625890b4722c5b834e192c4c5e565c975bd156c0bca8ebd33b76aa5e96b99698d1c2504a9ad7aa545715527afac38ba2e8e0a42b66897b96a2cb7e5384720dcbab5fcbb65e63c5bd5fc81adb55a7cb5557b9518771f586f7325efbd57efdf7af620566bed792b4bd797d1d275702cf9c47dc63aedcbaeada078a07725f3775e69dc35a698c90db503ce2ffdacadd8a3c6dbc234d765935d5ba32640d141f9dcd8b29447ab7975a90ebec78af39db39df9f2595139d07156d59a9bd38a2d5bf5e8ba6e3ecb2f65098503fd99763b719ef5eec835ea06f8ead8ebb57bd2b8adf536b03362dd6bd59cf66e6be5b89712ba42d5c0d29cd3682dbd5d665e361afc969773b96f256f96bacfe02d9c69cffacab76ad436a69bd96fe5e5096a8edaf79eb5d32a724e2d1c4d790919c42e29ad2aaba7d4386a3dd2272ef4a5fc24b30015031c73b61dc76bb915a9be49281864ebcade299e12d75c2d8be6bae4d015efdde3537ce7b4aa7f81be314e5c67f5134b4b47ca0599d788fbacb8e65a6bcc540ba8a5d6dc76f2dc2b6eeb1c5d171547dcb7e27bedb6dda2f8de26703a2cd406c5825e679ef65f4f8b4bdd25b5827e2b4cadca76beb37cd99fb83409e17418477941a96072cbca76cacae2bcca9cc321fb9cf85eba7fe70a4f2b05d46e1bbb85a795d8e218059756eb5e8e71c49aefbd1d409d0057b74ebb279ff1f7c551a3dea098ffd39e27e7d5d2158faeab44b9b1e3cef92b6ecd29a3ac72745d4aa836a4b45e5ab6578bfeb42e1d5d9709f4bd91eb48ad6e55bc6d350555826c496ee5e4bd6bcd7715493079d494f22d35c5fd524e8dc0e228bbe45c4b7ef7acf408c6a46d4aaecba46d1c66c6a5e665fb2c3f2949c79d944ca144d0ab3b2997faab5eef94f2640a81ad2ed757f65ef1b7d48670b68eaa00c5068edcba95dc9f2f9dbcea51772a5d170ce782d3994a4b32282e3cc394c0d9fec4848b0bce2be1b2fd88cb4d5c5e22408180ca0adf4a56f823af22d56bcc4af68cfbd3882d49b155c356d372ddbbacb89c13e3d175d5804a43cecab97dcbfa6875e673745d30a10c0b99b48d5fd7d6996228346ca6da7a7bfba6f96a2b5e170ccc9417adcb665e2cf5816b7995e35b795615b7f66652f3f22752b6429dc1f1ae6a7fabcad59cafb10770c43ccb6875b4668d528fb42ec3665c38cebe2e9cfd55b40e08540768c565fefa7c768beb6a8eaeabdb18df397b0ee45eb755f7473bf5e7caf30e6ddaeeb297725d5df65b12ca0cfa18e759e13cab0ad36b3780238e966ab9fbee91e33aba2eaa0c9e6bae1c773c63dcf576fe232e8fb213a63420ab6b61fa95d669454af3e8ba70be4ac8944b21535ee2baa2a0c8e017efdda9b630a64f5f8eae8b678d745d46501988b2da37c77df59d146b3cba2e196a8cb9719d57d368b3b6a8cda3eb9aa1c49015aee8ed175b355a7dded175e56cfacdd4840a034f2de5b6dd5ad8da92b6f5eb828181a97929699bcc756d0a0314066c951b579ba78e145b79866096b8d4bc5c1712d40532b75d72abdf5babe6d3d6bc44b92e29283074ae5c4a6b75cbab69f5497d1175a5b8ca3b2b5b658e292f74b528b766e49625f3ec7a745d4a5016b036c6d9b9c5afd5239e9143425520f33933ae775a1bb39ed6e8ba707408e6493af3dfbe23613d9b725d56505dec797be677cb2adb8ad7f9720545816a55d55777f3b79957d88eae4beb19160a75cfe4b2a126c0e79cb9675c2dae38f7aa848d3890150840e077a6fdcea034a1b898fdd25a7525a5aefdee3dbaaeee540a75a7252eb5c5ae5cc72c65cf7de79b49795f5726735dd7c5454a8bbbada57a62dda39555c6a3eb724265f1b85fb977bf35d66df56ac484c2a2e2bfafcc135b56c69aead1752941e5446bd5b7b07c8badd9e31e5d5703241077654d2ef3f7bd63b4f4281492d22402363e9d9696725faea78e0eb862da3a6d8e3b5b5d6d85e7b622e7792f8f36defd37df0d819969e45f1f57b2571af3e8baaeebba9c54f199beb6bb4f9d67a5dddb5c170ccccc4bf74c38c865f8c271be8ad6c4b3aa52debc2d8ea7dcae5837762ef79efcb1aeb3567b7ae92f858a1bab5aab25a5567d6ad9fd4858b198f7bee9ad5c5f6b49fdc48bcc49561ff5c77b6bafb245af2b8a8eeefe54771ba7d5ef7f4522e5241b3729afbfb7b4b8b264cffb65ab99cbaebbe5d6b4badc990aabda9bd64ae5d37bf5a5a6adad1ab325bf4afe91e22e14b598adaa636da9edf1e3c49965e5696d1cf3d4b3cfd947d775c515bf9d388db4210081ebea342b9829f49ca68d3612a538e967cb2fdd7a566b4612ae59c71ea7ccf95f4e5b655e4ca365492af7a65a562353e459e9b9fbadd69d8fed87326ccba6176c6bf9354f9dad2e65ed76745d5cb67dd76553a84afe4dd791ed7af65e77973667aaf9c8947f04b2c9715a89ed7e99a37ece6da7fddb75759bc619e95f238dba667c2b2d6fac46d7e5f29c4eeb2b6a75ed5f4db97126bfd6fe5cdd4a4fae6fcd1916aaf6147a6ecb26b9b345ad8acf8caffe6c73d6b94a4a69af51eb2bb5aca3ebbaaeee696e96b15a1c1f5b39e2b93b16e55bf3ec144bbea3bd158f09611cb165b165495ae11ce5e8ba4879b3e1d9745ddb7795147b66cefbd6954e3dab1b47d755ed29d495fa75994ad875954ed9112a344e4d73efbcbede514791e3acb68ef32d4b4f19fbe8baa0a8969577f7882dde75e418e701b45b12736971e739e27a4326ce8a03768ef846a9f59df62d8e2378a2d69a2ddf17d33d738d71d2d3753991397febb955edaeb9e60973e579e6c25f6220c954c25eae2b745d58473a9542268e62a3891b798e35eada3b8d32dbedf9a6858e9892f7fcceed7c39f7b63b6a35164b6b5973f74cf3cc94c2d4bc741ce6843f0e8d96595ab8f3ab69ad72d79376193665cb4d5c5727655b13f398e3ae3a7eb5acd175654f0af1ec43d785041374f79c2bbcabaaaa34a57dd3b66dc9756998922891d78c7be53a56b39a168592b3d56bff8fb45a9bceac3da17cd2fd5ad7aa574e2d3dbaaebf2e1825a425aeaef8fd3eaf8d91732b567192ebb6aaa46fd5aae62ad6d175fd75c1d06ca62b4b3a6ca444ddd2ca8a73eb65c6d6d633d7c599b4ebba5ea63480f3be33ff1aef57195b3b82a959c04b9ce9b45fbd3baedb929c576b745dafe40934a2068a97264db0852d5de7b6a494d6da3bba2ead83a15203c54b132696d5b3c55555f128b39c7b745d3c745dd99224327257beebed1cebdeed8d4b2c5ef158454d65af3ae2ab65a190125ee92eb545bf76dd73ad92f44c73d71347abc66bf745d2b9cdd2e2969cd3ba3bce98496f8dd58cfa4a6ae5ec49fbad84ae6b5fa1504c1212cfdfb97ebf38da6ce308894a538c694523adb6eb2e47d7b5e5d1360266ebca5af4fe8d99ce697f745d5bc785609c805c864ec0ee545ac0cb7584aefae6d75239e7db19da402fda4a5d6996d59ab8ca9d8eae2b648d905594db5a7952babfdb3eba2e045c1177ac6dddd2c6e77ad2d1755d5757ead7a5000b5b6b3e963557fb75bc7d745dff5b5f8265ec76575b4abcfb7c5aba2e8e642a619c360a651b937bb9b4f1ab152b8cb5adfae8ba6eb4cd0664698d34621ae9945552cc47d7c5b31cd2f8755d174c8ccb4d96f2a4b276c432df7bb935679f79745d361956e5ba7ed376914a35a6f4b9dc3156f5ca6a745da1ebaab4a4692cf3effdc96d45f9cc915b79745dd7456549d342365b28c4124321eeb485423f1cb1d1483e808830e2830b038a28e287224210f18108201620b1524923a2800324a0000838c001b80160104308514410d50601440184f8c1871e20016845e43452452372c60989401c5237b2c1322311542b9054800f0a471b19f23aee24e543bd4d3ed96499c4d2e1b60f32e555291fcf1a77ed7b7eb54778cad375957e0b59c178e8bab80ceb48d84987b677f26102c5ba6dc49142a1209f25d05088e5a3048a7556308e07c53aae954ea150904f124ca58d84eeb923bc15ad54fa12908f11704cbbf4a51f9f2250ac238db81c0a05f910e125e6d9aae2dd3c6addb593cf1026e5d1e68a4adaf5b46e5ff2b943cb68738c5156dc5a19ad1ddff5cc55eb5d456e3395a3eb8251e22384ce71fc38b7c515cd2708d5e4f129a5f26e3b2f10bacdbc5a5ea7bdd6f34849bffd804b5a2d6db78c2fb19676745d262dc374cdc707f6725badb56f25b1acbeaaf9f4a07a3ee9f75cedada98d7c745da1ae71d745c2ba53129f3aac552d6cc96afbfc2aee8a075466bea396219366da41ec95dafdb29a335a2df57ff7a1e35a58bfec55572d659e957bf2d1c157d3f24833d739df2c770ea6ae6c65c93e2d6bf9ee1107b7f649bf92775eada79c37e8746ad9e5bcbdb24125bbe435eb39bfde5ce11a706bf63caf55f794fd5a15ca8706d2ead556bcee4dede59d92683e33d0d3faaa3eaffa9ee379a6b9daf356faf5577d011f19f0af725a7bdb692d5a638e81c5f9a5e65fa5f59d575a84c84bfcc0e0ca5c716ea38d795b9662adcb66e4a8d65f5de9f91fb1adf55f706997945ab4bad562da4fbd876a6664644ada2673f37141df5c62792d292bad7f572db0a4bdd5db59f99edbb2e44bcc270e2eb1de97df5e518be6895950df8af865ccf94edb795f018d54d249e9e3a7d98a99f6d2808f0ab4bcb1b27aa5b10587bc1596f767fe58adbef72705bbd296c5b3c291522c37fda0a0d7ab2bce555a78577ddf10129f134c6b693a23bed2f2dfd3a49994f8bc81bbfcaeadfe49a3656d7e5d321f37248dfcce6b692de3ee1d3fe0d346c5f12b5b5933764bca1a4d60599b573b27ed56cd9b5aa3eb8af99460f6baefe74bfb95990e5be232f3d265a711cd4b950f096455d57923ef794fbeadcf0872cfb2ce6de94b9eeb57546aa078b9a221d174033e22d8d4ea73f369adb72aacadd175f19a05d04f08b265492d758d16e67fbb9e1f36fed6cfb53ee55857d85a20f828f7ac54e36e690bf3bc86cc74d2c825ddaf71de530d5e632573bfd7aa6ad73d0d8db3ccd9d62cd1e095b66aed73466a755cf7e70372636b6fc5385b78727b46ef75c678fbbe3b473a2b0fbcddb9f3ba3ff7cbe99e1d885476fe55d556ad15cfcf016c716c37ae3aef3a5a7fcda0d6627afbc43cf2ea757ef2d980b6f3e2bb33b66ae523ee44eaf65386bed3d2745655e595e26a8eea47036fd5d717df6a4efc9de3d175d9684edec6467362d29e5c978d467ac11f32acae37531dab9df9d45fd57c3270addc59dbeaca6d617c3f63dcdb67e6555756969cf7fd11e323fdd871e7986a6ce586c0278c4b3bfd6a512b664bf9d418b0f631e5f1cebeedef692f90a5a5e74f2deff39ee50483536ea9352d6ba7e596acbe90f65adcd668bdaeb896ef85e4d6525bbb96d87eccf163014ef99d795789ff6e6dc50a5ccae5efbdf3c456b472c27cbad033f65c71b5f457b4ebfea1c0bd97dff8d5bdb6e35ee46702b3ef5aa9252d9d56f6d71f2ebab6b63eae9253c9bb953f5b585173ab39eedbb2f5b335fa68d139cfb73e95996ecbc638027db2a8565531adf0fd5e696ed10f169cde5be56d5d6969b5e48ee1390acd272747baad8d75ed5f2b6c6b1ba875e78d5bebc7959d7b37f1b0417249f1cc55564b6e5e59d74522fd5ee2598365557a3f6ea9e5b478b5635e9478d45065cbaa22ee54567bfbdc9e3dbe562b77fa31e7ddfbbc5f05c6cd78d290359e9ace4ce7e5dd563f0a71d875a1a156955a7fe9ef6db1ad71745d5ffa91296f369e3354969eb146de2996b167fe323d66c098de98adbdb5aab757f30a9f79799b2c4bb9aeebe21ae0294365758e2dd95f6febe7b5b46ddb3a0f193ac538cacf5abe252b5c25f18c61eebeb135a35575ad2bc742303859cc75e164597ac430afa493c66e73afd7c27304834f49ae8b3f66d2f67571db77a6ccf302344f187886dd64a7d00e1e30585adec7df7f476c2d8f1ef86dae6e6559d69dd7eaf9bab897289e2fc4cb6535e7a496e532cb39baaed0f57801ef3bb795d2eaaf5a5bde86a70b3dd7fc9c4f59a9ac709e1e2ee0c9e3dbbbffc6cca5ac46349e2d543146bb75edd4e23c67f668815269e9ac53ceaf795b1a014f166a5565abba11579c7fe7b3011e2c5451db3cffbb7c7cbfef6eff1419765d2f9e2b606de53d73c796941c53ecb142ac9f73fe28b3ae75e3cd3fb429f154e15acff7ad6ec7ba572bf3e8ba42dda6c978a8d02d3ea9d6f56a8eb1e624adf7bc694ce099c2c47a737badf5b75ab7de919642c5558cf1aba6735a15c7d17571a10ca773589769663c51a862c51b577477dbab78b5270fabf7ba65e4536bfabcce17261e28ecfedbfa4ee5cc3dde598daecbf41d775d4dececd41be07982d4f5ab6a56f75a9ade393d4ed8d38a1977fd74cad9a5d56da62b5f3d4de0b3f7cf5ddfcf7b4a6ec2e9ae2b64799810b9cc95f5dc6a39ab6ae52558fed5dcb2df8cf1dd9d36f128014f8bdabef58e1d67eb70b69a233c78d44973aef63fc6ba8a9ae724ec5d63aeaac7d9a2b95bd10ac6957890a037adbbd73a798c74d7e839c2f3f9afe9e451ee6af71c5d17e95432c2dbd9ad6ad26aa5ad38e5a3eb32615bc791a6d86048aeebf214e1e2f8d9664b721a65cff43711f88dfcadabb1e475e721ecc8f1d65f33cf7bbea5a3eb6a80e78e8fb8ea49b1ed11736c47deb4ca8f5b478d9fea4a021e21dc6ad3cb31965dce29b30c42edf223d77677bbb1aef13d40f8baf3b674ef6fe557df3d3fa815cddd62fd79664965e4d0f0f8205a3a6bde9b57bcc2b2d30f787af096b5bbc656e2686d8ab71a9e3ae6a44febef4c23ce51cb0e787860ad7c2b7efd5352bda5e6806707b1de3a2bbdb3e5b8aa6ea5cef0d0612b59c9dded532b4eac7fb4844707fcc66af16ae968597b7757e2c9818ef963b77e56d8927972241e1c606e6be7977359f9dc3c8eaecb7383dc2bcb5e196bb5fa73ad3c36b0729e9c56376389ebf738ba2e6ceb6a60fb5b75535a35e655c79b067777f917eb8aad9931be3388fb5a91577c4ab9df8a74745d737ce7f4be9c51d71be3e7d175c9a0d31b31ef175756afe2f5c400f7fc95e57cca18abbc73745d30b0aa49b7f555de7dedb672745d4978e4983f3b95f65675ee69e57d018fdaeab2aaf8b9adaa7e5d4073cffde59d75639b296d01109e3858b08347054478e0809e14a08008cf09de10c2e3461b5862fbb6b2acfcda2f7d13ec2a77b7b825edb69afe7de229010902e01981003c2208c18c3c5adc6efd7dcf5cd9d1757d86691a0f1b205823f68e71d4fbcaa735df3abaaeeb3271d7a306f4a451000f1a1fa822c7bae7bbf1d4d346f9319e33f6bc5ccb7ba58579a65c7a3cd001017838d0b9b67cf32d75b57a8f96f4986177c7bc579ddbdbafaed5e8ba3c1bc02f5f479befec36533d47d7c584a78c4b2dbdbbe2d57e7ce59ca3ebf2680057fe31577c4f3ce55b4f3c64606c49bd5fe7f8dbd6ffd175793230469557532cab4ca9a556a7513c62f46ac71c6d8e5cf27c23f78431c48381b96f96d8ea7f37b56ae79e0b5456bcdbd2fc71ae32daecf2d2e4ba360f18b4d2969556ceadeb8d747bbea03cf669e5dc554b4df39fbadc715ecc3831edbc7aae94b76cf2588056934fd9b7e47be65be1d17555e0bfc2b99ad3eaba63df80a78bd77257b3f35971dd955a0a7cac968cd472bdb9e5364e80f32eb3352b6ecd7aabae3d5c684b5af746dc5f57555a76745d9e2dec6f8eed8d15eff773b446d7e5d1a2d72b719615d7355bebc9e2e3bd11573c2bcfd5aa7e745d18f060c1e98e56ef56be5f1fcf2d862727f75ccd3d318e158f5ff1d17569a0d306d9adc5f5c65ca9b5b4ffe8bad870abb8f9b62aaf95f595d547d725a5b3866a536dbf5bfb93df2dfbe8bac0e8a861724c65fdfad69412efd1379f335a375adbad1ea39386ef56cfb1575fd5ce67aea3ebbad1b20974d0b071e45567da2babc7b7f70c38721a69de91f6feb14e293a66d895f26da5fd7ae95baf47d75586c777e62af6afbaffb67e745d6474c8302b8d57ef4acf5949bbe3e8bac69029ef39722bf9cfdae78fae4b0c56bfc57a5797e6aab2d28e42a4532964937599bbae2ec3b428fcaf6032d715e27f05ebd7153271349d30f01a71ecba5b5a27bd60b8525a535b95f57b5b57ffc8021d3dae25f7e77ef1acb9fef6859b71b5fb639ba59db7021d2f487df594bf27b674da0ceba2d3853929d73df288f3cd7172a7d0ff7e2b1d2ed868f57ba3b57535bfc272745d5f74b610f5d479d73d71a563dd75745d5ab0e8cd9af3da75bcb7532b0bf3dafc2f71cc55c56976daae0e16ec5b1dcf4cefde5565351d5dd77585dde37e4b726b5955b59953a06385192fa53472cca9a4faf2d1756ddbd774aa10698d915ad98af6f20a772a543f79bd3a678bbb7c2aa740a3add4e235476cf3ded78b8e142c5e6965397d99eddd95e5a27077ad34ca7eb3fda8eb0ef1fc2f4d74f2b874ef6cd1f8d5c6ceab15a503055975bd31539de3574eafcd13beca98adfe6a2b6b56148fae2b8c8e1366d7913fdd9bcbcab25b8faeabbbb264779a70e3e4bdaa95be747fa6d5e8ba98d0b5e6dd565a75bfd5663bbaae0b7496d0f3cf2aeb6df38ed5e67b745d4ae05fd9aeab5d29cf7872d966c90bc9549ab9aefe3c64257b2bd9122c3a78645bd5fe513fade4771e47463a49a8baca366a8cfbde95e47aeb2041ffb562d711f35c5fef1aea1ca14a0bcbcc23b57d624af58844caa1d0a8333ddf1d23f06d258d7a6bcefba4d78eaeab5384aa8ab6c7dd2befb39add220295745bfc2b9776e638af94ce106cbe3b735beba6b8feac9d3bf4ae9debaa56f29974ec90365ad1eab13eb68f331682252fad72a4b1ba11536e51d109c2b6b3b2f64e59dd6aef7f20f4a8637f8c2bfe7aeb2e9f492864eafc606bccefd532f78873d714a6e383acff6bbf96c5f3524d7ba707b1526d71aeacbd57d7263a75d8fb6fc92efb6b3db37d323a3cd0357769d9685911cb3be2729397ebd23a3b90d5e2f1565937b74ff39ea243478e9aeb4ea5ddb992bddf11d71d1dc449fbadf296bdd358673ea3930399ab7cebdeafa31575c56b3a38a0f78296746e30a395f7f9ceb7f23e2db501a593d36dabb8e5dd911689525c2213449e643a75a1edb30cb3a25303ac79a595ac3af68971353746d2a7282193295f578706b766fd19cbeaadd53bdbebca34ac03756640a3c56f15e5945fefbd72745d735453ce3eebaca27c39a9a66d4c7464b0e57e3db9c5d9dabc72dd8941a6335e3a3bbfdce6d8374c939b2c654a0706afbf67a92bd96da7f7afcb922a3a7248db35fd3df7ce7276995fa06d552be5b4c66a66ab5b2e9816dbcc31ef6f3be71cb7c0caff4adb6cfdd43ddf38faa59dd71dab55e97d290b72b5fd63c5e7a6d5cdb1aee0bbecb4722ee3cb1ab50aee9493666c5dcc23dd140e4d2dfdfb56fdd75615690a645523ad5e6b1d2b1aeb44019fb8d26fabfcb7476ac913e0bb63cdd553fac6dd5f6faeaa39039a43a8844fc768236918a4288a3184104d1e0d000823110030382c2490c70362f9ac54bd3a14800363b25a7c42a70a647116a4308c31c618400c02861860948199a12a194d7c69e743558852b1214a3128d6a81f222380a9b4c5aa589381a4fe4965d25d322f45a74f459cea142c13d47b21f5142df2d94ff69a454880e0364378bd0c0dcf51349a062d2feb31540fe53b52c69eac61a237310943d958dc0db42ed29c0d37adcfe7cd4243134ab98106a0ec5054e2c15c88ef720e638150b07569ddca0691873e6def20b2fdbec83129c2af1a6afdb3130ded21dabe690a7290a3ebb65699759c9bf86ad25b35d1c0c2a06553110ac10ef440005ff295bff5e24b77f613056c1de8a09097155a06415813bbb59269b66a569b41d21b7be20addbd97452eb7df830ab47e568b61abdf7523406930bd1d8ea5283f2b68b856cc91cc2af9bd372fa28dd239443a5a62a954c807b501d031313a0d0a448954b175136310264ba424b73ca7a34bde592d0f4f21666074da5d6c8da735a0d359ec3cfd1ae473e45e35b99c538c1e91288b7bb338c5467ace7cea8d09bd248f85ae80ffa2b39aa7793bcf6e9878142b9013492c0195d9ee4a7ad0be66c02b5e8527262090da559a4ad2867c33eac0a3a98d28d7121ca9362bb6313ec83c176d0e765b9e4ed24ac544ac43b3eaa2d88e303a53ade61c6135d0243d440e692ea62d9006acc9bc394895d1f126f48f23b48bbf521e08c9c27b7f98b4b63ea8986b236d0de153ff2377fe17adcb46fc2d4efb49b0a08157c971271b8b6595cd1eec872c599d08b6915c4c7cc5d10949c652fcf2b0aa810e89635904ad7d5e39b4b4f90943494131a54f2ea2fcc45b5764028cb4f6d8092d0e58b9351f1aa13718b59f28d446853ff26ea87b5538dc93116f685c88f84638f5853eea2a61da25b5709deb66169084a8a9f25b35a7274b637a09b93aa2b7d40fa8a2d858623df81d12999d756fd79eca65d827ed2e497e5de65ae42a0bfabbf04d9223e8959096813f151278775320771f02a9bd25d8ca1a0562b5529b678a879c6d86c8f100751a957169d44c2b6582e33f80c3990b9864d17b57561c25cdbdf47f0bb4c45f05236f4c22a2dee555034da55d097fb74405c5c44bfeff407a0a555794d34a3c7fc038168b9bc4400e1dc7edff9f0fa7a680df27c4746ec775a0a700a14a1a484fe6e27b525789a34d7217dd7b3c0b48027c069d23d79498af88306a68e2d52a43abd8f342b6f9cbe12a651b3f027671db22eeca56d33a1de662453cb32afe419035f8910616e6437e0a2738b7661e275f98ee13f1bae88837dd8053c804eb5415cb7c35eb0fc99d5270f72d221154549c7b5cffe9a68504f14c3849f3869bcbb1eeba5ddd230a1e943aef4ddbbf7174ffa5c8bece47b5312142c811d2d585c4aea31729a137809536ffe59f6ae63936d8ab0e1f6116ea87a0876c32beeae1a120b8641dced766c2eaca267a376f98f99a885e42345eb7d582048849f8becef2ae9c35acc85d99740bfa43335f1f46c9ea60318289a0434fff53a8b70a345ef892a0b7f6bc33a74dfb34ff475a2dcabdf4b3a86e466a1c5bb08ac99a955419b0dec4fa665dc80c61105965b2fd0351b2acde15c7faaac5ea1243393ad8cf84de8064004b8a81dd6ac4a3ce12fe0d5d4a7f5310e83534e6da4afb2ea9c2df3623667831b69808d1e1c44bd0b54b31fca88eb36ec4d2f8e4457bfffdec191b8400837d9b163aca288cb5ef97cee0b65c74e957ceaa3d486ffd44fe37e8189949689012433a6f6df852217566c46d5d21d0e56428b5b0edd6c1a784cc2ac1b65807dc02726969b45c3762e67b101b3aa4f3e00b2c57f68f83f9e2454cf35448108f0afbcb68215524fd07149c30b350157bb1f4fb01ffe1fc3eed993b82228a9e6435cf57b3ddd7b97d6d52ba6580db67a60e01d393eb5a955d42156053b4caab50c3d4bb48883fd0a6b1e1152c7b31ca7b31ea4860dd123bad228e4bd5b4d1b1a411db0de2e025c09d2da631949bd980ea3ee30c4c9ccc26ce4aef1fb89f19e198eeb1261d3fbb1980386ce2e478f0d5c5e0d3e16e6dad2b785bd3ef4abb565700da638de6e86dad3573cadc244c6e7d6f6b972e8600b4f20b3de67d5bd359f5dbda85df1e425386ffb6a65ddbd37824bf5418af846a4bd0bf4872d2646407f3d69a9646d5cadcfcb7ccc75aebdc27e15a93d0fe9ff88ac10e8f8337eddb34cf99f146f90f19b576e7d5bf8f4fa76584d7cb4743a3e4a9141bfe05824a6b1ab300d1cf0a6a9953ac2f642baddd357ca051cc6f834ba6b1e9dc48c7a25f4d09f2e6a723f3459ab587d922351ec81377368a2867f741e6461379ad4cecba5484d5783ef80d33a2eac7e5fc96f0f07bf504613dadbfe3a8959031a0511bc8187bda897d208634bc4490e97c807ef93092aef7d5ae36a43585660f480eea471d0637135848c9eda4edc38883f06c8d4ef8b190e08f83fb499b8c52ac70ed1bc1663bb15a70cf6cd111fa7306a0a895af9c79ff08b765d4f1c9efea0297f34d2c08828aa1f57d21c972b55a7599129a099ff20cf43be247d6b57cbdc70b79ebf03d4680372c33e853aa8f1840548658df3f9c89da5d71a17ff841979c15e7ad831b0c0dd6390ef5d6a8a8a2e42ebb303f2d30c05d4f2f3e24ccad9934ea60c8c1741bc5789ea416ca8d32a04d2b77a008f6892d6ab986e87b07197a9be3d34931bf8fb4c189f7b96a0728606fd50f2b1de0101729d5b9851450417e17e95007787b3e259377e2d1ae3b31ce868f6371a9fc3a9cfa20b970c40b04d731a4269dc1e82004f6bc2df380273c40489db9241f9045758f378bbbb59b6348dcf50152a27b0d6ba1e404ff69f51a8b9df8172035226ed9454a8edda1610e42dfa73e17b1fde043b32f0d3e048c2155554bf27cdc4361434aa43224962b80ad091e286e53a55a51c73b91843aee9b3b44bbb82f69eb26c5e9f232a16bfc4fe651871ec69ec8a38381288d37a4a1d0f9be7a6b917119be68423f7f79b183db717d6c60818f3bba3e5919ed21d5898669bddd62438485e9a20aff1f8c0dec570c1fd322fe5ccfc47a4892fe6114a755aa2463a662afa1aa9073ab6c934e3fa95964dd20f420b22c3fe510783f2565fccf547c2bad3129786914cc48899fa6f20fdf87d5b3eccbc54ab41624f2d88e2b6e709ebbb381664060f3d7d0884d2b31c54ed15f4157113f31d504a988084b249351acdd2aa59c1b63b9c9a48f8ada2f6b4a9bb711c307d71de019b7efcbb72846ee0796fa16c3da0a1992e1e785d4fd0d172100b1fecb014314be53c9fd2f51ffc7632ff69478821a9e3626f91a3bc1f8d3b082ead4c0ae9450e07df726a1d59e367e7c213683a3dd74a401f0c9ac4d939ed4a688bc6999b664f7fe0661f8b9aeac0c7c3fb0ba5a839c6d6974035e6acf391a81d7991c38f4e1acdca45348de024296f8dd48afdbd4beda971c7215d4debc5d3d5facff2e7773898207bf9d1b5094b9065d00216d0cd6e363472786bbb23cb647ab74b02c6ba70afe6877cf9f6ad98d045b68d5086fedc46923ff107e35c9365b02161c4f695c46e174beebe99445b74a505c229eae82b734f6adef973b8d9d46cd0dd74bf016bfde11d7e8b18e34968f2d4f7c56e82ea8dace86d0fac953f7ee5a4fe07d4e269828078cd68004780496f2c6feffe149263d30a35ec7b8a769de731bf416863d5043af6fd9d3b2edb9ac7bcb6c901e3c97286d40f10511d27d4ad591c6e1ed9a14e292cfd651e7edb7e8004e0bda3e5dffa3753e6ef3b3763fe0f6a72f851f6d0bfae0a247e82ebdfdffd0fb13012d63d4108ce34ceec62476a8c555728ce51b6a6fda71a53d48eec71eadc85ab71d5780727e30f5e4900329e5a97a17eb8b4b8ea52f18445ec62cee265cea6aefaa94252efa296385d18fe2b1213231da570419ff5f86a496e80c0a52e1bf0f612d5d96096ae2bf0c798dbdac2632acf2c6cde25c59b1a2ea70616db1555238a3ede9bd941c9052411ff65612995896491acd3714ca5c9e0b4225e83d812644896d416f4efb2b3b50183269ea4950daec2369bf058fb381a5f68a53d2ae1e4b23d360a2a88511efa759271a8d291be4d600afd016492cd5acadba6a1859375804e48abe026d17accc12c59d99d4c9f779892f1685d09042d787e421f17a92dc0ae4a3ac1fa1e7bd40fae2c04c0fb4cd54eaa4eb9df51cbe5baa26aaa634f4ccf03a0aed3bd41052235e2a89766a3e6869f1759302804ce2cd20938835112cc9ba1950949fb3d97a777bad862f958a15b832d8b698b08210660605331378217c91f21126435a528292e48de3f161eb4a39d12348241449e91bb5621ad1f71950d24d97755acbf66adf552e8c2929126880d9adaff48db873ec8e276d146e1b3f87d908e97f1d77a8ba3c2fc81ff6f5306268364385b2404cda81a571145f485c055c9b72d3c319122327ebe706f35b7206c8f910e19ebaf4202b0dc6682c13e166898a542bd90c4d50484ebc7544367ebe5250e4d51b6e191df723f23e090f067841dc36aca0f97c102dafebad0b89a9ad89b3356f267b2e6a943ea9736f013803ad299ef1ed09715c53cde175a7e3dde1b63f8e1b1d7632fab7afb2043c8107b746a08a79bebbec651ec1060e74df5c2723eefe6a03577e98eb716be34a84b75bcf3141cb540e6e8ff78468d24ca15bb888c61590e1d6e1d81eaad01360134c73ad4273ed1213fb32e0207f9132faded56c026a17f098105e46af3b8eed34c6fb5e4df81e396f77164aec9b3558f980a38f76765e3766d99dbb409cc8d10cbd1c6bf0d80ebf66f28c22a3a88e797a9eb76252f8adb65f884efa2b58d16e9cb6f036d198f6d0b3843044449424013ad7350884f617400d44bf8502f8efafbff10b3987ae4ff1624371b1808c1c14f585403a102ce0f003d7745c2bb6dd1e5bffb0681ecdb06819fabfb611bc00193374d12b024d799ca4d2a7962507fff6180c948747590ee7f719e8c1e85eb90317440932020bb9619589df02fec417851e6e8b48a02db8e926d7ec72c752c0bdf61ab9f84eb3f08cc99e4fbd770fec866cc2f36e5c1d713892cf73a61584c713830510c38d1d0d5b4c0b9c53f119ba887086928360a0fed145d21aefccc76f59fe0e62c665713dfee497c5e8863faea0130f271daca31e9d9e9893760014aea4c4f572fedf01c89c5cede38f496ee443fc454023f38b34113d2f4b7e588b69eca14c46768637761d8564e4d14f70142733210a30c338140e927a055e0c4a8716d424de61d778b63b18fc76ddfeb2dfdda67a8f589fc636a33c95b91f2f7076abefee05cbebe6a03387bcbf11a9a1366ec2df49eefaa1a96fb2cc99780b1c943f325451bf9b0615dd2191a29137a7b30e618b7542bbbe8a74b9abfe08d0639f047c4579ccac7f921798d55e6b448a312a1edfc2f3e85cfc005f1209415da182c8845452f934a5fae3ba82ffbe6d124406508c7cba5732d5bdde018237085c9fdee7682a4541c7d219ad0a1b266d7e48f6170237fa1888cd2b34c642363bf24f186b9f416769d7e6c7bd4b13700bbf999d2bfcdfe136c0171aa394aaf044e9c7c0793a3f6bc387189ae009943b8bc28feff9227ae49d9eea901c76c99b4108e01927e7ed8800d902202b87d15d140c044504763feac3f29e87fdfb3c03e3111899ba906ac0587df0c816fb1c43a75b722647219b2f970074fd09783595598f7121f0641c4d6fb89d5e3a80b70007d75243a32610791ffc9b6402077391d359c9cedee1be7415263988910132340049f955ed7b0f52b1a44e4f472eda09ea1477a6823d694244a61dec16701892e7fbbb2a10f4a888d7663d558fc24b06850a2ba0877a02a2b197514f1edbcac9e7f8b6228c4b2ce3b8bc9d9d84c6b263a12b94aed35f121769e509e23c9f8b1c10ca21de08c62ba7e2b4ae5a96909c3a516590298fb61b271d7f7a2521d100d15c72767e718ac7a87ff3609bf8117a47584a8447d666cf5f05e3a1c8b701a208d3b64ebc5d4c16f696cb1c1c64ba24b7ae767db172f9cf90c2c5a33994bfa415b7c0229c1fe58ba521a9e2daf71a3da3acedf35bd9dd09bcec76f363c00a42a2952f6ec3400c9b23396d4d8cf76b891a10c0fb860c441433a109785f6ce4f27ca70f7b078f610b78c774618fe8bcb814eb1cf4b3939f31dc50baed201472a926291208642650944e3142755950b45fbcc15735e10d9a8828a06869ae4161a7abf3bb7920f3bc702b0c3414a57eaba9566ca728df3a5477b76fc6b6a96f8a5cb76e48af15dff09ca9954e982959889a0b1e4a66526edc15c3c6e0c22ec66d83321b32e55f1f7014d63d565d5b7cbbfe9cd4c0b59a989211060ec4eafe5cb9a140ed2982c8bbd718115a8d58b0177761e5e870a7b30c617bb1550a07214bbfaca47d2dde76c6cf84e09bc75f9a903c77819342c5789171b87bb0643eea051c9d60e111ee9ecb1a70aa627774b11925e16f8bc39729d69f77cc3568961d93f240e4e389d325107f56c17bb568d05419269e29b0f4857275cd6dd734d8968b3192502d819227d8fadd8291b9f0d22f39d64bedad7302d3998efa2b66b794d359c4931026a877bfcd9d9d76557122c7d666dcc346663263e4178022b7300d081703b8ee81f5aab9e9d39c182df2833fcea218063c66aacb30035c1845e72febdbe07081351c75f38b584febeed68e90515339bfa3468951d26b47e78b9c50c5a7491bb31bed31d562d11fb539b347a4acbdd943023efa9763f60f6c9e32a0d4210d9376d2703847a958812331973e9d3f151135b081c25b5068c8274fc80f88b8db19c97cd2479107deaf9bb5079fd33d37edf5cfa80bfc023191b3202278a80a72cddc0182ebb2a0bba3b24bad8ed9215b253973b4ad9328f6221081b0bd2f8ad1df970b229cd4209a677b205632c18b980985b6a44669f9628ee197cb9acb3105d2f936660740e0e739a2fc0f734b37c6f1d751eaba4761a7344fb854f33f74c11890539c304614f8d9f7f62f7654a9d283bda991e1c90216d0224f0cb7bb49bff302ffe2a9c8a98d91927e2de344c7c98c638c8b7e46c9b4b4cf4a262d2d6929036a54905ac70f2997a19cbcdc1a2c6a1788c1bad718d9196827adf75eecabc35a94aa9bb234169a2062dfc72917ceab24bd9ba622e238af747d07f157103172022e1850300c3a6bf5ead594990c45471f33348aee720a3e68ad93dfc135c84f248f5798466b5df35edb4675b23871f9f86338da480116e0ae6689483e4537fce47972fa13a790414672569cc856d5fae0894a81b61107f949525f7168903e9dd45aebaa74add5418461fab556d7715a4b678db8e9c4d63a9cf00a2ceae13076b6d649051956d305745ed272cbf02db11069adde296538256ead761cccd37e7bfdc609c34d75761a76f948443929b7399cc7699d1c5d44b13aaddec9cd8ef4896ceaa269b585b5ae62c1b57a6418fc14aed501d4f6a553b30fd73a7a90d2293f76dec0af8c9e97c7b53a491b628c5cabbc70e12f48ff652cd867bcb422ac92bed5ac75cdcb5caba502d2436051d66a9e6b9d50949e1a74adb393a230500fa36b9d1fd323c8d2b52e130b75ad8e7fa8ba968246816c7dd6856c3e541a2d4da942d6e588da4f11943b0799095b4f8905f582cdd72abf487c39dd1a5cdbdb25fbf46790b58685bbbba8953482ebb41dcd1525f04f953236a0ae033541c28050dd46d41b1beff67b410e5fd8a204336bfa1d5b9a2384c2431ed686b0756b790fe8e72149b6a5b8d174326666f8ca14c99047ffb621641080986f98dc663852f36264b872ececb93e6269ecb600c89c1e8f2f82990cb556e21ce8b208796bd81e0bfdef7140fda6d28b175290ae0efd0493829e787dd2eefd5291e5a063cb11451495b2767e8d7a781f547f533e103213cb1505f6d64919c189bbc380d47a9b4bc78407e9a6c33b2831da12b837450122d425b4e526cc7febb345138aa3ba726e82a68ddb3c607067d6705039fc9d112b28597ed47bd7fe31d7c3fd09265f50cc55af671ba6d0ea376910843387a1cb95e68cf08e76b6019e219f49108241bb390687865643f0be720f967412ed07a2cdd6258de51b1ec2c18cc8064cc038e2aacd702966a4b44482410db4486c573c70e442b27e9940f672c4653ee49b1ffe8866a7607b7d8542909670c1713586054471fb60c5263259c12c4b406d9875d4bb3f77a68fb032c5ebb624cd237830e00172f94659265b819fcd32193dd23f80cf1bc1293bb6726252be43460e34c8a45b313df0c09071c321d055f3d1907fb5fc1942f6df592d41913f2a6f850e7731b8f5b1dc60670636c268b0bf9be708f3ed883709d41c0f1d0f1b686cff45d824e8f89c6757e697c1e75f965cc6f4a30eba413393bd48c64e18e3ddfa76f5c812f78b29ef4ee558feb9beb41f6e9d2ccb2d2e3d712fa12cf1c30a5d1ff69871df0b7a27e0751fadc3d3973b55f22314f04424988668c6cef7fc43629bbd51c8a633083eeaef13759fb28fa0a5e28d1039b2ea7e2347fa735dedd49659be2f6f668a57ae4153c0efc7dd8e805e87fdf74f270088bd4157266347936f3d3ca315a004a0fa6e61957fcd604204046d4b8ffa80279549817838e7851b3ef144d7c734410e216bc60d71ba016da0f587a4f4b3acf09d750aded2ac16836c188b12baea02dbaba8db6a58b822ef7dd3e4353ee916cd5534d65f51c57ff184eeea3b2d17ea804a2ae075af51488c79df1c06926918c14446a7d576fbd7026486a7392c5b400d06f1116d54f5d7e462336a533241ec5bda49ec1c5bd135144aae29a17d43079f61deac5610df2d12211b39440b885b8ddfd7cfc3811c6a8644713b9e372d77b05afb32ad7e58b686f9e1e66ba83f4373e574e64cf6cd2c1199f968ad1667289e8e12837ba04a0f527fb6a6e11829d88a13ff89bfbc0fd2c38301f1b3339377e7efeb34c0215a5fe8f83ae28bc0323b9509f107f84374e0587160f439bae9f80ba6e74f3ffca18c7897da2c181fa361d8ce7cf77f8fe6ee931ffc53c6f0531846fcf4b7a1f3e0541900f0cbdc593519dd03ce30820cae0073c558d28ce8768f5f0bb620a1bdc9ab0449791236e4b4bf8bb9c8b2e260b8c6325792dc2d08a4c0a5a168bc7b1599037533b14221438e9a2f302b8fd70014b7d33b8cf25d18d43f10b7c8029399acbc50c322bea0b9f02fbb71236c7bfaebdf6bc4ea9d516f3b2679ad76f30bb275db0cf6df3eead8427251620add6cf0c79efc7cde9c9f26ca1f33a76630ca68f915b4236564bea35c37ecb57301f425cdc558e87cd4ce579e9fb8367b7f1afb8745e58bf27e96da0bc3dec956112bb41657457ebeb43c42f50041e6c1809e8ba72ff798bc300180456ff2c9294241703b0659e1939f4f7f1621036d7b4a6c1c2ddd1f01d0ccc31e7cbf428c0fd5128ecb433e149b1177838cbbc4271c606720bf07ebfdbc970f22458fc00edfb48e4ffc79cf19134931e2f8db1eabab5e7c4c05660d089e4f27082d1843c10469859615e75b29bd63d6832aeaa73905d4766ca15c26c6b4f146cba0511494c7d41aa317af45db779417b9096ef36d532127ccb460037eaea8c1529b15ed8a1c1ce77e750546dc4f1e4cf348a456b9de8457a281054c9d601c37e9c109ce36f12e2249be25a0a3eedfd886b18aa4bd875507a7fbd0ec11be2ed0d2104efe45a0e6d66ffd86727c879fbc67002c541c21f2ec5cc18db19d2aa9ac8e425423f12e364de39d6a83108973f87ce09f4fd580c3461982c1e6b0680e06d120f9e2e28f223ee9dcbd874d809471d606a1864e78330f35b0a0fb83ba5b328a4079aa816b9f101a6c6f4de89a676fa95a1473ecf2707191a7942ee0e10643c0cbf16f1e3ef05c33e64db40f2beca54979086b035df9aee14965ce6d20f90275f14f66be60fbe25b640dc8fa9139f8507ff66c29dca803ec68b6177de30bc2c75c78b232c4509f57c548f2ff5d7219e2c0626012f32ec023e5983d3e90038235574cd5c2cd9745b604e0a3b4d9448e04cd0de590033b1f6c3c9002cb313bac34890fdf1694d2c8416f87eb045101898bfcb56adc9048b387dc9d766d487f968af3362bca7e0055dad2bc0f50e0a5bfa36f32b4e23cbe1167a202493debe0fe02ba7a169843dade0bd995254617cd67920d27f1190de0f491d7a6c82cb8975d7262ee1d95d6cab437f08db3484b3e06933ccb3c028581ba8675dff23b668f6dddd060b49547188fb3bcc54141afb85df39611975fec67029496759a0d4d3ddafbe6cb99a73f9ae1eee3341c43fd2ba4e57bed1b425f116d9ff64e195f95f6126944eb7bcc521e2f680b27d73ab5c0ed67e65b17da3d488571ff0b4f5f03f7b4adf86320505f005e632b24acbf73013fd9892755c500c319910bf53808d5f0096d993eed57a077120a212b6d39e5d73db2ea20b5d7bbb8dbbb3a79c7e7fd439e2888242589f7208b89c282dfddf7bf01184623aa399f38b405737482437a151686678fec58878c2ce7a7a9fab13c78902d6a39f26a12c8352c1732d9f888bff33e6cf106d6a4de6d7c22f3945c6201cb7ba26707f85eeaaecb322e957e825f5f1ea02769b0f1487be42a1dbbaaec2e49a8dc22a6d109094374e27f96e312486052b8bef693ad230f94490c0f6969abd2af84dc30abea7f96e02cf4cc10b4889597b09813aeace22b7a7905e781af1ac493c6c3380608e9e212812826a352562e8f256b882d8873cd942181a225696380225049055145762824bff5b6dca04374826b327a1e2cc7d84a90cecb859048d1569554e48d3ac35ce0f7985a98d4bf05e2eb27c95df8bdc51eea003fc3a0bee12b8c32129c2e8dcbef2fbaf98c86952fc52b736b01fc1c558d3aeebd083832fdc2163086f40f769196bd373660d9b0713c08bc2c3655a1a0f066b10cd64dafe41f1be57f9fba2983f2d7e78517cfaf63926d51c9bb44938aa3b4cd0eac79bdfe97c15f326136dbba201f141b837e0787f99cc469d299be386bd82ff780390bc6b0779d23ed49dc7f3add36d41f1b56798ca70164d969d123422ac79ccba6e70636ee92f9358bd02724ec8350f44260f6ae41d9940f9ec22200289d21d5ef913b12fb1746fa3963ce27973c59bdae3eff9e1ae9ac66cce16ba8d83dbd0e63e6bd173c28223b5b3cb9633f815141ec2fb4f80fc876e5ef112b61515afdace2d7feac7a61bad33531b9e0fa3114f2c8bc93121eff7120b3419a3d2a39e755873490a31f7f1b1e9abf3e7dbc9c220e63c88f495ae94f2855eab2d3b52e1e04d6b8e477c2ee653ab2b747d5bb5b8a51fa0b25e5b8d09e0fd4bfd5a17c58495cda13fd0068b641d4e2f784fd32d366b3e8dfef440f0a19cab01e661dec445266d5e3be35f49db966d8c325a0bdebbccdd9c3555ea206a620c31c576034fa754bacd1d7ee8ff5f5dc7f4eb685b9fd2097809f94bf3cd2c90cddec4ae5d7c43394be1fe75e76f3072af5db9d039ded7965e6c0d472e30e68670cc160b30af8040369ecde366eb9cd57c133e5fe377ff4bbd9743508a04ee04c91051fae5243b63f7b7691f2d752d89cc9e4c115004edf896ccccd45aa5426d29dc049120b180fee074a1b6080527e4a1249d55ac196d21f31f84d04ca291bed7db7fd1f9917de28fb9e6b9823b26381470cda79951f9a17b09517267fbcd6ceef9c31fe660a7e8bef08d287e07f29e91fda72a44983e8f41ef84ef4cc4962fb643f6232e11bcb2e7b2e9e59c531d3056b76a0cb7e0ea099822547e77ab00886a0e157d5a871555287c80ab18ccaa64ea67bbceabe1f304cc8d34f623c128924e61d7c6938a6dafb7b59f06c242e30e76690255cb78e74e9c17ce29628b04127bae6079e1d073dcd001ee1df5d00a08fb6dba000a54cf9ec6092ccc9ef667a67d627643126fb8470127f221f758f8d04d7d885e929e3f2798874a2cf8dfdcbfc097815449088b3df9c2ea14733ba0e08dcaa54fb89e4cfaaa042cbddcf40c40ee1760ab3b1c46130c0294ce19bfe910bea6562979d28222e6c79e7328a4ffd4f1bc64e202148296ad840858dd103a9c5cf02c1c9a1391850256602de72626873d2780e5cc1899b7f9ff3c1b27f288006b664f1709016e17e9c647a04d01711b3337d52659140decfd6faea3c6ea2ea1182d20814580718ec725497da902178aa366e29ab2bf978e38c5152e0b04e0049a4907164aff0f211b98d0f613a54fe080842b59cb18464bb4d80037807078f75ba403ecb7dd16fdd1657bb9487b30e9c03f3d076787e1397e036709bfbcd2537d8dbf658033a0fd68306af4106f5c814bd45e8f54bec087a6be68c67f91801206f88f55b16dc5b843d6295ec7f995410babe30f2e0c0da5b1f4929829c10615f97a5e7642814a18024c7eabbd46b1e5ad3037b9813e8f02e341168c15477365215887314d9b22b3925f018b2eda2845072266d9ef880cf209a156c9a2d2f5bafdccf355fe2d03850b7ec8e8052fb06fd77ff8715e8337526897858fd0ec0c4b58d30b9fe15e734fecec54b9cf2e06dd038e0e44a96df61d4bdb47edf8ae8749c17aea98e05935bd73813a76326f2abfd85d22d11a18c022c853689fede84f830bd7329d493334fa981411a37bd942a20150edefdfedbff043263160e7e1741e5e90853efb3fd0b95815d1ef70535d583c672810e1daa9fbde27361b4b3ccc293ca1622329e3d85d1c88844a2a49c04bfef12990d9c699f42e50bcdec7bf4a5e10c91d0487b3ba8fce1bde0350c5e1ad1ff12200ed2e37d8c63b4bf44cc184bf2cd3087502e1058e680b8cfa60bbf0f239114188300990b84f093b4b673a22d04c456e0acec348831d44fd6660c61bbddbc37db6f80b675696e63923705511be2bc53ce553b5792fb86d02fdee3a82e596220c7614cb35edff4cd27fc67efbfdc3fbf461ea2b16dc327def58001bc11e52bd205daffe995e481ad56163f9b2523fa4ac37be8ea07b6bb125526943061e401fa16b67f1f65a9661aacd799d03ef8fe1c995434f7b5ce920e68425de48c434b2f91ac77ad05ef528996f01bd0a18ead91e7a33e90cc3e32e2936c69f595568c75e58ece75433eb0c720a85cd7481856cb83aad9d3b052c87e468e5029e031227d2c5cd01a3b2ab3449c7d648484e64f9a06c012673d34f69ebda7dc990497de71ea30d8c5fefda483c4b256454ab1e1d41f424c61fa0c9c365de43b20222199602b21466abf3eb0037ffb9631c740bd618cff61eb1a1a2814fceafc399aa1557f4da47825af370288df6ddbec98e4d6c72908db13097267187990f5b311aa8c3cf26d008b81350260590f9d2917ca4344b25c13a34d94d93fce5c79225f3f739f97782c82b7d77b27652ad653b474f93f6eb5216858f8670da52f25509d37c25e3cecc0fd8c79bab4fc2ac97b9d4c2be088a0e90b102bea77739c99d42e506244fd2c0ba4a72b9a0895721db35baa86e806fa693c80b5458546ab9b6bc66fd93ad01b5ecf5db3a9fbd2820911a57aa291600f1c2055663f7ade45f8c1ff74910f427f51c0431aa4abc2078ec40713db3025ac92bf6f737e6bd5b4cad4bfc33b8cbdcdf03d407806e7ee5b74dff8e9ecdef7856be65f7dc16db255eae61d2c7433dcebfb37012ef69d7d7775663989b7dda9c2f9490688c03505f189e51fc249e3e0bbaf3e26c6d206cf2fae7f303420762c8e04a2dcd03f1703ea28b4acdf5cc0a4891ee4f82990fdc4b96d1a148d6d08ac7dfd7ee5d8b2a2befe4631e28721383c878111df11cc3f75dcc7cf7d98ca01c0bfe377cbe459dd0ccedbe5db4ae6196fe8d38ffcd8d6aee1046ed7de025d67ccef86d3b2a03164bcdb6d05c34d8ca718315e1942fa1ee7971c1ecb77611ccee7995defc9e482db41e11772d80425326c70491d105319467e77d288d5f6ef07a223a7a7b735d820a6c86078295075e47dedc372e1e18fdd1fe63c022a3611c0f521efb1bc33c233e2398e0d9f4670d795044ca04d6b937d881f7ffdffe28d4f2b6d2376862c06e80d3c50c86a60842cd1bbcf76707bc89be73809ca023cf94792b3403a3fe6d35c9446c7236ae5f020b7319fa436347a8184b8617c4c9d278cfd40a51ca68513acb692a44c5453f9954cc6f2cc729d85cce157423fe85a421c9d4ca3771aed22084b6fee982d9e2e150e45b4c47bdcdcf9d3a2269df90727bb80a3bf843e70044f5da8e92d64a74630a1eb7276d62048790f6591ecbcac6491faf722ae0037487b1f9f907c1d0459fd5c2322807b25f218cb0713376bf763d559e8263ddb949f493e31afd341e39c642ea9f9b764144930f9e811480e7a9e490d23e3088c5b60d313f970cdc08f54fc8e52c6ead8b13c1a8a8f5dc7666d4885b0c6aad062a7b0e097dcb46c741df20de75b47639a1e48dbeb1d80d592207534421a548eeb1eb62a98d19b79f49b7b4018a5601883bfa0b364d96b058b7da024269b65ca1e87bdb9d5e16cae392274fc8187301cf77ddccf6cb2feafd2ee86eb15fef178adcb3dd9c3af105cd0207f022c90e8239b47f47310437056cc72b74cd5114c5791f4ff4ab83dd1a5070c6087a39a83d94cd4691b7cc905bc19c39f8163d863bb0435b81038508e581ab08bd900a219e87732a2873aacf138d579244e2132674cc9780910a1ea3027bc57d89a63bf83d7a9450a6085b3978404a1264c01d4a6fc968cec26fd7d5719197dcce8268de0770fe5fd626d8510e0d4e80e61d6b7378f87e6d50a06c24a964419972df30c831abad91b993b6eb84738633618cff8b885e9249a9c0f62f31eece4c23338af7b3ed1f2b792bf83d77e40edd1939b2bef853e13be9dc4e1b3ed7e60e38cd6d0d8fc1d82fb2ae3c17df28d04045a6dde1ae15abdabc0b9c9fdd6d10ba18fdf680f5e1f12ea96782ac3f6cca36f33cc559defc22dbb13d965f9d5cb9572eab9727f0877cc3082b96fa8ee1a04ef45bb9532f4d4ecd23b27a609530c9656974ce920bec8f5cc5d7d1a07a969fe2c59fe54853582728fd8191ec7faedc27a8383d54eda87291afd8bb1db25b7cd79152d71e7e34f06dd22619c3f7a69dca2c972b30dde01d6aed3f678ee09379c2cf425f6136956b351f97e26351248ef948ff81af05b388ebb87f7997e86a6967d4ab9a13139b932a5a41297dde059d53c60902780890f079019332a1aa4fdd1c58a80c8caafc7d2e0f2e661d3cd72962969543e20502947f9c85cbcb55a6829d0248c091032e2bc6f6f4acee6f5f4acd214301eaadb855d5200ad792a3d9d748cacb91020edcb496744faa2f06032a3838fb0bb247576aa39df7aececbdb659c7afdaa998793d0cc877d33c49bfb4289ef83bb96c0f43e3a15e9f1addc6f3a794fc1bdff5fddc49a86bd6000bd15dfb8a76ed32714ad03a65feb4ae0e945c36761e889312f090373d1d359431cd1bce379e5b4587a2f697094b8a5a77a3c84690bddbdc8d8300e7c3a9ec16fd76cc1081f455d86377bf607581197100e2c5851c4b42dd35877b090a51f0da76e46a19630018ace997f309c2ef908a6b331c0334811024d3bd6ffc95a6f3ec1f7a36cfbe220a2d5357b69a5ed27915817030a27a66fd07415bc03457fedf3afd7280f63e7fa3751623780639ff67a66f1fb5df6067625c7aec16c91b4deb1f9dc26173500e0759d34f2ae90142943aeb214dff48dad65b69d5b3fb48513c293781910ace0c76d0c4188285d8d3bcbae0ef14a1b4177579d5c300abf69fdb417297e9177ae092cb890bf0111dace5405f286f6de338dbae0c691cf734543f2b46cd3abe3a58c7c75171d1655c2d9685cdb78b5b3479ad4bb08334dbbf4554c857587e0fddcbc318d0f571c999118692eea08f35a6b52e9f1b1d36b26f5d1e581fe0cbf6d799f97b1f0df00ee528fead8257311cb7770fd0e4f6037d583b58a78cc49265615ff4969fc8b3fa7ff97f98fd290f21cf6fc4f079e076907c57c93008397e49269e9399e3ac25fd4f24576dd95b4b0d1d998689e23eb08af1278ba6f2d0489a10e6b62ecbf76be9fb57365fc412e2676412b6d47fdec4aaa4ec1222cd1d94fc24463ace625b6ca9fb56cccad89266bdf0b722306460311d84b94c41820acf903933f53d4898c50fce2def1c9c32e9436de9ef04d6983959fe678487b54cdb1abad4dcec9ee6577c6254a84e424cea69e06681e7b7d567fcf108d4f35af70677c38fe7ca15cfffd6513d18a237a47ff855a2ff2b6daa65fb9b1fa0eb2f64046a329439be7a99d14b8e280bb683c1023c6aa44dffe5631ee14abf698505eb07d4b8e696d26c9869ef1248ea36247afa9c79d386ce94f7a42562c3b5cb78d69f372db03b4fd3e9b0e3467f8789010084a9b908263410dc8ed08ddcef4232393902f47735f06ac97c0480603c707a3a655beeb5a9353ebcd75b51e06e9f25e1052a4bf58571f7003f5293662107708ae7e5b6093d1f34343f3960c66c1fcabb2f65787c6a0514c2962c84e4aacaeb33017a3e41f5e349d2e9fc8df58305b70d315757a731bd3881d0fc81a564ee68c17907a4eb21b2372195ec207af78de4e9fb1398ecc7c7c1d522184303c94d9249e0805a1b45858b71cbbb2d9924f4cf2aececc729728440577636e4bd98e306e3fdb675b9f39d95bdb3bc71d11e038da927692d12cc7efab888309ac0facd08124b74244da544460132da89aa7009bb351c446fda8f4a88e0fb1227bfa718e298c3ece0860523aff38bbac04709e0619cc50585193bb92b8d0dfd322c3ca4c9333b8e2bb799d29c62dcd62991f4cc34675304912ee7615f2b613cb4838abf40dcc4b5e8ad96bd293647c04398cf576bde074974cecc3f4271fbd4fa0084cbf8b4edd6ade093fffef9c3b44ff88dbd838623cc37bce0e7e7fffa1530bbf2dc6190cd61bcc2eb157ff2c15cc3ca3b7b53cc15234ddfbaf26762dfc57f74a94b9352fb4b7f21022834988db00cdd12ce728ef4f3ea015c2b4a5d9ee0fe7aab4329a7565c36927386fc7753b6dbf3ef47c3b3ab458775775489df4c963e84b52f2e4eff28bf44e41c245ad5e916902cb464b9162810030220765644370afb3825525c3c713a6e63d5827d41fca66d757f12b73d25b7acb1566da06452a454a4d009d507bdebb9f329bc3adb4b07af2b629934fde64893217d467992dc737bc826a1d191016bd572dbafbf24e78c78eb1ff5cc9b70829a5778b03f3eeb8b06c5ce93912e94bd711e7251f164e0a4ac9f791fc49a40766393d1518d84da61fc4552b8624bab194a84215470226e9100cef7e85f29f3266582f4db66447b40c06888d9a6fbdfb5846938c4af413bf9cad89a5d1363eb64e347fa9a41d8cadbf121d74b336c9e9600368bc212ba954534d42796414740ab2f6648826279f1a3242de90dc4e47f73b9ec1208e120169c5769e4382982dc24a76c3095dd4000aecbfcaa23e4953fc64601fd709c26b178812df72b2cbab18949daf0ad04d2abc14002933d86ad1236b9822bc7088503bddedf710505a087220e213835dadedf66260568c1ce87ec53f60825073b375f90c36a52b34fc516e669027b695bd12c84139150388a9a7a19f18c70e50c4a8312a389dc9ded2c9763d2b155d1756a9699092cf2a174778021a4e6625722994349429469ff114ea2a5d851e5c5680f0d21d459fd41b2f8447215ebe6bc1a2fae7870db72fa556a9611aa65388d779dfcdbf13b23d67b1ac4ae9c694883378f676f4f9c014fab89235051bba93e7ced05af052349e90d1fd254e3a6fe4080cfb114d83f873d0c12a80f9ea523c2ea893d846e5b18fbce707f445d4345d5af0cce8e8968843f99d0fa2e9f7c040b942872422333bcc899d40f30782cfac8994cabaa7e480061e74f7151bac632158283a91f2f4bb7c99c7dd6fcbf2065580a17ed26d40512bbe5b04262699aa85f09604a982519fe06ad0a62d27a84500f50b58c7266d9e5c7c4d07f627c26a160eebd57170a2764d4a008edd68f84e018877e03bbd43cf6592a0bee46aa0d8ab92ad47937a28bb7ac057f09f938eb52e0413d58f32932c2e7494d4a7fe61d36faf89f39dde452bfdd8e5f771c713c10c081497e53bfd90e47b49631eac5dd94020525fce460d73b20898524625e529ed66ec9357648787aad9d533b237f7ab5a9fb48cd8d927b0ab1fd3f37f02106dbe2f459beadde17d3fc1effa38bb2d5ac3a5d6bc47ca4334fdd3fe85e60bfb2c286f2f066de7274d3f29bb8712154d31774a6d1de3485ab6677446ee5149f07b725e37706119bb29ef325ed0f0371fa985d3e7f35f7219c012398831f70aa33cdc8cdff7a82f72402f279f2fb29ae671164fbec4edf61a85f4893e384cd5ecf3f131a730c8f00af83f0fba631bc94be1e045cb641b218910fbdd644d836960be08e5138718d381c812ec0fcb2bc210bf5c5bb6857a3cfa2d919c24c82c110043445a8b18c44330ada2eb8a7ba1581330657217fa75e0dd21297e203f6d2ad49e351300aaa054a0433919688c7403e107a0aaa10f89bd797468013daf86279cc06708d644b852093eca248bc7909c52241f9c8560e3e185a729c28855c631d55f46496b384ab54db327b52557e3df50bee4b54ad62be107d2b92a04abd96e986df94dedef67e8f39f020b87fc3fe56ceee7013ac56d4e92bcf467bb30e4acc18f86723a58796af40a2593a9adb630672ef77fb200e595f313af0f7af05223308b6c360706e619ea7ca740d19ec8de04f5716d3ccf44364f222dbb114826de6c264e179e6a3bada127635cef8a8d57f27cfc0e618eb35083ca9cdcab7832c27c91a4906efc5777895f7b7e24996d27efce6ef9a26f92a85f16870c7436d92b45c97eba04e8aca27879bb765808b70932fbe6caf26070bc8ca20f7e3052e1b3bd7712de98a7ba8e3681181115578bfac683c4169f2102e96b0c9f245cefa2063338469d6482a7176de6385675db415d73c3b7cafbb98ea4ca345c32ab6d940cc3989341d646c945339b25e53efa5c704b88d4ff93db3fae1a3feaeddc4e93b5016cb0d6327879c6c71d1778f6530c975b0effe62cc5f42fe0fc97f2591fb9c70e0610d9de3f03d3fba7fe2df0c9b94161f81779daaa319cb3d1ccca48ccab8ad83bbe41f3a6e0358c9335f1eebb6e33812b10e0a69c3e56d7e1f0688f44b9b0d1d7ef77c8573cb3ee890a5b50f96cf8dfd09a6c8a75b40bec388f19ef0c15a47a3ce0c09e8fb2dcc5a73c9daddff55c1082ffbe352ad7462a0a904b5f71a191b30986cd2bfe54796c0c54d076eab73b132e5fe4e996cfffad130ff51d0e234b90a7d59334b7395386326b9796c3cf7338611abc74859736ddc1e7f6bd240a1ce4785f22dddc4600107acef63ad934018f63a239fa2ad19c83874dec131ccc2078c24f307aa97afbce78fa994aa01fcfb44560287440aa3bcca200283a722ec93f0c75ee444d453ac135d324faf440cdff8d14d7288c40a4b46060ae5d13aff2aedd9376b71964525978c521f25ea730ce0c8d5d7a5c95072e6e70801eb858f0723f8fe28718cb453e063a5eff75d17a688a5c220cd1caa575f9be3041918baae0439ebe3a19af03e20b71702618c3e43e93e32302db9d56e5a9bbd8d272f99f3625db1f94db2c8b8fbe692453493cfe3355719824dee2d53b1d979bd469e44f64975107f01e9789233f0a1f0f4c63bb73745acf62a909d7362c23705acb3ec83e262fa226d07cd1d6ef97f5f162cbb8f613f75c11c2c6b3b32124e204bd7798c64feb025ae83d33c6abf01cb9b60eaa2b76b07543f6317359cea0088b308070fc12eba5f2a16ac43daf45e84bfe2e8369fee4a48898048b2cf183652b4d1bc0d270d95ce083f307c69a55afd201622cf7a0995da20b518ad478c6c62394611d8e9da1e602c3de02227194b0945da070fbaf6c6f6ad7fdcbee25c11e0d56e4deae657a0c007c04294fc415378149caa7aa7d0f664139c33147d293751e51a666f39c6f63d9e706faa27ac5bd40e907a4221e9103cd48afc99173e65b8010b4f985573a4d875d6fb4b84ebd37337055ab520d01fccd9d219649c7888444a2cf81d02d8bf1605a0e7c72068122a5d419b294e790eaffc689cac47f629d2c5a731162f1fdff10d407a5fe0bc9c7b98e939bb817c91ff5a00f73b847720dd301580a222b227007b77f710a7f82cf2187438e4d2e5293774a8c07037f03b45310e1819f76e76f44f87403c5f6e4bf0d4bce871d9e420c4187d288b2e6e691256bb2ea92c3acc32ba753d8248d79b4a0b5c15e4686207931c35626bd2e1165cfa6e9124daa4132b7d7314972d45ebb38c6bd4669bc5e04ca0b3909dc262e23199e649287a65bcd933a21c1116328a0f50e3af72a29ec8c6d39a756c6ce7d3d8771a38e1752785c1e09d541d4c102c7d89245b674e6f15758f85e23dbc94bc4d7a8b4a52eafa59a810c8b197451890a59fbfb8472e15c82fc7f114e81d8a59a44cbe23885d949de42f4a73eebbff1dc8fa6710cdf02fcecea1b6e1f347709c7a87e6ab21d2e253d8e3a6728b3612bf14e44ad1f4a8e4e5dd71f4a8a4d80bab05f880df02c39616c245a6891b09b04e0774cdff5c9f69904c57d51be6eddcc0f47f6d03de7fbe18f13a7342c8853646350574e746a11a476d86f8785065112b93bfebe3298efb1488d02cd59531431e4e2d5b55c16a361ad2c6a1d622b466982a4b6655c5d6e384b475319b6a8c68d988f82f98ce26091bb83fa7e48691fa13903fa6a070a1f49efb952883147c070316a5a9c1ec0198addf875358232d6e201ada4154c0680987decc414470f3ef10aeba5cc3924d0a302dff3303b9e22db712cd78f18584641004cd505d44a4e793eea5c6605c72375c995848583aa9e69b277b2f599d9cdbe468d905a57da72c084a54a875bab49d0a863ba8d603740da3e35b1cdc9f54cc7454b2b0b4389b74044eb777409524227a1062a028118a88754cc903862f263da016b99d13c418cca5844cd2bb55236b91858f4eae27ad3da600cc83a7629bc17e8febae8cc70ae63d66bd13c4e1148fadf8c8737cf1fb0e3167192222462b23fc9cf94d7feef619052f3a2482dac25fe74af2c52925ba7bd287e7875772b50b9f2304e23858536fa98ffd8171bdceb3cc0e6c503800e979917285e1780d74531f8cd6ad35e35582864aab9bdbb5a6119a7245b2206f27a8a9311dbd57ed4b3e981870c46c9ed514ada9b18d6e85901eb20819bdf675de07d01fede86b4e050f162482c9b30529d1c452786fafe971b590c283f578d3fae9ff76f2407ba44150d62241b9fe02cc4edea1816f415372a784cd50909a5e9776259531a00318dc6a9d1929c81e7aaa141101720524a41ad438fcd618d3823068bbfb51832a472e1f373fc77e277b17149369556f943af038730499249363c5e1ff78605f0e2813434416fceb9a9444209c6cbe55165427ac809e6657316d659acf2f3af736aeaaefc24aa053d28c18780bd61bddb97f93af3140d6bd1d615a11f5464c78fed0751a744fc554397fbf037f04f69161dbd3399dace9c39c00db248eafa06bc190f7d98203eb4e88f7624d0ac57f86fe1a49f18a31ff422ffadac32fad20705e5cd95e0bb73e94aa3e51b1fe0364ddd9e220c0dd3dba1e411e9fcce6409f0f06bb48ba47fb9ae7fb3479ccb0d76fafdc3799e6e1bc99e3f6b782e2b3cc9fd6e745c95d6b5827f97fee291cf5793dce2efcbfcd5aa57f84ac96d32fcef5dcff41acfd9ff53786405fdfcb57e0f6b1f549cf775b0bcc3c53b7ed8cfb8ad72d6cdd3768687ac997c4b1b6fd0fae8570469a8ba15f7e678efbfecad3ffcc10f9f8b859aaf230d9ba6e601ac157863e8f4df03aff5df81f06f6e05ef567801f1fd2165ac4dd66838ea5e3491786cbad9024cc6aebaa15b52f1f80aad0582a065e32c611aedb875734fa1ecad9b7f7ba3e9fa8e60f040b452e57e3a597ec7d305c1c6d0d5697770da32031d4c508941f14c0b69248720d2ad3b787115abc68b74f484853a5abcda5fda9200e7013eb64134594c8633bbe054c4859d3b0241dde3d55439eff3352e235ae701f8402a000073bb7afc34e6ebad7f45b60760fbd7b2ae252a879de26560f88c4be4dd82b1813213ec2f6f33ba85b536c9f946eda7744ef912f4a6c4fa22646ea2c3a182a29fa6c8d7b728d7c2da52e4e6e79027b0671758c0442de416c380d0dab3bbc4b7926fd849363ae7d0b2ae92837ae57f9dfa4b3d49819013105494eb97885c89a3df84e0ad95d9be13bce8876db65e674e2a50f13f8be2b021ebe0366c2d9246d30128749415aad79648f061feb622d9ccf5f24d7a7e00f4e483730e411df445ce5637cfbf31f6a63b29ef9b0bba4c000d21086af64d2956a125e7702d5782f3b2da36bfa282b68ee20aff846eda88d578e15ecfefa6324b0482fb0c0fdeaca49c08b0fc8b36ca71ee0fa9e8b26a72333058d40114c6412f156f0a7c77bbde479d1b31aeae2b637b5bd5863a653de2233c562c197ff139978cfc39e5702c229d5d635ddcdaedd66d99b466220d0b09b72be9a1585223fc18b2db8c68dcf0d4029e1b5605268f05bd86c6142c55fca16c487e0fa8394dcb5985b2802785c8b20f69b135ce335545a76ddc28b74892c53160adb005b2b85278366091fc4ec24a1ab6921e68c917e327e6e1cbff8e7d8ab22fd6d2f3da738dd0367afb65bf5f11b1fbfabb9d25408a5ef567519c9dc4bbc9faae2ce1f6f0cb1a494b5d6bcd9ec06e92620df45b6b890c46baefe43e7588f3c217d73377f6eca71f1a6d1db40bc3dd85ec95eb36ecc950c87a004efec85b5c6c9403b902d73ec90ffc4f94659fbb3df09f55106c34c4a04cd9756ca2c899bef2ab1c50e0f3ef33d4ced78c3922cfc9c23e93784fea4206fe42a36073113ab91e1508cf11926ecd7b98f127cc4a9a7277bc887d3a34e8efb8497a1eff4579a6be7f46bee36fb5c0ffb7fc045b0df8f9f3a8ff6043f80f40eac61f2faf181925b627e44262f6fc63cd51b17d8dc40737fdd831065dd94bd824b93f9846a4854f6f1e40206fccadec98d2a89a11f6beb1cea3054b50eed22fd0a25b32416b291816ff2159dea2c18482c80f424161a043d9b1f89a1860da2b1effa4c9a537614fd1158bb66eca5a5213ba12f02db8bcf01ccc9e38149c23c0a028d3076734e11af6e3bc1e203000d2280ec649749eb2f92d52f6bb947464618a284a1fc9b02b4af8a55e2f8b4bf2ae371568cfe980431b63feff1af00ccd75381281f96ca4810a357af12de3b0dc93f327db3dde530001bf94031a98fdf5fc97467254bfee47d8d7f4ec8273b969bec49ff9fcacf0dd9e30c44204e4729a24f40048be3d11cd695505d14c8633fe221f5e0f3c3c64ca3ca751d600ca7769e32ecd9559dc94b6328e90cd6fc3f1a05d7e6176c434c0e5e6ccd63190aa015c46c1c8fe91dd4e2756cb173220fee7bd2450f5a3b7da0e6c7eef74b52f2d0e08304c3b03829e75d933fb85830df6f783b655ea6c694254b63bd0e369640a3a9e6c028f2402563102a84d6655dc6c06568a0bc225b946aba4dc9b34885e0cac6e97c76841a8fd84eba7de81031e4b3235c89b893a6b48542521b36ccf5653eff162e9a1eec195d030e4f24758b485e2d4c18b7eefb090637224ea005778e14b4d6a028ce95ac5158dc27ccbae1ed5c2fb3deb340335a708d3f0a4697ecda25b69b1ecd8e073e514eac09b29ea9d6d3658389cea6d23cfb7cc8fe1f0a2f06d715aba83211a5a640c9f0a3988cc67d410039ee212fc24f3892fc5efd1dded77e768c30ac7ea438860a73801d69d6f8147a91ec17771aa300e9a732f1e7226d31cf233921cf864a8a719cac2fae8c6120d0d8d41242068d88c015e13c797a2b0b259a65aa3bd4f884025416cc97903e9ad7b0efbe77b33f7594352e2185314bfcecb8510bfe5bea59ce494fdd0f8f02d5a6b0dbe136ab9735001d21de5fce55124c90c69bab31c7e57810b167c5e4dffdeee43c2f679bdfd6b3af8a54c6980ed68b254382df54a3267a9ec00391c748d630491770c7eec91e5c57402f4d50544ec3b4bfe6d3346f177ebba63bec922c1255c95a511f991125c3db307d17ea6eb3ee88b22d392fe9d31fdc9d188ce3577e8bd37a09fb2cd72f585e023c2c64a6917b9ed8c85cb71bb1db060e35ed700f05aa9f60cce8b189d802b7a9c14b65649bb395b08425dc8dbc3fced7b967e56de39f93f441d995d91863ce13b5dda2ed08b12dfad5a8095a33e8c9d6febaf4e2d915a8433a1efa77262f220ca7203c8a2487e0032efac8c167fcf1333e22aff14487c3c18890355993b064fefcb7bf83b96d41c6f1f067de676af83cd93bbd8f5fc23941a49ed4b7afe1d460b58643101baacfc31c4e23d2e5f0187d6885c39804e21bf58cb286c999083c06cf226d3eeddeb515850b2c91e5bff8a486a4c9240e816e8a5d8328dedd485a3f83c38a662baa50a23862436a9629a3af0b86302e8ae0660f38d0f451c5c36753cbccd6cae67f24711c8e15ecd2b8a87f5c134037e7b677801b683444480d7e6942474875fe28411412f4c33a903c04dc29e37d41e666bd3e5e594d773f59bc3be650d961b510581b76009f0bd12f07357508875385cc19ddff74170fc224", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xbaa78c7154c7f82d6d377177e20bcab65d327eca0086513f9964f5a0f6bdad56", - "0x2371e21684d2fae99bcb4d579242f74ad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x301863616e766173", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9799c6127efd7b432295ad94afa4b64bcbaa78c7154c7f82d6d377177e20bcab65d327eca0086513f9964f5a0f6bdad56": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a6772616e6470615f617574686f726974696573": "0x01087bc6fd5dc6e832b294bbf2ae21df67f990a526793a9ded12a5e54e40a5a94d1d0100000000000000eb17972691ec3a7d09a316baddc8838362ade2c12a21a506d697903e16577bfd0100000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x4342193e496fab7ec59d615ed0dc5530878d434d6125b40443fe11fd292d13a4": "0x03000000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index fab155f..b74e351 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -8,83 +8,126 @@ edition = "2018" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] +[build-dependencies] +substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "hc-contract-experiment-patched-v0.9.9" } + [dependencies] -codec = { package = "parity-scale-codec", version = "2.1.1", default-features = false, features = ["derive"] } +codec = { package = 'parity-scale-codec', version = '2.0.0', default-features = false, features = ['derive']} +log = { version = "0.4.14", default-features = false } +serde = { version = '1.0.119', optional = true, features = ['derive'] } -# primitives -sp-api = { git = "https://github.com/paritytech/substrate", package = "sp-api", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/substrate", package = "sp-block-builder", default-features = false } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", package = "sp-consensus-aura", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", package = "sp-core", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/substrate", package = "sp-inherents", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/substrate", package = "sp-offchain", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", package = "sp-runtime", default-features = false } -sp-session = { git = "https://github.com/paritytech/substrate", package = "sp-session", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", package = "sp-std", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", package = "sp-transaction-pool", default-features = false } -sp-version = { git = "https://github.com/paritytech/substrate", package = "sp-version", default-features = false } +# Substrate Dependencies +## Substrate Primitive Dependencies +sp-api = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-block-builder = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-core = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-consensus-aura = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-inherents = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-io = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-offchain = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-runtime = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-session = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-std = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-transaction-pool = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +sp-version = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } -# frame -frame-executive = { git = "https://github.com/paritytech/substrate", package = "frame-executive", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", package = "frame-support", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", package = "frame-system", default-features = false } -pallet-aura = { git = "https://github.com/paritytech/substrate", package = "pallet-aura", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/substrate", package = "pallet-balances", default-features = false } -pallet-grandpa = { git = "https://github.com/paritytech/substrate", package = "pallet-grandpa", default-features = false } -pallet-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", package = "pallet-randomness-collective-flip", default-features = false } -pallet-sudo = { git = "https://github.com/paritytech/substrate", package = "pallet-sudo", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", package = "pallet-timestamp", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", package = "pallet-transaction-payment", default-features = false } +## Substrate FRAME Dependencies +frame-executive = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +frame-benchmarking = { git = 'https://github.com/paritytech/substrate', default-features = false, optional = true , branch = "hc-contract-experiment-patched-v0.9.9" } +frame-support = { git = 'https://github.com/paritytech/substrate', default-features = false, branch = "hc-contract-experiment-patched-v0.9.9" } +frame-system = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +frame-system-benchmarking = { git = 'https://github.com/paritytech/substrate', default-features = false, optional = true , branch = "hc-contract-experiment-patched-v0.9.9" } +frame-system-rpc-runtime-api = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } -# Used for the node's RPCs -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", package = "frame-system-rpc-runtime-api", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", package = "pallet-transaction-payment-rpc-runtime-api", default-features = false } +## Substrate Pallet Dependencies +pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-balances = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-randomness-collective-flip = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-sudo = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-timestamp = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-transaction-payment = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-transaction-payment-rpc-runtime-api = { git = 'https://github.com/paritytech/substrate', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } -# Contracts specific packages -pallet-contracts = { git = "https://github.com/paritytech/substrate", package = "pallet-contracts", default-features = false } -pallet-contracts-primitives = { git = "https://github.com/paritytech/substrate", package = "pallet-contracts-primitives", default-features = false } -pallet-contracts-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", package = "pallet-contracts-rpc-runtime-api", default-features = false } +# Cumulus Dependencies +cumulus-pallet-aura-ext = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-pallet-parachain-system = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-pallet-dmp-queue = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-pallet-xcm = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-pallet-xcmp-queue = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-primitives-core = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-primitives-timestamp = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +cumulus-primitives-utility = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +parachain-info = { git = 'https://github.com/paritytech/cumulus', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", package = "substrate-wasm-builder" } +# Polkadot Dependencies +polkadot-parachain = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +xcm = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +xcm-builder = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +xcm-executor = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-xcm = { git = 'https://github.com/paritytech/polkadot', default-features = false , branch = "hc-contract-experiment-patched-v0.9.9" } + +# Contracts specific packages +pallet-contracts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-contracts-primitives = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "hc-contract-experiment-patched-v0.9.9" } +pallet-contracts-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "hc-contract-experiment-patched-v0.9.9" } [features] default = [ - "std", - # temporarily enable unstable contracts features by default, remove this before using on a production chain. - "contracts-unstable-interface", + "std", ] std = [ - "codec/std", - "frame-executive/std", - "frame-support/std", - "pallet-aura/std", - "pallet-balances/std", - "pallet-grandpa/std", - "pallet-randomness-collective-flip/std", - "pallet-sudo/std", - "pallet-timestamp/std", - "pallet-transaction-payment/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "frame-system/std", - "frame-system-rpc-runtime-api/std", - "pallet-contracts/std", - "pallet-contracts-primitives/std", - "pallet-contracts-rpc-runtime-api/std", + "codec/std", + "serde", + "log/std", + "sp-api/std", + "sp-std/std", + "sp-io/std", + "sp-core/std", + "sp-runtime/std", + "sp-version/std", + "sp-offchain/std", + "sp-session/std", + "sp-block-builder/std", + "sp-transaction-pool/std", + "sp-inherents/std", + "frame-support/std", + "frame-executive/std", + "frame-system/std", + "pallet-balances/std", + "pallet-randomness-collective-flip/std", + "pallet-timestamp/std", + "pallet-sudo/std", + "pallet-transaction-payment/std", + "parachain-info/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-pallet-xcm/std", + "cumulus-primitives-core/std", + "cumulus-primitives-timestamp/std", + "cumulus-primitives-utility/std", + "xcm/std", + "xcm-builder/std", + "xcm-executor/std", + "pallet-aura/std", + "sp-consensus-aura/std", + "pallet-contracts/std", + "pallet-contracts-primitives/std", + "pallet-contracts-rpc-runtime-api/std", ] + # Make contract callable functions marked as __unstable__ available. Do not enable # on live chains as those are subject to change. contracts-unstable-interface = [ - "pallet-contracts/unstable-interface" + "pallet-contracts/unstable-interface" +] + +runtime-benchmarks = [ + 'sp-runtime/runtime-benchmarks', + 'frame-benchmarking', + 'frame-support/runtime-benchmarks', + 'frame-system-benchmarking', + 'frame-system/runtime-benchmarks', + 'pallet-balances/runtime-benchmarks', + 'pallet-timestamp/runtime-benchmarks', ] diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 7536f8f..4002d79 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -22,20 +22,16 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); -use frame_system::limits::{BlockLength, BlockWeights}; use pallet_contracts::weights::WeightInfo; -use pallet_grandpa::{ - fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, -}; use sp_api::impl_runtime_apis; -use sp_consensus_aura::sr25519::AuthorityId as AuraId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, NumberFor, Verify}, + traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify}, transaction_validity::{TransactionSource, TransactionValidity}, ApplyExtrinsicResult, MultiSignature, }; + use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; @@ -43,23 +39,36 @@ use sp_version::RuntimeVersion; // A few exports that help ease life for downstream crates. pub use frame_support::{ - construct_runtime, parameter_types, - traits::{KeyOwnerProofSystem, Randomness}, + construct_runtime, match_type, parameter_types, + traits::{Everything, IsInVec, KeyOwnerProofSystem, Randomness}, weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, DispatchClass, IdentityFee, Weight, }, StorageValue, }; +use frame_system::limits::{BlockLength, BlockWeights}; pub use pallet_balances::Call as BalancesCall; pub use pallet_timestamp::Call as TimestampCall; -use pallet_transaction_payment::CurrencyAdapter; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; - -/// An index to a block. -pub type BlockNumber = u32; +pub use sp_runtime::{MultiAddress, Perbill, Permill}; + +// Polkadot Imports +use pallet_xcm::XcmPassthrough; +use polkadot_parachain::primitives::Sibling; + +// XCM Imports +use xcm::v0::{BodyId, Junction::*, MultiLocation, MultiLocation::*, NetworkId}; +use xcm_builder::{ + AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter, + EnsureXcmOrigin, FixedWeightBounds, IsConcrete, LocationInverter, NativeAsset, + ParentAsSuperuser, ParentIsDefault, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, +}; +use xcm_executor::{Config, XcmExecutor}; /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. pub type Signature = MultiSignature; @@ -77,27 +86,70 @@ pub type Index = u32; /// A hash of some data used by the chain. pub type Hash = sp_core::H256; +/// An index to a block. +pub type BlockNumber = u32; + +/// The address format for describing accounts. +pub type Address = 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; + +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; + +/// Unchecked extrinsic type as expected by this runtime. +pub type CheckedExtrinsic = generic::CheckedExtrinsic; + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPallets, +>; + /// Opaque types. These are used by the CLI to instantiate machinery that don't need to know /// the specifics of the runtime. They can then be made to be agnostic over specific formats /// of data like extrinsics, allowing for them to continue syncing the network through upgrades /// to even the core data structures. pub mod opaque { use super::*; + use sp_runtime::{generic, traits::BlakeTwo256}; pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; - /// Opaque block header type. pub type Header = generic::Header; /// Opaque block type. pub type Block = generic::Block; /// Opaque block identifier type. pub type BlockId = generic::BlockId; +} - impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - pub grandpa: Grandpa, - } +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, } } @@ -122,7 +174,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { /// up by `pallet_aura` to implement `fn slot_duration()`. /// /// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 6000; +pub const MILLISECS_PER_BLOCK: u64 = 12000; // NOTE: Currently it is not possible to change the slot duration after the chain has started. // Attempting to do so will brick block production. @@ -133,20 +185,22 @@ pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); pub const HOURS: BlockNumber = MINUTES * 60; pub const DAYS: BlockNumber = HOURS * 24; -// Money -pub const MILLICENTS: Balance = 1_000_000_000; -pub const CENTS: Balance = 1_000 * MILLICENTS; -pub const DOLLARS: Balance = 100 * CENTS; -pub const CANS: Balance = CENTS; - // Prints debug output of the `contracts` pallet to stdout if the node is // started with `-lruntime::contracts=debug`. pub const CONTRACTS_DEBUG_OUTPUT: bool = true; const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 15 * CENTS + (bytes as Balance) * 6 * CENTS + items as Balance * 15 * UNIT + (bytes as Balance) * 6 * UNIT } +// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. +pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); + +// Unit = the base number of indivisible units for balances +pub const UNIT: Balance = 1_000_000_000_000; +pub const MILLIUNIT: Balance = 1_000_000_000; +pub const MICROUNIT: Balance = 1_000_000; + /// The version information used to identify this runtime when compiled natively. #[cfg(feature = "std")] pub fn native_version() -> NativeVersion { @@ -158,15 +212,15 @@ pub fn native_version() -> NativeVersion { 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. +/// by `Operational` extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for 2 seconds of compute with a 6 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = 2 * WEIGHT_PER_SECOND; +/// We allow for 0.5 of a second of compute with a 12 second average block time. +const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND / 2; parameter_types! { + pub const BlockHashCount: BlockNumber = 250; pub const Version: RuntimeVersion = VERSION; - pub const BlockHashCount: BlockNumber = 2400; // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the @@ -198,12 +252,6 @@ parameter_types! { // Configure FRAME pallets to include in runtime. impl frame_system::Config for Runtime { - /// The basic call filter to use in dispatchable. - type BaseCallFilter = frame_support::traits::Everything; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; /// The identifier used to distinguish between accounts. type AccountId = AccountId; /// The aggregated dispatch type that is available for extrinsics. @@ -226,52 +274,30 @@ impl frame_system::Config for Runtime { type Origin = Origin; /// Maximum number of block number to block hash mappings to keep (oldest pruned first). type BlockHashCount = BlockHashCount; - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// Version of the runtime. + /// Runtime version. type Version = Version; - /// Converts a module to the index of the module in `construct_runtime!`. - /// - /// This type is being generated by `construct_runtime!`. + /// Converts a module to an index of this module in the runtime. type PalletInfo = PalletInfo; + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData; /// What to do if a new account is created. type OnNewAccount = (); /// What to do if an account is fully reaped from the system. type OnKilledAccount = (); - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; + /// The weight of database operations that the runtime can invoke. + type DbWeight = RocksDbWeight; + /// The basic call filter to use in dispatchable. + type BaseCallFilter = Everything; /// Weight information for the extrinsics of this pallet. type SystemWeightInfo = (); + /// Block & extrinsics weights: base values and limits. + type BlockWeights = RuntimeBlockWeights; + /// The maximum length of a block (in bytes). + type BlockLength = RuntimeBlockLength; /// This is used as an identifier of the chain. 42 is the generic substrate prefix. type SS58Prefix = SS58Prefix; - /// The set code logic, just the default since we're not a parachain. - type OnSetCode = (); -} - -impl pallet_randomness_collective_flip::Config for Runtime {} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); -} - -impl pallet_grandpa::Config for Runtime { - type Event = Event; - type Call = Call; - - type KeyOwnerProofSystem = (); - - type KeyOwnerProof = - >::Proof; - - type KeyOwnerIdentification = >::IdentificationTuple; - - type HandleEquivocation = (); - - type WeightInfo = (); + /// The action to take on a Runtime Upgrade + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; } parameter_types! { @@ -281,20 +307,21 @@ parameter_types! { impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; - type OnTimestampSet = Aura; + type OnTimestampSet = (); type MinimumPeriod = MinimumPeriod; type WeightInfo = (); } parameter_types! { - pub const ExistentialDeposit: u128 = 500; + pub const ExistentialDeposit: u128 = 1 * MILLIUNIT; + pub const TransferFee: u128 = 1 * MILLIUNIT; + pub const CreationFee: u128 = 1 * MILLIUNIT; + pub const TransactionByteFee: u128 = 1 * MICROUNIT; pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; } impl pallet_balances::Config for Runtime { - type MaxLocks = MaxLocks; - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; /// The type for recording an account's balance. type Balance = Balance; /// The ubiquitous event type. @@ -303,31 +330,42 @@ impl pallet_balances::Config for Runtime { type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type WeightInfo = pallet_balances::weights::SubstrateWeight; -} - -parameter_types! { - /// 1 CAN = 1 Megabyte - pub const TransactionByteFee: Balance = CANS / (1024 * 1024); + type MaxLocks = MaxLocks; + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; } impl pallet_transaction_payment::Config for Runtime { - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; type TransactionByteFee = TransactionByteFee; type WeightToFee = IdentityFee; type FeeMultiplierUpdate = (); } +impl pallet_randomness_collective_flip::Config for Runtime {} + +impl pallet_sudo::Config for Runtime { + type Call = Call; + type Event = Event; +} + parameter_types! { pub TombstoneDeposit: Balance = deposit( 1, >::contract_info_size(), ); - pub DepositPerContract: Balance = TombstoneDeposit::get(); - pub const DepositPerStorageByte: Balance = deposit(0, 1); - pub const DepositPerStorageItem: Balance = deposit(1, 0); - pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS); - pub const SurchargeReward: Balance = 150 * MILLICENTS; - pub const SignedClaimHandicap: u32 = 2; + + // NOTE: These are all set to `0` since we're planning on getting rid + // of state-rent with an upcoming Substrate release. + // + // See: https://github.com/paritytech/substrate/pull/9669 + pub DepositPerContract: Balance = 0; + pub const DepositPerStorageByte: Balance = 0; + pub const DepositPerStorageItem: Balance = 0; + pub const RentFraction: Perbill = Perbill::zero(); + pub const SurchargeReward: Balance = 0; + pub const SignedClaimHandicap: u32 = 0; + // The lazy deletion runs inside on_initialize. pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO * RuntimeBlockWeights::get().max_block; @@ -370,57 +408,198 @@ impl pallet_contracts::Config for Runtime { type CallStack = [pallet_contracts::Frame; 31]; } -impl pallet_sudo::Config for Runtime { +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { type Event = Event; + type OnValidationData = (); + type SelfParaId = parachain_info::Pallet; + type OutboundXcmpMessageSource = XcmpQueue; + type DmpMessageHandler = DmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + pub const RelayLocation: MultiLocation = X1(Parent); + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + pub RelayChainOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into(); + pub Ancestry: MultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsDefault, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting assets on this chain. +pub type LocalAssetTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = 1_000_000; + // One UNIT buys 1 second of weight. + pub const WeightPrice: (MultiLocation, u128) = (X1(Parent), UNIT); +} + +match_type! { + pub type ParentOrParentsUnitPlurality: impl Contains = { + X1(Parent) | X2(Parent, Plurality { id: BodyId::Unit, .. }) + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + AllowUnpaidExecutionFrom, + // ^^^ Parent & its unit plurality gets free execution +); + +pub struct XcmConfig; +impl Config for XcmConfig { type Call = Call; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = NativeAsset; + type IsTeleporter = (); // Teleporting is disabled. + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = UsingComponents, RelayLocation, AccountId, Balances, ()>; + type ResponseHandler = (); // Don't handle responses for now. +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = SignedToAccountId32; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +impl pallet_xcm::Config for Runtime { + type Event = Event; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Everything; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = (); + type Weigher = FixedWeightBounds; + type LocationInverter = LocationInverter; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type Event = Event; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); } // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime where Block = Block, - NodeBlock = opaque::Block, - UncheckedExtrinsic = UncheckedExtrinsic + NodeBlock = generic::Block, + UncheckedExtrinsic = UncheckedExtrinsic, { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage}, + System: frame_system::{Pallet, Call, Storage, Config, Event}, Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, - Aura: pallet_aura::{Pallet, Config}, - Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event}, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + Sudo: pallet_sudo::{Pallet, Call, Storage, Config, Event}, + RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage}, TransactionPayment: pallet_transaction_payment::{Pallet, Storage}, - Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event}, + + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned} = 20, + + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21, + + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 30, + + Aura: pallet_aura::{Pallet, Config}, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Config}, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 50, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin} = 51, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event, Origin} = 52, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 53, + Contracts: pallet_contracts::{Pallet, Call, Storage, Event}, } ); -/// 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; -/// 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; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPallets, ->; - impl_runtime_apis! { impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { @@ -479,55 +658,31 @@ impl_runtime_apis! { } } - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities() - } - } - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - opaque::SessionKeys::generate(seed) - } - fn decode_session_keys( encoded: Vec, ) -> Option, KeyTypeId)>> { - opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + SessionKeys::decode_into_raw_public_keys(&encoded) } - } - impl fg_primitives::GrandpaApi for Runtime { - fn grandpa_authorities() -> GrandpaAuthorityList { - Grandpa::grandpa_authorities() + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) } + } - fn current_set_id() -> fg_primitives::SetId { - Grandpa::current_set_id() + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) } - fn submit_report_equivocation_unsigned_extrinsic( - _equivocation_proof: fg_primitives::EquivocationProof< - ::Hash, - NumberFor, - >, - _key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof, - ) -> Option<()> { - None + fn authorities() -> Vec { + Aura::authorities() } + } - fn generate_key_ownership_proof( - _set_id: fg_primitives::SetId, - _authority_id: GrandpaId, - ) -> Option { - // NOTE: this is the only implementation possible since we've - // defined our key owner proof type as a bottom type (i.e. a type - // with no values). - None + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info() -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info() } } @@ -537,7 +692,7 @@ impl_runtime_apis! { } } - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { fn query_info( uxt: ::Extrinsic, len: u32, @@ -590,4 +745,68 @@ impl_runtime_apis! { Contracts::rent_projection(address) } } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, add_benchmark, TrackedStorageKey}; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!(params, batches, pallet_balances, Balances); + add_benchmark!(params, batches, pallet_timestamp, Timestamp); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } +} + +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, +);