diff --git a/Makefile b/Makefile index a9c89e8..9b93813 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,10 @@ all: build test build: cd scripts/helloworld && cargo build --release && chisel run --config chisel.toml cd scripts/bazaar && cargo build --release && chisel run --config chisel.toml + cd scripts/smpt && cargo build --release && chisel run --config chisel.toml cargo build --release test: target/release/phase2-scout target/release/phase2-scout bazaar.yaml + target/release/phase2-scout smpt.yaml diff --git a/circle.yml b/circle.yml index 2797f10..4830991 100644 --- a/circle.yml +++ b/circle.yml @@ -6,6 +6,14 @@ jobs: - image: rust:1 steps: - checkout + - run: + name: Install dependencies + command: | + echo "deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch main" >> /etc/apt/sources.list + echo "deb-src http://apt.llvm.org/stretch/ llvm-toolchain-stretch main" >> /etc/apt/sources.list + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - + apt-get update + apt-get install -y clang lldb lld - run: name: Update environment command: | diff --git a/scripts/smpt/.cargo/config b/scripts/smpt/.cargo/config new file mode 100644 index 0000000..435ed75 --- /dev/null +++ b/scripts/smpt/.cargo/config @@ -0,0 +1,2 @@ +[build] +target = "wasm32-unknown-unknown" \ No newline at end of file diff --git a/scripts/smpt/.gitignore b/scripts/smpt/.gitignore new file mode 100644 index 0000000..a602731 --- /dev/null +++ b/scripts/smpt/.gitignore @@ -0,0 +1 @@ +smpt.yaml diff --git a/scripts/smpt/Cargo.toml b/scripts/smpt/Cargo.toml new file mode 100644 index 0000000..ca22b59 --- /dev/null +++ b/scripts/smpt/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "smpt" +version = "0.0.0" +license = "Apache-2.0" +repository = "https://github.com/ewasm/scout" +description = "Stateless merkle patricia balance tree" +publish = false +edition = "2018" + +[dependencies] +patricia-trie-ethereum = "0.1.0" +hash-db = "0.12.4" +trie-db = "0.12.4" +keccak-hasher = "0.12.4" +kvdb = "0.1" +memory-db = "0.12.4" +rlp = "0.4.0" +elastic-array = "0.10" +ethereum-types = "0.6.0" +tiny-keccak = "1.4.2" +plain_hasher = "0.2" +libsecp256k1 = "0.2.2" + +[lib] +crate-type = ["cdylib"] + +[dependencies.ewasm_api] +version = "0.10.0" +default-features = false +features = ["std", "eth2", "wee_alloc", "debug"] + +[profile.release] +lto = true +debug = false diff --git a/scripts/smpt/Makefile b/scripts/smpt/Makefile new file mode 100644 index 0000000..95313c1 --- /dev/null +++ b/scripts/smpt/Makefile @@ -0,0 +1,9 @@ +all: build test + +build: + cargo build --release + chisel run --config chisel.toml; true + +test: + node relayer/index.js + ../../target/release/phase2-scout smpt.yaml diff --git a/scripts/smpt/chisel.toml b/scripts/smpt/chisel.toml new file mode 100644 index 0000000..1977a1e --- /dev/null +++ b/scripts/smpt/chisel.toml @@ -0,0 +1,8 @@ +smpt: + file: "target/wasm32-unknown-unknown/release/smpt.wasm" + trimexports: + preset: "ewasm" + verifyexports: + preset: "ewasm" + repack: + preset: "ewasm" diff --git a/scripts/smpt/relayer/.gitignore b/scripts/smpt/relayer/.gitignore new file mode 100644 index 0000000..7a7b33a --- /dev/null +++ b/scripts/smpt/relayer/.gitignore @@ -0,0 +1,2 @@ +package-lock.json +node_modules diff --git a/scripts/smpt/relayer/index.js b/scripts/smpt/relayer/index.js new file mode 100644 index 0000000..0fb05ae --- /dev/null +++ b/scripts/smpt/relayer/index.js @@ -0,0 +1,147 @@ +const assert = require('assert') +const { promisify } = require('util') +const BN = require('bn.js') +const Trie = require('merkle-patricia-tree') +const Account = require('ethereumjs-account').default +const StateManager = require('ethereumjs-vm/dist/state/stateManager').default +const PStateManager = require('ethereumjs-vm/dist/state/promisified').default +const { keccak256, ecsign, stripZeros } = require('ethereumjs-util') +const { encode } = require('rlp') +const Wallet = require('ethereumjs-wallet') +const yaml = require('js-yaml') +const fs = require('fs') + +const prove = promisify(Trie.prove) +const verifyProof = promisify(Trie.verifyProof) + +async function main () { + const testSuite = { + 'beacon_state': { + 'execution_scripts': [ + 'target/wasm32-unknown-unknown/release/smpt.wasm' + ], + }, + 'shard_pre_state': { + 'exec_env_states': [ + ] + }, + 'shard_blocks': [ + ], + 'shard_post_state': { + 'exec_env_states': [ + ] + } + } + + const rawState = new StateManager() + const state = new PStateManager(rawState) + + // Generate random accounts + let accounts = await generateAccounts(state, 5000) + + let root = await state.getStateRoot() + testSuite.shard_pre_state.exec_env_states.push(root.toString('hex')) + + // Generate txes + let [txes, proofNodes, simulationData] = await generateTxes(state, accounts, 70) + + // Serialize witnesses and tx data + const blockData = encode([txes, proofNodes]) + console.log(`block data length: ${blockData.length}`) + testSuite.shard_blocks.push({ + 'env': 0, + 'data': blockData.toString('hex') + }) + + // Apply txes on top of trie to compute post state root + for (tx of simulationData) { + await transfer(state, tx) + } + + root = await state.getStateRoot() + testSuite.shard_post_state.exec_env_states.push(root.toString('hex')) + + const serializedTestSuite = yaml.safeDump(testSuite) + fs.writeFileSync('smpt.yaml', serializedTestSuite) +} + +async function generateTxes (state, accounts, count=50) { + let txes = [] + let simulationData = [] + let proofNodes = {} + const root = await state.getStateRoot() + let totalNodes = 0 + for (let i = 0; i < count; i++) { + const from = accounts[i].address + const to = accounts[i + 1].address + const value = new BN('00000000000000000000000000000000000000000000000000000000000000ff', 16) + const nonce = new BN('0000000000000000000000000000000000000000000000000000000000000000', 16) + simulationData.push({ from, to, value, nonce }) + + const fromAccount = await state.getAccount(from) + const fromWitness = await prove(state._wrapped._trie, keccak256(from)) + let val = await verifyProof(root, keccak256(from), fromWitness) + assert(val.equals(fromAccount.serialize()), "valid from witness") + for (item of fromWitness) { + totalNodes++ + proofNodes[keccak256(item).toString('hex')] = item + } + + const toAccount = await state.getAccount(to) + const toWitness = await prove(state._wrapped._trie, keccak256(to)) + val = await verifyProof(root, keccak256(to), toWitness) + assert(val.equals(toAccount.serialize()), "valid to witness") + for (item of toWitness) { + totalNodes++ + proofNodes[keccak256(item).toString('hex')] = item + } + + const txRlp = encode([to, stripZeros(value.toBuffer('be', 32)), stripZeros(nonce.toBuffer('be', 32))]) + const txHash = keccak256(txRlp) + const txSig = ecsign(txHash, accounts[i].privateKey) + + txes.push([to, stripZeros(value.toBuffer('be', 32)), stripZeros(nonce.toBuffer('be', 32)), [stripZeros(txSig.r), stripZeros(txSig.s), txSig.v]]) + } + console.log(`Deduplicated ${totalNodes} proof nodes ${Object.values(proofNodes).length}`) + return [txes, Object.values(proofNodes), simulationData] +} + +async function transfer (state, tx) { + let { from, to, value, nonce } = tx + assert(value.gten(0)) + + const fromAcc = await state.getAccount(from) + const toAcc = await state.getAccount(to) + + assert(new BN(fromAcc.balance).gte(value)) + assert(new BN(fromAcc.nonce).eq(nonce)) + + const newFromBalance = new BN(fromAcc.balance).sub(value) + fromAcc.balance = newFromBalance.toBuffer() + fromAcc.nonce = nonce.addn(1).toBuffer() + const newToBalance = new BN(toAcc.balance).add(value) + toAcc.balance = newToBalance.toBuffer() + + await state.putAccount(from, fromAcc) + await state.putAccount(to, toAcc) +} + +async function generateAccounts (state, count=500) { + let accounts = [] + for (let i = 0; i < count; i++) { + let wallet = Wallet.generate() + let address = wallet.getAddress() + let privateKey = wallet.getPrivateKey() + let account = new Account() + account.balance = new BN('ffffff', 16).toBuffer() + accounts.push({ + address, + privateKey, + account + }) + await state.putAccount(address, account) + } + return accounts +} + +main().then(() => {}).catch((e) => console.log(e)) diff --git a/scripts/smpt/relayer/package.json b/scripts/smpt/relayer/package.json new file mode 100644 index 0000000..4372e44 --- /dev/null +++ b/scripts/smpt/relayer/package.json @@ -0,0 +1,21 @@ +{ + "name": "mpt", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-account": "^3.0.0", + "ethereumjs-util": "^6.1.0", + "ethereumjs-vm": "^4.0.0-beta.1", + "ethereumjs-wallet": "^0.6.3", + "js-yaml": "^3.13.1", + "merkle-patricia-tree": "^3.0.0", + "rlp": "^2.2.3" + } +} diff --git a/scripts/smpt/src/account.rs b/scripts/smpt/src/account.rs new file mode 100644 index 0000000..0535f94 --- /dev/null +++ b/scripts/smpt/src/account.rs @@ -0,0 +1,35 @@ +use ethereum_types::{H256, U256}; +use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct BasicAccount { + pub nonce: U256, + pub balance: U256, + pub storage_root: H256, + pub code_hash: H256, +} + +impl Decodable for BasicAccount { + fn decode(d: &Rlp) -> Result { + if d.item_count()? != 4 { + return Err(DecoderError::RlpIncorrectListLen); + } + + Ok(BasicAccount { + nonce: d.val_at(0)?, + balance: d.val_at(1)?, + storage_root: d.val_at(2)?, + code_hash: d.val_at(3)?, + }) + } +} + +impl Encodable for BasicAccount { + fn rlp_append(&self, s: &mut RlpStream) { + s.begin_list(4); + s.append(&self.nonce); + s.append(&self.balance); + s.append(&self.storage_root); + s.append(&self.code_hash); + } +} diff --git a/scripts/smpt/src/keccak_hasher.rs b/scripts/smpt/src/keccak_hasher.rs new file mode 100644 index 0000000..fc67d36 --- /dev/null +++ b/scripts/smpt/src/keccak_hasher.rs @@ -0,0 +1,41 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum 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. + +// Parity Ethereum 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 Parity Ethereum. If not, see . + +//! Hasher implementation for the Keccak-256 hash +//! Taken from: +//! https://github.com/paritytech/parity-ethereum/blob/6bb106a784678cc2cadabfd621981371f477c48d/util/keccak-hasher/src/lib.rs +extern crate ethereum_types; +extern crate hash_db; +extern crate plain_hasher; +extern crate tiny_keccak; + +use ethereum_types::H256; +use hash_db::Hasher; +use plain_hasher::PlainHasher; +use tiny_keccak::Keccak; +/// Concrete `Hasher` impl for the Keccak-256 hash +#[derive(Default, Debug, Clone, PartialEq)] +pub struct KeccakHasher; +impl Hasher for KeccakHasher { + type Out = H256; + type StdHasher = PlainHasher; + const LENGTH: usize = 32; + fn hash(x: &[u8]) -> Self::Out { + let mut out = [0; 32]; + Keccak::keccak256(x, &mut out); + out.into() + } +} diff --git a/scripts/smpt/src/lib.rs b/scripts/smpt/src/lib.rs new file mode 100644 index 0000000..08938b6 --- /dev/null +++ b/scripts/smpt/src/lib.rs @@ -0,0 +1,114 @@ +extern crate ethereum_types; +extern crate ewasm_api; +extern crate hash_db; +extern crate memory_db; +extern crate patricia_trie_ethereum as ethtrie; +extern crate secp256k1; +extern crate trie_db as trie; + +mod account; +mod keccak_hasher; +mod rlp_node_codec; +mod sig; +mod tx; + +use crate::keccak_hasher::KeccakHasher; +use account::BasicAccount; +use ethereum_types::{H256, U256}; +use ewasm_api::prelude::*; +use hash_db::{HashDB, EMPTY_PREFIX}; +use kvdb::DBValue; +use memory_db::*; +use rlp::{DecoderError, Rlp}; +use rlp_node_codec::RlpNodeCodec; +use sig::recover_address; +use tiny_keccak::keccak256; +use trie::TrieMut; +use tx::{Tx, UnsignedTx}; + +type RlpCodec = RlpNodeCodec; +type SecTrieDBMut<'db> = trie::SecTrieDBMut<'db, KeccakHasher, RlpCodec>; + +#[derive(Debug, Clone, PartialEq, Eq)] +struct BlockData { + txes: Vec, + proof_nodes: Vec>, +} + +impl rlp::Decodable for BlockData { + fn decode(d: &Rlp) -> Result { + if d.item_count()? != 2 { + return Err(DecoderError::RlpIncorrectListLen); + } + + Ok(BlockData { + txes: d.list_at(0)?, + proof_nodes: d.list_at(1)?, + }) + } +} + +fn process_block(pre_state_root: Bytes32, block_data_bytes: &[u8]) -> Bytes32 { + let block_data: BlockData = rlp::decode(&block_data_bytes).unwrap(); + + // Construct trie from merkle proofs + let mut db = MemoryDB::, DBValue>::from_null_node( + &rlp::NULL_RLP, + rlp::NULL_RLP.as_ref().into(), + ); + + // Insert proof values to trie's underlying db + for item in block_data.proof_nodes { + db.insert(EMPTY_PREFIX, item.as_slice()); + } + + let mut root = H256::from_slice(&pre_state_root.bytes[..]); + let mut trie = SecTrieDBMut::from_existing(&mut db, &mut root).unwrap(); + + for tx in block_data.txes { + // Recover sender from signature + let tx_rlp = rlp::encode(&UnsignedTx { + to: tx.to, + value: tx.value, + nonce: tx.nonce, + }); + let tx_hash = keccak256(&tx_rlp); + let from_address = recover_address(&tx.sig, tx_hash); + + // Make sure trie contains `from` and `to` + assert!(trie.contains(from_address.as_bytes()).unwrap()); + assert!(trie.contains(tx.to.as_bytes()).unwrap()); + + // Fetch `from` and `to` accounts from trie + let from_account_bytes = trie.get(from_address.as_bytes()).unwrap().unwrap(); + let mut from_account = rlp::decode::(&from_account_bytes).unwrap(); + let to_account_bytes = trie.get(tx.to.as_bytes()).unwrap().unwrap(); + let mut to_account = rlp::decode::(&to_account_bytes).unwrap(); + + // Pre transfer checks + assert!(from_account.nonce == tx.nonce); + assert!(from_account.balance >= tx.value); + + // Increment sender's nonce and update balances + from_account.nonce += U256::from(1); + from_account.balance -= tx.value; + to_account.balance += tx.value; + + // Update trie with new balances and nonces + let from_encoded = rlp::encode(&from_account); + let to_encoded = rlp::encode(&to_account); + trie.insert(from_address.as_bytes(), &from_encoded).unwrap(); + trie.insert(tx.to.as_bytes(), &to_encoded).unwrap(); + } + + Bytes32::from(trie.root().as_fixed_bytes()) +} + +#[cfg(not(test))] +#[no_mangle] +pub extern "C" fn main() { + let pre_state_root = eth2::load_pre_state_root(); + let block_data = eth2::acquire_block_data(); + let post_state_root = process_block(pre_state_root, &block_data); + eth2::save_post_state_root(&post_state_root) +} diff --git a/scripts/smpt/src/rlp_node_codec.rs b/scripts/smpt/src/rlp_node_codec.rs new file mode 100644 index 0000000..d8a0243 --- /dev/null +++ b/scripts/smpt/src/rlp_node_codec.rs @@ -0,0 +1,152 @@ +// Copyright 2015-2019 Parity Technologies (UK) Ltd. +// This file is part of Parity Ethereum. + +// Parity Ethereum 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. + +// Parity Ethereum 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 Parity Ethereum. If not, see . + +//! `NodeCodec` implementation for Rlp +//! Taken from: +//! https://github.com/paritytech/parity-ethereum/blob/6bb106a784678cc2cadabfd621981371f477c48d/util/patricia-trie-ethereum/src/rlp_node_codec.rs + +use crate::keccak_hasher::KeccakHasher; +use elastic_array::ElasticArray128; +use ethereum_types::H256; +use hash_db::Hasher; +use rlp::{DecoderError, Prototype, Rlp, RlpStream}; +use std::marker::PhantomData; +use trie::{node::Node, ChildReference, NibbleSlice, NodeCodec}; + +/// Concrete implementation of a `NodeCodec` with Rlp encoding, generic over the `Hasher` +#[derive(Default, Clone)] +pub struct RlpNodeCodec { + mark: PhantomData, +} + +const HASHED_NULL_NODE_BYTES: [u8; 32] = [ + 0x56, 0xe8, 0x1f, 0x17, 0x1b, 0xcc, 0x55, 0xa6, 0xff, 0x83, 0x45, 0xe6, 0x92, 0xc0, 0xf8, 0x6e, + 0x5b, 0x48, 0xe0, 0x1b, 0x99, 0x6c, 0xad, 0xc0, 0x01, 0x62, 0x2f, 0xb5, 0xe3, 0x63, 0xb4, 0x21, +]; +const HASHED_NULL_NODE: H256 = H256(HASHED_NULL_NODE_BYTES); +// NOTE: what we'd really like here is: +// `impl NodeCodec for RlpNodeCodec where H::Out: Decodable` +// but due to the current limitations of Rust const evaluation we can't +// do `const HASHED_NULL_NODE: H::Out = H::Out( … … )`. Perhaps one day soon? +impl NodeCodec for RlpNodeCodec { + type Error = DecoderError; + fn hashed_null_node() -> ::Out { + HASHED_NULL_NODE + } + fn decode(data: &[u8]) -> ::std::result::Result { + let r = Rlp::new(data); + match r.prototype()? { + // either leaf or extension - decode first item with NibbleSlice::??? + // and use is_leaf return to figure out which. + // if leaf, second item is a value (is_data()) + // if extension, second item is a node (either SHA3 to be looked up and + // fed back into this function or inline RLP which can be fed back into this function). + Prototype::List(2) => match NibbleSlice::from_encoded(r.at(0)?.data()?) { + (slice, true) => Ok(Node::Leaf(slice, r.at(1)?.data()?)), + (slice, false) => Ok(Node::Extension(slice, r.at(1)?.as_raw())), + }, + // branch - first 16 are nodes, 17th is a value (or empty). + Prototype::List(17) => { + let mut nodes = [None as Option<&[u8]>; 16]; + for i in 0..16 { + let v = r.at(i)?; + if v.is_empty() { + nodes[i] = None; + } else { + nodes[i] = Some(v.as_raw()); + } + } + Ok(Node::Branch( + nodes, + if r.at(16)?.is_empty() { + None + } else { + Some(r.at(16)?.data()?) + }, + )) + } + // an empty branch index. + Prototype::Data(0) => Ok(Node::Empty), + // something went wrong. + _ => Err(DecoderError::Custom("Rlp is not valid.")), + } + } + fn try_decode_hash(data: &[u8]) -> Option<::Out> { + let r = Rlp::new(data); + if r.is_data() && r.size() == KeccakHasher::LENGTH { + Some(r.as_val().expect("Hash is the correct size; qed")) + } else { + None + } + } + fn is_empty_node(data: &[u8]) -> bool { + Rlp::new(data).is_empty() + } + fn empty_node() -> Vec { + let mut stream = RlpStream::new(); + stream.append_empty_data(); + stream.drain() + } + + fn leaf_node(partial: &[u8], value: &[u8]) -> Vec { + let mut stream = RlpStream::new_list(2); + stream.append(&partial); + stream.append(&value); + stream.drain() + } + + fn ext_node( + partial: &[u8], + child_ref: ChildReference<::Out>, + ) -> Vec { + let mut stream = RlpStream::new_list(2); + stream.append(&partial); + match child_ref { + ChildReference::Hash(h) => stream.append(&h), + ChildReference::Inline(inline_data, len) => { + let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; + stream.append_raw(bytes, 1) + } + }; + stream.drain() + } + + // fn branch_node(children: I, value: Option>) -> Vec + fn branch_node(children: I, value: Option>) -> Vec + where + I: IntoIterator::Out>>>, + { + let mut stream = RlpStream::new_list(17); + for child_ref in children { + match child_ref { + Some(c) => match c { + ChildReference::Hash(h) => stream.append(&h), + ChildReference::Inline(inline_data, len) => { + let bytes = &AsRef::<[u8]>::as_ref(&inline_data)[..len]; + stream.append_raw(bytes, 1) + } + }, + None => stream.append_empty_data(), + }; + } + if let Some(value) = value { + stream.append(&&*value); + } else { + stream.append_empty_data(); + } + stream.drain() + } +} diff --git a/scripts/smpt/src/sig.rs b/scripts/smpt/src/sig.rs new file mode 100644 index 0000000..7109750 --- /dev/null +++ b/scripts/smpt/src/sig.rs @@ -0,0 +1,41 @@ +use ethereum_types::{Address, U256}; +use rlp::{DecoderError, Rlp}; +use secp256k1::{recover, Message, RecoveryId, Signature}; +use tiny_keccak::keccak256; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Sig { + pub r: U256, + pub s: U256, + pub v: u8, +} + +impl rlp::Decodable for Sig { + fn decode(d: &Rlp) -> Result { + if d.item_count()? != 3 { + return Err(DecoderError::RlpIncorrectListLen); + } + + Ok(Sig { + r: d.val_at(0)?, + s: d.val_at(1)?, + v: d.val_at(2)?, + }) + } +} + +pub fn recover_address(signature: &Sig, message: [u8; 32]) -> Address { + let mut s = [0u8; 64]; + (&mut s[..32]).copy_from_slice(&Into::<[u8; 32]>::into(signature.r)[..32]); + (&mut s[32..64]).copy_from_slice(&Into::<[u8; 32]>::into(signature.s)[..32]); + + let message = Message::parse(&message); + let rec_id = RecoveryId::parse(signature.v - 27).unwrap(); + let sig = Signature::parse(&s); + + let key = recover(&message, &sig, &rec_id).unwrap(); + let ret = key.serialize(); + let ret = keccak256(&ret[1..65]); + + Address::from_slice(&ret[12..32]) +} diff --git a/scripts/smpt/src/tx.rs b/scripts/smpt/src/tx.rs new file mode 100644 index 0000000..fa67d2b --- /dev/null +++ b/scripts/smpt/src/tx.rs @@ -0,0 +1,42 @@ +use crate::sig::Sig; +use ethereum_types::{Address, U256}; +use rlp::{Decodable, DecoderError, Encodable, Rlp, RlpStream}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Tx { + pub to: Address, + pub value: U256, + pub nonce: U256, + pub sig: Sig, +} + +impl Decodable for Tx { + fn decode(d: &Rlp) -> Result { + if d.item_count()? != 4 { + return Err(DecoderError::RlpIncorrectListLen); + } + + Ok(Tx { + to: d.val_at(0)?, + value: d.val_at(1)?, + nonce: d.val_at(2)?, + sig: d.val_at(3)?, + }) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UnsignedTx { + pub to: Address, + pub value: U256, + pub nonce: U256, +} + +impl Encodable for UnsignedTx { + fn rlp_append(&self, s: &mut RlpStream) { + s.begin_list(3); + s.append(&self.to); + s.append(&self.value); + s.append(&self.nonce); + } +} diff --git a/smpt.yaml b/smpt.yaml new file mode 100644 index 0000000..f364350 --- /dev/null +++ b/smpt.yaml @@ -0,0 +1,13 @@ +beacon_state: + execution_scripts: + - scripts/smpt/target/wasm32-unknown-unknown/release/smpt.wasm +shard_pre_state: + exec_env_states: + - efb6c0fd0b5b9a715b4abfce5cfb9693279af5d80f9b61d2b015064905534d36 +shard_blocks: + - env: 0 + data: >- + f9ceb7f919f9f85d94754491e4674d5172b91cfbb82ddea514b54a1bc381ff80f843a0bfe6f384147102158cf2f86952526a67d332dd1ba200f40eb98fa80c8ffeac22a0527e8f901996257476baea2c5aa78ceb97b58ce6f504155d5df0f89861bbb3761bf85c94e6b179c2eabe5c70dca6ba7aea48a65a8dc84a8481ff80f842a02930702946381d418c55b47a04b7d5a1d90bced985dc02a3412de55324f67d819f9b9dc046bc48e2940092671f34abee23f31c567f4fdc4678bc617b4fc6723a1cf85d948cd33ba98ca7bd2c4ea1b376621e1a20761aa00281ff80f843a0bbf161d401cd36c9d4a8230cb30eba732bdf7fbdf75fd2232afdd3e39efbce6fa01c621fbe59812586073716d5d7eb494c2770ad9f0554e9e570557a53d4f94e7b1bf85d945e6638bf104f831727e7fefca66bc6f8337b830c81ff80f843a0a968727f7ff2757e76b755705555a8513e667d2ae839da967801db3d727820b9a0508159db7dcd6f8ba7a798d6671d83f23209496d5e703e4dc28a7951eccadbde1bf85d94857f0f598e224c5720cb4f8f1d10a1e1bad6e94481ff80f843a01a0038e6d9363a62896dfe665984238a4eef36e1ba109e5d62e4bb35f10c0527a0615ed7d13df09d46ceb3ecd24eb77d64d692bcdb5954a0b1e8fd8dc0251649ec1cf85d94b07058d444f8e9ec163604c30389297042b45af881ff80f843a0c25f49155afbe9c92f1f98cda86eeb9b5b24ff69aa22479c8a8dab4e0310aceba04a87e53187e421502a6e9a49ac09339466ba20a7b9a48db8e77001440bb0a6151cf85d9472d605f793c758db767e3e1db4272b5485b6763081ff80f843a06fc7f136756e18bf145559323a74189dd454dab553c93c9fd6ac6a21bc959f13a0383ceae0ea7dafe5be51856c2abd508a04eb7b03a5b2a068b43ff900e5653e391bf85d94bb093842a31f4f416b9e2a044560fac317d2cf9a81ff80f843a02c6439bf0d1b71124b898709cf6a0a3e7d167d9ea70336599d98a4f0b2d5863ba04263d3299eaa995ca2f4116c927308a91ba89028be75db3888fc48b1702495121bf85d94a2f8154edf47bdc6f3e78bb49a0746b44822cc9e81ff80f843a0067f47e65d89dce6201ea1c3f34c8e5982b5bb0df067057260d5ecc70cfd2ed5a001d56247ec14bc3ab50b26831733b392fb1c2a827026135d3228efe09efea7991bf85d94759707486ab459dbfdcc6a5f23762be0b7b648d481ff80f843a0e5b34a48db5775cbac1c86b8459693749a5cf22429a1899b775668d60826081aa008e359dd6a8ebe820150dd70fbe4a5efef6b34ccb5dfb8389bf9df18186cf3031cf85d94ddb3f3406d15626a8452e0bf00945f55208ff5eb81ff80f843a0a03de54f8d1741e651398b4603e4190a004c7cc359b9dacae2d5a71b298a024aa0324cb5ce55c388da8da5cff894430f8c019173b16eb3611e6aba0e37a514c0f61bf85d9457f7dd8316a08dc27b899bf8f6cfb305a88b5e0b81ff80f843a05ab481c83a84f5eecb529b928aeedfcb732f84fb5496e96ec6d8375f80c3acb4a0131ad7ec1720a382706c2623b34a867378f7ab411836ef4c8dda20ca85148ed51cf85d942f2da852b3f4ba4b23f7592ed824d791fc165d9281ff80f843a06bc3e553fbc0944475654cfb2c154aa5fcc09218be262d7ef6aa7fda5934635fa06fda8109b7874cd59822bffbabe18ac33e3312278c66512eea721939b0be85711cf85d94cbfd84dc9d632248551a7e5869ffeeb2ec5a82ae81ff80f843a06780fc68e4ac04ac8d18dbf86ff2a38f811984761a6f927409dc455eab057380a07b2f8358679248afd62425d5c9fea25a48fcb69cf59d8bd465c9fcaaa5fe0e051cf85d940dfd0829e74e7b256babde4a0b8e75c42d2d653b81ff80f843a00766e7d329c2b4be94aced1cc478b710c019ee0d12e84d21ea1e430ed5bb846fa0653b43c569085962a67f512f59135bcc4b158a43463632a5a34eac00913e66b71cf85d947a9f2c3df0895edeacbac33b5973295554ad3f6d81ff80f843a03cace3f51d643fac67936bd2d59e4908ea2bda412643207d5976d8597977a995a045f61afe96cec469568e0ee02b7ab1cb6f907a1dbbd40a5177d5c183b745a86e1cf85d947ec800c43972d7a73736f077bc7a0ab6d37312d681ff80f843a017a090682a0c04b0e996945041353ce8ece26966b47b95adc5fd23808fc25bb7a0213b33b28b4d3dcb16a568febea62e820dcc6f01dff2b806cd1a5bca424060be1bf85d944938ca35094cba2c042b8ca8a1c0f7ff1b08078681ff80f843a0d1ef6128a7404c085a1567dd2c53f4ff4e6fc9d3413d9e108d10335f65fa91f6a03f667bb0e96c451bfe5e2ae95fe13822efa755b507f397bb735ea41b3ac13a361cf85d948a496f8d4218190509b9d6f2947974ddb24b36ab81ff80f843a0e89445313097b6ef201be77f005028a5df12ef7eb175f916bef279f4009cc0c4a04e435af57407361ad70931185b1d7d6261ed84a2f2a2bd56cfdf5e90af7247511cf85d943f7d02c574eee4caaf423142757b513ddbbf927081ff80f843a0b332e908f31ffe7c3e267500f5baa92a60ffbe5d4227c388400f1a81be74efe7a03e4cc33d843dd21e29a0156b4be40ab61a7f016ffcf9beae3be3b0f60630d97f1bf85d94e87c900c7b958eb3e2d1149e6fa121347fd327f681ff80f843a0df1666eaec5a360a374d0894c68ca25b4de172bf6fbdb45e83e3b62bb69f1837a043523620f1c3c551cd3a1fde560d10e7a8b386e9111106025c321401659ba4b91bf85d942ba9793f71e0822f6dc4fc44aa2fc67df2a9ef1681ff80f843a04b5b237ea18f9f4a4fb16d226fc6391cb6c3a44960411b6c8590f7af12b8e22da0312c2dafaa3c3507d18e0bd46db1afc4bf064695040788257d69a6f7d3968d171cf85d94ddfacf3f3f7c7b81c811ded6ea2ca385b7dd42b081ff80f843a068824797f9062dbc6f0fb8d770efcdc17181869b0b77c2f256af4629cca99c35a03c7fca6622efcfc4d478e434464b2dfc49ee11e2ce491807af42afa91afd45b81bf85d9401d328ada37dd437e655c6caefc19e50f8ee343781ff80f843a0b1257cafe49acddead4e5cbe4b3f2873331adc5f01d3f23d86464bbc2d741a72a07e8af80bb5ddf4cc79c9e58ac1f9e1d8e2518f281dd7eb9343682036940429a81bf85d945112f44b3e574027e246157d0b725bad0c4dc9ad81ff80f843a0ebe89cbe5ebd5105666605f322b4af07b6314cacc08de41ce9bbc70dfa8f876aa040e0a5cef1f9079c9f95a11277ee8acae187d405479b59c000abe2c54550041d1cf85d944e1505d37d54a5351e129064f4d20e005a6f676981ff80f843a00ddb2f66c5d95e9d4c677588173e4267e4c25c5fa38198ebf628ae213f4e209da04375ccb61098cefece15f1b20d8b7f1fb69cc4dbaa4a2e09c67fec0410648b751cf85d94ad695d61acc368abff17ba14b24f0720339bb54481ff80f843a0d7244df0aeb0a2cf42e08ee1104dc98cbb946e262d90a7c73ee4ba98cd7ea618a07447fd052465c7e90550db713cf887620ed5d6df76584e4f5eda7fa4c2294b431bf85d94a6c2b9b7cce3c760c5a05604cb5d83c6d3b8609981ff80f843a01f76a3a20c020817c59eb6d9525ad2e292deed494f5c84d71b844b5aaddaab36a04928da969c9339ef4feafc15b5e13d55221e6eda117c95eb05861fa73ed63fbc1cf85d9441d799dd51cf13a2e30ccbd66dd9d9d38b4670a681ff80f843a0e8edb6149eb63c2e3bb69ce15e6ccfff1abaf7bb42fd614bd393cf5c003faabba04cd68a20eb65b650768517ce815602f3a47af0641386acc152fec0d8402560b41bf85d94d3f1d7d701a00af130ff114d46c60e4ddadc715f81ff80f843a03607b5c49ac039b5980ca499e33130de4244c2010173561e71f0024bec98cf2ea043ee2a7db2bc2bb7db0968809d1d4185ea359e30046df81e5fd41404c3ff051e1bf85d9410b5e49b74ee8d619b66ebfa3cd8c38258cdebb881ff80f843a099cc17c042aca410d8ccda6e789e1d36c24b2f19f73cfb3ce765388049872406a0107ffc3e5dcf8b612a4f701a36a2616117625fdee292dc74277c3bcd72a91ae51cf85d94b9c95a3791da54c32338ff772adef3942955f1b281ff80f843a0a94d3e91f46cd7897177a28e3d031e0cbd3033f419375ea216ebcee6b5cf22b3a0618dc31761b48dcbc92c4d5a3a6dbe2fe56a96c97442b1718d90f89fc5192bc11bf85d94b985531ef7682ac20b92d3c51e242fe2a030b68781ff80f843a0c1071261e1b816c4b65fbef614d24056289113fc49d299438344ca9d4fa2484ba0034f658e7a8b56763796cf3735481f1db039f446981038533494c190de9970861cf85d94b750769ea9e28637f3f397dd0cd9f1ac79749dc281ff80f843a06b0fcdbf804e65f269fcb63b28f671b2b69d512f3e7cb7667f2fa085f5e376ada01871e51feaa6fb74231fc6a61c1fc5451628c413e1d86368af206545d6af9b411bf85d94c3196866a82c53579864eed2ef3a60f7136f0ebb81ff80f843a035c6a2573dbfe7728369322947f3a21f31e47dd223903fc80b4182f6e992b81da00497e6ec49ef8491c765e4f19041b2f34ad864eaacdf67493830ea28579e9c971cf85d943ce7be6ff22706fd028fd09c8a267fe228d1d7f581ff80f843a0f36b38bacb9ebc8b33e78492b4882673bdd77227f6b286eb5cccff4ee85008f3a00f7ad2162e19db51748ebcca251cc67243a5432e82b1746994338833dfb6207e1cf85d944d9bd26335ca45dbf68d2d58db939f4270c00b3381ff80f843a0d7e3d453a67fc1c4bc797aaa20fc7ae96a1ddbbab00a2ab5f6c1ccadc9ec8998a00caeac0798e950e36e8098d11dbc0736aa03c0ae5181fe13cd82750fd4b0611e1bf85d94731975619a3243791644d38c3b3dbd98cb783f7e81ff80f843a0cc18315c0bc03452ec58291fdc4e43556b5956f931789e7e59cff294c7e08689a07bf0cdc1202678d8f92835cd0af74cc8733a021780b06bc3d1f27892d29e14441cf85d9416048a9d3ac88d78254cc1b1755f6884d208c0d281ff80f843a08485c596d36a4a56e8f1457578e3e52452ffc17bbb7863086651547860844c2ea014139ab44dbc6ab86464897f54a6aab9298b79d7288c483d9ad604aaa1b4bd461bf85d94d43d80c1255a01fd725ad1e9dfa7df7c596479dc81ff80f843a062a5a5c4e22b25924e74ff4ed52b07094f1fd7e4a87d16cfb9b49d0dbfd55410a0167e7e0d88fb226e7221d2c92a0a97e188ad9deb77d0d4fcecbe5b546e53dca71cf85d94fe718ed908e919b64934fea33a92431e5a1becab81ff80f843a00560745a249aaac0c6e726588faed0da5c314d56bd1bbae7bd6bca136d7e5d13a0401864e181742f87cf121ee419ff273f5232fc0d9275bad6c5e75097a068f4621bf85d942ed9836c2f2d6e1ded0341e023e7951bf1bc3edd81ff80f843a0272d8611af4e781c71cae9fd23392b8efdd505e087ee0d5464c86b4deb231fd7a01c4f76a99f9b43f64884dd512b85f8ed3e99c06ac9f63a82555dae05370260071cf85d94ce425d85a217cc395607f94f88a7a4adf68efca581ff80f843a0c060ccdfa6b94d1c088543c3bdb30a26bd4fa8cc2e6035757f4970e6e8b96c22a01b66ad8a6aa169a8474a6265920a8ed96425a2197677f269ee82c5a9cb7296411cf85d947a7560856b92ce10a258f96d9a3619cc2ddcc3d581ff80f843a05cbf8f8854ee42e4b3a78dda8c96e5bdda01017c504c2f498f4f839cf05ec368a021a30c16e79e4b2563132f2091a0c1c93a87f1841b0081a8db195c44790485791cf85d945c3ec250d14a6c50133295c2e87b07267bca207081ff80f843a077ea34cb898b99103af5e304710c9d188270bb6dba05faf6f76be9103caf9dd2a0373f0754aca72f6bf852833e8155a2e0dd78e490733519534592e74fd5dbe5261bf85d94438e17e18bc82bd35d8b7b77452d64520795615981ff80f843a0b446d43e56400ee3ab63b69e4cbbdd6984d8745bbad9dcdb54209b4484755ebfa00eb97999d9a206bcd22055153691336f9558dd09e8284aece6505e712ca48bae1bf85d94172dacb54e65bef6dd1294cbcacee8f8b032d73c81ff80f843a04ca5fad50021be6f56826ee61f1e38b5ee4c08418732a1220845934b3a0ec55ca02b1e27d6f3280f9a574d9825950ee7ee81576301995e365c28c053cbbd3b47aa1bf85d9461da5734720ade95a13624e4ae7556f53d89ebed81ff80f843a0f9502d82218392cdd38bed0b696db1b9955e0295df62b7bc551af9e2cc22b3fea01a7ad4513b8b571d0b6720fab6de4d1234f4eb2ee516ba86b09bed283ea14ed81cf85d947cbf366944abc6be30a56c5f012e30ad5fa504a081ff80f843a0f906077e4ebcd40028f72b303347725ef0f7f4953f625d817a1c1b523fcf5714a058a435bacd6082a3e876152a61f3f7e6c89f51098e3eab912e14e74e5089f0051bf85d941d9c393a57bc34b95a1f8f770b8aa22384b8e78b81ff80f843a0127760f4897afcb91b7b07ed6388b2fff00660b3b66ccbcb42e81215a35ec1caa07b5de7587adf22129e8d7af8af1dcc7c562c4bb254183dff67c051e7ea01992f1cf85d944c78d561ccfa438249a46d6fffc666454bbe497f81ff80f843a0a2a9e968886dea4061378e9a00154c9ef43c82e01504c61804d50d621b1219dea011fe82e145bf31b9e145f8c3415ce87229ace5a2afc93a13805e9c2f11b0fd6d1cf85d94665c730549ca338fb5af2d24ea9bb5049dbbf5e081ff80f843a0cf5fe99217e6cc17c865a5a4a9b51a1618f50bb8cad9674348c65c8e674f71aba0782d152571fef79d32ed4d94f56ad5b191fa03e5554c01f9a654dddfb2ebca851bf85d946d19cf9c8840c8d170e146ec06880a10d1699e8381ff80f843a0a552ad73429a84b12cdc06f0c7b6e996d8afe73ba8bd6e3e9117feefe30eacc1a007f3f139ba43a732daa86b34c180a5103240bd769bad7c3d9a41a5712906e0c41cf85d94033ac7a93d82b91a7232c5d1288e15011abdc6e581ff80f843a0bc6e74c1de30bd2601517def5f880035aff4901a19885824bd2890c4f41403f9a06688679d8b5d5c74da68f1537d6c45d68e2d10cdb5b574bb52e2f9c876bdd26c1bf85d94dcbe20dc05de4d01448de04e67fc60e4ab2966e381ff80f843a0c9c963b34f6deffcf509434da8501a4a4ed294544904add7fd4b57a1dd8d216fa05e4c983897e0db13ecafbc656ba8cd9987dbb2c63788b370072462bdb3ee940f1cf85d94e0f164a1baaf5a1415403d1af5bab163328ab37181ff80f843a04525cb0fb5b858515b25dfc517ac44363b6b12646f6a3e0e5c09303b702e5512a03974096fd18c4adb638de0a01a72f2a84d8759f3f0c3492723d6874351ebac421cf85d94ef5f8af4229386ee0ce8769a05585889dfa66cdd81ff80f843a04da897903cba0e70921dbd1ad5eea07011c30902e887cd9c7740a0a4637d024ba06d91afdb7cfaf782797392e44016ad37c699dc5df1b172ef2ccac573fc3e83771cf85d94bc5ba7acafed89f54e60b8eb2caaff339ff7196b81ff80f843a073c535904bc75d8b757c91b42f2cd28aed287a2fdb862fab0bd22aa567978f55a029330c980d9214ae4dadc9365330424f3d9bce6c5f8c5f8a33293643025e50ce1cf85d947d7add62291f94b6116d0d53383b445150f5749281ff80f843a0926e9155cc5193453f25bc130b418b11008e2cf23315db23e1536893bbd1dd7ba023e4177fbbd96d12d374e3e139cbdeaf404af23d1630a905868beb244cb98e701bf85d946d7152d45d53524b528203bb65d331ff085d63f281ff80f843a02c3f53b6a820a4cfa404e0732e18954980885d3a27464013d54cbed0c2b3bfc6a072d5d5a6097eed0c80b7f85ae14f01740947961b396a6f39465e61960d93b68b1bf85d94c04c790a99fa08702593b9e32804f8f83890b08381ff80f843a0c23c4a0e9f90b52547ebab20cf0d55d71c5757ffbb934788a7661fbeabb7af86a029a7bc27c93997c8e81fda45dc9322d8e47597f1150bd9ef316cdece0d898d1d1cf85d9475f6f031dd4a7695bd94d09a27155cad04254c6781ff80f843a0397537e7a013518b19d819f98b901ea55373b612f793ffb64e1febf3f46b4540a031a1996d623ac88d607a96b9a08a49890a39433170865e98e066a8d8803b265c1cf85d94c9fc571e0ddae8b7aa6e91160f12222f913e1bd281ff80f843a04d7a09dfaed12c44a2aca24a09962ecc64a11309c4858480e1ac1dc8b4d82a9ba010ba9e7467edc701262f4becba3a74ae331e9512caa59feee8d708223e06c3101bf85d94e9a0af5aa888334295190dbf2863b0837099b05081ff80f843a0fd557929322561a97d13bb3c1215d846b21b1780b0083085c9dc9fe0543ed99da01d94cd3e6a116575d4f2b21933c815c324875933de6f6bc1e9dd23e03f7859d41bf85d948eb417ea213700b87b5736ef4c4532fae1044ec281ff80f843a0983add26b8530082f32d97febcb1170a7f9e97203015eed375c78fd0bc4a2005a07c13d720f526c614db7ca13cd8fe879f5210f455600bc8ade5e6291f4259b9e51cf85d94ac85600c58010ead5d5d2551433fb63afd6eff2981ff80f843a0da67739e5e150d505c55e029fe1da1fff3c22a065b5301948248931a87743998a05ba2da06152568be5b17c3acd6cf381b3cbee2e985ec6e068cc1097992bad4f11cf85d94b37b667c7cd44809eb7b8b531f2b08cfc9745e5481ff80f843a0188851e38ab3232f4ad5231b0c827b9513ce2adaab62aa889a64fec0c59e6229a020009a886b050ef00005f4c4f10de6ea5e371e9d95a6636ec87a074ae7ecfc4b1cf85d94586adbeafac0b6cdabf7423ed543458672e3156281ff80f843a00adbb6017da708ab47cbadd30b2e1be32aa67c0c47dba6f8e5b2ce62c952a946a019e53f0b19337106c967c31606b3373d03f42e6dca7303d0cc633dd50c8ae5a51cf85d9439f57d2108ed56fd677eb3058d106cfc5318114981ff80f843a0ea0e7bfe805d2ede29692481c90c07ef1c9a85ffa90c57a16870f21d6d92c874a03e03fadfac35c88c9321c0504c539a1384ac930b37e38b64e9ce85c273021cd61bf85d94549eb4313000e4f3a90ef2def8edd8446edc1b4681ff80f843a02bcdc89b29413def7e6f889b7cf094fd7a1da27c1044f6baebbf1d434d523680a052be167804380f9a455ff2840b0945365f218e080437989f9d63e80dad9170691bf9b4b8b90214f90211a04f6d8b658a74213e6346dfc065a4b5efa6f3debacc19f698d813521936e39c6da0fa6b866fd97c36e1ce74626eccaca41f58db7431625ac7cb6e33971ba8a24ee6a0cdddc071427805c582e9fe530ea0ed43b3fde342ca1af4c9344c1969efd1900da002a3ab3527969ab5387d8bcad2e56af6c76aea25a22ab336ae04af7cc58f0baba0c563438834074ce0cc92bd1b7e31206c269d50609784190445dde268d7195076a0c1bc08df2f31e0ae0d2ab795b077a6cae85778b39db2a9c00a31d1e6be252929a0bcf799f020e5db3c0073847225de1322fcc4e7a14233e843e011df95b015d7c7a0c3b873d253a206b3cd8d80a2163fbc974ca0d81dfb306352334d559c04535376a0b1d3ea66ba4dc3be79b52b4442c272ec24b8be8cf8c21d9e08e7af055a25b72da0bb7fedceb9f6286602ceaa1634034dc0c10c2ac8ae4abad08d0909096d9e1e90a065f160600bb124b22a32e15474707566990afe345ba8cd1cdaea31ac97370adda0b836c447ddaab3c2879c8846eadde6e24304d26d75426411ee442d2f61d68457a0a474cd30522f1309f93735c14a39913d656cc9dd0155270fa628104b4d1ebd11a098dffd178959d2926b2ad31c9250f76f327465dd921f15fd4b503b38cb7b267aa069d7b2ea98972b8e1c53a217934e7040432167a0e60d7e3dfcb2fc83267ac344a0187362849f023347d4a8aab35feb38cb78cf777c3a286bdd94f5e1cfe8bf556e80b90214f90211a0ffb0031e2644977b365e26c5e766bdf1ed5fb2336cf6c0259d19986cae240ce8a0bff76b72b64c4328f8e48c4a6a3af2d59a5b6ca02ba8a10630d5cfe860b80c31a043b77416399824758a4fc94d40932809ece83dfb8af09afc7b2ff4b5d6ad8331a096c203509f7e9ef07d0f698b4e44d45119403432399cd163f31b17df544ed5e8a062fd684131e5a34d8bc2b495599b301d85b8a86ffdd372b980fa31e47016f81ba0f21a60a79914331fb2ffb6ffb758c6d1a54577740c404ead924348ba541b018fa0c6a3691310e4a001e5dbd411bc7865fb27c39815eeda73b125de789ca2f713e8a07f5d0853286bac21b57b4f756ebce9b76337488a1060bff17fb770fc2a864a34a0900f46256f0c67b6d9f05d20ead9f4db4b1ae8a852f713d0a90fa3558b29621da0732f42cd81223a36e7f4de3b3397fb40712cc6aa957fc4cea44f323dd04c31c8a0e9b874e5b195e376599071b7787c6c79917035ada42d164536608d21312907aea08dd65114d1c994fc8d2e8599f2147ccde6bb85372392ce5cb4fa22ad14e88641a02a3b9e086756e9df902da4faf40c8d48f6123c5b3485c388c9c563e3e6d243dca04b87c2a331acb9920f61578546a1b15af2b2f47739439938d139608b31a2ba2ba0e3e8e8f7876b773f57191089ff0dcc1ac40939d2fbb1bbb75ceff61383f11482a07a748a3445f7a666074e913568c9ed0fe6d4335c2faa237970361d4b614dae5380b90134f90131a06040f5af783db15fe49fcc13594b03d6002bf6e75c8ba68b40295e10de2b3f6f80a0ddfb62e91cf240c12745856673b826e569a1d6ae40c64641761d67b1c11cb5a9a09f82c6046be8156f2ed8a9facc6062d03fb85b35a2e7acc5663e69cdd8933eb5a0c88df5ea56f8b2aa984fc678ade7287f2ec18d4f1346ae7c0d5bcbcd75becfb8a04808453dd2a3ec4c00fb9e083e837e8e07d624c34ae2393fe72c9c589d6707f6808080a0373c7ae0fdf4d332ed7f246cfca0383a1e97220765fda6376103fcbf04678458a00d39b72b7c44c1590afbeff66437f28a5dcec282d025323bb6be069185be8f7ea07856579dd775b23d56f17f83b807352aa04c7f34b017351c9b7a8e985e88567480a03ffbf2f3eed82525eb5c5c45863641ad3829d03215e3e704f20ab4a4c5adcdc0808080b853f85180808080808080a0d90009c6104397e29dd9ba4dde7fabfba2278f026004d36422af8dbe9e8721c580a03abe332c243bf2dc3a7535ab5ca51c23998f1a50d690906e8e34abb6b8f9ac6780808080808080b86df86b9f2019b3e97a17d78cf3796ebe50ab538286963c13a4f6275e6f77f76ad5f1e5b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0521285e03d08754af4efc857bfea8680ec3ba3c0873e9f8522f4bc2851ac8c69a0cb92888e82c8157674cc7675b97a3ba822e19ad26fb786c5423fbefd52894d65a00d972cc7a38c839d3e267c3bb9f071c52360d9e616f2753a796bc985b22a7ca6a04c84ed93f05b3212a90cb0c940c63b68dd48d79878d1f64a2755c7af790aff57a0ac0fcad51b3de0cf38415ced1d37454c49a1aa38ac65d55af7058538450988e4a05bdf6e518b8877fc0f3225d491d4bb61e57835b3fb534e7ecbb7aa2c55a2e565a08b05427b3bb3b8f47bed505ab012b47ce2fa9d804bd650ff156e22228e9ec7f6a0095482a3992f04b8870ed9d2c07418e82855359244f1e63136d4160664670ce0a093b6964a7dc17a4311ade44d0e88678570c814dce08a91ad7fccc8454d5df44da0559fd9e8949f2d5d5050cccc207112f8bf25fc38e0cfb67c73f54e1cedc052c5a06ac8cc51dbcef0373c516b66ea108058e552ffd471a6a1afc39c697a2bde8391a08450e62fd7700e874c219477fefc0852769399779c2955df62f155697473b2b5a0a14939673d2da61a50aab72bed036efc2baa3b5e08d38077c8595468be959334a07edb3996a031ccaf5f48dfff2750e15bebf30eb4f4d7fff1c6ee959332a61517a059f2a038687198bb7a01073fd48af2b27d6d47f5fa226ee66d760e994286dbc3a087ceb76f74cc5eb72308c8969a1d58d332f7cb5de4469ffd667cae654cf8b63880b90134f9013180a0e27a30c131e1e9357e22a096c9f07f8d94daff6306942eeb1ac8863b53b1e3c7a03fba3cd4f1ab3801405cab89f94e79e2ca59ce5642441ba8c6e792e35a982411a07dd351ded4a9f953267b6b02447f162d4ad7a0d189a46822e37814142e1bd073a04772bee2e63532139b3ab110d642d12cf4b637c67e2ad32493308e80587e3f7ba0a6af79e6d7892c12513d55623210a48a691e6694b7d3165e96f7e6b75ea126e580808080a089f799e9da456127f37cfb09abf4b7fa3c47190d5fe929b50107e05d00eed302a03049337d68a25d8ecdd4e6ef343d49f7cddc9cb0053794cdc54c3c9c58528fdd80a0c3d4fbee46df60fd17148af526a6086db90f9e4b5b166a5156255dbab808249aa0ee3847192441a586387fe32689a81179dc1dc157f75667e2c12b5b6f6b9458d98080b86df86b9f32b1f98b1652e0f2b9853bd53627b17a273a5c13a97c44fbf12ed079dca451b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a021c6af8ebcfc2ee4fb3f4f62c1eda7bbb545f175ab313576db8b7205ba9b9a34a019c9705af620f1b595a1b84553e2278d3ec43848d404223dcf244cf6fec8cb86a00ebc1137c028f5770775a8247608ecc063af8d2e1795c9695156b36c24b6bdd1a0c8c380254b2e007f29443622a062f5530be20cec95f8bc17db9e41f2003a491ea0d669532016e99b8a6cb788c2f87d4886240f1911d4e670058a3b44577acdf38ca07ae72713dbe200183affee0be236b352eb006717f3406632b9084ccc56b2293fa028ffe56e362c7efd43ad536fd98c77e72278b306ba3fab840e55b5f2e179ec76a067b42a5f079c1599bbb90f1d2d5c77f4cd8a74402a221c0fc3881ae4a319740fa0ebb9f727cdbcd29c85fc6a2ddb2023b74367e35e7e2cd802a7e9aba73bca4b6ca0ded15dac1762a8535dc029244b1ee806c1c858fa213ef55e32db43996b633bcfa0c039fe40571fda113db28d7a77b502338f55f58d4390ca9f9558e79165d9de9da0d44d62716ab97e995e6a605c9025126527833fb2f86ef8b23f919414bd6ab04ca0d9f2b3a9f53e342be988d18bd9a68702a020d25f681d338a41d67dd62badb398a0b04011f7f2a761b93885616868b880ab8e48a57298b6c6096212b7080b5f6d14a05bdbf3d6c4e7be3b026c2bf4790679450b1104bb8e0f00b4b3c97d46dddd715aa01e5da76a682466a892bfa0f52fb0f78a8870bdf970fdeb9071339bd60b20f17880b901d4f901d1a0a8642c8e889dc10459c967ef9e9c082525c19d2b0f632ebd8604a0e49226c08ca04f6df1aa864565a05b5676a4916a48e94ca612c4024dc1db5733f5cc8f64e2c8a061d79365cd1626277d74c7ff80ef2ddc452ae3498cc7420204a01756a8b0a1eba0d402fdcfdc6b264567c429c3fa0441e44470fb15f25a88627d806e129f64eecaa0df69316941f099f88fdddf7f84132a75fe1a423b9508a67efc50bb4e20447446a055982177c31252f35762d2cd3b03014ff6770d2ad06a76a3ca5094d9beb32c0ea0f6abf74f14558c04ee8e422500f4ca398cef114d7e005aafccb1ddcac5adb75380a036804802c7a1465a737baf68c02b20a95822d2ed8ce0f375473df661b9631ca2a04da475323de8471e5d4ef588330c65f342918fabc25775c2199861a0c78a8fc880a0cb172e8c628a058e2b011d2bd914d48b018eaa0a49c9948e12eecd552b7a4945a03e5f19ea3e6fd57d2869c417995fdd3f030b28641b5c5b18049db5529690b4aea03c980684ed417e661676a103c670e5e9464ab76e64da34d16d1ede3971e56c36a0d08cae038101a0999afaf338a894d2b7d31c274a3a3ef5c0ead23b2821d60ed8a0cd0b531c496d6edf39301857219cd95ca66c9a52c7e76d8202b48c4982cc6d4580b86df86b9f3ee9c2b5aefec7015c1ad65f3825f937431f13b3760297602aec86cd5d5cddb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0f18cdf26aae28c28f73e8bcf0d774e238138d8a2345f24e626950164dc1e94d1a06863489561016b7dc7cf6b4ba8dd8a6d6e0c10739ada0d3fed9298bc79ff22bfa06d8bb5ff05fe9ad4c7241c4e16e4935d953b6a8063ceae50adefee2f4089063ca06c883495c8f2272131d03307aa9b6afdd194051cc2f9e11b8c48df39b07f6ab8a0f713a9822afeefa1870cf5a8c8c124730cc7030cb0d1d2d88c90a53a2d298c3ea0b1c10ebe05e0ee5492215788587c9a31efe89f73df80894a24117e9c28c6a003a0a71d85edf9bf7cf4bc8ee197e448bfff47a68dda97da78e431e0987a5611781fa0e11ab4bf1f57316c806f9800b07dc5051780819bdaf567a0e702e25071c4b1b0a02dff485407364131b7630422ff8932ab61871f5daf82a4d7a224c8dff8d83515a0f14ee522b164984839ce5c388745daa00a32d746c5324f657d3d7bd9b88cf26aa06dd9bad001521d9a3d2b626de01249594c77e29a96573c6fe519c7b2d6f4e2e4a021a7bae563db24fbaddf0b8f09f737b76bd1768389e9905f60e523536a8392dca02b08cc1c12e5c45caab7eae335f079ad13a0557cd59eca47217d924a2a2f59d9a0a565306c731ee0f3f0c33b1b2994d17f3f37e6b2ceaa75cf4e3a23839cf18665a0fbffc70741f9232f5ef91af1e9dbf5101255f7729d0ae43716a9c78c250d5a34a0d1cd5cb6c9ab7a4ea9367e09158555e05110883efa33d142c15b770dc746c00180b90194f90191a0620b2795973e5137bb603e5684a9882ab76428298836ed9d9bed3b22a78cdc9680a0021900ac7d22d8eb8f1ae5af9786df8160a5a4890a328848e0a9bfa73c34e1f8a0b12478591a2b7e032bacd5fac3b0829f2310262e6b8b60cfe1cce19a8d0626f2a048b6ea0b0c596974e2fb350004ac6dd972f35993f49496e4b649388d8ffe0b90a075b624d43eb1cb207d3f6f5136600fb4fd0dcb5c194c7a3d62f6c104f577f60aa05ebe647cfd8d53b50f746200967fe66b2d6775199f00f427614f47ef410d8738a0a0387e1975493ea64578d614439a202b3d67da98b57d11c72f799c661c095e1280a0902c1b3fc2dc3290b83cf91949e8d70dcee141a501eeb737fa20b8afe6ad40c4a07a516bb3d03a7756b53114fad05c76ecfd33b4db53fa3e04a3b3e61943be7f7ea097bc12466e17bb73c33c8dbd504aaeea6403e8e5758d3eee1e9797f8d206caa880a0c46a26277781a21b3bf737f2d92a13f70bf1bb90157e6ebcdc3880bb93a0acdc80a0eaf6cf9fa33fa6c111d88d140fe07736489704ff5e6020b18e458fcb4ad8e83b80b86df86b9f310e9ff68853657261a048df91d7f7339680b0ff6cef5e5b1152d4855720a4b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0e94e140de3629e8ad3d766f5812a41411b94d91ef035fc1cf64494195816f25ea036e8ed945c1abaccf6fe98611a136bb97fe2dae83810889c8d4b17787524d41fa0fa88c50a675d0cc187896bad1b8542f09a5ee1a160e49ba0a879a92204c879c8a0cfd5897fc1def2cdde682ed07e6d4b7c46f7fc0f2c06cd4b66a6202e2bda4765a09b00c903850ed9e7539fdef11408578a322c7a3777de6d414c50aa1e6bc33499a0e0056e9205e63177ccf194abeb06bec895dbdcaf8e5a1f37bfe39740ae29775aa097fb9776bd0d557a1c63461abd37e7022dd090a7ea213e8600cd8746c4e964d2a004eeaba145c0557045c82a8389d6dc4c4482bdf5cc5af82589b77b03eaeb3c41a0cec02375987ece4ac72f1adb6d7aaeac757f761b4e98a6bcc8e177e02ed048dfa0daa970a21af026a52bc4278e1a37792f67760241cd1201214f2f28d68c6f62e1a0fb0006306995984b3c86bceb717d8985b2b82a35579b9defdaac400daac147e4a0bc02208fbe68ce40b2e09b9924b48c0207dd9577b1e3c6001b5211a4d8a6832da091cc5477fb8fd6fa57b24ffa4d973343dfbf01d40e8b25edf07462c687d257e6a0b11c4dff6d82275f12b6f08c8f8e95ceb0231967e93f4df08e0dfb3c015e6a70a05a6e0a8a2882eab8f3331a9f9fc233bb2783405ef3c2e32e0f87a453d781aa3aa020fafd23900ff632de631c771516c7f0687fa26120a6e7c8e5e1b93e21bc0d3b80b90174f90171a0b7f7bdabf7ed8c9380e1563f1d70c0ccb47669f73502d068898a66c3540365f4a0dfe44d2125ff159443ec11e6f07445b7561846f2757b281ea94db9b956833586a0084821b48d376e2dd9b82f5ed14335af8e2ae0ff42e22eef8b81459c95175ddfa0e2fda19976c65bd2badf3fc092d502f64c5fbfc2a3a041c26d5a03e5a914fc4aa0f9b0ee1384c8e71086c4b88878629c976c0786d1cc931b617644cab79bcb0a48a0ec51aa4e687a78148afe1ca5478139d1c2483cae07994c32d8d12ebc7f72ff4680a02bc9bd5f37f6817f75481a599ba7ea37e4e36c7918ce58b87b7b4049d3908b3ba0336854efe9bca4a4facbdfeafb217f9d827d8ba178fd65b415e108612a205d75a0b1bdb9858321169c30c5b0f4bdb45221a24969898fdff2af83e814d94c77cc15a0dfd77c16f8190abf8a40951a8a81386a6feee92db0ed84e7381f2015ac7ad75f808080a0a9d3729e131cd6f17f565c98e407e11002caa9ae8ec449b5b518eba3b7dce5948080b86df86b9f344f0e40b24f9f60f376efbe9901ab07c575c9488085f3fd03c8971d04be6fb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a063539ff3db62c7470aef02566f40999e2398546a8747ec05b8922f7ec7abd515a0cc9265fe8f01433eb84dd7ef080e674aad760cd06e4d3d0d4dc6f2d4e697cbeda0c7850af2ff0382592f31bf3260dbf9a02970e64b74fcb807fa5a357f87e9df4fa02aed2885f14109399924b23120a42433f48f54a09c2f2479b5f9b7c10a350fb8a07ca987611c56a4f187f85efb72020c63f9ec814c19ec4a284d1b62cd78f67735a0bd932dfb508e028e2b8ab2973ef4c695cb616e0fcc748d0d03d06fba8a7a7b11a064ac8ed9b99badc29e60cbd0549baee5c1d4f7c07f5001d417857ba3f23468bba0e467607af9c52b3fce06d1734de61711a5194a32a7cda68768224d8890152b1ea094ae7db1b69e2add6a8447629b3a0ba79dfdf2c6a75371fe07b140758a525371a05576d12d448a74395934fcdbc4b46d4791d50694cd107fbb95a58284be8d05a5a00315e81c98d4a725e3749e81394928b6e41b780a9b910e9737e66e8dfcdc6d62a0c1056a88f4e995e2da94e8455357980f821ccd888247e2bddba8e0781fd70e74a0df9de50155bfd09f40fd8407275d66fb2ec1c5b8d680b8061d6c6a0abde28878a0d11bbe1a7b2ada2cf9f0c9322498765986ca5971c2564ac6f86a036004eb1471a00d6f0eb6ef932eb9c461f3dc9fb662874c04b0f676ce8b6338fe1d5180c8f1fea04cd5e10f45c06f9b24520893246c7bae22b6290c59d5bbfcf891ac8d80c2a23080b90194f90191a05b9a0f34e784b9cb0588793fcd396c5e31e6d7a2feaceb40cfbdae2337130092a00a7769fc477c4f54f5d45c6aa948dc1c3c328cb1531ea7a7467d100a3b3681f6a0fef70f3ee22140b989f94526b301d91843a83f923ee8de24e150bb5624f72d75a034b105344a546c954e5ce9566f0d4324d97e8cd321c3cd41fda7bab69369384ba016294c246d42923af5913b0318e04460764533daee8804ac152955453e6fbb6580a0f35c20fda8ce23808e9d532a812ce475fd3bf3f3da88b0ca1cf1f1aa234a04e7a0ae04507a998d5110edd926a98e4f2174514778a263b40feecd661326e7c656ba80a03fe3dbaea6a798d03e6de2d5013db8efac9378b1db7090aa79d9346dac430a3ea06cc2698f4416cdf3c96501812a94b42216d2f23e96d45f33e45279620238083480a012422b353d1852d9ae1f77236a17d416ddb5843f9c2c9dc7447d6f77953e705980a00f460185a0a587835e2e574293fc1a0f39abb939057d1b3621eb0924e718acb9a034a60f3ed0ecc0270e4bf56db8d2d771511a7d9203d9bb345d6b1439fa61628e80b86df86b9f3ce09cad47790b30d44fddba77318223c1b3e290eaf7e04cbd71b48e1c1779b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a059a2d0fd0b8888afe05a865f667d69fd4c35ca969bdd825ad13b643984ceafc4a05f7835db0154bc2dacff492a1075ab391dc8d35a0db025852dd537ea40ca67ca80a026930b3961ef2384252713d4fb04137fc28c4f064b0c191cd4c6d10b69e50a0b8080a0aaa311428d1c1afd16d1691da845cb9b171b8de6e125491f7ee71430d1651c5e8080a038f6594136fd40688e62c031e95e7888c188cf77ae69243c7e3f32a1a47afb61a0fe0e90e11d67b5a3d8feda34f242bb9501d0886997b464bfa6816e7610424ebaa0e1c2627026ffd9d3e9a4de21f4bbf5900b0b052d87e39e564b9d0372a3fcf8c3a0125fc4e57a863d22d6a99eee83b989811e7da32d42a9d15620a660fefadf504ba045d8934c7a176aa7b97675c0ae8bfc50e26a6108e5271cbdaf274ef19f90e9a680a013b1fad6b71c6ac16479886b0256886821cad153eb4a4bdba89c47a4b84e378c80b853f85180a0ba2a83d944e822877d4fcab846fb0d753643972dded3ebeefa17f1bf24d8e73c808080808080808080a025f63f4fd38914baf65568bd34dd9b8d90f7ed32e2645a7b68a7eb95eb054dd48080808080b86df86b9f20fb2c1facae22c7da5c8da0b24d1e7d88f522297f88da80360766baa48abcb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f851808080808080808080808080a0e2f5a64b734f36a432c90881a6049953c82db83844799cb39c993933372717368080a0a188a053d7eb2c1654e3f40d4ebbfeea99cadba77d7db0e7b667bb85f0ef5ee380b86df86b9f20d82564954a54a44c1868aba137bff8891f3fe22c6bfc15109ce946f4b741b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0986d3edc3043fe841007e4f1c17ee281e69cb1b1bac7195e604b7828866b6be5a02da0a7835b7300d48e212e2b7f103620c5e97e98e01ad624623fccd5d905dc0ea05b1870d175dd9e2de8344acca16045cd548910e0419960a4c06e3aba713f0909a07cc5b066d2e1ccaa2c0e005ff73928f67729d5118d07c7ab5282ca90e910c993a0973713c64683ee0e453f9ff60213d26edddd428a9ac77d66944eb676cb68f0efa00c29e4d3fcef11cf4790b6aa364bcbb56b67203603892f6658caa21507e5eb0ea01afb25aba19a879f63e38cc8cfcdeadb1994f065b31c76055214635f76be332fa075ce4034df938d7b6dd343d26e214c675c3c642e8dd9515db3423c10a34e6743a040f8c7eeab847c340fdb7aa8180732e0d2565010b0a93d219bd4a11127c991c4a00cf203446b8b9fc2f41bdcf3ec4a2b4cf3e421b9378dc766ac49f76b3ed7298fa00b1704c4873d5f5d7c3b6434d6b032d45fee1ae024dd5a4f52716847a5725622a0394182aa1548ba5fe34b6fd19a51c672e2d9eaf239f40cbd3d9c76aee7d91512a0a915e10e232ed90a00e182ebfe157cbc76b269834797481cfe844bbc59d0b7baa017b074d0ceeb29b46b3a9a291ae932c16f9b4511b237ac10fd33312fea71949fa08841f0c6ab48842c22db33dfde45f5e75b59cb0981e0ad2fa11cb0616f47ffe9a0eb154f48d86e13a701c23de5754b6806939abdbf3795e2d6e140def9e24316e480b901b4f901b1a074763fcc80a8dea56a84b697dbb7dab76f9529823bea376975777f3cfb6297bca0c8a6894b230541ffb7f630cc4db9c68f27eec95268f951ae3020fdff878a4db5a02fbf746bc584f306dd079ccfba07d367410270094f68001d4033e05f61f62421a06b57319f1698746e2d57296454ca9215f5ba82b385c6bfb5e9d63271c011989880a0393c434893a5bb7f488653759127a656a8715d19fa9092035de0bd3d89b360d3a0cda298bde2ead1b13bee4f72baf9c6694065f559cb96d4bffa19c7690aa828bf80a0de6274083218b90cd44617f7388a2069643dbd0c8aab336ddc051d2f12958922a0b31dac5e7f963f63e3e3daf96a094dfbf96332e106570ad1321e3ce974c71df5a072e46c0f05f7968fb0e0819c9756f8cce931fda9e05e887c329404f0382c41b780a02607f215044759b726898db811a02e3cde4f3bede26a4f76fe5abd42a9252bc7a0d02ed06414534e7a717588994a2afd3b37b708189323615f4a7f0a696564c9a6a0a797d4ca92b106dd49a7621f9d861c2f17f99fc1481ee0d09198ddfbd1ecaa28a01baea76b308d5f88f6241ffcf64f6a6d326dfe6db4368d270821dc9fe11ff0fb80b873f871a0cd88a484a05c61fe31872cd2462e975b3289eaf4a27a0e96502006a8a166e88c808080a00f16ef477fd77c7708d49ac66583e84530c60eae14104cf07e4cd69404a383118080808080a0af90648ddab809af4a2a8df034355a8ef30dcf7488072df5c01c95754313aa4d808080808080b86df86b9f206d7e6b593635dc097abe9142b6cad559522dd6d7e338f82316bb2212bb71b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f85180a02d514d4cd50ef48da098c88022f3be9e5857e2fb7bb5c9d8a62d8f1aefecd5f080808080a0b828969f38e390e60d9cfe852958d5a467626f9ada4e5d0fbc4e5ac864211db080808080808080808080b86df86b9f2070c751e4afb14dc07049def9022654a061f0cd3c52694081dcaa910cb714b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a02960cb554012ca7559cd0e61090536f62ca01d970114f0baa672cc2c5fa1c32aa0a5f6004d98fe3cba4eb256bce626d9b87940824a575bbe5ca842b162ab298ffaa01ab0513e179f3480b48faa02bff5b6520ade16218910fdab52a5583201e897dea007272cb9ae59ee2a5223ae6e8be138eb8c639b7a2d035272b0302eb34845b432a0730afb1b46b575f8dba0c1539c16880a76cbc799efe4e8d7e27829e16f37c3e9a0b2124cae581c9d13e3ffaae4e56882dd942ffeef4aa45f6e93eec1142364e1baa0dbf0d9df9c864b6dba613db501ac5af7bf0071f97f615714a82b52e7dc882390a00d9d295ec6699f415dc376beeab82aa0cd7f712ba973ceffee79506fc19d20fda051880c44f30dd4a543dfb09bfb8b2d2a302d55092ae2ecd189ba991aec731601a0bb92d5b8f31a796cf00c8256d0bdf30c55939904fbb27f3a527ebedef7b3d8c6a0ff04d40b3683f9d9a2f1eacc67b4aa7804a84a517a79b3894f4ac6942f0e29a8a0bed939a049af8752eb2986f4c908aa5a252099966ea81689276d89e664a60a61a0cd2d5d6b7388d74636097582104f65e3b5e92b3658ada42b09a8a53c262b1d29a019a883b9eefb6ce5c4076e1b5cd10dd25a21ae8ccac527635094612c342c2681a0b9db58e4c8ff2db0231dc8022ed001ab6360a545f044c0d04d9428957ac6cd11a0904343697ac537759d87050aa2cb1dd2a9f884a4049a900acd3997b920d74dd380b90194f90191a0ff49caa90426142e18c41d11e8d78c6e46d9b5d6519a0a5715cd79e0f9d20f0b8080a09f07a9675d2b25464e48c93eb60f8c9972a153977d98be9abf4ed4c3900994b0a0c6891fc56d5701884e5f421ad1ee9f1561764dbf5722969a2d855c75ad257b618080a0de64c5351fe1bec299aa604621bdc96fd0a537da85f9508e5e09655fd0a024d0a02197d6f2a779b3eb0f55c66f35c41d98ea99d5cab3426c3068925bf466c94b99a0062bd4ac8c85358cb70f4360e36f89cb834a2ae22a3c6ee45fccec15a5438e74a042d0e2ee63135cb216dc3d4a3d8ce67a0e7a808d3395bda29435a97137981ba8a06c8659cd15a6a5942112a9bb5c2f70aeab2fa1b330e99fb26c1622f10383247ea0b2f8a144017b999edf22f8d24291b66ca8b8808ff572576346ee9a62d08fca19a09fa11c568d91df7f1f5d3003dacb570b980391ec42c80c629e939e032874d8cfa0523649ee63567e7757306c7c7efd3cddba5637f1263e65b5b03d46e39bffc72da0c85c2e40a75591dd714953737263875bd77e011f465b123563d76f6a0c52d19880b86df86b9f32c0dedb432350abce3e85da5b525ecd267738e2efcfc277d4ced7da0e229eb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a0450f2f1fc5e649254154913f2e1e50c7bd9b538fce9ca1dd7c3162cd4b8e10bda09e6c2475d652fb92f42a9b3733655ea81dfa7b71e4c6becf8effd0de52d41175a0a9496109e0113ec9462d73f560407c9b4e718141fa209bb6f6605ddb23f67927a037f5f025abb6036249ef54408df12d4c69bbb76f8332b72bca3660f6c7005aa7a0ce5ddb2b6f2609221c40d566e83e68c19183e361f79ab8eb5b1ec891eab244c4a0e3c80b09f448f000aceebe832ddc4b4296796012c8e015c99e6d7fd9d4c081ffa07bdf0c2d1590b99af497670a6c93f1f58b5985f2b616fd28c12c12387bee449fa0a713aa73df615ba514ba3f4de6a944f94ae1b9e48933f0a50065e9dfd2800c4380a060403096d2c45c81c5dffb26cafde80dbf5c7c87ea3e7b27fe20ad2d628413e3a0f9c7575b4c0a2ad6fd4749e2eddbbc2ce0148bbf082797bc3072b039910d00c8a0aaf59531c9972d7b9ea43ca6eb051232df2901447df4a6f4030d80bdb5e29aca80a06f9d180323a3366ac4b616744ccc4011f26c2fcd6e698687bb7f18dd131ebffba081145910721b918748794562b7635cc15f027770ab30e0587e2f21078a78cfada0c4efeb8ceecb517f820bdd4589dad8132cd42ca8bc0bf3c542bfcf2425ec6b1980b86df86b9f3f7e94f02c7de1611dc9105f02da7bb58161e55ede01aa877cfa7f88fd0b48b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a07b71c8d40d025f68420c49ab6e5b946c5e4a11be4457085b776f078de1460892a0b740aefdc8926c16d8390849a5e3dcfd3bdc1383aa8714063566d9a4deb1c311a072806a612e1fc16d3748916efbd945c578d66663c8830987613234a617c97ef0a0e6022fe97a34bde75bfd7f78390233411b37a5ca315888f314fc435315e8f324a07ba8da9da072dc6fca855d6c4a6360fbec5b7bc430e7b2e4362c1d241a15011e8080a0fd680da2bea31edbf80efb4dc8a39baf1c07729025a53951161e7c9cf9e9d80680a050eeaf1cc2b0adcb3e78dc07cc26407f854a9310ba9515aef5836c43489b9a698080a0638fcd81eaa5d721be97964a1f67df0ea113cf54fe737744fcb4f387b39ed30aa0958aa311823e79099c7400d98fa2839612bb85da3aed38444045774a51f7292080a02cc15d87a7af8850983684855bf45b0a01c3e62e6f0e00acab3e4dec2d07708580b853f85180a0cf3eea5f276d737b77af53a6eefc2a8136274531b2c2b4accc5a3e71ddb94640808080808080a045a107e88a29c630bec2057f00f1f307ac967710281afe48cdcc6730df85a39b8080808080808080b86df86b9f20b211988a957257221ddd1b7da810b105b519e939340d8fb7695ee0038d32b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a08677a2e0e3441fc11b3aef08e12e54ff5cdc065aee9266ec50910c89edd451b2a0faf13baaffd9e898f4d3d1bcf248a6311040e00857b69784f01b9efe70c2250fa091b4f15908601351c2b5abce5d0190ecc0cb4f05ab7681c0d9cb1908f6ce07c9a011cb0a70977a5cccf9887f72f871dd6405c601951564bfc1b321a57c990275cba0171ff575159f9710f0298038d5923f92c6f7c4f5db6c820f55c13934ac1ee252a0289213d4e87aa37471e59ba247671c0c3fdb2f622f712d91bde860ede713f033a064865f0dda58419934ab2331fb90123cbf5a0ef7a8c41b810872c32296055ac380a0f71396ecabe6de78e34a076b35673e16b4c7ffb46f9e5fdbfb5031f636c87997a0728c5e0aaba8872469c3c8aa81f8fb0018c29f4e97d74e864105cc97740d81d8a0c4aa678011f000e86159e6ef96bdc2f79d2c96848312c3b942eebf7146d3567780a050fc80d554534488ad4c37f958d10724b418c4fe54dbcd5740b21771d845b9f6a066129a7388791c0d42af957a37af6c96fc27b857e8cef887d2ae20e5ffb52844a0f6a967fb9909af07c7d94bf316632942ca9a087f90402bde09ac5be4dec1ebcba09aa59d3e3bc7d13e38aa4ac2c2efb3f900efd2ac1716a69b01ed888e43db7ed780b853f85180808080808080808080a0c88a0554a9092ae9e51c3f1ac43d88fa3233e47ce5786d8efd38b7e22756429980a07f9ebdab6c7ee7eb5d46cd425ab48ef32e558900d0b4a1da41ea3c6de901399d80808080b86df86b9f20c954f4c234812c75c6204c2e48a2569fa8dd6a0b3054346de05c737441c0b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f90171a0e7ec554d057e46ddab88296a107c40330de2d6d849d1785aa4b59083445d521aa0b297068e4fad706c4cd4c0763e655110c72d31c9f7f7b905af9a87451b68f49aa0db9bb457e554e46e1f9ec6bcf049541f70a6999ee8031713cf22a6a0031d751ea07c4440ec0472849ea801e8d7e78317804cca0fd2720db6d2535fe9e9389aebc780a0cbcb95be1b08e20290d84d1a7bc02a1719cdfbe786e9e59235ddb13c8ac3e68ca088880d8371c6014c55268c64e29875389dee54f57494feb6cc1e4a233823ab1c80a04cb7ed3e018c3312317436c2b3775d7c167d7b28689b5a05414e690d5744d242a0ef4771f1cad5afed2c61b1e64ba4a272587efcc09e9c624f89f0c126e735563aa0c9f56d1a8845506b6536598e31dc54f8f2c2e6df910df634359961073cb762098080a0ac036ea6f2d5e1fef3752477bc8c39b5253a91e15ef0b37b366ca76e18cc071fa0a6fc6d46a631d50b3c49b3f7cf0c1c452ca0ca940bf5d2bfc4e3df79b60439798080b873f87180808080a0e7fc7bbb6421c24c252f1eaff962d1f051d12e3782aa410b7bb7e93979b70921a0db6eb689b8f1029847cd1dc44ba402ba140a4622365e035ead1fe0da1a614301a035f49469910d42b4ad257398f1b6562fec63df7493ed613c70e8c9eb37fc49af80808080808080808080b86df86b9f20379eb3fe821c170827d4257840ca969a253b8b8d267884c9de17f20494bdb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a002e81cd28de1d5d897b0c760bdea233a4e04ee95d5f191e4d9a439eef6cbd344a0960f7e22fd34a9de50bc3a6b90b2ca63fb893db69615c64cb8c3bb273a9b1e0da01d6fd872fb609858bed4d13cf743cafabcf7bd9c67c783fd6b3078fe3fb6e8f0a0bfc7e7adc4382f6936477614b420897dac8556ec1d9ba57b8e1ae9f3b45879d9a0b019c3bda8abfed6c1b72bd0720860c12dbfa9d638bea2835f4fb023cc531602a07f882a1d3d5ffb5d465d085077611fb6d2238b72b77b87aeafb4faa99308f462a0fb1b4737047a49a32dffbc4e5ee6fed86784b31b868ac86a8dcb213525bd7038a0254497ff72c32295e5db9450258adb74818a254882387ed7349a07e999fd1a57a0c80ea5bfc5bd01f3bacad9e30134aef243dcd61df83642bbed7cd3ffe186ed76a03596fe04d05d534015723f619d6db11cc92fb3367721e4338d0e8d75fec92f92a04d970b7bfa548a0c83e0448f7141e0857bccac85c1aa92dc49e989463dfd3f21a09b800140b5dd0a638384cc6f1bbbc1bee16ef057c40b4ebe9635c0cc24fb99a5a0e537c3f3945e59c056c7b447e7238c0eae13900f014a03ec01b9caeec9ca6899a0181c5ae3018700d273b660ff7d15e759506c2f5830caee9ba66c39401a84e304a0e2af49075209acac2f571dbc8a3a3dbbd13f7892046bc0a795e83734a01c6ba9a0954237b980b85a203f939fe61952bee08d336dec7758a5991ff70261a37a8aac80b90174f90171a04d97da8dbaf34534eee4f43e91065846ec5e89d274ce61d45af0c31fef6f737e80a0b3d9ba6c26940211ca7200d35f755c046e99c7f410c4c79c54bbe6c766ecfdaca022dad670f4f40d59f3516d87db70979335f2d542055d2b4627f99b6b8a20a3e580a013effe4936e527df1e7e3cc36b2cfec93b4cb29242422ddd1241771431be2ee8a04923f09e75fb6ba9e7d0cbdfebf9f300415d575ee69b042b3f05a4bdfc65403ea0dcf78bba09a8686247930e19400c5b0d693611afd6bb0435d9078cdaba56df8480a0095c172070986a1ad710b93c8be0680d9e63d30a7a1bcf91bbe12a1b7f5e4d41a04b27ff849ffddcabfada529ef06a853412a462eade5f58a809076d4805d84e6c80a080f6bf70023c17a090cf894c863c592fbb61ebfb5b91b4320761ab11353d126a80a0b9bcaf2759609c9b06002b5784fce4bfa50ac6043b6e025b18eeaf227748e304a042fd5594dfca5cd73f56db1d9d420e6b9a058146d717ff4949235ca7e873f3ed80b8b3f8b1808080808080a025cc47a1bb2f1d874a0a5fbda384d2d1794bfd9d92ef545c9937f9c7fb3e24cb80a0f240975a253f7c45d4f49954fe67af4e0f1305d8640bda223a84801d38a7f07ba0e975a5688c69e9ca0cd9fb9086e68b1018562c386a438e732b618e844b9a438f80808080a0caa94f5457c030c7c73b44b003d2c78caea050a50732bc020b8a285300fcf5d1a09ab717cc84a638211a01e9623642e6a5d70c693a1b1198d6db7db2441c55ab4b80b86df86b9f202a29d341d76c184d159835f6c215cce587e6ca120ac74e7afc09ca1be5e2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0665eee936c6ed0fb4c28e35eb711d31138e33b31a929eb28a8e1f4677a809f41a09d5ceccc9dc3334a4b31d05f6a9aa782a72a84b64dfecf14ccb460cd3f52d7e2a0dc7691b28c93ced14f31a4aff22d9e8cb8998f93775407dd643c3b1dbe02d4b9a0d41f5e65ea092dfd45325cce034c41890221400d732efa3a146d58d12983df35a0de2eb02631d4c1a98033ee1fe008dc0f3f957124d65f6077d1fc32c7c7186d5aa0cd10a3201ddbd7c04079a78f4c94ae5832afbd937504bd8b005f8a70fd43e6cba05b8fbbe36d8efe3301c8e7ebdc8bee8c8a830ad5dc2d52d7556006d82abe70fda02a93a9055aa0349c51b0c587fa788e520878bc2d3eaed02524579d42ddafe914a028aaf4fc1eb59588032353cc47c1b7ddcb34d1293ed85320fe35c946633e004ca07ccb165141189b91ec177523e29721cd18d52e0cca3d68ba210936ce342d1c6fa0ceaeddac01203892de9a5c36989e933d6adcde0360653503f0b20ad67122e2c6a012c9d37d4d66073168f06f3c84d1667ba7084227965f399d6b1aea78532a110aa0ba934b95f76c3f84419a7dd84975af1ef00fe933f9fca2b8b7ba754ca4af018da011ad7236cf5c0ee50d098e6c67cc3f30365827ab28b08b1186f95598e71a6357a08bfe92e8005d7c0d52d58e229bc2a29f0252fcc4a01b6d16082c284b88b977fea04adfdbfeab74e67b0746074107bd0bbb3bee2278c5b9a9b6189e511b6a82c1c780b901b4f901b1a0fd09555bcac86ef439f865ef28ab9f85836198c4910e0499865e271bdfee19ad80a0378f69a21c0db1d290b144332f49e458d9d1bb13bafacacf690bedc6056f6314a0025c7777e9130716c779e9c09d26301c6694432e140cd859fb7d6d6e32823e258080a0e6899e9c3c0c193a062e5030cae1e5fea1bd10bd7e9f040e3acbe43c14b8142aa045490c8ff9f57402068329e2654978dda5cc70a2a73f897e99b6e8ec22a02eb0a074ccb106b8b7b90e02ec9b6cc7f846d396e697de32e1c3e14682d256fe690e96a085340b760b2c12cb717fdec697c3e3fcfeb2368496b30a286d55772ffaad7241a0327650e96faefb8210ede5284762d42f4fbbfedb6c35730a2107e869eacfec5da0f54aebb96297aae26c66334c9d22c26e2679542125ee6d0929a0fa42114b25d0a0c8eb48d19afbafdb77eff09569a8c6c2c9a25428b3e758ad5a81a2cf2b46bc52a0f523a32972bb8c68dad31c9d68ce2095619207094c1e53c8b60637c80ea1de33a0cafec1eaa8ac27b7862d3969021299ebc38ff8441fae5622ff18a83213ba92bfa0f0412862d519faec568c4ca46401a9a1489309b0f2aaeb9a0a7975226f7fc80e80b86df86b9f34a9904335fefeebf4d9b30b112c997f3482c0f5d297b323123435ac8e296cb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a01a2141a9f5e018b61567803f3700792021a750dd3bb3c853fa40c41c6dd57123a096dcac64a1163764a39b6c427771d2e538e0c3bc9150c242ae86d82e74a49eb4a07c6e9e19369588a723921d97796a17a6765795124c3ad197af5e511be9012058a040a930071d1830cae69f4d6bfdd8f575e686ffef0b690e39cd7d929fafb19caca0ff084bc332134f9edf9c18fdfd86d53e11389fbdddf68617a57d5a7886d7e1c2a07dca06d1fbfd8e5c08d69f219dbb20f369ad5ac2efa5672c22a15369310b0314a0a57156bd128c41a8d341ca1eeddd299fd3d914524eb2b162fc7220bd83aa2fe4a0e7537c42eabb98eae011f97f6fd35d4c9857c3c10b9f5a72bcd4391d1b67d5caa09a48569c874d0961a7a5862556394b30841bda7f1567a470296dccb39c2c69c4a0a67a136913fe9b415bdf5f11aed94fbcdf2729b722b72490b43ca1def08ed41aa063c1b2b1d58cd74c810aa3a4e3513b5a1311492d47bf23c409bc5eb702a3bf0da02a395ada08582c6fc8649387ce22de21c5f3dcb1f8338a6b8f5b87a534706831a02eac67abd2a30f8a8ad8514b821ebfabb8a5af5f0cc825e1840f812555950965a03e64bffd5cc41ca8136a0e8f86a1a80ba9f11f2e38e7c11f137d4d7fbbdaa32ba0ee63fc35720f831a1cf4032361c90a0794654b6de1e4074ce841d4ba36e8b102a0c01f6917d10279b73290907d0d49e211cc16b80c4eb126bfe734783ffeb7f3e980b90174f90171a0c3341b204277e877f095f6c1d0c6648e9b2493309e6ad17e0e9716476a707d70a06f2d18b8c10e6e1ec16dcc8de0990733c71b3d6b2cd6bdb4fdfc014ac4f17b548080a0fd3a8433855e0cb17912bad7e5dfc3c3386dba10c07b9eab853fdc583238f01aa0b6235c7de7c548057ae65aaff10090ed5ff2fce73ae95d065cf2942b0416e4fea07a597572b2ab4cd048997c5cda94b2142296a0d8100c01e88ba76f51f5826c20a0764acb6d38bfb3237871b18b92f2b2a9e9d20aa5d5fdd8afa7ea16b52a200b6580a0f2ea25957d770b14917aa06bfb148b84de7f87916ce28df9340c8532d4c5d083a0406c8922b334d713c327c35b519fb439ee810c20c5eec1655967e0279df0a5eba0a5dd4f3383643dd9a7f4e7467eeffe16a3750f9a7d8b68a6ffd997dd913a6514a001f3c2fbe17f01e2259640a734273d001fc74f39b9f544343a4b746dbb5de10e8080a03c80bbd9842f4d5d102e601ff9d82e706d2e5e27efa2de0e34e9e6958dd07af580b853f8518080a07e7745b1e2515d380629522ac3d1e51a17c4acbbd2ae8b3532c9421b7327354680808080808080a0f979445cb809484a015c915b132cf33d80d163de9fc875f4fec8b4cf8a065a7e808080808080b86df86b9f2092eb72d564959277ab9ac9b406dd29f6f239945e434687664fb7a5c63ecbb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a099db3b7d197001919154a6a0ba2fb93252eb01e281a5dea72fc0e38fc0388577a0a13e46649c2ba763cddca84b0d69d67912a48c1a3e1295d4c44fd906e3686c9b8080a0e4dae5a5b5c1f9aa0095ff963fa1fb4afc15cccc72e4054ef967c3d5022a6c4fa06bbe9d51c1517a5ba907279c620a1312b7fa30962bb28de7354374bf6675390fa04b9a27fe2c7c64b2edae3bb054ef29b72df2ca8e9fd388ca7bcd7504efbdfff6a068c39e985a66929b0b6a8123ed18220f8ddf3167ddd952f84e9ccc2c01b1fafaa0fd5d22ec0457388948427aed0885711af4515a07644b6a57126c01fed6625eeca08001c9a6799063d698b292a3b7f0c3a3416a7dacdfd253c68ffa9987703790d2a00e18e5877fadc4a6eab01e5e4827518942b129416ba487f747568564c7200f148080a0b73550e9ea214e96d71f8a0058bf0f724ea6aa146d38c8ddcfd61ccaea22b12c808080b86df86b9f30cde9a3dc9ff1367757cba3b8e0d7d1c817868ddf2786fc945077ef227ed2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a01e181723e97dc6cb7562db0d436ae5032e6cef6be05a2fb781284afdb20b37f9a089e3142eefa6ac691b9a975b5178ff118a90b8b178e0f6a94a56c7a9a9e09dcea0090aab1e51a81699f3b9df9a6bc9c29bdbc6f967da001edc93f318cd05e179b0a05f7bcfd9ff5474c6e94d54a890be7fdf3beee48a199abc42ba852a967df6013ea0a7c8ea9f604b7833eb56a89d58314df415976dd35c75ee85e32daa92f8d0166ca0c15419864a98125359c7724b6514d51b6d9265211440c7442493f5b05b90dc24a028b17ddf224b3c3673e5780fd7313b36358a41ba2a9673bc976c1bd722964272a00c5bec06edd0a37a2bf6f4a4297abc77ca61fc4cb11b6461f56cea82ea326873a09b9258318ce6efa5b649b4c6279a30ed5e79a177fa248c194370c23e715f6737a0c2597ed71676350649a187ec9d4a33cdbd2cd1819f0841f409df47e9f84c7bfea070e5b7a41dc5c92f93b9f63c63d5389f54e87dcd7d73c80b419cbdbd3163f9cba06b061978c1c4227090c5dc65c0418cd14ddb76fd39283ba38c2104b79eb0714da060406ec9194d46abd9404e30cd9e611e7421baf455bd3070cd1036a95e0c67b0a0f02acd9a28d5d45ffe9056ab50813a44e476923571005a47bb07d72a8b474205a07fa5762d8c1705dc6514c8ad5d0ce9b41da393c168574b6c37480dcfd4e4b830a0cf014a4583f1902144555463c9d6db033a5fcf25be365121defee1372d87c68680b90194f90191a05eba58dbdcdc6efb739659b2ae233f2f794da01c0a137d011e6484ca4825cf0680a0b5f2f0a97d22f66bdacb867903d6b7165ef0362c3008bc8fcdcdf0c31f21043fa0f0b6049dfe9cd20459a83ffbcea9394b6f627461623e451346366a7de58989e88080a0a122537cede963c65528ae9f7eb35ddc2b3064e99e93db989bdf66f22b835dc6a018b76cda46f6c185b8466899edbcb3877fdb5cc693e23d4fc23397673fe6e67ba0c83d195627bdd2d3ee3ddba2d2298609faa823102d1ef9ca6bc6dc6e782a9c57a0c8aee0f1340ee4e96250f7d26895f654356188434d38a314ffe3e5b576b831cfa0c53fafe3ce275939aa9f5887adcd36a3f17518eea2adfad43db754ae0b379537a02c09536cb30643410f215b95544afbc66dd272a603cacf076343c0ab134c70aca09db7dc9bac004c3e52e5f2754c491ca64a7187b48d34f59ada47767d242099a0a05a343f43ae3cb9d2c721d5e82c61ec47b6996a7f10df6c88f1e725d34e8f865c80a07fa62c46b407a0264206bd36bc2f48b8aba4f702e69f15acea5a7bf8e0ca36f380b873f871a02b13b24461c455cc578081dd7ae198b762224f0a5382808f91650083c72e47218080808080a051e284e9a9f32c5e706187f5750288701eecded5159ef04daedfd2c732c463708080a05154c945803c0c936686967cac8d1610692d2f012330377e43804d846881c87f80808080808080b86df86b9f20ec96260151b6491acc526bc272740f8e1c9eeb5666a574ed77ce6d94eb6fb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f851808080a0ab89fa1f9620d9c9f14233207565dbb6a80d4d76fb68fc33b4eeab168551242c80808080808080808080a0194d04be1ac0a2ce4124c7e7ff317ef7b10452de0f6712ce65cda881261ce4be8080b86df86b9f2067ddfd2ae6ef1b2db1d70908de3755935ffaaaa19cf2153f04def559d924b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901b4f901b1a064510868ff5c9a6475da31428f19a274bc212780a2e86639838079cdc0d8bd82a0369bb2c2907f5fd0681c14589f1d789e20b1fafde0d878df3ca0d587fac28b43a010666e714d2dbb440fc3a215cfe60da6dbbfa362dde50dbf9e56c43b28e5c341a0c2109815185b519ae6c2a36de94a3d1f55e3e065f4888e686414d0f648426961a0325b233d091424e43374574650b6a96abd7fbd4501ab9de298bb849dbbef77f2a080574aad58e1896effa1fd7667ba83722b65961e502bcdefd9ff5edb9528085f80a00294c0f647485daef9d21b0c3c87ecccbfde3437cdf8d634d090f1e658fb2d41a02e6cef11619aac6fc981f6f951495f16d090e6c67908fe329b0bfd33a6d52da9a092af9499582135e9ec168ce20e5d80ed109fdf142fd8cf625e438d3076a0cc99a02830687d7117eaa01926d2ea83fa632835bf2c0098c12d7eef0679e19aefa8fda0f37b19865613687e86b21260672a372a8a979690c7b00ef930b3b58eefaa955e80a03c53d3c6eaef0bdf8c878862b583d27ba2345f77cabcd421f0ef793536c1961b80a0ae27edf1c0da69994b4c42ba087281fda9143b8751e69d069f77251b127652a380b8b3f8b1a07fa4d096a63d87b5637d2c3b4cf212ed2943da563acec146068f40dd01a1c7a980808080a0c9ae24df88ee14378849519c14f6c4604ed9a6c009a86468c33a26eb9ef7c383a0b13af180119a9a91a2dea8f3cbde3240d1d6172e48a04a934774c1cc357569d880808080808080a064506c13e63d7f6e58ebc6226f727dfd385c9846d240196cfbf95a703ab8dc7aa0897c39ef0bb460a48026543d37360a19c292cc66f1999cbe363f1adb88311e7d80b86df86b9f200b773cb8f13162563c80da27ed058b22fcc758837b2afa5edf8960e8bbecb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90114f901118080a07f7be14791395a74a08973b8bd265864437bbbe2b60d7987af2d3c103c78ca5ca0b9c28f66bce8f784349678758c5aae1b537dcd69b543f10b57697193cd8e78bb80808080a08cc29539e4c806a4ab4a1fc83d641a3c24007b3a52bdcb684076a1c0ee2b4fe8a09a640f09eff3657239cd03f6603aceab68f1abad6d989c972faebe578380faa6a07bd545075007fc61cab83c7ae0dbc96d00a8976628934c7ac7af5b50e0d94e27a07330ef4cc97360ad313ba0cfaae40ef28700522b5ddb43a4d49c1a0cde5940f7a0d973c02b25e364d2a954da8ef7e68711611ea84fd11cf933e524decd1b031cfda0c9b2d49608b22f853291f7e37688abab4199906d73b626436ac7c5523e4ff084808080a3e217a0fe5b6d1579fe778bda2271a6df2de752f2fd4ac00d8297ca3feabd105a50d4ecb853f8518080808080808080a0ab192d782ebbb939f468f9791ed147fe9381feeb6809d569441ca03228f2949d808080808080a0b8202f30b9199005555cafd592ed8cfb60d49c2e661884e0799fd094ba8e251b80b86cf86a9e380ef770f351f9c6c5a24e55d558c33cdb86c06017e2c168fbf71b864e29b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a00eabfcee3156a428dba566a1483d3b8d91893da63a3f43d2db33b6abda626d28a09a5475ad6d0235ea69649a49ffa2d040e5e905200a555e3637176c01a26162b2a07b6b6576b2df449100e048d2e9e458ca176057373f5a48a03f18031c96c1b8d7a07ab1f3fb8985404e754f9a413ae27700c6eab8b1c38bcc9467bab2e9172c37fba029f7f57383734f9c508d2becabc6add8eb3e58fb4c8d0023b5fd3409d86bc204a0595c6ea5982d90d5222f650c8b9ae31e3eb72116eada96898813348c9204b6a5a018663137c039c881e23a14ffee0261f748561a5def513b2696ea46b02c488373a02b107f914f7160ab4bd4e1dd3d077ada6f6949fca97948fa63ec3d5248525244a0c9676255b6a2550ce242e08fd03972a5ba4fbd3c09f9ee749c7117489983295ca0ba3c58452464298960c542a6f8c6efcc6b005e29aaafabac7aa3156e8e573872a05a989e975f82bcb6c1302daae83ec6692dc3e84e864d95eccf03322afd1459e4a027e4391c06eab6f7896a6d3085a57e4b136fe716b5e85ee02e5f7d4580f78978a08fccb40c4e57f5e7b019b1b976deab6bdec2dfdc259e954a2c5d8413dbe7f547a00dec61c8c857ca11bb182762bba8966a5a9ed181d3716433fde5a63ded6ca618a0e1e4c3cd1e9393b4e8a2469c67e96a229eb3f8f9b74938a4f0350be1b4fac86da00545b1b39e0f42f2071563db2a6b80ee96a729af2b0cae1a45308f3526a9e1e380b90174f90171a0aca0f72101138bfd7431e7ef4f4b73babe8fe83065f6a6cd46b0c605be1a62f78080a0791fee41071382951110a9c2a3f76611251a6c458b20d86ba555d50e8e21491aa084a40c3356fe51dec64b0018823bd1b82208d003beeb4f2899ccf019f7d8bc7580a024157aa7ce7fbd21cb55b5b20834f47bdee2a404ca5ba4e58d46ad7ef38eb183a0e2da14372cbde9e22544e55c7c4479d016c057a52faa62e6e46d9cd0c21b7e1b80a08b86f53568d031fc038dad126e443fba27e781b4261349a668a640d51aa5e9e0a06c17b527e69e8cc35b2ac311d368686f88095cc3888effacd2b62b9f1c04ea9ba0299270a10e65c257419c5ef3499197c61d833e8286a14561b99834a40e7f5a4ca0f02d42bd0110b74643624e9f54e0029e40e55e258da463d9eb4a54b94d891289a03a2cfda2cc0c83489e52fb350bfc384e90d98e9f4dad16b55305ddb3cc2dbd05a01396723f743befb13ef38016823a253fc55036eee65b008d2a54d25f2d1174c58080b86df86b9f3ea09789bf37d1bdcc521ea1ec3705a153740d53b98c8dc4b94b03313c832fb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901b4f901b1a048536f5eb89a4b95121947f3d30358e96ecbda28a9a0a5b8f154cb26be52c0f3a0838cc1723d7482265a5c55aec8b1fccdff34ed36d1c124d18a10476ecdf47f1fa0b33bf18017aa3e062435d929a2cf59dcbb5738968b39bae258595007fa7a7b2aa075c4a0069e6a368927b173b871654eb79130d9c300244f912691fea1341f973e80a0b86768178de781ee4472b59ed512597b6e2e273a3441f595aa9b26ffc9d93f12a07f680e36d2b59549fba059603316efa8a15bdbf5028c0402a50518c0ce21a3e580a0ceef7383865fb35dda50caf4f84445b256f5241dd0d30ae1b66e54f00eeae6e8a0373c364238a8fb6ae5f830da5a2c94c8ff3dee1dd3e3a2eb80d16a0ebc7a79b1a071df8a1627c45a5312047717686c0aa955b283f74d41772890e4b6819211743ca0af49d6adf78290f6d16d2539ca72f087f9068414531d39dd8773d8fee56e2cf4a0764c82bb41eac668cb0ee80019244a96ca8f3f8a9c2a5d52abbb316dc87581aba0a83c17cb33114f70e895ee3df8f55a855d359cc28d89a58f32478536189c2b6ba0f2acca9cf4586fd8bb2b74ca873e03a0da57f2c1a2417aa1098dd67b98758ac38080b853f851808080808080808080a064f049fa669067d818eb54270a848073c56d7818c3284cb91446ca90d752c02f80808080a075a844ce4c682b004c93a039280b0a62227afd414847e4e2831bb4fe28c2232d8080b86df86b9f20a0258b9600f5aeecfe16210538b1c847501447523d0c828edc77d16a2572b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0e516d6e6a2d1d208dd5957d7c8eba435f948ec6aedc85a80598e04fa61b3f0f6a01953f71318bdd3945e685571d92df15530a3ccfc0fd58d8761eaa39704006628a0d1bfe3321223713bcaf46821e2932f5c123c7ee1d2cc2b1e4f4f19e998219047a0e5fbf700153ca0dad48daaac5b5ec5347e65f224715bd0e28e8a4563b62138c7a07c4f5e236b06578642e2f03b8229e63635a93f9769f9a4d2b91b1ee4ddcc374fa02132522a531dcb257cf7e9b76c8b479e18912b6e61124e9a34f4adfab9e7d2c2a0280349c25dd8ae92794ad69f4b8426cf599bde342fcc920f93b0f20bc5e3081aa0d032f5398fc2c4539ff6d12edb3147cf7783bf349d84789b0fe1d8c5f1e605e2a044aedd777dded6f84fda78f9c9ffdb84002964c5166d94bbd70716107098420ba04f4857421b341541f7cf536a032fb06d47faf716be3f72e3259a6f925c7f91b7a07ce5eb897abc260862ebe66ed2d1c27a17939fcb19fd9bec25537cdb96543c77a0b79769d3cd1e67ca5589c959e3ba1e09a7b37e5b299f865fe6ad383d4d20d652a0626ae910d071992a560249f8f965520b3dc76ef3d6f2d5d8245b33fcb3e16db9a028995cb61e0e04a087a9b01c8f3d4f47a686d93c9a482b868c3a7fb4983fa9faa005eabd2719a4950fdadadceda36c4376dc06798416a9011c3478c52d50ad6009a0cdde8c9b22cddd7120fba87b02dbf0775e4585ace098c3d8c9c47fcbd444147680b90194f90191a0d6d23fcf247db4e48799592d7c181f6436a38a54f6c7941eba13b55bd444ef1180a040870170b8953350394d796a3c2b5f77c0cb8e2d4ee2c8e320b4d1d5b45ffb59a0f6612c1cfd31b5ce16df7adfaef136339d99f3d63ee3ddccf71b42de2c6d2481a07d0e9f815c8b08ba4d7f429f0c792b8e41c621b5f202e9a88bdb0880935107d4a0221bb019466ad3fa62de6f5ef173de26d14d7e555d45f1e13e8f47fe294c5a2ca07f082dc4fef6a0dfa617cf053107072a2a3d928b87c1b65c54bd005737332e8ba0111ef1a9a7388971b130a911a3181506e63f93baf9c26871916060a77cd77a6ca07f83bfd92f2f5e5d8fed929e55479911e00815d92703016bafaf446688d9aeb7a037d91d524b70f74bcc854fca12fe9bd3bc2bbfa51123f13fa01fc24421119c0780a07d7ab9cca62a339688e0732ca7f097a4857287f767239e86e8396f9c08f54819a04799eef84cd123ed7aeb21f25c4ff097c70169db7b07768b27bd85301913e11c8080a0d39f7ac33bd9cd3fca4093638589245b73ffe5cba9b1fb1947f1bcabd06452a580b853f851808080a03b629ad9d341741fce3503b08d4ba9dea0b89c8fa25763ecef18bde3ebf0a5668080a0b510b366050ab708d0f8eec90a07e0bc6c2115b65061d4937494245deaf3010880808080808080808080b86df86b9f208ecd3d948285633df84f91520e7af2e71116c61f3c4aa4ebe888873ce0edb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f9015180a0687c8a9231a3396b384c57bb7c7768caac647c754d602a718a3afee4a0527625a08390057657ce82e28884faea21208471020ad6e80d4ee1d896fc10a0554e7a6b80a0b0a7c8d154694a5dd1670d7bc577e7ca368e65b5013a7bcec8b16ba24857f74c80a04a30e1a0092d747f73a642a16845e2d2a2ad678a7f66f97b4815b84f2272a2f180a0428a761fc67f534dc4707cee51a61031ae09b1ee3b2048c66ee8de3a7cba2c9ba03c41ada1c8969f25055483af651890f3895e680b1a5af7fd0cd42c4287f79e34a02f8e3d000562f1b69688e3df49a5c963fcbac7489145c13f5a4d4074e12023d3a01a6fb102e98c5468ab29e4e891faadf86459234d9a99d48e87b6de4f70d4d372a05341d91ee4b265c3623732c86d95731fb66afb1d819abf0e2b013144d4e71d4d8080a00ee2719002d46cd9721207d05daf7a22e722639fc9c0a3b36838f0f9a021f92380b853f85180a06f0546b6f88d6238fa4bdc5b805a3b2a86a450aaed97443f35b28d368ec2594c80808080808080808080a053264c8455a1ea066432d4b56d597f6db430cb281160b13c6cfec9e91e29809a80808080b86df86b9f2011d406cb78d0a044405f18362561144a3c82b1a56064a4fc9e0ce0001af4b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a07595e28dfaebedc77750854127a9310eb2b8794e03aa00a5a41f41afd897af3ba0016f3ab62264a2adc097e7faf7444884b7718b1a75c42598229c9f6e5f57b069a079d4f2525fb7e488783b9e5105823ba81923aa78933764e42e7a659304eee89ba06028194c44c5ee340564bb4fe360f11d85f69092cf77f257943159f6b56925b1a0a916bd06f6dff693a6468c0cd5cc9c8e5ca7f5e062d61b95ac9bbf65aabe10bca0636f9d10fd7ea1b453c5d56a6d655d5cd34ee7ef38c449ba723c92b2b68736afa0b9443e8aae870e1e127c06d5a406906bc96c6e91b10cbbb711c1e6648c27cdeaa020078f1f19254aef9125c9a932defb042a279f82ed0140c0c63d0cabf0683aa58080a0904062da2257fc4894f846194b330f2ab8ed336c58f5d358e4b977e9618ceac9a0e1d0876b1ae917181049fe08f38708344e043fb20470dbcc466e55e2156f64b2a0076eb952d4f8d80e0162a70b8af6e3096f6fdb3ca83d5bfaa9c82fda7e14051fa03e1328958924d68342d793252600ec3f4d49f2781af29e5f653acd37b86d2489a0f4a4acc694110047935a946dabcecab3af901cbc270a0398ca23c26dc77b54b0a0b739b6446421adc3057f87b2e567fc65ea8d6e849e6cdfb129cf1c7efe4ebb9f80b873f871a0fcd1d1d0094f3ab848900aed77b25b6c548a67923a5962f8d82f8d1e16c1dc948080808080a00b9dd74302907544a82b7bd8a59cc45f6c60bd18206beb1370abd62535f35aec8080808080808080a0ce6b717736c4c29c91adb231edce63d5db0c8c4d9f1467af3f4f84ef20e581c180b853f851808080808080808080a0e3e1d8c2df191350041426dd72e121112ee0ac1f4f68638660cc9a06ef29e43fa0a4dc9c93765a4b5befc2b28c4f0e263944ced15a79862fbef7ea32121751bf6b808080808080b86cf86a9e3efffa12a340d528e16772bd1ebef03c14a43a974cc23c3e07023353d2aab849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a0954fc8ddbcd96430606d049af0772a6d463861dd4abce098889233232589c71ba04ab7c98f08428e6bbc7abb97c4c5b3d669032107a1023f63d118d5b9619ccc208080a0630b365e439d6dfba748861a87c23489e47d7896e51947170472d766c40b05f6a062e5140cca4d936914e4d2a710bf4e22ac7ce9da6f93ff75730b7d5b1fb791dc80a01474699b0afa02348be4c3ded63563c48b5adbfb47853ba6f7b3115cad5c3cb980a06b6bb37c6d8f4f9ca7ea308f9276a4d0108648176b0fe37f8dec37f2b723d4f5a08487581c9f145ba955ba156d3072eb41860b50922363529adde0910e9b318b5d80a04e775eef863a0e035620cd793109e95ee96248899e35cffea6054c4e9c9c47b280a06141819f637363b5136812322d9ea46b22b3540ad29b952c6b16f5fcbba19768a0a7aa21f9b8446ad829d7983dca2a8e7be82e72879924a5dfa60470ccd0cdc9a380b86df86b9f361c2420be6d02f7344e52fa818797c20a4f723f4eafdb9ed3dfabb5094c51b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90134f90131a002eeb5eceaa97175e5c51c2d97aa54e0ca6b91148a746b3c7d5148520c52f167a050e4aa53855864979b86dbfccaed24943307214f30da8cc691b5dbb3b6a808ac8080a0ef299e592fafc9c08d7f058af029f34c3e5f2b129c23fff249bd150bdd5c08a5808080a013f7707a171d4d3e7a80a01703b83f59c5ff77305d23a558cbd4585925541e49a03c5695511cd1ced48625f4e2e56663df60fff13b63b1182dbbd46ed02269f793a0d82cc6a6e7f2f842e32ada871e6d117bb803affa810cd5d7cd472370c44a46538080a08ec6dfa949e2a8fea75f121e9be64c9e3ed208596af30d4f77fdc6e10b4ac0aaa0f2bbefcd25168f6523ed864ab8a9c6dcecc9506750a2ab4e2413e5fe260edd38a0a133b72613034634d8bdf964ecf3b10437d086566bf43c4f2aeae9ea97e1a7f880b86df86b9f3ac723acf9a6986ff2431788458baf1ee6591ee3f4b43e57138968b12b2987b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90114f9011180a01e1814d8ab45406558d3db0d658a8cba73c3b364d53839f899b51da9934742f0a0b2af239704457b7bd375bd7748dda9863d303e9daab9821dfa43236f8ef908c2a0bba1a18de5821d7bba8d6580d51aa0c09e173dcbc9d9f992941e3ae3018c78e580a01bac0f673e5f1d1a78d5a18926efb37bb004869bed85c609fe3fa21f0d16ce9fa0c67c10ffd94c6e163e19f1d131854140c866c957a1be77feedf4bbe71606a78e80a0e992975372d11f3752f98fd823d4fa1c85d1cfd42eebdcef4da3ee6291ad8d82a048288fd424253eecb0dde1abf90f8e58ac863a0566e2b8457e121b9b828afe1580a0ccc2805176708c07053dc6dd80af4b265fee32d510cf1f0950140cf52f1973a58080808080b853f85180a0d9e4b610426193bfb48b0b3613e99831eda8f51f6de59feeeec3492e217b905180808080808080a0307a6330e5d4489b07d24f84f714907b6bc251cc9a816f3946712c966c33a61180808080808080b86df86b9f20d9b17a4affe75a441aa0c5a66d006d985676cfdfa3f7f9abe258fb72a7d2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f90191a02c063c3e4d684772bda73a16097cdfb854aadaea9ad8ef3fbe6b733103fa20a9a0a31e0b06e163081205f571d0597d2346ae194f55271dd2fde9d88b54fba7541ba0d6c234d2d70fbd17e467f2455f304d381369d79c0e6ca3b77c3e5b2c0c6909258080a0fb6823c9c54be3aca1f87bbac814c07837f403d833ab98ab6ce02a9feb926e7ea000b376cc7e4a5bc8f74ab148a30f1be00adaeed412ff4c1ed3e3b02e226926ba80a050b10955cf3a0d09060424f7f8296c3216a98741ddbca449c933529823df1249a01a2c023a5333a0723cf4a26a9b05d34f264aa987544dda4225931d0c52d00b5c80a0494e0a52cf52c0aa32c924c27980f1a0e6bfa0f5f3e62964409d22c0a3325443a09c9597a544de691e21240e50faeb0b982d5e866839b7628281c06f97f0682a2ca0fb61df1252c58aa13988aa9f8079b54ffa80c281d3da4dd9247faa9b25c0e36aa04abf05025ac2c2b2e2a780f0aa44d395a88da90f4aa5fefdb37137f6fc564120a00127bfc2f4e13eb90550920c36f6d9e4ca7636dfdde751012cbfe2c83cf7904b80b853f8518080808080808080a013ece5f55fa4b4881f844b9ec0ce15342bfe2d074739675b557cbd328fafc2d7808080a04699d95e293138ee246338588267806abcec11e66056ddaeddd1d8fe4ecd2d6580808080b86df86b9f20b4e83f2e702fcb0f605b687a993e40a6f14f6bcfba567d973797f5a70944b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a002b1949d383185e1159e50745c27d64484447ebe1090bb40c2955586bbd93f5aa0e6e243b3f3558f9fb97e0efdee5bfabea718e2411a78a5e2c10d1280a31afa40a06b75f167264579b585891425a6b6444137b6bba0fa7bb35e9759ad9bea2a3347a06fe21651ea9812753cdef148bdc186233b144863cd6335d4c64735c45efe13cda063409b99b19289fd06ed0d2564277e801cba04e0e17150c8bd30c9be530d0f31a0752c0555054bf9ce28b3de67921e2123d6c6f102ac028b658c0560e088f54d73a043a504254b5addbe8abe35cc52068326c1e8203bd2d78366416c4627fb5302eba03ae809dca02fc3e6331a15d317c97fa5490a84878a95d974b62041d87d4461f9a0a3d5910a4922a2cc82cf8601de22f91e40bb090eab794dc79c0b9a15bde5b073a05dc057f0a13bf6465ca324b5ae9ad9edcdaee322a5a266148df55d94c2f74e0ca07d0b25f0457499264bcd4587f2693b05988b8accf3cfd33865b621234bf47cb5a030e7b000d0a313103dcb42145b9cf8ee93601e8493682cb4429b01d24f7d557aa06904f01e33a70c8a63ed1cc55591c54a94b5b60232d1193c0cb63891311ba0bfa067e89a7c006cd0f7a42709b508837fe7d98de703a573338f5461aa29da7d5ecea01920a70ce1c8a0bb9be66c25a83cd7dcea2f440571806d6966250b112cbc5818a0d1e32cf9b3cc49480cdcb5055e54768ddf393898f4505f9b93222d63f20dbf7280b901b4f901b1a049fef3068b5524edd03fc8d33bf8154c4f76a5272ddc46b58bbc6c2055716545808080a0a4450b92d5eb46014fa955b3d63528d933d4bb19c85fbb2817362b436883f6e4a06ce529270301ac2d1ad549a995efd76656aa379a813746920dfdbcca4b1cda53a0852935e4418fb2d337df798a0d6aa8f9250e705755d8d8d2427a245e47bc5e02a06f734edff53f5f6ace3cab68ca0fa8616ae2aad648b2cf16d82bfeb169757d5ca0ddc4a90f4722b423d88cc0a1aacea0b7b4e6a5788723e35874e58d5948235352a0158da783822da5b46898b1a1411c4d1a33fd362eea49e4d92a03164fd87c45bfa03488b04e5800292722841640fb6a6fc15330d8816af55b00012e8cef4c17cb39a0e924c34efee9171c14a332fad70d0415f99b57cb90344af4d4d4f9865fa9fceba09c3be87bf34fb4daa32b516e7ceb94ba53f5081020e54e53245539021033d4cfa05ffb6bdf76f01921940ef911044746f867323b40ae78d06e81b0527729739911a063e13cb063516bab228c1044a5c37c18ed30a9fce33f1c6a05fc2e78593b2473a0d9e79744571678e5e455b0e7d7bff25848d1f76e23aeae68fcb081824150272180b853f85180a05c3cb2163253294958827eddbbbb2ab4c4b7ea2981b210b6565e6ea7a23536a180808080808080808080a01435dda407a43e9f4c00abc7e798bc72aa3201e357ba70ec892c60b8d811cc8380808080b86df86b9f201d1950a2a94d9f1263bad015553e62df59d6b175969b92607cf32ec73ea2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f9015180a027a4fa50397d33f7c1ddef27aefdca3c1837e0f7431782c87e6bd860472430d580a013079316b6c464849badc17a3131d2242be4508a379491807abfd1c9497d99a880a03db1b506aad5f9ffe454ab9f2d279c6922cbc1377122ce652e2e0b79323a3ad2a042c05ba394e71dec91d07d315fe6cabb2b51cf3337b3132fe423b64b12835e53a064887644c9652077d2fca376707b33024023389ad2cd56f565cfbdafeea86336a0e88861e3d115cad614417bd27d3096f01dba78c975cfe67ff2c82caf0bcf78f380a00b131471e362a455dad743085d92a60b366eb1727a797da338d47f710fdc759f8080a022cead757eb09b1760235cf6fd5c0f26b2f715612be4ab80f12d0b8278de8e5fa0c1d67ddc585f26be8fbcce1fe93cf52d1658661e8066a2480a05fa0caf97392aa06b0c7a70d20c52c400df27a566863b274730ccbebcba2db01fc5762d8f21db3c80b893f891a0860dc1d73c36663b2358e4721cf6157f28581db8fba9e5c8ff02be8e610dc02680a09d9bfcad4918a76ecea218edce53a9fbc804218e16e3a9c72ec6e2b902e686d0808080808080a0d6e7c607f945dab7767a968c49e9d5ca72e172fc9a47cf92ef98fb1693f91f488080808080a0836af763ad79c9cc7d5fd5925694e7a4c3bb4133e329b4ebcf9761d5caec02fd80b86df86b9f20fdc88991dca64b94ded5e0adf91480fb8c1a8c4aef0def09758ec78d6480b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f9015180a0efee1755000e93c71cb9813ae9c093a714173f0458c87acdb6681c40cdb0865ea0107265a6eed66e150342d47678f3ec867bac0b360f6d3f760ad5d32be3fe3fd5a0db4d9ba88fd779611d8576b2d685abe2d5cf967c53d3ce5c2750042ac8b349c880a08076c927978a9de3ec5f58eab7be570f22fca6684b3195cea7b7c876073da0af80a03e1f1bb0428fca215b2de4e5fff42257caa42c5cb32dbc9743ce828ea33445288080a0b0ca5a45f2a6fc51f9956d2ff204ce6d86a680a908e3a360da5a029a9d7dd8f480a0ba46c5349fe9fa2b66371d8e0c76cda237d4fef90ad5bb2018d23f90903c9b8ba03f42b31f47f6dc9770e18ff4f88239a8eeba2d99bcb8173f3e7b5a77c7d3609da08e4040da84fdb3b255c1d4b968e7fd5c908d2a9b02d231efd1b4fbf5ade6458da0530200258b88e99644a472a17db821d4c583652845feef6c56a86235e0df06bf80b853f85180808080808080808080a092bce056a4df2f6081a7f4c0a5e820b9b1855ccfdacddb6231c564b2020916dd80808080a0fa8de355997f3b28f678528c8419eab9b9029f723403f302579e1b45c32ad7ff80b86df86b9f201f27effc3276f1a5ca3e86dd9fbcc912d5b31b7ba9e9d7b54829858e3e4cb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f90171a0eabf629b80d87686daebfee92247687cfeb6d8784d7719722fbc9d543a0a30c8a01e507c7568092623f1966f9fceb7c66968cc7789a1c5b507179a9ca06aadb670a0674a3518d248bbbff1d0b7ae9afacb56652e8bf16652688e89c61fe4cec844118080a0e89c10281798ad265ee96b09405037ce34a74d055413a9bf47679360e08fcb8ea021bc6c79fc4e670c893a98e5f0a331d11ab604b483aa52c7027ec9ebe35e40438080a0d66f0ec43038bf9c6719a05430ae1d44cd6196f34a2473e5f444ba972fe7d803a03429cd4309c9712cbab4794cd101c05ae06c8c2d4220893ce44cc06a159abb6fa07eaa80b3c8d9818ffe3d94ec0b0889096af946dfa228b73def744846367c704c80a0dab790f8fcaabed5709c6a3bb67ff461808cdb8354bd8343a1c38985e6236e1ca0bc759cfc7439968b9f0bb6614fc28f6a24a923dfa9dcb19bca30f343b09d9f87a094a559ad1d37bdb4be4c24ae6ca1b5e2deb0b76918c9e688778ed06fc292852580b853f85180808080808080a08a7a861eae1244d14a3d1cf09e1121d73445968e17658e319d7d62720fb5e3a48080808080a0359b2a21142b29781826ac3613034cb1d5df1d67152cbde29a083525e9ce2518808080b86df86b9f205c556d8d4ab8df8fae6aa7aa4f13b5f3b76fa485f423f164e97a1ca4782fb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90114f9011180a090d19ae67deda76b0039c6c6495b740f25ca95b0b1193bf9a60c2574541206b480a02a15c8ab0c2631e1a8403169d86020874ba093c2bd73fc6a6c380d10b6d21f4d80a0ef20b51cda17c21a3f6f842c7de30ae5787d91973e20bad3344e9dbd65c9502e80a0b466a8d582ca39db5343beaed4ebac4f06d620209a4b0369feeb97df55a9abcba0988755805610576f83e6b58ad46a8f41926d8b14d8c4eabac091afb39920026680a020cf82ca57c5497cac0d7847fe725f9de959780940da8d1718fc1ec6b3c7bf81808080a0a697085e7559e645e7396123fad38e3d089e14b509800de0142eb654fea3f949a0b01cb585bef5da265e582b9a2a2f8ad84bbed3ddd3e67325e119529e8c61427580b853f851808080808080a0a3ce37ba2e5a57514f610f0dc971d20d5da523b4b0459ed14990e1d8dbf994eb80a09f159ffd0f90111c53b62b589651f7c2427a9fb6ab1ea6e6588de074e67da2e28080808080808080b86df86b9f20cddc03a699298bad48cf2d7f27e7e39a25b80f8947a57c02eba3afb5b5f2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f9019180a04a74a8dfa91fbb1c5e64e606d5ab88ff3dcde7cb527ff750effaefef13760f7ca03bebb4172d0ab7e348cb5bf4bd7b453d21906d653b36c1ed0bb44400673f74c5a0c30c66fcd9b40f24ca7996c6c45a9fa82147816c9eb0a614c88f27c55a0291cda05117febf38394ef3d4fb247d2a23adc2a556b9ac13308be3596241a07d88b28aa039e4553dbfd2e99f470c3ea75b8a94e9b2178c58a218f179a3658cc54c282801a0a443b9147dc437eb5def5b9c0d0f61c77ae092ab8640f56f9cd751ee2dabbdafa01102fd280367afd76cb6bbba0055b15f7ac49c8a42e461da91bc137b2b21a907a02e36a774c0177824e055f6cfabca9e5e97c490eddf8b1bdc8dc04ac4af413796a01ae25a237740c691c2395a3e8cd25840cf44434837834de8caae7ceae15088e680a0594d8d74a15e56c87a21b32acefc32bd7df995755534cdedc9fbc817f9919abea02731b500618139677d4fbfbe0f0501d3aba36b33e8f339c1050bee893894edf680a05cc44e98f244bd18895b45120992fbb0d431f82dccb6165a91548d76e7d741018080b873f871a0e329fe4ada90cff6c701a0d0f66fb5de9cb74290b43d00476f6e61c292d4bed480808080a0fb1100645641db164e3808f33796ec6fcae28f5b780548d3aa36520ddd60f8ce808080808080808080a0c0d12acf4da7631ad59437df4525be15ef9c9747e9c3f3f2881f7fc2155414df80b86df86b9f2082e5d3e689f164f6f52345dc9919757cc6126a6023245fd422a25e221954b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a034c16a2e1d1ee2aa868dfccb602a53b233ff38fe99f76064a85802c6dac4bdbba09001e1083c280cfd8c41dcb97b3f048678589086ae6b2370d5c200ecf0d6d499a090e0306646053feabd7ee9abf6d5a567f13aaa1f928688a30a8af1d383730de0a05e4bcdda97396097c14d44c112e2fe9bfcac2dbb755137e906bed456388f052ea07e4011c63910e38d9afb80c17be8cde7e840c3e2f506ae324b22c57edd5a8042a040b728d430ca61cccb9dcf65ec8b4ad5b2074c065d956fdf3dc41e685d7ca397a0c11e171509c19dc6513dffc74f9269f866e58ba58e348a2dce1bd40e47d4f70e80a04630d9167fd57efae50f9b499fd3b403fc193ce69753b5959720b15e9461753ba04fad410c4a5385463cee789b5ec7a83a7180c6e9331a4e3cc80458b531089d87a019480591a69f00b483e334962c82a0a2b3416b6ea77f068d49d66854a500c2a7a0a992f663b20eebf70308744d998c4c8e99edf54fac2a196c618b73939d4896d780a0f261596cef0c96dbd6f35c0d09d6638c457c4c24242ae555c1a37b05520125e4a0764cf88c59cac1b033a8c37b4a6b2edbf422b104a74b53a07eabc4f2d6479f67a03981ff10ca7a7c795ffab13a4b3519fe1877125215626a7887e2ca829a1717eb80b873f8718080a0231f75b1122ea68bf4723c04ac83c60f5b51c97b5ca33cf6bbfd7d65d73ab23d80808080a0d03f9585afa3918c2eff350b824268ad261ad02a774ab82972ab2757745ad2b980808080a0d6179022ff78ea010e25084cdb6fb4f9e23b7e1ca44ccae3588648385ff5c75680808080b86df86b9f20ab22e662feea3d69f73b44066bacd63a457e1501d99eb4f704c7b4831bd4b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f9017180a05ec0b93266307a6918f9b893ff88b58e8cac5c5b2c642da75361a0bb36c96e12a0f2660992d7eff6f9357f4849298409c000580caea293f1d25f998a44e7254c73a0a9692bca66250bb63d666ead545e7d3dc19ff61e8a148f54d7b3cf1dde3d29bda0e1714eafc9f8314a574b290d738ce6046ad5ff90c319ee4578851dc18bbe0cdb80a0ead610599994ea44d841647d19998ef664513b791e6aef73e2f6efff44c2502aa0ae0f2b16465a7ba557e83c83b5016ccf4c10bdd9bec9f8a4fd4820ed0d064a62a0e18f631b8be5c0661d2955f1645d07011f0024faa896367687323dab5b52eefea0de6d788963294815a8ccbf79a1eee83c46d80006b6bc6b6398933721ec36f6e88080a069a7b4097f8b236d519f183d164135924a62e00bd4e90ea1f7e5b28057d425a2a00a28c8747b5db5cdf886d05439316cd56a5e0ef36106251fccb7e33b4f67522fa0b5812fd5b8b0142e1068a02e546cfae47e167fc0b6f2877bbecf0e059549915e8080b86df86b9f39f37a2ed47bbf0ee8e5b38122c582196afb764eb93130df7e3b9fb2b5059db849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f90191a0399c9f5d197c2f0e9b9b11c705f6d80b71b7ed80d22a5933f154a57e9e7ef182a0406508e683abe0352cffc6975ed30203d9df45fc255c2c077d3e1adc6229293ea0fb15ffaa04142be9b3be74c175070ea35de5662af67e71056166d9002e066a25a02b6725ebbb65c37b27f59b3c0659adce9bf3cf384bdc08304016151e97878533a045620262e1dcab682c9ae7446c51da057310530362456a249597bb607b2aa85b80a0cd04d2e8f1b6e1a4100bdf98a31a66bf12fd5f7be40a15aae598544ee62f97d5a05afd5fd18eb497a1885f6d917243432f1e7252ece30385e743ef6f828161378f8080a0c7967534e553e11ba5b646c510ea4f3fc5a98c048c22daa699907506d852746780a0661564947067dde29429898e8351a2721e6373c9ac99a9a940eaf960294e2a05a03c690688e00b02a68840bf2a15d0e4a034c1e3bd1feb3e499ac52c3f29e7e6cca0d321e45452264d0a438445f0be7d77af45e443d34e07815a89c5975cd5f49229a012c8c8e5f9475c772195de19e8798de861c8c1057d9cbe6e72b88c5de17b41f780b853f8518080a07156be47cf07d67c8a5ee678cd06cf6d311a10c9d94981cecd2c13718432b0f08080808080808080808080a00b39fc1d03757cb1088c3f4ec0ab7bd129c44ca8faf27ec1e9d275a32c9929b78080b86df86b9f200073a11c25a7ef27ff4ca75f40e77540b249b2ef37470f895cf613ec03d0b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a0aa5b6852ead0320c2bb5c412fcc115e66781086db4f95ff5642e5a29e67efb89a0c2a42a70f097f9e7f4ea75aed3feba7ee35443048c651767acddf997309c373ba0abdd5c1c228673cdd49afc8309f902dfd27a8aa458853a10307463bbe346db03a0e12f5f7a8df4e6940ed38765eb3cf12af99dc0632e360a896636e395b6e3aaf0a091556d00f6d3df4e9f45139a97502c9812d6b982621edd89ed4995fae626a409a08531a89ad218b4689801e2b17825f00d85d72104a95ecefb5645a2024ef8904da0ebab2056369bff7e0dd134472671accd953a5f31ceaed55328a906762324bca0a09467c6e99535ffec820a29989bcc2a4f19b44a99ef70f81304333f062ecca71ca01bc7e1932a3a15cb8e88f6cf5e8a29bd10a5107c66c37fa30058203ef3e6e44080a0df8062ce7ced0f4fac90b9ee871e80124eaa6a830c4eab8b923ae83cd558c245a042fd18ed405844c5bd2db96faeb4b73608e31d4d9401def0eebf05db3338d278a09dbab6c471392b04608c156d6eb763f32bfb117a41d96f3dee0e3493a00cd6e9a0799481b79a36ca231238dd2523675e295820cc3bba9a7374360fcbba38c5317880a0683b33544997ee29a1228e1c50adfd28eae0778bd3458b6dea2f3f596bbd3aa580b873f871808080a07aacd7afe3303641af51098351228d1498c5389ca69db0d72231eb8304a94d1c8080a0e8178b306d2d74e59ceb4e878b7d8708556a48c93a572f233d4f2af8004d62f68080a0af9d5c3fc0f85bbbed12993f3ae17b19edb779b169bed122041170c4d24e7c3180808080808080b86df86b9f20368095fd4947449affaed024a30eb2e862489eef7af3f4a1e61474a71c7bb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f9017180a07cc5bbdd46849d8baf58f71e23932d0bab6922dccafa64c544da6083096b671fa003d064ad30a0b59fb37714d485bce0ed8f1968277efce8604952f24f73a8ee5ba00ea6abc951220bd073ea46bcec700f7d2f74370009d9b2333b58cd4cae3b16c8a05eae0205bc5085b243f9c20b47d22d2edd72ee069b2176e4f1c78b0e30498efe8080a063712840390bd24e19e35cfa0ca8ff706158ff3439c9c740df24371643e45cf1a05171867eae2a9b743a8c0453ad89aeed835fc5f6225ff213f9bd9861d49ee484a0d92594c3259339fd21c55a44d68685aa3fe06bb6c96666a6995ddfa7b6822639a01e5125bce51aad249f357ee99de42bd83c3203c1ef1e093d5032ff1788342eb580a02fd8f7a1f6a72095b9091e47135517c0922ea904d345b195a98fc4a653f90a42a094208cbba2997599aa1709849956e1639e5ffba51310413c6545a43143f9c95780a029834c0d1eed18eeccd9719272aa43d28350e2c60758b772003a7398bccc4c8380b873f871a090a60324df30fa3a1634c2253029188b94d31d194a250d4606cd278db55f043c808080a09044feefd6cf59f3b1ea04918083bc876dfd5e9ad49116056cb1e9110b9408d480808080808080a0f0c8b5a97523706b36f379f5a3e1f39f392e70bc15e99a7a29edab22937e33e880808080b86df86b9f2016e3af4812a6c715f149fd158dbdb7ef63f2f26d4dd5bc15758709706a49b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a00e1fbd2fdba28ed7477ffd1a788f9a47fb79dc502701223fb0831dae88ee45b9a0d41391c9f1aac36547a7633f7d456ab715c4baf2e2a352e2314d64ae165090c2a0ebaaeb4347cb23f1caada6fa74406e62549f8d45061b6d26382463ff00e52bf8a0a4004e161226c8ecf33c7d12d2b9d0863a95ce7d20ac5e6a50a61d43b6ea6153a0454d8b046c6e15b331dd3d51c1867b7dd89c5fcc7304fe729e3db2d065bc984080a0d7ee56e7d1768229fd13a4784a2caa548ff4822f6495d6bf95e3d215b44d9761a058fe05d28017b383433d8564fd4d95f94a721620b4d76424fb96548333b3c81aa005efb4db0fbebe2e1100b0be6557c0d705913db7d1e1864295164b7da47f065da031157245b6baeaadb9a750ee5dd8dd4418da91c9126ab2565858264997c0481580a05a3f5ff57fcef6a26e15bb964310dbe7ef1db16fa66da5f8028bac2e4af8b5b8a0d4d43558a135bb2dc87b88794d1ee5cb2112059147ae827573fd63464f136f36a0f2036d3e2bd27ad9a6941f6668ac190c80722192eeec331c67dc27b425ece5d3a03c081c02b4302fd44c29dc4a9b354445111984bcc2ee1f56c7cc9be52d7f78c9a097d0d77fe08d3fbc2b846605498822924677b5e88daa6c8d3d13e0e4c780bc8780b853f851808080808080808080a0ffd94e1d9105a6324130aa54d9aca3f401c406a8bb14f686068d5dbb9638b1f78080808080a0deb4f180d663ebe7e5d05cba17184f2ef044d19a94ae6a2f1c1cd3e3e657c52180b86df86b9f20f4d5526366efb98443267a08a1499f85d8e52351327bfa524fdbcb71ff5eb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f9017180a091754f1b8e10f382cc19e5a8c96ef038b475fa158bd1e04e6567167e02dc6a5ea06f54b408e9315f8e09dee4496ca987ffbad7603f7fc84f4ec3ba592f8c82c97780a0100eb27d184c1dc0443d6ec55fdeab20f7ce9140675c2281746391df0b4427e6a014f52e831ee78758b3695a0167aa5381e19c493551029974c21d42f46478b4a880a0fb48ec4c53436e2a7d71993049ed94e474286088ac7a7a6bcd25ab6c8d02bf5980a0539e0d7d147489aca43b7ae9020ef799a262309bcf091e8776358729199ec93b80a034d92b0f37b5c9c13971c28538b564f571822a24fd43a59f82ed2dcba2717444a00e3e7af303b824f31e45c2fb876f7559191a163b6e4de08998808a8b122580cca0a01114b319264aba2f09a69352246cdb01fb95930282eeac81cd00a19e011b57a0a96629470cc1b4bbeab94eff97f812953fbb937232d289538b6054fd2e0d4fa1a0cd57318a4c0b65de49372651fcf729e7acc686ad6d3646823733a620bcc4e62e80b86df86b9f31de60e179bcda8407614eec6db012cef5754e8eee70f4d352c582769d8283b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b86df86b9f3f2a11817ed06c64db4967e35c49d2f11238fec1662b5dd5fbc84060dbd78bb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f90191a0c31f780bb7643f45826138b0473c976478a28692df8197a5f8c315932faf032da0541e8a0c5a185cc894dda2c2dc88b2566d6394ba98cd4d0b78c3ad1180891b5ca0a76b780e86442223f81dde13e0a8c97246015da0d6f93e54f372438a20bf438e80a01f7054fb4d187633ea32d3042f1c73c66deca8e62970a426601012e6d38803d7a059073e5e7f0127ff71dc61952b95f57785661aab65e518cf5a6876677039346fa0c7f3df46dcafbff8e32e215cd2a52a9ed9142a0c4e8b96f2cfe51cdbfe18dc18a026a4515de338de3fba08f0c46c2efb9c07abbc2f4056c7746d1bf5e8d4c025d980a06d6cf913129fd382c1bc293ff26ed943a6e22f332de5953e394851023b8c1ebaa099a41105b7c49c8d700bca64e958c90190cefca7435fa6e6e1bfd92e1a00a1f9a0a76d3ec7b70ab6b9226fdb3d56d715a4794e82ac9276b876a15371641b69125ca0695f984b0339fc6febad462cd9d404b79220e11681c71179b0e413570af2512280a0bc750c898c0cd2ea2eff16c2a8e878138a3ca1f7ef74e0facaf935cfc6db3fa58080b853f8518080808080808080a02d6843e94ec260b053b354a950a68f49be9b063aa07e9f2c506ee8871a1d1de7808080a056d4e97948eab331d2c43de5b4af1d8947779ceaf15dc9c89f2373b591659e8880808080b86df86b9f20aba8b7c0d4205cb2b708159016b8449330afc6e58ddbb2da9005f1e2bba6b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901b4f901b1a0784cc66e2b7748237fd86a57222fc2f54f9ea8041d346a1b0975e6083819953480a05749dab779c2a56af6fd586013b4d942d864396bf91f580055a8e3411cc8934da0c70b198527dc5c20d2e24c19aed082979009c194fe0b7afe0989ece784013957a03de5f22e76ec55b49104051f29ddb65ff55c01d2870ab9ae928086218d5b2c25a0a1b506b20a4acbd00fd38b7499e4523f5c09b089d39453ad1f835c3a4f8086c8a02190cdc2f0c38dca20d82e086a1a551a767c32051852755d27c81b68ba4f65d3a0fc3a5e6dc8945915f5694042d55a9a5bf9d1dd7cc89663045fc802cb8edc7e9a80a00477d87d3e89140645935b5bc70b3fd493d617943c3d6291f6825b4b3a788783a0cd218521e2f96f66865cb1e307f77c7a6cd2975d9fd7bffd5b7d93152f4168f1a0ed2b8b53577904c50908c01fe58287f94d3ee583409ac1fbe1f9f952419c33c6a04d46442ac9a0c429d159d3a00e1a655ce4875075b81bf3d9efaf3b5db8627ab780a0f32ba6c99c6fa57a5b8d82576d058e57d55c341b870e47c049d011700936af61a052b94f22fd37b0f00b519371100e8df62233584184c499f89f30c89a60fb52c580b873f87180808080808080a0b89404efa93a17c572348212d4b2db6056d40790b9bbf9b4f3a1cfc5c0fc3bf280a09e806b23dcc404a63c89514d5e156fa2951fc000ad3714a2ac1ba7556dc8ae8e808080a0f7bf9bb2e690b5a8fc6878487bd87f22772803742f595aa860ea5a9cd5b94065808080b86df86b9f2085133471c540d6d4add866cce2024a9f7c34c4d961a4c87a4a58eebf13f1b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f90171a0d59234d3a9324cc04b75d93da76c5654fa0bb8b69d65384f42269ddb40e05ee1808080a004d6137af4a84f5a09b0e8168ce1cbb41458d9dd5938986f6f11f7edba45b58280a05f9dd89e64a20f49e50ea6cd46803dd82671dbb75021f61731e182241fbf148ba0c62149ae1a16877933da8d676e558b0f56738705b0fd53feca1f714ac30e9eeaa07e87863f843fa46a7743f22a7518fda6ad8e5286a35eccb1c488c5a5bdb59f75a0fce29de0ef58fbd22f61cae8d749afe0c9a224bb180a0e128288d24aabfaba18a0e69da6d576221eef58fdfd2c9812ba4b7f6c329ace4bf1c2d4e93ea4bbf6b883a060f11027d259c199e9bb8796c86c438ddaa22babf40fc20701f229dda00a1882a080b671bda146917894821dc99d9d44bdef280ad6e7643428aef31d4b1f850242a08e6806312dba8eb2f1adc52f7c1af1d1fd1e55538c9b4ad6d2aa1966fedd565a80a0b8dacaf32cd23548b15dc7bf552e141486e449fa93de30dc5d35ee48b29cccd580b853f8518080a09311b145ac442ca4e02f5998a71a824ae9f41c65228ab40c58a8825146abc97880808080a032073d5decbfe8df75eb1048d7457acbba99e0abc3f74fbca41d61247ffb0b08808080808080808080b86df86b9f20640b9304d83d6a7bb5cf27d9e232fe4bf00cfdd72cbcdfb7310ad1217769b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90114f9011180808080a011df0c23235628fdd7fc13352b176e368e956e3cb760b264bf823c75dbd24e82a06228c8a3027c42a41e6d82a5850248aff5b1e5435868bcb3615d463b9b4e113ba05a793e6e10e04a3b41f3f5af8132ecd4de257447a0803e7d87d61380d869a94080a0568d7942cce396012d00aafcb1f2053145794a0d36314088bf2838c3304868a080a007efd10d258ff2006039439f19faa3e4a1e2565b823b3e21ceca2c0ace56a7b280a0779d11fa9213280956bec09ae319fbee199a93bf834422bf21bca05e64140cd4a0e830386eab49c484f170a11bdfcb87ec653e42b164c678b70e46abc6f3344307a0e57116f1b3a31f1c1c9611531e6a04aacc94f2a60147e9fb3cf7c0822bc951158080b86df86b9f397ce7fb78b1e84773a869d577c88dc3c0755717a320a9d5a8625a4e28698cb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f90191a0ec24cf9edd12d17c4782ee6abcbbaf8d5db9fb6a2decfc2d04d925cdab49739ea0f1bdd00acccc251c2fb84eab4ff082d34d1a93a32a4b6e8c6c12696917f8b0a8a051fad23f7245145b60885f7ba45e03a5a8c01bebf8a6b26a24f1577c7a5b5995a026cdffd8c0674dfac97ccbc2fdba8482522e3c98d144b5c28f7b3fb269ec0f02a0e5bc5237260cbfd512b09a883b20f3d9fd0a36a74e022b4449c27b53431e0b7780a04a985d3d45076d8c619d7bbc35265c97d620544afc54e87a19682fefdf860bb280a039f8c34ef16f7203b05666edb7a1bceca970999a209e73dc17c454291e4a12b4a0f4d0e5eb64bb5e683578535ef4df211c3d587d8cfb420a0b17683d874a65c1b380a0b9dccd5dcaa5f87a197222f8fcae435a94da9ccf3833d440ef39a92a9406e7d880a0ea9ef5809977c42de0d94424b13eb3175b8e298ca80166325c4deb7666a5f11ca0d6e6cb3950c875525330f3a3d19815b1ace95016c862989e192fc2af53ae4884a0905eae745980bcd3a6acb2975c4f158b7f22d6f80f5633d434627506e6f9d43580b86df86b9f3e71e4488ef0105d624a6b0b16ec801d2d9018de6aa1c21929d891fa735927b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a043da0363ffee5811dde184f0d445c4992dc01a41fbfde8c3e3ec0256906527118080a091f228a6c2fe58d40a246c7d381d7ce77e2b126af614a085088fdbebc6729452a09dcbd00f50f41a6e45436d21c1f91563e2308aa11c5b2f599bf4e6bc0b36d6b0a0e583fadfbd03cd4d453b85c7895693a62dc530115a062e0eeb4c1aaac5094654a0b3b4096e7319bd91f3a7819e0bccb1d9c053e03f5b2162f124519e9c3eafc54aa07df90435b112e89d253df6cb77a0c721f0d6a1fff50e74049e6cbf069612529da049bf83d7eb100de113f04a521d0f7397fe6b523690bbffc70a37eb382b233a50a095da009d64fce05824a8614ac5256946e55dfbc41b039c1a298863219c5dfc30a05838602786a553aa8bc30878bb6d080ca6a90f2a5b4cb3553362c8b0927be59fa04bf348ed0ee41d4bff1290b59fe0c146bf1baf443cb49b9fe3bfe6f224b0429fa00f4229352ac7e3cd3d71127cbc33343042873e8c358a37747816ceb8e8d4e86ea0da7b85c540f65d2ba52866efb6502ee84cca9a0e92f231e8800c495d08c1cb7ea089acdd77cbbf6e8b36a1a204fb791942fc599debaa1b122ee29bd126f96ff4f9a0cee4f03ef84db9fa04fcbbd70ce4297a49fb03bf3989635d24f5fce2c4f3617780b86df86b9f31c31b996c3dbaf895aef50e6586f7498b62e3c560af29c20f14fd2d4d4940b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b86df86b9f20d0d35ccaef6a626fac8632a2023f66ab81abef1723546fa3284c8f7cce84b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f851808080a05b5dd3da04aaeb132b7833fec91fec6fab296aaca77d8aa4777bc3a13e1b283aa01c2b36472bfe4c11e78e8b6dbb36172fe7c0a957dfb0c3a5f651aa0eef42ccb1808080808080808080808080b86df86b9f20bb64a8c7374e767e7d1e2d3c1047767d59b7cafe1c166e36720404c25075b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90134f90131a0cb816896b3d85a757d2385097f0326ad013fc908bc2facdf2defbbcc9508847980a03b978b628b0b0d1a277f9d7faae817247a97679d580d9e07e7b2c805188c7e16a02083a29944689f20cd874937b7207f72e25c3165f0b43d476acf9579b5779d3d8080a09410921625c5f5f25b8a7675a5ea13df4034c9dd2ceb844ced5128afd9a1b425a0c60b579ef6b7d5b29c1b16c3afccecf6083fdcd3299823df97ff383854650c228080a0fcd64a60011da132f47705244597e44d31b5a78dc02c8b7a689e6be3c46e137580a01e29baed67ad804b1c43b2103a66f8224553dccb1c15e056c6301a4d323f08cea0152900edd5bcf668157f034f8ef0ada59e8da93baf81ebe55b00eb4fec856c9aa08966d631f5b439c4016b2e7ad623a103d8532189274f7069e7fea7a70759f5468080a3e218a01fc71948d471926fa5c33d00bdf84fafa6b2f19f7d950239591066a572775df9b853f851808080a00a65e7ade2dbe8ad7895ea9c5a0ee365aaace2e0328abb4e343a37538e7d929380808080808080808080a0d7bed82a9ea9a97ae567dec98f90ff9a0f6cb4be773564ac23583fe067b9515b8080b86cf86a9e39833b17b4e82d3f1047793732864fd31a44bca86c1dc60ce9c6d1bb6bc4b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901b4f901b180a091a0a6c271c6b59dded5b111f23a45307aabfa6a4bedd52f253de0a3151a622ea00d8313fc495c916b05c4abdab4100c292a11527e78bb2c9d45cef56e3845e155a0fd8ad18159e5fb62d276f2b33b02c5af101dc812d75489e96315eb45b7c4ed8aa023850b76ce54ff91c6aedb6a54cac630d0dce890009b618da8609fdced487d3aa0e2a666360dcae437cb19691a4c3b3c8b5ad1fefb9d2cc4b68e7548d550a85808a01d9eb674b71d52243a062870db2adfaafd3a5de7a8fbad397a29356a9d08b997a0896017d3bce14ed2ea30a855057612b2542358adae9bfb6f6a268350abd3e520a0a0f49f414f22c9558dde7c801fe5a452638117374424a98809d8e60c64bc9812a0ba5ba0eb02ad3c538a1bfc9a47ffea29cd3aa134e1af13bcad68021a068d25bea0393bdc24e5922389103c3d16845020c581b88a8c5f8bf96baf017f0de433685b80a06988d269c60226d983744a6f42fb7f262b9e303050569f2bcd2eeead88124d3aa06c31e6f09e1847241ada5b422c21ed418f1668646809230d59dd867dffa47cc180a084dca62903bf1567946072044aa184857c0baff2d3cfe21784ee8e161e7022ec80b86df86b9f3b7c2e341a9f378bd0ec12835c5a55f29171a6cad1ff857d4e593011e96abcb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901d4f901d1a069fcf863a62d10f85acf08b50bfa36138170c98549534d15429dccf5fa896214a082a5804d40623415ecb6354368918719acca7bfbeb77e567369644d939f5de4ea0266e37f63fd1eb139b489fb8aa245af5aec98d7c073795c1bef3b208b0522dfd80a02e4fc81dac29a33cc9f9c06e91593b325ccce857c09ec1acc0e6714fe79a3145a0cb6cb2e92790489d9c44c2203e0bbe0431e2eabdfa8ac90509e15b52a120606280a0b2e68f6107ace2bd925e5649b5d6ffe71c21361d7c8498070ab8a2d10259e3e2a0375b6726ef9c902bdd9e8139dd9eadea65ba19ac22f600ef688db53b0219db26a04135300c3f4a285cd4d2d2c8db5a68a24b5c681e88ce3d0d287fab911c61c264a080b8d6a73783e4e99f5633671c937a13856e4b26b1fcbab674349db5cf79e3eca05e35a1d37602979a09bcf42e19cd82dbe6f067b1d576eee52379ea3b1270bc60a03f67a18b029d50da29dc062c7e7b6ddb23559097233e9140a91d45d6ed3720e1a0526ad9191473b96c0c4476defa737a21306c231f87565ece7c4eec1350f7b27da0c845153cd3ad3a2ca744893c31bcb6df31701840f434e60d90ad23e6462308f3a00c7e36903a0e0c2da3de2c6fc4a262975c12e2fd955501322b21a39eb42f921c80b86df86b9f3bcc406743a58b75a490584e6284cf5fe2559f6a75fbae74f3e483d042d2a4b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f9019180a0c3fe08a395f1a008042793d57e8bcb4c449e954dbb11a9504475cb0118904487a05c5478fa68cc842e9416f54107a53d5077d5fa46693d065962cf617c97801faa808080a0b8592d49003e3ba1d7a33b4a6632b56ecc73fe19e685f697a2e1d6bf1238a23ca0ef759d71e49825d7a78940e44a59fb02408235f43f7b94d4069a415e106ac61da0e67743e7294bf835ca86e9146ca27445485cf829d401e672edd9ad1a212b25e8a06734118930a1a96ca88906badccafad33fb26e4bf50a4e1eae3a2afe277647eda08bd6b2a67942afa5282748c888c7f3a625caaa3c40688ef18f6068a9c2bb0e15a00b8f168522167ef4e9e5ad2c80a0c8824ea7df2ed68abd6743c00b0071acb963a0f21599df0ab8f1f0952a7afb703804e02622adb9822272d4075baa5c07a52300a0ef2f9907fe14ef7f0d56e6e3ad5c6647c7c70342391b2281673b547afe885650a02328e9ffee297e77c8914a8157f9fd69cc28e3043c2f9e49e1242857e7139a75a02b1cfcb31c458297b5c7c8b089049030623aa7f6e75085e8d05e611038b2885a80b86df86b9f3901a8be41b4234258c3c16640f5b206348f163618dab81a48af8c25c52e5eb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f9017180a03b59e76a16be4fa0a74b6863875ae0e85885816dbc15c86a729bca054a9ab28ba0767174d8a24087a30e89ad6c6f0e3fe18b32fabaf734547987df495d6efc8ed580a0bf5fcbd7e00e896ddb139c85964035c7e697f3558c730bf2a2eb46f040150716a08ba287e1a5422a367fe98d6f1e857425fc536af4c478fac563855d14f701fef8a019a6332801b6d71206630be24714d079ad16f1cb258ae2ec28707ba50bbb9fe7808080a0ed63543692a9365b4eafb5bdb27c5991175554f934eeb814472e9428f355287aa0efb10858a38b9b8fedc66b66d92785d78157930ba78f3bfaf7477dca4acaf097a004592d7d4070c69a1e1b97ccf0cb46a0ba55720c4a6fdb0eeaca3dfc310118f9a04d5029f5b150d602ccb76526251c4c628088440f6b83e155d2f517bfc625ad32a06f441a432d6f88f04e396529d89f2110e5c3fb651817e4349e36d3f3feaef62ba069e8b128325461f30c82c201d88918fbe2d3c3fea924ab5eddc656a5be6e659c80b853f851a0c03d2f56dc8b2638e52acf3c207e2d628f7650201891aa28d8fe8d0e7c7f5eba8080808080808080a0730d1097c6bb697e4e2a2d73ef4d106588b23a8bdefef82b421f8bcd54e63f6380808080808080b86df86b9f200311a9346f1c2ea6953daac0fbff27ba27655172a8c278f74b9c7f9eb1c6b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f9017180a02afc12e1b94474044c1871c3882da75c1bf614dae167cefe714c02402d64218da00d909a01eb67ec1622619f5f66b23655c1d50f9c830fbb3f28e33db40c8452dba0e32fa89e1f49a5c3a467e78d552bd346abb7e7ea15bb80a4178326f6d441786fa06f577e7f38874b6abf29e048f62cfdf1332b1e01a01ace868baca911827e455ea03011640f2086070e6fdd3414b950beef8e32d077f8f8318c1128d8d48bcf72df8080a06a355880cf62fb512585fc2beaf38e314865f5985ef0f896ee3bad4e92f87b8480a057d1d072364ec3af8597412e56f8647991a350f7bcbeff5226a2805b9476150ca0276209cd00bf6d755d51bfd144fcf704842bae1c6acc4d221e5125ffd3c7e2bfa057d163a1c750cd278e95348b6b6636e927bd643aa6b1863f2409b79346c833ec80a0801eefac58c79669024de408711e913d2a8b6db2bfc5175ce70274ae5217e121a0e1a24e8f85f5042b3f908fea8cef5cf79568f5d0b6c6c8de43a402c51ef8d4bf80b853f851a05a15c309e74617c6cee063f21f5722f3cc16642e79d0ab15c17acb43a98e0207a0d151272485c5d13815021a279e33773ca9a2fa0cfb1788095d030331611f9502808080808080808080808080808080b853f851808080808080a085d75a84a468b9a46a027b5e215938df892b594056321a04456660035e6fab9a808080a0e17c7b4ac59b2075ede6bb08bb3c0d68dbcc3b8fddf24346dee0b8422e1d7172808080808080b86cf86a9e3a6a56f8f4e5453ad97402efd91a70e81bb57d65537ef5b89c0093b5649fb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901b4f901b1a000337e959e17626dfbf7c0fa35f5e68d489ebe60c7e4c54b6d0051a03e4d0b06a090df04317b8e259aa7a309950d249561dfd59f6d2c22f9e8521fae2ea36a9e1ca00e3e018a8ea875070f3e1ce81d900f38105802f1eb93386942b22ba4a6569eff8080a0f4623508165d195642ccc1e547ce8e22346450c9c2c886e35d4ac7fbc8162a1aa003dd10d55f9fe028c27e1f5e429431169b1e6659c50c371248a6ace85418d447a0146694f5a660004a6cf62d473337534ea4076a2a2a9376927c02f1d26643fcd0a0f0db75f9565eca32c7737e14d3ccf592f3df253f960934c51bbe296a57ce3531a0337a5385ccbf234ac7827e69309b176f6b475c54deb8bd2c55f7c6817283a96fa065eef8a3848fbdc3be702250932c5462c779a51935cbb69e036708522816fc0d80a049e027fccd3c7f3027040b4bfc05d127250cf921d92f740ab3d497d91e308067a0fa4062ecb1de1f23f36a94bcd974edc032888e9699019994f2d7514b3db12092a086cde00f90a1edd944d5dd0d3bfaa6158ea0d4742c9eb8281a9a409d0090cf73a0fe0bbd4eb5d952f4931ac80bd8dfbaab14e156f93687fb96ce6179c1513f96ad80b853f8518080808080808080a09801442cc81cdb9d5b1f8a0c1802f80a1076e949afdf623930b5f87ff5d1a5c280808080a0389b2745f9c939f63d45f4304681db80032c9f5b6440e54ca2103b36bb7ac7e7808080b86df86b9f203344369bfbf1d6720d18784dfc87caa01ec3f6dd1a169a91dd8861ad08c8b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a0137290e967dba7d140b7669e7ddb8ed5d9509d58d706d7d1e7fb9d46ae5007bba03a14633eb6cf14a2c91ca69887b2a3bb1833698956b1da2a6981a393264134d7a03b7e9e7a4d0bf6b08e2c3250e9cfa5e0b23d043ec4b63553781370f988a19c99a09f6334b231f52d510c00eb587afab10a4cc3714f6baac7570f26074395f23acea0b8584f87ac1ac3639de85dc52175372f0353f54d332297898bc8c4be8e4c2c48808080a0d37a61d644181cb3a4b70cdb4af10eef17364df0a5a4a495e3ec5eaaca4d5519a0e2c0b2c832ae691e5939be19e921a479c349b6b4a17b9df9c9f20e09bd477f0da09a708c683f5a117450941384057188bf4b96cb862726e987591f07009069a647a00c63adf470fe81b503ebeb40db0316bef2e72dcc9ac404e981c937b4f778145d80a0490ddf3c47bfb8f3f74fbf2bad39113273df047f81102c23cc7e9ac74394851b808080b853f85180a063f8886c3392f1d12d5a234bb1c6c2712f3da3f8b7bd4bb3714d0685f39d797f80808080808080a0554f922466d9390a0397b937368c00e0e5306a9bace8c5e21edd7f64b4f3d75580808080808080b86df86b9f201f532a777aaaca3508b99b8761248197676d835a7d9ffdb0209d65c7f34eb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f90171a015bb9fe6cad091389b2e7c98df652d8695f158d6cdc66713a1a585d43d22dae4a048b3dac4a23b6433d4b23ed909093cca2c2186d2ccb74fba5746c3b0496531a6a02d34644a4d20529d90bdad3654eca8ab196b9150f645c12d7a5959ee6d646cb7a08b302fd025921337dc99d661fb2c2462bcd7b68d2210324319646411ebe9e672a0181ecc086f0bf9960a0315f069d8c4872d96e79d1a8feb5471d26e3a83df60d6a0882317ed7e68e03d62edf0cb2bc37ba3603dfb7e92a50b838e5e2d63eac0f37580a0e1e7e62b09c3b475f04ac87362af811205a2b38b4d8ae5697eb954e9ec5d1a3aa0c671024d36601cdaabdd28e2cf1f7da1b573b69d172702552acc25e266aee3f1a05b4c7fbcebe90c77c42192100a37463e1c266909e399143557ed37d556ed9c2d808080a0394a3ae5e35470cd3c5adef115759ec430ce3433beb2cf59ac592de8899fa50b80a01be60384566deb4a2752ca439a59a58e2e4ebc3689f5d3f0556a1f6180a3936680b86df86b9f3c6b0de13d5aaa3d891519294f7bb37eac1adb6b17846bb6b162a831fcfaa2b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90194f90191a06fe91036bafeb143b045e11e67a9f156170d8d4a9100fe18487d5b39aa48c2cda094d112c9de3698a5ada677078b80b552e0f5495e3faeeea0d3bbe25a193b4c6fa03cb718baa2d9a1eed30a203af47e8c0328e5dcac504bcb6b4bfe0ce6faab118580a012af4309bc2c87cb49eb53cf388ba4c1d00df640ab056c012ed002c5a8700841a0a450538047d4c3236407cf1802df0cf4ba0e2f665ab884106041697ca95067b580a0ece83cf5a8e7b8c12995360e83a0a6c8b5ea16b218f7322a4035632604de2c42a0a983e14c14fcf5e9b5fed874e7037dffeb2bbc6de52e6ae90e8f98736f97dd3d80a0d37049809056a96f55e9bcd36bae34c4bddf96dc5dff7486a76d3b85d504d2c9a030a570308f12485fb7f2d38df0ae119c5530a77d6ea48eee911bbbd672522e5fa0179639d7bf63f763c38a31035ab7352360fe3461877e2e682d7abd7d3a5b432ba009e305c8c2426ce737aafb73efa4fa1a35876b60c566d9ef96724b65a6c40104a0853de6cf5dadb848af096a379a8ce952bf520c7e50cbf1c2ba1074d4ceda47828080b873f87180808080a0c32368e0c1208cb24129741fe1ddcff09cac6c641598993be77ba69464585f9b808080808080808080a08fbc2fcabc732408ce1dfbf24396e3267c6470b695760c5e0610d9d910a87d2ca0451d00958a8b92ff06bedd9123496c617194904ce89f2d7375ff740eb7aa8f8980b86df86b9f2023da307bcc455203ed3a05c5429493970f9b39605865186a9d3fec220834b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f8518080808080a05607e8fb330b2d1ed056707fc8d00ea228f8190c0a6fd390f6ff200c1cbbdd7f808080a03084d938c41225145c0b6578002cae33d8ebfae40b0959ba9a1951b35c4cc08c80808080808080b86df86b9f204b5e25dd7ff2966e30f4935815aeaf859bb0721bd854fade6a2e323ea350b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b853f851a0c24767ec4404f73347f6069be9948058b815d3e9eb90c9ee9f1ee9866fb30d588080808080a0d88ad1c724c5f8d038c48f617ee33ced23fba0dbf81dac0bd57bca2e39387f7180808080808080808080b86df86b9f20cea3fa0c89e2812b208e589bbc959979848dfa995893971f2e5c98b341e3b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b901f4f901f1a0225eb3943f97d304032c7c4dd70130b8fb80dd7f481a5531f8b6315dea39b0e7a0649e2ba3f3842504c8650d8aaeb7fad0f315699d2834df0a54d8d2db24753d5ea09e1ed3dbc08a4383ee28467aef33494fc8e5bf7fd0c5b52d076fc5b723562ab380a0106f484f80e77213f5379392ef8a7bfcec0231ce94a8dd1943ec2dbdb03deac1a0a8bf16b62e0eaeb36a67f4a3afed213e2c9e06a637e5988c2a7741a0da0ee3fba01ec99e877519d95aeca2de7d77b53c6522631f979be7ed0c4f1151326880e563a0c4c3e38862317ebc0e7f21781cf0ab19e1a344252eb84c5e1c91cb678003436ea04aad01a383785d69251bcc34612720e46259e806dfdf4fd451358d2792c39c6da016f04031b4ad4c4153f44f0c41084ce66922671a580940c559b3a630d4cbc28da0289121345ec54c1569b53092285e2d235de23654b17e05d1c76926e57da1c69ba04db2d0fd7ec7f0735486176c3d6c7ce26d1756c2411ed9116c754c64427f2e7ba0f199c68be3e098d40c5b3889f47ff25b54401bf124864f170ed2f4e07acd62b5a0628cc546733bdf539f56b75064ff7d6e3d12f455b72b13319a07154a25ada32aa029d860ddbed433ae46d11d15ef6214dce6ade7a994bfff18ba035e56b384b44ea01b28ad942763d831d0530d1075b31ddd69df6f5ace94a29276d78a2ddda8c06380b853f851808080a04d025ad2bc72da29292834c7813deb538db0238e7ef9d77bb3a0a9cb4e59f36580a06054aef18119e8e284074d848360250e20f331e1aead0ae88b734588d88999dc8080808080808080808080b86df86b9f20e6236a30bc44625175012103dbaf8173e9eff7ade48ec676e30e0c0bafffb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f90151a0f8839732049cb0572c5aa68f921ef58c56e59eb342d12cffc48624ad3c3f68098080a021e53c81322450dd9262a045df407694d5656d904ce4e8a5ab46888a495fd35980a0ec0ca959cc444516e81ef48b5d6fd61975fc7ef67cbfb384e29d1f3d71c66730a01ae1ecc90f9a59a26cd60ec9e571f7ca92723ec0132cd8626c032bc919901c2ca0d187343e755afa32a24a1666be665bb86699efde38eb73b64d0e282cd82a7eaba0e658a8f5ab2d26e5f9e6668343a02ff7753b00f46cfde483e8f8b08096fc7b6fa0a8b010bc5a052fbc138df25b69bad17f8a445f33f7e830021048319c613280a2a0cbe922913210fc6057596ff3d46cb276860c2c52326d010b6af348180b0ca4fd8080a0f294692620f4d84fdd3a3f51c1d4e10441464288bcc60ba75c100460ac211b9ba004f8b375c63c7ea628ca2c8661401d0f3d462daa6525bd5b149cceeaa1c119ca8080b86df86b9f35ee85c6b06c9053a4b98c4cb731f2b1b71cff867e76fd8736442d2143eb8ab849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90174f90171a02bc709b0fc1641bdb468239f376f86c843168f41547e39c63ef04a9aff508a85a0ff19a4504717f32e6fff26091883afb6bab6438beded341dfbefb2251c059811a0760a1b4a9eb4f081ef72e144b25ab3db05598f535384670b1a8e25f1059c22bf8080a06ccdab6f9d2770da8a308e07cb4a07d4a12674d014222817318c72e3613277cda0ae5267828ebce9aa957d1a6b272f559c44f2cba3b7008fbfefc842a791f4c143a0c9e683766a0eb5a0eb5da183f8cd579f2c146ec6fb9b2d3abcf1d4393c0411c9a09f71bcec2938d9946c513bc9cb84e1768b7869396456eee12f0b951af7a0c7a2a04a5ee9a136fe9980f1f8319e1ac7460bf8f5db6dae3ba356f4a20a99bb3bf50780a0024848a34a80ee2bb903cae9008132dd6fc011ee60b0e58ebf82d227f995ab8780a0ba9ca5e9fa41efa29661f0cfb1c4e831de448add77d00432eed30f0f49ed775080a071c5a75a41efda864509d5716baccd89c8823b3515f79aa89b679f4efb93cda880b86df86b9f390f014c1799b33ea519662dee752d919203cff7ed344ebe988eafe7a74f8eb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90214f90211a0468a6b3e05afd79b566cbee6eba1fa6ad34ae799ac5b86b6370613017d1c7539a0dd9e2c7f863534f95e6ed6daefbc34e1e2650016e413e7efc2719230203818c9a0433bddcbe20b251fd158209a61fec8ef3fc0b5b38522560d2ab69d9493fb1971a0a5c78cdfe9287cc805e5704233ae25bdce00da01b7e9f5f36d5054fde871469da04519ed0de697fc63cec9207602b3a0027087825105993fe6a234c99e6b7d7793a04bca7dd1161ca6bb490c2c0c07f583d3f9aeb5c294837ee499f50cd26036a2b8a0477e39d273403623a0a5477dc525cbfa9a09e7580c9b6fb2203c643372b4a786a0c4801ccfa6c1814ce7bb0890a78131230c5fe40353209d424d75a0f804c1dda4a0d5f3272370a20b3bcec4784ecce30be9d9d62ff8195d34e3fd92e33197d2c17aa08a816a4b44a1c13dd9f5f7c3c407ee6e36949f325e7d5d8f35900f3692f1a316a036af0e05840450dbea4f543d5581d3cae4e468ef960c12a22e18bf67c50dfe83a0d832f4f9777a6e791a7a3d63e7650e05b53e9b6d99c74ba5f49105fd3f8bbbe5a0934949850d269ab9f76b37a427d591ce3598112e0983d1ee99a623edd58e07eca04c772f389725c91ca3b154bfd9b95e3e00aff6c11a18dc6cdbf5cfb9f22f11b5a040dd7265b626a64fb3384c325aac214ba5639aa82e309e5c275ce4bf14e81598a0a2b0f267c255f08e53ec80ae74d06a2234d81c6b501c59db60cf3db90de813f280b901d4f901d1a064b86530cd31e3d2ee95aad792e35d8d17cdde2a5abec811294c8461c9f81b29a040d9b2f3f5232f7e0be68996f0399d7014f92842555f850db680d1f2221b347580a01db202e0e693865ed50becc149de04d147e26129d9cc1743de62fc322c2c0ba5a013672bf624e0f402f67621442fd8f79a69af65d359e2415bfa9a428cfd7ca86fa0a55242f735b67474f1b2c491c8302eb74df7b8e614cf8f979f5afabec6a02501a026f70c59dedbf82b239f9f32a26be819aff170b3a07e6b62b0a60b3e6f279c60a04b9e1098c8972461be3b397e3e4e9d194c4b003b48b59ba3ef2d028877fdc28ca06eaaf70acb478a6ae7dd7b0fa8fbe44497ef2c2633c62f2768ae5f121b91159d80a08b87220aabd737038ea9896e2995dbb30b064af85681da93ef3e49c1d0a4a4d5a006bcd6b8b45589724a5549d3f8510373cee176329cd40909ff21e790b7ef5ac6a050ddfbf04fee2806a3fdb03ceb942eeff85b38423101e6b2e0a4b1e498ba8475a0b96d1565c226bb09ae8aadcd571ec4dc26f091cd83286540a2a95f31e268d81ca010fae7d5464c397ee5fc99bf84f8a0e2f9154e744d3cabd0e00afafb600e96ffa048bb8774a0d9af7d75297468b8dd22ffb1da725769b5263367a7538ae7a8b33f80b86df86b9f3088f20fe3b28f3bc2669604234faa79131291de35dc2cb41c5a84e48a94ceb849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470b90154f9015180a041fafecdfde6baa6fb28c89b2774892f4b6aaf26c799e2ffaca823b867134c97a09f71eec594649282f08270dec0de0ab9b5ea8cedeac15144672cea6a8560b224a0b2104abfdb21e081db0c1ca2924f2a8b2a015c5754ae994e027052c8c38c58b8a0c7499b74dde69e03085fe5457c4b124be9121675b9d1b0716c44cc925fd76ec0a03f09f8725f5b5129d66b7e2d9ddacf6d745a56d0fe2164b58d4fcbd4605fe19ba036ef01f299f88b94eb1295b376ef830692ce8f7bdc5ab1232d51e8ef09a5e68aa0ef710dd921b3847d2d231682a9ca5a4cc2c327cb074048d5eeca8a54102f20f28080a044fa0fd1de762d6ff88bd7fd48cab94b8955f52ac93a0d721e1dce65a7cd4b0e8080a07a9489938ebfb63ce62253b5ccec316615d43c2dd3bb8a5d0e1c21605dabde9780a0efe70baf3986e06fe5eedff04b4811a8c3cf613e8704bfa0c8a7b3b142ceced180b853f8518080a04b7a63fb80e72be15d2c927abc4493e92fd79e44c60a8dd76282e55491ce407480808080a013acfe7d9abe99af649dd46bf2bbaf799895db360607f1619e20595fa97b7785808080808080808080b86df86b9f20380a2da2d0c7cdce64d85c6653e7a14581980d1e19872594c58e9ae74ce9b849f8478083ffffffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 +shard_post_state: + exec_env_states: + - 2ee5dadde6bace65c1ec0983e7a6af6c4ff324fc6e782b88881c9332ac29cbaf