From 77c7ca7f0d4264c44143fa8c280d614a77069e24 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 5 Jul 2022 17:28:18 +0300 Subject: [PATCH 01/67] initial work on wasm3 integration --- cosmwasm/enclaves/Cargo.lock | 201 ++++++++++ cosmwasm/enclaves/execute/Makefile | 2 +- cosmwasm/enclaves/query/Makefile | 2 +- .../shared/contract-engine/Cargo.toml | 1 + .../src/contract_operations.rs | 22 ++ .../shared/contract-engine/src/errors.rs | 35 ++ .../shared/contract-engine/src/lib.rs | 2 + .../shared/contract-engine/src/wasm3/mod.rs | 343 ++++++++++++++++++ 8 files changed, 606 insertions(+), 2 deletions(-) create mode 100644 cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index e854294b6..57d1d8fca 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -37,6 +37,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -99,6 +108,29 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +[[package]] +name = "bindgen" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "clap", + "env_logger", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex 1.1.0", + "which", +] + [[package]] name = "bit-vec" version = "0.6.3" @@ -184,6 +216,15 @@ version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "0.1.10" @@ -215,6 +256,17 @@ dependencies = [ "generic-array 0.14.5", ] +[[package]] +name = "clang-sys" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "2.34.0" @@ -294,6 +346,12 @@ dependencies = [ "cipher", ] +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "curve25519-dalek" version = "3.2.1" @@ -430,6 +488,7 @@ dependencies = [ "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sha2 0.8.2", + "wasm3", "wasmi", ] @@ -496,6 +555,19 @@ dependencies = [ "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", ] +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -552,6 +624,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "hashbrown_tstd" version = "0.9.0" @@ -583,6 +661,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "instant" version = "0.1.12" @@ -621,12 +705,28 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.119" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + [[package]] name = "libm" version = "0.1.4" @@ -648,12 +748,34 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ea2d928b485416e8908cff2d97d621db22b27f7b3b6729e438bcf42c671ba91" +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + [[package]] name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-bigint" version = "0.2.5" @@ -732,6 +854,12 @@ version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -863,6 +991,23 @@ dependencies = [ "redox_syscall", ] +[[package]] +name = "regex" +version = "1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" + [[package]] name = "remove_dir_all" version = "0.5.3" @@ -894,6 +1039,12 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1283,6 +1434,18 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + [[package]] name = "spin" version = "0.5.2" @@ -1338,6 +1501,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -1424,6 +1596,26 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasm3" +version = "0.5.0" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=3ecaba2#3ecaba22e5a37631c71720a75cc7d4fcb3b8f858" +dependencies = [ + "cty", + "wasm3-sys", +] + +[[package]] +name = "wasm3-sys" +version = "0.5.0" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=3ecaba2#3ecaba22e5a37631c71720a75cc7d4fcb3b8f858" +dependencies = [ + "bindgen", + "cc", + "cty", + "shlex 0.1.1", +] + [[package]] name = "wasmi" version = "0.6.2" @@ -1492,6 +1684,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/cosmwasm/enclaves/execute/Makefile b/cosmwasm/enclaves/execute/Makefile index e05853c1c..71f106427 100644 --- a/cosmwasm/enclaves/execute/Makefile +++ b/cosmwasm/enclaves/execute/Makefile @@ -92,7 +92,7 @@ RustEnclave_Link_Flags := -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfi $(ENCLAVE_LDFLAGS) -Rust_Crate_Source := $(shell find -type f | grep -vP '(\.so|\.o|\.a)$$' | grep -vP '^\./target' | grep -v Enclave_t | grep -v Makefile) +Rust_Crate_Source := $(shell find . ../shared -type f | grep -vP '(\.so|\.o|\.a)$$' | grep -v '/target/' | grep -v Enclave_t | grep -v Makefile) Rust_Target_Path := $(CURDIR)/../xargo ifeq ($(SGX_MODE), SW) diff --git a/cosmwasm/enclaves/query/Makefile b/cosmwasm/enclaves/query/Makefile index 0e4d69aee..92f78fbca 100644 --- a/cosmwasm/enclaves/query/Makefile +++ b/cosmwasm/enclaves/query/Makefile @@ -92,7 +92,7 @@ RustEnclave_Link_Flags := -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfi $(ENCLAVE_LDFLAGS) -Rust_Crate_Source := $(shell find -type f | grep -vP '(\.so|\.o|\.a)$$' | grep -vP '^\./target' | grep -v Enclave_t | grep -v Makefile) +Rust_Crate_Source := $(shell find . ../shared -type f | grep -vP '(\.so|\.o|\.a)$$' | grep -v '/target/' | grep -v Enclave_t | grep -v Makefile) Rust_Target_Path := $(CURDIR)/../xargo ifeq ($(SGX_MODE), SW) diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 746ba1714..322839440 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -38,6 +38,7 @@ sha2 = "0.8.1" bech32 = "0.7.2" pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } +wasm3 = { rev = "3ecaba2", git = "https://github.com/scrtlabs/wasm3-rs", features = ["build-bindgen"] } lru = { version = "0.6", default-features = false } hex = "0.4.2" secp256k1 = { version = "0.21.3", features = ["recovery"] } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index d22534743..74270985b 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -352,6 +352,28 @@ fn start_engine( operation: ContractOperation, nonce: IoNonce, user_public_key: Ed25519PublicKey, +) -> Result { + crate::wasm3::Engine::new( + context, + gas_limit, + WasmCosts::default(), + contract_code, + *contract_key, + operation, + nonce, + user_public_key, + ) +} + +// TODO remove once the new engine works well +fn _start_engine( + context: Ctx, + gas_limit: u64, + contract_code: ContractCode, + contract_key: &ContractKey, + operation: ContractOperation, + nonce: IoNonce, + user_public_key: Ed25519PublicKey, ) -> Result { let module = create_module_instance(contract_code, operation)?; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index 0f649127a..c2e9aec4f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -12,6 +12,7 @@ use crate::external::ecalls::BufferRecoveryError; pub enum WasmEngineError { #[display(fmt = "FailedOcall")] FailedOcall(UntrustedVmError), + /// The untrusted host seems to be misbehaving HostMisbehavior, OutOfGas, Panic, @@ -29,9 +30,12 @@ pub enum WasmEngineError { /// The contract attempted to write to storage during a query UnauthorizedWrite, + /// The contract tried calling an unrecognized function NonExistentImportFunction, } +pub type WasmEngineResult = Result; + impl HostError for WasmEngineError {} impl From for EnclaveError { @@ -69,6 +73,37 @@ impl From> for EnclaveError { } } +pub fn wasm3_error_to_enclave_error( + context: &mut crate::wasm3::Context, + wasm3_error: wasm3::error::Error, +) -> EnclaveError { + use wasm3::error::Error as Wasm3RsError; + use wasm3::error::Trap; + + match context.take_last_error() { + Some(wasm_engine_error) => wasm_engine_error.into(), + None => match wasm3_error { + Wasm3RsError::Wasm3(wasm3_error) => match Trap::from(wasm3_error) { + Trap::OutOfBoundsMemoryAccess => EnclaveError::ContractPanicMemoryAccessOutOfBounds, + Trap::DivisionByZero => EnclaveError::ContractPanicDivisionByZero, + Trap::IntegerOverflow => EnclaveError::Panic, + Trap::IntegerConversion => EnclaveError::ContractPanicInvalidConversionToInt, + Trap::IndirectCallTypeMismatch => EnclaveError::FailedFunctionCall, + Trap::TableIndexOutOfRange => EnclaveError::ContractPanicTableAccessOutOfBounds, + Trap::Exit => EnclaveError::Panic, + Trap::Abort => EnclaveError::Panic, + Trap::Unreachable => EnclaveError::ContractPanicUnreachable, + Trap::StackOverflow => EnclaveError::ContractPanicStackOverflow, + }, + Wasm3RsError::InvalidFunctionSignature => EnclaveError::FailedFunctionCall, + Wasm3RsError::FunctionNotFound => EnclaveError::FailedFunctionCall, + Wasm3RsError::ModuleNotFound => EnclaveError::FailedFunctionCall, + Wasm3RsError::ModuleLoadEnvMismatch => EnclaveError::FailedFunctionCall, + Wasm3RsError::RuntimeIsActive => EnclaveError::FailedFunctionCall, + }, + } +} + pub fn wasmi_error_to_enclave_error(wasmi_error: InterpreterError) -> EnclaveError { wasmi_error .try_into_host_error() diff --git a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs index 5fab47759..3b6696c8a 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs @@ -2,6 +2,7 @@ #[cfg(not(target_env = "sgx"))] extern crate sgx_tstd as std; +extern crate core; extern crate sgx_types; mod contract_operations; @@ -16,6 +17,7 @@ pub(crate) mod module_cache; mod query_chain; pub(crate) mod types; mod wasm; +mod wasm3; pub use contract_operations::{handle, init, query}; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs new file mode 100644 index 000000000..695517ac2 --- /dev/null +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -0,0 +1,343 @@ +use core::ops::DerefMut; +use std::cell::RefCell; +use std::convert::TryInto; +use std::marker::PhantomData; + +use wasm3::error::{Trap, TrappedResult}; + +use enclave_cosmos_types::types::ContractCode; +use enclave_crypto::Ed25519PublicKey; +use enclave_ffi_types::{Ctx, EnclaveError}; + +use crate::contract_validation::ContractKey; +use crate::db::read_encrypted_key; +use crate::errors::{wasm3_error_to_enclave_error, WasmEngineError, WasmEngineResult}; +use crate::gas::WasmCosts; +use crate::types::IoNonce; +use crate::wasm::ContractOperation; + +type Wasm3RsError = wasm3::error::Error; +type Wasm3RsResult = wasm3::error::Result; + +trait Wasm3ResultEx { + fn allow_missing_import(self) -> Self; +} + +impl Wasm3ResultEx for Wasm3RsResult<()> { + fn allow_missing_import(self) -> Self { + match self { + Err(wasm3::error::Error::FunctionNotFound) => Ok(()), + other => other, + } + } +} + +pub struct Context { + context: Ctx, + gas_limit: u64, + /// Gas used by wasmi + gas_used: u64, + /// Gas used by external services. This is tracked separately so we don't double-charge for external services later. + gas_used_externally: u64, + gas_costs: WasmCosts, + contract_key: ContractKey, + #[cfg_attr(feature = "query-only", allow(unused))] + operation: ContractOperation, + user_nonce: IoNonce, + user_public_key: Ed25519PublicKey, + last_error: Option, +} + +impl Context { + pub fn take_last_error(&mut self) -> Option { + self.last_error.take() + } + + pub fn set_last_error(&mut self, error: WasmEngineError) { + self.last_error = Some(error); + } + + fn use_gas_externally(&mut self, gas: u64) -> TrappedResult<()> { + // todo implement gas consumption + Ok(()) + } +} + +macro_rules! link_fn { + ($module: expr, $context_ptr: expr, $name: expr, $implementation: expr) => { + $module + .link_closure("env", $name, move |call_context, args| { + $implementation($context_ptr, call_context, args) + }) + .allow_missing_import() + }; +} + +pub struct Engine { + // WARNING! + // This box is dropped when the Engine is dropped. You MUST NOT use the pointer + // after destroying the engine. Using this pointer in the `host_*` functions + // is only legal because we do not provide direct access to the `runtime` field outside + // the Engine. We also use a RefCell to ensure that we don't access the Context incorrectly. + context: *mut RefCell, + environment: wasm3::Environment, + runtime: wasm3::Runtime, +} + +impl Engine { + pub fn new( + context: Ctx, + gas_limit: u64, + gas_costs: WasmCosts, + contract_code: ContractCode, + contract_key: ContractKey, + operation: ContractOperation, + user_nonce: IoNonce, + user_public_key: Ed25519PublicKey, + ) -> Result { + let context = Context { + context, + gas_limit, + gas_used: 0, + gas_used_externally: 0, + gas_costs, + contract_key, + operation, + user_nonce, + user_public_key, + last_error: None, + }; + let context = Box::new(RefCell::new(context)); + let context_ptr = Box::into_raw(context); + + Engine::setup_runtime(context_ptr, contract_code).map_err(|err| unsafe { + let context = &*context_ptr; + let mut context = context.borrow_mut(); + wasm3_error_to_enclave_error(context.deref_mut(), err) + }) + } + + fn setup_runtime( + context_ptr: *mut RefCell, + contract_code: ContractCode, + ) -> Wasm3RsResult { + let environment = wasm3::Environment::new()?; + let runtime = environment.create_runtime(1024 * 60)?; + + let mut module = runtime.parse_and_load_module(contract_code.code())?; + + // TODO link to implementations + link_fn!(module, context_ptr, "db_read", host_read_db)?; + link_fn!(module, context_ptr, "db_read", host_read_db)?; + link_fn!(module, context_ptr, "db_read", host_read_db)?; + link_fn!(module, context_ptr, "db_read", host_read_db)?; + + Ok(Self { + context: context_ptr, + environment, + runtime, + }) + } + + fn init_fn(&self) -> Wasm3RsResult> { + self.runtime.find_function::<(u32, u32), u32>("init") + } + + fn handle_fn(&self) -> Wasm3RsResult> { + self.runtime.find_function::<(u32, u32), u32>("handle") + } + + fn query_fn(&self) -> Wasm3RsResult> { + self.runtime.find_function::("query") + } + + pub fn gas_used(&self) -> u64 { + let context = unsafe { &*self.context }; + let context = context.borrow(); + context.gas_used + } + + pub fn write_to_memory(&mut self, buffer: &[u8]) -> Result { + write_to_memory(&mut self.runtime, buffer) + } + + pub fn extract_vector(&mut self, region_ptr: u32) -> Result, WasmEngineError> { + let mem = CWMemory::new(&mut self.runtime); + mem.extract_vector(region_ptr) + } + + pub fn init(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { + let handle_wasm3_err = |err| unsafe { + let context = &*self.context; + let mut context = context.borrow_mut(); + wasm3_error_to_enclave_error(context.deref_mut(), err) + }; + + self.init_fn() + .map_err(handle_wasm3_err)? + .call(env_ptr, msg_ptr) + .map_err(handle_wasm3_err) + } + + pub fn handle(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { + let handle_wasm3_err = |err| unsafe { + let context = &*self.context; + let mut context = context.borrow_mut(); + wasm3_error_to_enclave_error(context.deref_mut(), err) + }; + + self.handle_fn() + .map_err(handle_wasm3_err)? + .call(env_ptr, msg_ptr) + .map_err(handle_wasm3_err) + } + + pub fn query(&mut self, msg_ptr: u32) -> Result { + let handle_wasm3_err = |err| unsafe { + let context = &*self.context; + let mut context = context.borrow_mut(); + wasm3_error_to_enclave_error(context.deref_mut(), err) + }; + + self.query_fn() + .map_err(handle_wasm3_err)? + .call(msg_ptr) + .map_err(handle_wasm3_err) + } +} + +impl Drop for Engine { + fn drop(&mut self) { + let context = unsafe { Box::from_raw(self.context) }; + drop(context) + } +} + +struct CWMemory<'m> { + memory: &'m mut [u8], + _phantom: PhantomData<&'m mut wasm3::Runtime>, +} + +const SIZE_OF_U32: usize = std::mem::size_of::(); + +impl<'m> CWMemory<'m> { + fn new(runtime: &'m mut wasm3::Runtime) -> Self { + Self { + memory: runtime.memory(), + _phantom: PhantomData, + } + } + + fn get_u32_at(&self, idx: u32) -> WasmEngineResult { + let idx = idx as usize; + let bytes: [u8; SIZE_OF_U32] = self + .memory + .get(idx..idx + SIZE_OF_U32) + .ok_or(WasmEngineError::MemoryReadError)? + .try_into() + .map_err(|_| WasmEngineError::MemoryReadError)?; + Ok(u32::from_le_bytes(bytes)) + } + + fn set_u32_at(&mut self, idx: u32, val: u32) -> WasmEngineResult { + let i = idx as usize; + self.memory + .get_mut(i..i + SIZE_OF_U32) + .ok_or(WasmEngineError::MemoryReadError)? + .copy_from_slice(&val.to_le_bytes()); + Ok(idx) + } + + fn extract_vector(&self, region_ptr: u32) -> WasmEngineResult> { + if region_ptr == 0 { + eprintln!("vec_ptr_ptr is null"); + return Err(WasmEngineError::MemoryReadError); + } + + let vec_ptr = self.get_u32_at(region_ptr)? as usize; + let vec_len = self.get_u32_at(region_ptr + SIZE_OF_U32 as u32)? as usize; + if vec_ptr == 0 { + return Err(WasmEngineError::MemoryReadError); + } + + match self.memory.get(vec_ptr..vec_ptr + vec_len) { + Some(slice) => Ok(slice.to_owned()), + None => Err(WasmEngineError::MemoryReadError), + } + } + + fn write_to_allocated_memory( + &mut self, + region_ptr: u32, + buffer: &[u8], + ) -> WasmEngineResult { + let vec_ptr = self.get_u32_at(region_ptr)?; + if vec_ptr == 0 { + return Err(WasmEngineError::MemoryReadError); + } + let vec_len = self.get_u32_at(region_ptr + SIZE_OF_U32 as u32)?; + if (vec_len as usize) < buffer.len() { + return Err(WasmEngineError::MemoryReadError); + } + + let idx = vec_ptr as usize; + self.memory + .get_mut(idx..idx + buffer.len()) + .ok_or(WasmEngineError::MemoryReadError)? + .copy_from_slice(buffer); + self.set_u32_at(region_ptr + (SIZE_OF_U32 * 2) as u32, buffer.len() as u32)?; + + Ok(region_ptr) + } +} + +fn write_to_memory(runtime: &mut wasm3::Runtime, buffer: &[u8]) -> WasmEngineResult { + let region_ptr = (|| { + let alloc_fn = runtime.find_function::("alloc")?; + alloc_fn.call(buffer.len() as u32) + })() + .map_err(|_| WasmEngineError::MemoryAllocationError)?; + let mut memory = CWMemory::new(runtime); + memory.write_to_allocated_memory(region_ptr, buffer)?; + Ok(region_ptr) +} + +macro_rules! set_last_error { + ($context: expr) => { + |err| { + $context.set_last_error(err); + wasm3::error::Trap::Exit + } + }; +} + +fn host_read_db( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + + let state_key_name = memory + .extract_vector(state_key_region_ptr) + .map_err(set_last_error!(context))?; + + let (value, gas_used) = + read_encrypted_key(&state_key_name, &context.context, &context.contract_key) + .map_err(set_last_error!(context))?; + context.use_gas_externally(gas_used)?; + + let value = match value { + // Return 0 (null ponter) if value is empty + Some(value) => value, + None => return Ok(0), + }; + + let region_ptr = + write_to_memory(&mut call_context.runtime, &value).map_err(set_last_error!(context))?; + + Ok(region_ptr) +} From 9442edb52ecee6981ff2e50a3cf35b591cfea6a5 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 10 Jul 2022 16:52:39 +0300 Subject: [PATCH 02/67] added functions declarations for CW x wasm3 host functions --- .../shared/contract-engine/src/lib.rs | 2 + .../shared/contract-engine/src/wasm3/mod.rs | 175 +++++++++++++++++- 2 files changed, 173 insertions(+), 4 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs index 3b6696c8a..f1cd36a75 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(stmt_expr_attributes)] + // Trick to get the IDE to use sgx_tstd even when it doesn't know we're targeting SGX #[cfg(not(target_env = "sgx"))] extern crate sgx_tstd as std; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 695517ac2..2b1e326ad 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -126,11 +126,22 @@ impl Engine { let mut module = runtime.parse_and_load_module(contract_code.code())?; - // TODO link to implementations - link_fn!(module, context_ptr, "db_read", host_read_db)?; - link_fn!(module, context_ptr, "db_read", host_read_db)?; - link_fn!(module, context_ptr, "db_read", host_read_db)?; + #[rustfmt::skip] { link_fn!(module, context_ptr, "db_read", host_read_db)?; + link_fn!(module, context_ptr, "db_write", host_write_db)?; + link_fn!(module, context_ptr, "db_remove", host_remove_db)?; + link_fn!(module, context_ptr, "canonicalize_address", host_canonicalize_address)?; + link_fn!(module, context_ptr, "humanize_address", host_humanize_address)?; + link_fn!(module, context_ptr, "query_chain", host_query_chain)?; + link_fn!(module, context_ptr, "debug_print", host_debug_print)?; + link_fn!(module, context_ptr, "gas", host_gas)?; + link_fn!(module, context_ptr, "secp256k1_verify", host_secp256k1_verify)?; + link_fn!(module, context_ptr, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; + link_fn!(module, context_ptr, "ed25519_verify", host_ed25519_verify)?; + link_fn!(module, context_ptr, "ed25519_batch_verify", host_ed25519_batch_verify)?; + link_fn!(module, context_ptr, "secp256k1_sign", host_secp256k1_sign)?; + link_fn!(module, context_ptr, "ed25519_sign", host_ed25519_sign)?; + } Ok(Self { context: context_ptr, @@ -341,3 +352,159 @@ fn host_read_db( Ok(region_ptr) } + +fn host_remove_db( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_write_db( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_canonicalize_address( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_humanize_address( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_query_chain( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_debug_print( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_gas( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_secp256k1_verify( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_secp256k1_recover_pubkey( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_ed25519_verify( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_ed25519_batch_verify( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_secp256k1_sign( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} + +fn host_ed25519_sign( + context: *mut RefCell, + mut call_context: wasm3::CallContext, + state_key_region_ptr: u32, +) -> TrappedResult { + let context = unsafe { &*context }; + let mut context = context.borrow_mut(); + + let memory = CWMemory::new(&mut call_context.runtime); + todo!() +} From 0e4415ecd1770feff40f6f489ad58cdb15d3bbae Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 10 Jul 2022 16:59:04 +0300 Subject: [PATCH 03/67] removed references to the core crate --- cosmwasm/enclaves/shared/contract-engine/src/lib.rs | 1 - cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 2 +- cosmwasm/enclaves/shared/cosmwasm-types/src/std_error.rs | 2 +- cosmwasm/enclaves/shared/crypto/src/kdf.rs | 2 +- cosmwasm/enclaves/shared/utils/src/oom_handler.rs | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs index f1cd36a75..6a852ddc1 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs @@ -4,7 +4,6 @@ #[cfg(not(target_env = "sgx"))] extern crate sgx_tstd as std; -extern crate core; extern crate sgx_types; mod contract_operations; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 2b1e326ad..69bb22a19 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -1,7 +1,7 @@ -use core::ops::DerefMut; use std::cell::RefCell; use std::convert::TryInto; use std::marker::PhantomData; +use std::ops::DerefMut; use wasm3::error::{Trap, TrappedResult}; diff --git a/cosmwasm/enclaves/shared/cosmwasm-types/src/std_error.rs b/cosmwasm/enclaves/shared/cosmwasm-types/src/std_error.rs index 50f84f4ba..1f865519a 100644 --- a/cosmwasm/enclaves/shared/cosmwasm-types/src/std_error.rs +++ b/cosmwasm/enclaves/shared/cosmwasm-types/src/std_error.rs @@ -61,4 +61,4 @@ pub enum StdError { /// /// The prefix "Std" means "the standard result within the standard library". This is not the only /// result/error type in cosmwasm-std. -pub type StdResult = core::result::Result; +pub type StdResult = std::result::Result; diff --git a/cosmwasm/enclaves/shared/crypto/src/kdf.rs b/cosmwasm/enclaves/shared/crypto/src/kdf.rs index d58602b1e..eb2965de5 100644 --- a/cosmwasm/enclaves/shared/crypto/src/kdf.rs +++ b/cosmwasm/enclaves/shared/crypto/src/kdf.rs @@ -46,7 +46,7 @@ fn derive_key(input_bytes: &[u8], info: &[&[u8]]) -> AESKey { /// Generic newtype wrapper that lets us implement traits for externally-defined /// types. #[derive(Debug, PartialEq)] -struct My(T); +struct My(T); impl hkdf::KeyType for My { fn len(&self) -> usize { diff --git a/cosmwasm/enclaves/shared/utils/src/oom_handler.rs b/cosmwasm/enclaves/shared/utils/src/oom_handler.rs index 2c17ef551..c93958337 100644 --- a/cosmwasm/enclaves/shared/utils/src/oom_handler.rs +++ b/cosmwasm/enclaves/shared/utils/src/oom_handler.rs @@ -1,6 +1,6 @@ -use core::sync::atomic::{AtomicBool, Ordering}; use enclave_ffi_types::EnclaveError; use lazy_static::lazy_static; +use std::sync::atomic::{AtomicBool, Ordering}; #[cfg(not(feature = "production"))] use std::backtrace::{self, PrintFormat}; From 53d7b1278319580e168a78821ae880f0364bc105 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 10 Jul 2022 17:40:33 +0300 Subject: [PATCH 04/67] wasm3 host db imports implemented --- .../contract-engine/src/wasm/contract.rs | 6 +- .../shared/contract-engine/src/wasm3/mod.rs | 113 ++++++++++++------ 2 files changed, 82 insertions(+), 37 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index c127e2710..ae9f013e0 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -32,15 +32,15 @@ pub enum ContractOperation { #[allow(unused)] impl ContractOperation { - fn is_init(&self) -> bool { + pub fn is_init(&self) -> bool { matches!(self, ContractOperation::Init) } - fn is_handle(&self) -> bool { + pub fn is_handle(&self) -> bool { matches!(self, ContractOperation::Handle) } - fn is_query(&self) -> bool { + pub fn is_query(&self) -> bool { matches!(self, ContractOperation::Query) } } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 69bb22a19..4e4b9c9cf 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -11,6 +11,8 @@ use enclave_ffi_types::{Ctx, EnclaveError}; use crate::contract_validation::ContractKey; use crate::db::read_encrypted_key; +#[cfg(not(feature = "query-only"))] +use crate::db::{remove_encrypted_key, write_encrypted_key}; use crate::errors::{wasm3_error_to_enclave_error, WasmEngineError, WasmEngineResult}; use crate::gas::WasmCosts; use crate::types::IoNonce; @@ -57,7 +59,7 @@ impl Context { self.last_error = Some(error); } - fn use_gas_externally(&mut self, gas: u64) -> TrappedResult<()> { + fn use_gas_externally(&mut self, gas: u64) -> WasmEngineResult<()> { // todo implement gas consumption Ok(()) } @@ -325,21 +327,23 @@ macro_rules! set_last_error { fn host_read_db( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); let memory = CWMemory::new(&mut call_context.runtime); let state_key_name = memory - .extract_vector(state_key_region_ptr) + .extract_vector(state_key_region_ptr as u32) .map_err(set_last_error!(context))?; let (value, gas_used) = read_encrypted_key(&state_key_name, &context.context, &context.contract_key) .map_err(set_last_error!(context))?; - context.use_gas_externally(gas_used)?; + context + .use_gas_externally(gas_used) + .map_err(set_last_error!(context))?; let value = match value { // Return 0 (null ponter) if value is empty @@ -350,38 +354,79 @@ fn host_read_db( let region_ptr = write_to_memory(&mut call_context.runtime, &value).map_err(set_last_error!(context))?; - Ok(region_ptr) + Ok(region_ptr as i32) } fn host_remove_db( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult<()> { let context = unsafe { &*context }; let mut context = context.borrow_mut(); let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + if context.operation.is_query() { + context.set_last_error(WasmEngineError::UnauthorizedWrite); + return Err(Trap::Abort); + } + + let state_key_name = memory + .extract_vector(state_key_region_ptr as u32) + .map_err(set_last_error!(context))?; + + let gas_used = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key) + .map_err(set_last_error!(context))?; + context + .use_gas_externally(gas_used) + .map_err(set_last_error!(context))?; + + Ok(()) } fn host_write_db( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + (state_key_region_ptr, value_region_ptr): (i32, i32), +) -> TrappedResult<()> { let context = unsafe { &*context }; let mut context = context.borrow_mut(); let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + if context.operation.is_query() { + context.set_last_error(WasmEngineError::UnauthorizedWrite); + return Err(Trap::Abort); + } + + let state_key_name = memory + .extract_vector(state_key_region_ptr as u32) + .map_err(set_last_error!(context))?; + + let value = memory + .extract_vector(value_region_ptr as u32) + .map_err(set_last_error!(context))?; + + let used_gas = write_encrypted_key( + &state_key_name, + &value, + &context.context, + &context.contract_key, + ) + .map_err(set_last_error!(context))?; + context + .use_gas_externally(used_gas) + .map_err(set_last_error!(context))?; + + Ok(()) } fn host_canonicalize_address( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -392,8 +437,8 @@ fn host_canonicalize_address( fn host_humanize_address( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -404,8 +449,8 @@ fn host_humanize_address( fn host_query_chain( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -416,8 +461,8 @@ fn host_query_chain( fn host_debug_print( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -428,8 +473,8 @@ fn host_debug_print( fn host_gas( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -440,8 +485,8 @@ fn host_gas( fn host_secp256k1_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -452,8 +497,8 @@ fn host_secp256k1_verify( fn host_secp256k1_recover_pubkey( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -464,8 +509,8 @@ fn host_secp256k1_recover_pubkey( fn host_ed25519_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -476,8 +521,8 @@ fn host_ed25519_verify( fn host_ed25519_batch_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -488,8 +533,8 @@ fn host_ed25519_batch_verify( fn host_secp256k1_sign( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -500,8 +545,8 @@ fn host_secp256k1_sign( fn host_ed25519_sign( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: u32, -) -> TrappedResult { + state_key_region_ptr: i32, +) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); From 10efab6e56a6070d955097b2fd3d3addb577033e Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 09:48:44 +0300 Subject: [PATCH 05/67] addded wasm3 implementations for canonicalize_address and humanize_address --- .../shared/contract-engine/src/wasm3/mod.rs | 99 +++++++++++++++++-- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 4e4b9c9cf..1e1fc53c4 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -3,9 +3,11 @@ use std::convert::TryInto; use std::marker::PhantomData; use std::ops::DerefMut; +use bech32::{FromBase32, ToBase32}; use wasm3::error::{Trap, TrappedResult}; use enclave_cosmos_types::types::ContractCode; +use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; use enclave_crypto::Ed25519PublicKey; use enclave_ffi_types::{Ctx, EnclaveError}; @@ -425,25 +427,110 @@ fn host_write_db( fn host_canonicalize_address( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (human_region_ptr, canonical_region_ptr): (i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); - let memory = CWMemory::new(&mut call_context.runtime); - todo!() + let mut memory = CWMemory::new(&mut call_context.runtime); + + let cost = context.gas_costs.external_canonicalize_address as u64; + context + .use_gas_externally(cost) + .map_err(set_last_error!(context))?; + + let human = memory + .extract_vector(human_region_ptr as u32) + .map_err(set_last_error!(context))?; + + let mut human_addr_str = match std::str::from_utf8(&human) { + Ok(addr) => addr, + Err(_err) => { + return Ok( + write_to_memory(&mut call_context.runtime, b"input is not valid UTF-8") + .map_err(set_last_error!(context))? as i32, + ); + } + }; + human_addr_str = human_addr_str.trim(); + if human_addr_str.is_empty() { + return Ok( + write_to_memory(&mut call_context.runtime, b"input is empty") + .map_err(set_last_error!(context))? as i32, + ); + } + + let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { + Ok(ret) => ret, + Err(err) => { + return Ok( + write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + .map_err(set_last_error!(context))? as i32, + ); + } + }; + + if decoded_prefix != BECH32_PREFIX_ACC_ADDR { + return Ok(write_to_memory( + &mut call_context.runtime, + format!("wrong address prefix: {:?}", decoded_prefix).as_bytes(), + ) + .map_err(set_last_error!(context))? as i32); + } + + let canonical = Vec::::from_base32(&data) + .map_err(|err| { + // Assaf: From reading https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#607 + // and https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#228 I don't think this can fail that way + WasmEngineError::Base32Error + }) + .map_err(set_last_error!(context))?; + + memory + .write_to_allocated_memory(canonical_region_ptr as u32, &canonical) + .map_err(set_last_error!(context))?; + + // return 0 == ok + Ok(0) } fn host_humanize_address( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (canonical_region_ptr, human_region_ptr): (i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); - let memory = CWMemory::new(&mut call_context.runtime); - todo!() + let mut memory = CWMemory::new(&mut call_context.runtime); + + let cost = context.gas_costs.external_canonicalize_address as u64; + context + .use_gas_externally(cost) + .map_err(set_last_error!(context))?; + + let canonical = memory + .extract_vector(canonical_region_ptr as u32) + .map_err(set_last_error!(context))?; + + let human_addr_str = match bech32::encode(BECH32_PREFIX_ACC_ADDR, canonical.to_base32()) { + Ok(addr) => addr, + Err(err) => { + return Ok( + write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + .map_err(set_last_error!(context))? as i32, + ); + } + }; + + let human_bytes = human_addr_str.into_bytes(); + + memory + .write_to_allocated_memory(human_region_ptr as u32, &human_bytes) + .map_err(set_last_error!(context))?; + + // return 0 == ok + Ok(0) } fn host_query_chain( From 98b9166e9f5e37ec193b26f1fffe384685838739 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 15:01:15 +0300 Subject: [PATCH 06/67] added logging to wasm3 host functions --- .../shared/contract-engine/src/wasm3/mod.rs | 143 +++++++++++++++--- 1 file changed, 125 insertions(+), 18 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 1e1fc53c4..1043b3124 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -3,6 +3,8 @@ use std::convert::TryInto; use std::marker::PhantomData; use std::ops::DerefMut; +use log::*; + use bech32::{FromBase32, ToBase32}; use wasm3::error::{Trap, TrappedResult}; @@ -67,6 +69,21 @@ impl Context { } } +macro_rules! debug_err { + ($message: literal) => { + |err| { debug!($message); err } + }; + ($message: literal, $($args: tt)*) => { + |err| { debug!($message, $($args)*); err } + }; + ($err: ident => $message: literal) => { + |$err| { debug!($message, $err = $err); $err } + }; + ($err: ident => $message: literal, $($args: tt)*) => { + |$err| { debug!($message, $($args)*, $err = $err); $err } + }; +} + macro_rules! link_fn { ($module: expr, $context_ptr: expr, $name: expr, $implementation: expr) => { $module @@ -311,10 +328,12 @@ fn write_to_memory(runtime: &mut wasm3::Runtime, buffer: &[u8]) -> WasmEngineRes let alloc_fn = runtime.find_function::("alloc")?; alloc_fn.call(buffer.len() as u32) })() + .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; let mut memory = CWMemory::new(runtime); - memory.write_to_allocated_memory(region_ptr, buffer)?; - Ok(region_ptr) + memory + .write_to_allocated_memory(region_ptr, buffer) + .map_err(debug_err!(err => "failed to write to contract memory {err}")) } macro_rules! set_last_error { @@ -326,11 +345,20 @@ macro_rules! set_last_error { }; } +fn show_bytes(bytes: &[u8]) -> String { + format!( + "{:?} ({})", + String::from_utf8_lossy(bytes), + hex::encode(bytes) + ) +} + fn host_read_db( context: *mut RefCell, mut call_context: wasm3::CallContext, state_key_region_ptr: i32, ) -> TrappedResult { + debug!("db_read was called"); let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -338,15 +366,26 @@ fn host_read_db( let state_key_name = memory .extract_vector(state_key_region_ptr as u32) + .map_err( + debug_err!(err => "db_read failed to extract vector from state_key_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; + debug!("db_read reading key {}", show_bytes(&state_key_name)); + let (value, gas_used) = read_encrypted_key(&state_key_name, &context.context, &context.contract_key) + .map_err(debug_err!("db_read failed to read key from storage")) .map_err(set_last_error!(context))?; context .use_gas_externally(gas_used) .map_err(set_last_error!(context))?; + debug!( + "db_read received value {:?}", + value.as_ref().map(|v| show_bytes(&v)) + ); + let value = match value { // Return 0 (null ponter) if value is empty Some(value) => value, @@ -356,6 +395,7 @@ fn host_read_db( let region_ptr = write_to_memory(&mut call_context.runtime, &value).map_err(set_last_error!(context))?; + debug!("db_read finished"); Ok(region_ptr as i32) } @@ -364,26 +404,35 @@ fn host_remove_db( mut call_context: wasm3::CallContext, state_key_region_ptr: i32, ) -> TrappedResult<()> { + debug!("db_remove was called"); + let context = unsafe { &*context }; let mut context = context.borrow_mut(); let memory = CWMemory::new(&mut call_context.runtime); if context.operation.is_query() { + debug!("db_remove was called while in query mode"); context.set_last_error(WasmEngineError::UnauthorizedWrite); return Err(Trap::Abort); } let state_key_name = memory .extract_vector(state_key_region_ptr as u32) + .map_err( + debug_err!(err => "db_remove failed to extract vector from state_key_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; + debug!("db_remove removing key {}", show_bytes(&state_key_name)); + let gas_used = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key) .map_err(set_last_error!(context))?; context .use_gas_externally(gas_used) .map_err(set_last_error!(context))?; + debug!("db_remove finished"); Ok(()) } @@ -392,35 +441,52 @@ fn host_write_db( mut call_context: wasm3::CallContext, (state_key_region_ptr, value_region_ptr): (i32, i32), ) -> TrappedResult<()> { + debug!("db_write was called"); + let context = unsafe { &*context }; let mut context = context.borrow_mut(); let memory = CWMemory::new(&mut call_context.runtime); if context.operation.is_query() { + debug!("db_write was called while in query mode"); context.set_last_error(WasmEngineError::UnauthorizedWrite); return Err(Trap::Abort); } let state_key_name = memory .extract_vector(state_key_region_ptr as u32) + .map_err( + debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; let value = memory .extract_vector(value_region_ptr as u32) + .map_err( + debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; + debug!( + "db_write writing key: {}, value: {}", + show_bytes(&state_key_name), + show_bytes(&value) + ); + let used_gas = write_encrypted_key( &state_key_name, &value, &context.context, &context.contract_key, ) + .map_err(debug_err!("db_write failed to write key to storage",)) .map_err(set_last_error!(context))?; context .use_gas_externally(used_gas) .map_err(set_last_error!(context))?; + debug!("db_write finished"); Ok(()) } @@ -429,6 +495,8 @@ fn host_canonicalize_address( mut call_context: wasm3::CallContext, (human_region_ptr, canonical_region_ptr): (i32, i32), ) -> TrappedResult { + debug!("canonicalize_address was called"); + let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -441,55 +509,77 @@ fn host_canonicalize_address( let human = memory .extract_vector(human_region_ptr as u32) + .map_err( + debug_err!(err => "canonicalize_address failed to extract vector from human_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; let mut human_addr_str = match std::str::from_utf8(&human) { Ok(addr) => addr, Err(_err) => { - return Ok( - write_to_memory(&mut call_context.runtime, b"input is not valid UTF-8") - .map_err(set_last_error!(context))? as i32, + debug!( + "canonicalize_address input was not valid UTF-8: {}", + show_bytes(&human) ); + return write_to_memory(&mut call_context.runtime, b"input is not valid UTF-8") + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")) + .map_err(set_last_error!(context)); } }; human_addr_str = human_addr_str.trim(); if human_addr_str.is_empty() { - return Ok( - write_to_memory(&mut call_context.runtime, b"input is empty") - .map_err(set_last_error!(context))? as i32, - ); + debug!("canonicalize_address input was empty"); + return write_to_memory(&mut call_context.runtime, b"input is empty") + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")) + .map_err(set_last_error!(context)); } + debug!("canonicalize_address was called with {:?}", human_addr_str); + let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { Ok(ret) => ret, Err(err) => { - return Ok( - write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) - .map_err(set_last_error!(context))? as i32, + debug!( + "canonicalize_address failed to parse input as bech32: {:?}", + err ); + return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")) + .map_err(set_last_error!(context)); } }; if decoded_prefix != BECH32_PREFIX_ACC_ADDR { - return Ok(write_to_memory( + debug!("canonicalize_address was called with an unexpected address prefix"); + return write_to_memory( &mut call_context.runtime, format!("wrong address prefix: {:?}", decoded_prefix).as_bytes(), ) - .map_err(set_last_error!(context))? as i32); + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")) + .map_err(set_last_error!(context)); } let canonical = Vec::::from_base32(&data) .map_err(|err| { // Assaf: From reading https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#607 // and https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#228 I don't think this can fail that way + debug!("canonicalize_address failed to parse base32"); WasmEngineError::Base32Error }) .map_err(set_last_error!(context))?; memory .write_to_allocated_memory(canonical_region_ptr as u32, &canonical) + .map_err(debug_err!( + "canonicalize_address failed to write to canonical_region_ptr" + )) .map_err(set_last_error!(context))?; + debug!("canonicalize_address finished"); // return 0 == ok Ok(0) } @@ -499,6 +589,8 @@ fn host_humanize_address( mut call_context: wasm3::CallContext, (canonical_region_ptr, human_region_ptr): (i32, i32), ) -> TrappedResult { + debug!("humanize_address was called"); + let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -511,24 +603,39 @@ fn host_humanize_address( let canonical = memory .extract_vector(canonical_region_ptr as u32) + .map_err( + debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"), + ) .map_err(set_last_error!(context))?; + debug!( + "humanize_address was called with {}", + hex::encode(&canonical) + ); + let human_addr_str = match bech32::encode(BECH32_PREFIX_ACC_ADDR, canonical.to_base32()) { Ok(addr) => addr, Err(err) => { - return Ok( - write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) - .map_err(set_last_error!(context))? as i32, - ); + debug!("humanize_address failed to encode address as bech32"); + return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")) + .map_err(set_last_error!(context)); } }; + debug!("humanize_address returning address {}", human_addr_str); + let human_bytes = human_addr_str.into_bytes(); memory .write_to_allocated_memory(human_region_ptr as u32, &human_bytes) + .map_err(debug_err!( + "humanize_address failed to write to canonical_region_ptr" + )) .map_err(set_last_error!(context))?; + debug!("humanize_address finished"); // return 0 == ok Ok(0) } From f774115ee92678cf788053e1fafb868208023a60 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 15:09:17 +0300 Subject: [PATCH 07/67] adjusted wasm3 host function signatures --- .../shared/contract-engine/src/wasm3/mod.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 1043b3124..3b216990f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -643,7 +643,7 @@ fn host_humanize_address( fn host_query_chain( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + query_region_ptr: i32, ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -655,7 +655,7 @@ fn host_query_chain( fn host_debug_print( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + message_region_ptr: i32, ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -667,7 +667,7 @@ fn host_debug_print( fn host_gas( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + gas_amount: i32, ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -679,7 +679,7 @@ fn host_gas( fn host_secp256k1_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (message_hash_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -691,7 +691,7 @@ fn host_secp256k1_verify( fn host_secp256k1_recover_pubkey( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -703,7 +703,7 @@ fn host_secp256k1_recover_pubkey( fn host_ed25519_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (message_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -715,7 +715,7 @@ fn host_ed25519_verify( fn host_ed25519_batch_verify( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (messages_ptr, signatures_ptr, public_keys_ptr): (i32, i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -727,7 +727,7 @@ fn host_ed25519_batch_verify( fn host_secp256k1_sign( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (message_ptr, private_key_ptr): (i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); @@ -739,7 +739,7 @@ fn host_secp256k1_sign( fn host_ed25519_sign( context: *mut RefCell, mut call_context: wasm3::CallContext, - state_key_region_ptr: i32, + (message_ptr, private_key_ptr): (i32, i32), ) -> TrappedResult { let context = unsafe { &*context }; let mut context = context.borrow_mut(); From a32748fa77e82a8d6fd140bfd27012e04c913fcb Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 20:16:36 +0300 Subject: [PATCH 08/67] minor fixes --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 8 ++++++-- deployment/dockerfiles/base.Dockerfile | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 3b216990f..800538111 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -149,8 +149,10 @@ impl Engine { #[rustfmt::skip] { link_fn!(module, context_ptr, "db_read", host_read_db)?; - link_fn!(module, context_ptr, "db_write", host_write_db)?; - link_fn!(module, context_ptr, "db_remove", host_remove_db)?; + #[cfg(not(feature = "query-only"))] { + link_fn!(module, context_ptr, "db_write", host_write_db)?; + link_fn!(module, context_ptr, "db_remove", host_remove_db)?; + } link_fn!(module, context_ptr, "canonicalize_address", host_canonicalize_address)?; link_fn!(module, context_ptr, "humanize_address", host_humanize_address)?; link_fn!(module, context_ptr, "query_chain", host_query_chain)?; @@ -399,6 +401,7 @@ fn host_read_db( Ok(region_ptr as i32) } +#[cfg(not(feature = "query-only"))] fn host_remove_db( context: *mut RefCell, mut call_context: wasm3::CallContext, @@ -436,6 +439,7 @@ fn host_remove_db( Ok(()) } +#[cfg(not(feature = "query-only"))] fn host_write_db( context: *mut RefCell, mut call_context: wasm3::CallContext, diff --git a/deployment/dockerfiles/base.Dockerfile b/deployment/dockerfiles/base.Dockerfile index 68c5e3037..297409b49 100644 --- a/deployment/dockerfiles/base.Dockerfile +++ b/deployment/dockerfiles/base.Dockerfile @@ -27,7 +27,8 @@ RUN apt-get update && \ zlib1g-dev \ libbz2-dev \ liblz4-dev \ - libzstd-dev + libzstd-dev \ + clang-10 # @@ -100,4 +101,4 @@ RUN . /opt/sgxsdk/environment && env && MITIGATION_CVE_2020_0551=LOAD VERSION=${ # RUN rustup target add wasm32-unknown-unknown && apt update -y && apt install clang -y && make build-test-contract # ENTRYPOINT ["/bin/bash", "go-tests.sh"] -ENTRYPOINT ["/bin/bash"] \ No newline at end of file +ENTRYPOINT ["/bin/bash"] From 1898b4a44ff976dc8610fba4c1d582cf32af30a9 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 21:51:07 +0300 Subject: [PATCH 09/67] fixed name of allocate export in wasm3 --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 800538111..599989120 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -327,7 +327,7 @@ impl<'m> CWMemory<'m> { fn write_to_memory(runtime: &mut wasm3::Runtime, buffer: &[u8]) -> WasmEngineResult { let region_ptr = (|| { - let alloc_fn = runtime.find_function::("alloc")?; + let alloc_fn = runtime.find_function::("allocate")?; alloc_fn.call(buffer.len() as u32) })() .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) From b28c4a10c1b8e29e98dec7c7ee55646a5afcd0fa Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 22:25:26 +0300 Subject: [PATCH 10/67] refactored wasm3 bindings to reduce code repetition around error handling --- .../shared/contract-engine/src/wasm3/mod.rs | 303 ++++++------------ 1 file changed, 106 insertions(+), 197 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 599989120..5eabb77c7 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -6,7 +6,6 @@ use std::ops::DerefMut; use log::*; use bech32::{FromBase32, ToBase32}; -use wasm3::error::{Trap, TrappedResult}; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; @@ -22,9 +21,48 @@ use crate::gas::WasmCosts; use crate::types::IoNonce; use crate::wasm::ContractOperation; -type Wasm3RsError = wasm3::error::Error; type Wasm3RsResult = wasm3::error::Result; +macro_rules! debug_err { + ($message: literal) => { + |err| { debug!($message); err } + }; + ($message: literal, $($args: tt)*) => { + |err| { debug!($message, $($args)*); err } + }; + ($err: ident => $message: literal) => { + |$err| { debug!($message, $err = $err); $err } + }; + ($err: ident => $message: literal, $($args: tt)*) => { + |$err| { debug!($message, $($args)*, $err = $err); $err } + }; +} + +macro_rules! set_last_error { + ($context: expr) => { + |err| { + $context.set_last_error(err); + wasm3::error::Trap::Exit + } + }; +} + +macro_rules! link_fn { + ($module: expr, $context_ptr: expr, $name: expr, $implementation: expr) => { + $module + .link_closure("env", $name, move |call_context, args| { + debug!("{} was called", $name); + let context = unsafe { &*$context_ptr }; + let mut context = context.borrow_mut(); + let ret = $implementation(&mut context, call_context, args) + .map_err(set_last_error!(context)); + debug!("{} finished", $name); + ret + }) + .allow_missing_import() + }; +} + trait Wasm3ResultEx { fn allow_missing_import(self) -> Self; } @@ -69,31 +107,6 @@ impl Context { } } -macro_rules! debug_err { - ($message: literal) => { - |err| { debug!($message); err } - }; - ($message: literal, $($args: tt)*) => { - |err| { debug!($message, $($args)*); err } - }; - ($err: ident => $message: literal) => { - |$err| { debug!($message, $err = $err); $err } - }; - ($err: ident => $message: literal, $($args: tt)*) => { - |$err| { debug!($message, $($args)*, $err = $err); $err } - }; -} - -macro_rules! link_fn { - ($module: expr, $context_ptr: expr, $name: expr, $implementation: expr) => { - $module - .link_closure("env", $name, move |call_context, args| { - $implementation($context_ptr, call_context, args) - }) - .allow_missing_import() - }; -} - pub struct Engine { // WARNING! // This box is dropped when the Engine is dropped. You MUST NOT use the pointer @@ -338,15 +351,6 @@ fn write_to_memory(runtime: &mut wasm3::Runtime, buffer: &[u8]) -> WasmEngineRes .map_err(debug_err!(err => "failed to write to contract memory {err}")) } -macro_rules! set_last_error { - ($context: expr) => { - |err| { - $context.set_last_error(err); - wasm3::error::Trap::Exit - } - }; -} - fn show_bytes(bytes: &[u8]) -> String { format!( "{:?} ({})", @@ -356,32 +360,22 @@ fn show_bytes(bytes: &[u8]) -> String { } fn host_read_db( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, state_key_region_ptr: i32, -) -> TrappedResult { - debug!("db_read was called"); - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - let state_key_name = memory - .extract_vector(state_key_region_ptr as u32) - .map_err( - debug_err!(err => "db_read failed to extract vector from state_key_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + debug_err!(err => "db_read failed to extract vector from state_key_region_ptr: {err}"), + )?; debug!("db_read reading key {}", show_bytes(&state_key_name)); let (value, gas_used) = read_encrypted_key(&state_key_name, &context.context, &context.contract_key) - .map_err(debug_err!("db_read failed to read key from storage")) - .map_err(set_last_error!(context))?; - context - .use_gas_externally(gas_used) - .map_err(set_last_error!(context))?; + .map_err(debug_err!("db_read failed to read key from storage"))?; + context.use_gas_externally(gas_used)?; debug!( "db_read received value {:?}", @@ -394,83 +388,56 @@ fn host_read_db( None => return Ok(0), }; - let region_ptr = - write_to_memory(&mut call_context.runtime, &value).map_err(set_last_error!(context))?; + let region_ptr = write_to_memory(&mut call_context.runtime, &value)?; - debug!("db_read finished"); Ok(region_ptr as i32) } #[cfg(not(feature = "query-only"))] fn host_remove_db( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, state_key_region_ptr: i32, -) -> TrappedResult<()> { - debug!("db_remove was called"); - - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult<()> { let memory = CWMemory::new(&mut call_context.runtime); if context.operation.is_query() { debug!("db_remove was called while in query mode"); - context.set_last_error(WasmEngineError::UnauthorizedWrite); - return Err(Trap::Abort); + return Err(WasmEngineError::UnauthorizedWrite); } - let state_key_name = memory - .extract_vector(state_key_region_ptr as u32) - .map_err( - debug_err!(err => "db_remove failed to extract vector from state_key_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + debug_err!(err => "db_remove failed to extract vector from state_key_region_ptr: {err}"), + )?; debug!("db_remove removing key {}", show_bytes(&state_key_name)); - let gas_used = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key) - .map_err(set_last_error!(context))?; - context - .use_gas_externally(gas_used) - .map_err(set_last_error!(context))?; + let gas_used = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key)?; + context.use_gas_externally(gas_used)?; - debug!("db_remove finished"); Ok(()) } #[cfg(not(feature = "query-only"))] fn host_write_db( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (state_key_region_ptr, value_region_ptr): (i32, i32), -) -> TrappedResult<()> { - debug!("db_write was called"); - - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult<()> { let memory = CWMemory::new(&mut call_context.runtime); if context.operation.is_query() { debug!("db_write was called while in query mode"); - context.set_last_error(WasmEngineError::UnauthorizedWrite); - return Err(Trap::Abort); + return Err(WasmEngineError::UnauthorizedWrite); } - let state_key_name = memory - .extract_vector(state_key_region_ptr as u32) - .map_err( - debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), + )?; - let value = memory - .extract_vector(value_region_ptr as u32) - .map_err( - debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + let value = memory.extract_vector(value_region_ptr as u32).map_err( + debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), + )?; debug!( "db_write writing key: {}, value: {}", @@ -484,39 +451,27 @@ fn host_write_db( &context.context, &context.contract_key, ) - .map_err(debug_err!("db_write failed to write key to storage",)) - .map_err(set_last_error!(context))?; - context - .use_gas_externally(used_gas) - .map_err(set_last_error!(context))?; + .map_err(debug_err!("db_write failed to write key to storage",))?; + context.use_gas_externally(used_gas)?; - debug!("db_write finished"); Ok(()) } fn host_canonicalize_address( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (human_region_ptr, canonical_region_ptr): (i32, i32), -) -> TrappedResult { - debug!("canonicalize_address was called"); - - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let mut memory = CWMemory::new(&mut call_context.runtime); let cost = context.gas_costs.external_canonicalize_address as u64; - context - .use_gas_externally(cost) - .map_err(set_last_error!(context))?; + context.use_gas_externally(cost)?; let human = memory .extract_vector(human_region_ptr as u32) .map_err( debug_err!(err => "canonicalize_address failed to extract vector from human_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + )?; let mut human_addr_str = match std::str::from_utf8(&human) { Ok(addr) => addr, @@ -527,8 +482,7 @@ fn host_canonicalize_address( ); return write_to_memory(&mut call_context.runtime, b"input is not valid UTF-8") .map(|n| n as i32) - .map_err(debug_err!("failed to write error message to contract")) - .map_err(set_last_error!(context)); + .map_err(debug_err!("failed to write error message to contract")); } }; human_addr_str = human_addr_str.trim(); @@ -536,8 +490,7 @@ fn host_canonicalize_address( debug!("canonicalize_address input was empty"); return write_to_memory(&mut call_context.runtime, b"input is empty") .map(|n| n as i32) - .map_err(debug_err!("failed to write error message to contract")) - .map_err(set_last_error!(context)); + .map_err(debug_err!("failed to write error message to contract")); } debug!("canonicalize_address was called with {:?}", human_addr_str); @@ -551,8 +504,7 @@ fn host_canonicalize_address( ); return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) .map(|n| n as i32) - .map_err(debug_err!("failed to write error message to contract")) - .map_err(set_last_error!(context)); + .map_err(debug_err!("failed to write error message to contract")); } }; @@ -563,54 +515,41 @@ fn host_canonicalize_address( format!("wrong address prefix: {:?}", decoded_prefix).as_bytes(), ) .map(|n| n as i32) - .map_err(debug_err!("failed to write error message to contract")) - .map_err(set_last_error!(context)); + .map_err(debug_err!("failed to write error message to contract")); } - let canonical = Vec::::from_base32(&data) - .map_err(|err| { - // Assaf: From reading https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#607 - // and https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#228 I don't think this can fail that way - debug!("canonicalize_address failed to parse base32"); - WasmEngineError::Base32Error - }) - .map_err(set_last_error!(context))?; + let canonical = Vec::::from_base32(&data).map_err(|err| { + // Assaf: From reading https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#607 + // and https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#228 I don't think this can fail that way + debug!("canonicalize_address failed to parse base32: {}", err); + WasmEngineError::Base32Error + })?; memory .write_to_allocated_memory(canonical_region_ptr as u32, &canonical) .map_err(debug_err!( "canonicalize_address failed to write to canonical_region_ptr" - )) - .map_err(set_last_error!(context))?; + ))?; - debug!("canonicalize_address finished"); // return 0 == ok Ok(0) } fn host_humanize_address( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (canonical_region_ptr, human_region_ptr): (i32, i32), -) -> TrappedResult { - debug!("humanize_address was called"); - - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let mut memory = CWMemory::new(&mut call_context.runtime); let cost = context.gas_costs.external_canonicalize_address as u64; - context - .use_gas_externally(cost) - .map_err(set_last_error!(context))?; + context.use_gas_externally(cost)?; let canonical = memory .extract_vector(canonical_region_ptr as u32) .map_err( debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"), - ) - .map_err(set_last_error!(context))?; + )?; debug!( "humanize_address was called with {}", @@ -623,8 +562,7 @@ fn host_humanize_address( debug!("humanize_address failed to encode address as bech32"); return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) .map(|n| n as i32) - .map_err(debug_err!("failed to write error message to contract")) - .map_err(set_last_error!(context)); + .map_err(debug_err!("failed to write error message to contract")); } }; @@ -636,118 +574,89 @@ fn host_humanize_address( .write_to_allocated_memory(human_region_ptr as u32, &human_bytes) .map_err(debug_err!( "humanize_address failed to write to canonical_region_ptr" - )) - .map_err(set_last_error!(context))?; + ))?; - debug!("humanize_address finished"); // return 0 == ok Ok(0) } fn host_query_chain( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, query_region_ptr: i32, -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_debug_print( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, message_region_ptr: i32, -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_gas( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, gas_amount: i32, -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_secp256k1_verify( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (message_hash_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_secp256k1_recover_pubkey( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_ed25519_verify( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (message_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_ed25519_batch_verify( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (messages_ptr, signatures_ptr, public_keys_ptr): (i32, i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_secp256k1_sign( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (message_ptr, private_key_ptr): (i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } fn host_ed25519_sign( - context: *mut RefCell, + context: &mut Context, mut call_context: wasm3::CallContext, (message_ptr, private_key_ptr): (i32, i32), -) -> TrappedResult { - let context = unsafe { &*context }; - let mut context = context.borrow_mut(); - +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } From 7fa1ae8121fccb223caf6724fed26d451d701611 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 11 Jul 2022 22:47:18 +0300 Subject: [PATCH 11/67] implemented host_secp256k1_verify --- .../shared/contract-engine/src/wasm3/mod.rs | 107 +++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 5eabb77c7..14ec31d5c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -9,7 +9,7 @@ use bech32::{FromBase32, ToBase32}; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; -use enclave_crypto::Ed25519PublicKey; +use enclave_crypto::{Ed25519PublicKey, WasmApiCryptoError}; use enclave_ffi_types::{Ctx, EnclaveError}; use crate::contract_validation::ContractKey; @@ -613,7 +613,110 @@ fn host_secp256k1_verify( (message_hash_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let cost = context.gas_costs.external_secp256k1_verify as u64; + context.use_gas_externally(cost)?; + + let message_hash_data = memory.extract_vector(message_hash_ptr as u32).map_err( + debug_err!(err => "secp256k1_verify error while trying to read message_hash from wasm memory: {err}") + )?; + let signature_data = memory.extract_vector(signature_ptr as u32).map_err( + debug_err!(err => "secp256k1_verify error while trying to read signature from wasm memory: {err}") + )?; + let public_key = memory.extract_vector(public_key_ptr as u32).map_err( + debug_err!(err => "secp256k1_verify error while trying to read public_key from wasm memory: {err}") + )?; + + trace!( + "secp256k1_verify() was called from WASM code with message_hash {:x?} (len {:?} should be 32)", + &message_hash_data, + message_hash_data.len() + ); + trace!( + "secp256k1_verify() was called from WASM code with signature {:x?} (len {:?} should be 64)", + &signature_data, + signature_data.len() + ); + trace!( + "secp256k1_verify() was called from WASM code with public_key {:x?} (len {:?} should be 33 or 65)", + &public_key, + public_key.len() + ); + + // check message_hash input + if message_hash_data.len() != 32 { + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L93 + return Ok(WasmApiCryptoError::InvalidHashFormat as i32); + } + + // check signature input + if signature_data.len() != 64 { + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L94 + return Ok(WasmApiCryptoError::InvalidSignatureFormat as i32); + } + + // check pubkey input + if !match public_key.first() { + // compressed + Some(0x02) | Some(0x03) => public_key.len() == 33, + // uncompressed + Some(0x04) => public_key.len() == 65, + // hybrid + // see https://docs.rs/secp256k1-abc-sys/0.1.2/secp256k1_abc_sys/fn.secp256k1_ec_pubkey_parse.html + Some(0x06) | Some(0x07) => public_key.len() == 65, + _ => false, + } { + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L95 + return Ok(WasmApiCryptoError::InvalidPubkeyFormat as i32); + } + + let secp256k1_msg = match secp256k1::Message::from_slice(&message_hash_data) { + Err(err) => { + debug!( + "secp256k1_verify failed to create a secp256k1 message from message_hash: {:?}", + err + ); + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(WasmApiCryptoError::GenericErr as i32); + } + Ok(x) => x, + }; + + let secp256k1_sig = match secp256k1::ecdsa::Signature::from_compact(&signature_data) { + Err(err) => { + debug!("secp256k1_verify() malformed signature: {:?}", err); + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(WasmApiCryptoError::GenericErr as i32); + } + Ok(x) => x, + }; + + let secp256k1_pk = match secp256k1::PublicKey::from_slice(public_key.as_slice()) { + Err(err) => { + debug!("secp256k1_verify() malformed pubkey: {:?}", err); + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(WasmApiCryptoError::GenericErr as i32); + } + Ok(x) => x, + }; + + match secp256k1::Secp256k1::verification_only().verify_ecdsa( + &secp256k1_msg, + &secp256k1_sig, + &secp256k1_pk, + ) { + Err(err) => { + debug!("secp256k1_verify() failed to verify signature: {:?}", err); + // return 1 == failed, invalid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L220 + Ok(1) + } + Ok(()) => { + // return 0 == success, valid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L220 + Ok(0) + } + } } fn host_secp256k1_recover_pubkey( From 53a45b203407907176fece05f6444b1e002b490d Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 12 Jul 2022 00:51:13 +0300 Subject: [PATCH 12/67] various fixes and logging in wasm3 integration --- .../shared/contract-engine/src/errors.rs | 4 +- .../shared/contract-engine/src/wasm3/mod.rs | 55 +++++++++++++++---- .../internal/keeper/secret_contracts_test.go | 2 +- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index c2e9aec4f..1cd52816f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -95,9 +95,9 @@ pub fn wasm3_error_to_enclave_error( Trap::Unreachable => EnclaveError::ContractPanicUnreachable, Trap::StackOverflow => EnclaveError::ContractPanicStackOverflow, }, - Wasm3RsError::InvalidFunctionSignature => EnclaveError::FailedFunctionCall, + Wasm3RsError::InvalidFunctionSignature => EnclaveError::InvalidWasm, Wasm3RsError::FunctionNotFound => EnclaveError::FailedFunctionCall, - Wasm3RsError::ModuleNotFound => EnclaveError::FailedFunctionCall, + Wasm3RsError::ModuleNotFound => EnclaveError::InvalidWasm, Wasm3RsError::ModuleLoadEnvMismatch => EnclaveError::FailedFunctionCall, Wasm3RsError::RuntimeIsActive => EnclaveError::FailedFunctionCall, }, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 14ec31d5c..29ff22384 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -6,6 +6,7 @@ use std::ops::DerefMut; use log::*; use bech32::{FromBase32, ToBase32}; +use wasm3::error::Trap; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; @@ -21,6 +22,7 @@ use crate::gas::WasmCosts; use crate::types::IoNonce; use crate::wasm::ContractOperation; +type Wasm3RsError = wasm3::error::Error; type Wasm3RsResult = wasm3::error::Result; macro_rules! debug_err { @@ -70,7 +72,12 @@ trait Wasm3ResultEx { impl Wasm3ResultEx for Wasm3RsResult<()> { fn allow_missing_import(self) -> Self { match self { - Err(wasm3::error::Error::FunctionNotFound) => Ok(()), + Err(Wasm3RsError::FunctionNotFound) => Ok(()), + // Workaround for erroneous non-enumerated error in this case in wasm3. + // Search for the string "function signature mismatch" in the C source + Err(Wasm3RsError::Wasm3(wasm3_error)) if Trap::from(wasm3_error) == Trap::Abort => { + Err(Wasm3RsError::InvalidFunctionSignature) + } other => other, } } @@ -155,10 +162,14 @@ impl Engine { context_ptr: *mut RefCell, contract_code: ContractCode, ) -> Wasm3RsResult { + debug!("setting up runtime"); let environment = wasm3::Environment::new()?; + debug!("initialized environment"); let runtime = environment.create_runtime(1024 * 60)?; + debug!("initialized runtime"); let mut module = runtime.parse_and_load_module(contract_code.code())?; + debug!("parsed module"); #[rustfmt::skip] { link_fn!(module, context_ptr, "db_read", host_read_db)?; @@ -178,6 +189,7 @@ impl Engine { link_fn!(module, context_ptr, "secp256k1_sign", host_secp256k1_sign)?; link_fn!(module, context_ptr, "ed25519_sign", host_ed25519_sign)?; } + debug!("linked functions"); Ok(Self { context: context_ptr, @@ -215,41 +227,59 @@ impl Engine { pub fn init(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { let handle_wasm3_err = |err| unsafe { + debug!("init failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); + debug!("booped context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; - self.init_fn() + debug!("init starting"); + let ret = self + .init_fn() .map_err(handle_wasm3_err)? .call(env_ptr, msg_ptr) - .map_err(handle_wasm3_err) + .map_err(handle_wasm3_err); + debug!("init returned {:?}", ret); + ret } pub fn handle(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { let handle_wasm3_err = |err| unsafe { + debug!("handle failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); + debug!("booped context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; - self.handle_fn() + debug!("handle starting"); + let ret = self + .handle_fn() .map_err(handle_wasm3_err)? .call(env_ptr, msg_ptr) - .map_err(handle_wasm3_err) + .map_err(handle_wasm3_err); + debug!("handle returned {:?}", ret); + ret } pub fn query(&mut self, msg_ptr: u32) -> Result { let handle_wasm3_err = |err| unsafe { + debug!("query failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); + debug!("booped context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; - self.query_fn() + debug!("query starting"); + let ret = self + .query_fn() .map_err(handle_wasm3_err)? .call(msg_ptr) - .map_err(handle_wasm3_err) + .map_err(handle_wasm3_err); + debug!("query returned {:?}", ret); + ret } } @@ -525,6 +555,11 @@ fn host_canonicalize_address( WasmEngineError::Base32Error })?; + debug!( + "canonicalize_address returning address {}", + hex::encode(human_addr_str) + ); + memory .write_to_allocated_memory(canonical_region_ptr as u32, &canonical) .map_err(debug_err!( @@ -723,7 +758,7 @@ fn host_secp256k1_recover_pubkey( context: &mut Context, mut call_context: wasm3::CallContext, (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), -) -> WasmEngineResult { +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } @@ -750,7 +785,7 @@ fn host_secp256k1_sign( context: &mut Context, mut call_context: wasm3::CallContext, (message_ptr, private_key_ptr): (i32, i32), -) -> WasmEngineResult { +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } @@ -759,7 +794,7 @@ fn host_ed25519_sign( context: &mut Context, mut call_context: wasm3::CallContext, (message_ptr, private_key_ptr): (i32, i32), -) -> WasmEngineResult { +) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); todo!() } diff --git a/x/compute/internal/keeper/secret_contracts_test.go b/x/compute/internal/keeper/secret_contracts_test.go index 3bc4e68a4..bc170775a 100644 --- a/x/compute/internal/keeper/secret_contracts_test.go +++ b/x/compute/internal/keeper/secret_contracts_test.go @@ -2431,7 +2431,7 @@ func TestBenchmarkSecp256k1VerifyAPI(t *testing.T) { func TestBenchmarkSecp256k1VerifyCrate(t *testing.T) { t.SkipNow() // Assaf: I wrote the benchmark like this because the init functions take testing.T - // and not testing.B and I just wanted to quickly get a feel for the perf improvments + // and not testing.B and I just wanted to quickly get a feel for the perf improvements ctx, keeper, codeID, _, walletA, privKeyA, _, _ := setupTest(t, "./testdata/test-contract/contract.wasm") contractAddress, _, _ := initHelper(t, keeper, ctx, codeID, walletA, privKeyA, `{"nop":{}}`, true, defaultGasForTests) From 8e87a33bef20d9117d8ced5d65a7ae95263b0346 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 25 Jul 2022 00:37:00 +0300 Subject: [PATCH 13/67] added the remaining cosmwasm host interfaces to the wasm3 implementation --- .../shared/contract-engine/src/wasm3/mod.rs | 579 +++++++++++++++++- 1 file changed, 562 insertions(+), 17 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 29ff22384..3909f02c9 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -1,16 +1,18 @@ use std::cell::RefCell; -use std::convert::TryInto; +use std::convert::{TryFrom, TryInto}; use std::marker::PhantomData; use std::ops::DerefMut; use log::*; use bech32::{FromBase32, ToBase32}; +use rand_chacha::ChaChaRng; +use rand_core::SeedableRng; use wasm3::error::Trap; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; -use enclave_crypto::{Ed25519PublicKey, WasmApiCryptoError}; +use enclave_crypto::{sha_256, Ed25519PublicKey, WasmApiCryptoError}; use enclave_ffi_types::{Ctx, EnclaveError}; use crate::contract_validation::ContractKey; @@ -19,6 +21,7 @@ use crate::db::read_encrypted_key; use crate::db::{remove_encrypted_key, write_encrypted_key}; use crate::errors::{wasm3_error_to_enclave_error, WasmEngineError, WasmEngineResult}; use crate::gas::WasmCosts; +use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::ContractOperation; @@ -108,10 +111,40 @@ impl Context { self.last_error = Some(error); } + /// Track gas used inside wasmi + fn use_gas(&mut self, gas_amount: u64) -> Result<(), WasmEngineError> { + self.gas_used = self.gas_used.saturating_add(gas_amount); + self.check_gas_usage() + } + + fn check_gas_usage(&self) -> Result<(), WasmEngineError> { + // Check if new amount is bigger than gas limit + // If is above the limit, halt execution + if self.is_gas_depleted() { + debug!( + "Out of gas! Gas limit: {}, gas used: {}, gas used externally: {}", + self.gas_limit, self.gas_used, self.gas_used_externally + ); + Err(WasmEngineError::OutOfGas) + } else { + Ok(()) + } + } + + fn is_gas_depleted(&self) -> bool { + self.gas_limit < self.gas_used.saturating_add(self.gas_used_externally) + } + fn use_gas_externally(&mut self, gas: u64) -> WasmEngineResult<()> { // todo implement gas consumption Ok(()) } + + fn gas_left(&self) -> u64 { + self.gas_limit + .saturating_sub(self.gas_used) + .saturating_sub(self.gas_used_externally) + } } pub struct Engine { @@ -327,12 +360,12 @@ impl<'m> CWMemory<'m> { fn extract_vector(&self, region_ptr: u32) -> WasmEngineResult> { if region_ptr == 0 { - eprintln!("vec_ptr_ptr is null"); + debug!("vec_ptr_ptr is null"); return Err(WasmEngineError::MemoryReadError); } let vec_ptr = self.get_u32_at(region_ptr)? as usize; - let vec_len = self.get_u32_at(region_ptr + SIZE_OF_U32 as u32)? as usize; + let vec_len = self.get_u32_at(region_ptr + (SIZE_OF_U32 as u32) * 2)? as usize; if vec_ptr == 0 { return Err(WasmEngineError::MemoryReadError); } @@ -343,6 +376,44 @@ impl<'m> CWMemory<'m> { } } + fn decode_sections(&self, region_ptr: u32) -> WasmEngineResult>> { + if region_ptr == 0 { + debug!("region_ptr is null"); + return Err(WasmEngineError::MemoryReadError); + } + + let data_ptr = self.get_u32_at(region_ptr)? as usize; + if data_ptr == 0 { + debug!("data_ptr is null"); + return Err(WasmEngineError::MemoryReadError); + } + + let data_len = self.get_u32_at(region_ptr + (SIZE_OF_U32 as u32) * 2)? as usize; + let mut remaining_len = data_len as usize; + + let data = self.memory.get(data_ptr..data_ptr + data_len); + let data = data.ok_or(WasmEngineError::MemoryReadError)?; + + let mut result: Vec> = vec![]; + while remaining_len >= 4 { + let tail_len = u32::from_be_bytes([ + data[remaining_len - 4], + data[remaining_len - 3], + data[remaining_len - 2], + data[remaining_len - 1], + ]) as usize; + let mut new_element = vec![0; tail_len]; + let elem_start = remaining_len - SIZE_OF_U32 - tail_len; + let elem_end = remaining_len - SIZE_OF_U32; + new_element.copy_from_slice(&data[elem_start..elem_end]); + result.push(new_element); + remaining_len -= 4 + tail_len; + } + result.reverse(); + + Ok(result) + } + fn write_to_allocated_memory( &mut self, region_ptr: u32, @@ -389,6 +460,26 @@ fn show_bytes(bytes: &[u8]) -> String { ) } +/// Returns the data shifted by 32 bits towards the most significant bit. +/// +/// This is independent of endianness. But to get the idea, it would be +/// `data || 0x00000000` in big endian representation. +#[inline] +fn to_high_half(data: u32) -> u64 { + // See https://stackoverflow.com/a/58956419/2013738 to understand + // why this is endianness agnostic. + (data as u64) << 32 +} + +/// Returns the data copied to the 4 least significant bytes. +/// +/// This is independent of endianness. But to get the idea, it would be +/// `0x00000000 || data` in big endian representation. +#[inline] +fn to_low_half(data: u32) -> u64 { + data.into() +} + fn host_read_db( context: &mut Context, mut call_context: wasm3::CallContext, @@ -621,25 +712,50 @@ fn host_query_chain( query_region_ptr: i32, ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let query_buffer = memory.extract_vector(query_region_ptr as u32).map_err( + debug_err!(err => "query_chain failed to extract vector from query_region_ptr: {err}"), + )?; + + let mut gas_used: u64 = 0; + let answer = encrypt_and_query_chain( + &query_buffer, + &context.context, + context.user_nonce, + context.user_public_key, + &mut gas_used, + context.gas_left(), + )?; + + context.use_gas_externally(gas_used)?; + + write_to_memory(&mut call_context.runtime, &answer).map(|region_ptr| region_ptr as i32) } fn host_debug_print( - context: &mut Context, + _context: &mut Context, mut call_context: wasm3::CallContext, message_region_ptr: i32, -) -> WasmEngineResult { +) -> WasmEngineResult<()> { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let message_buffer = memory.extract_vector(message_region_ptr as u32)?; + + let message = + String::from_utf8(message_buffer).unwrap_or_else(|err| hex::encode(err.into_bytes())); + + info!("debug_print: {:?}", message); + + Ok(()) } fn host_gas( context: &mut Context, - mut call_context: wasm3::CallContext, + mut _call_context: wasm3::CallContext, gas_amount: i32, -) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - todo!() +) -> WasmEngineResult<()> { + context.use_gas(gas_amount as u64)?; + Ok(()) } fn host_secp256k1_verify( @@ -760,7 +876,102 @@ fn host_secp256k1_recover_pubkey( (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let cost = context.gas_costs.external_secp256k1_recover_pubkey as u64; + context.use_gas_externally(cost)?; + + let message_hash_data = memory.extract_vector(message_hash_ptr as u32).map_err( + debug_err!(err => "secp256k1_recover_pubkey error while trying to read message_hash from wasm memory: {err}") + )?; + let signature_data = memory.extract_vector(signature_ptr as u32).map_err( + debug_err!(err => "secp256k1_recover_pubkey error while trying to read signature from wasm memory: {err}") + )?; + + trace!( + "secp256k1_recover_pubkey was called from WASM code with message_hash {:x?} (len {:?} should be 32)", + &message_hash_data, + message_hash_data.len() + ); + trace!( + "secp256k1_recover_pubkey was called from WASM code with signature {:x?} (len {:?} should be 64)", + &signature_data, + signature_data.len() + ); + trace!( + "secp256k1_recover_pubkey was called from WASM code with recovery_param {:?}", + recovery_param, + ); + + // check message_hash input + if message_hash_data.len() != 32 { + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L93 + return Ok(to_high_half(WasmApiCryptoError::InvalidHashFormat as u32) as i64); + } + + // check signature input + if signature_data.len() != 64 { + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L94 + return Ok(to_high_half(WasmApiCryptoError::InvalidSignatureFormat as u32) as i64); + } + + let secp256k1_msg = match secp256k1::Message::from_slice(&message_hash_data) { + Err(err) => { + debug!("secp256k1_recover_pubkey() failed to create a secp256k1 message from message_hash: {:?}", err); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(to_high_half(WasmApiCryptoError::GenericErr as u32) as i64); + } + Ok(x) => x, + }; + + let recovery_id = match secp256k1::ecdsa::RecoveryId::from_i32(recovery_param) { + Err(err) => { + debug!("secp256k1_recover_pubkey() failed to create a secp256k1 recovery_id from recovery_param: {:?}", err); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(to_high_half(WasmApiCryptoError::GenericErr as u32) as i64); + } + Ok(x) => x, + }; + + let secp256k1_sig = + match secp256k1::ecdsa::RecoverableSignature::from_compact(&signature_data, recovery_id) { + Err(err) => { + debug!( + "secp256k1_recover_pubkey() malformed recoverable signature: {:?}", + err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + return Ok(to_high_half(WasmApiCryptoError::GenericErr as u32) as i64); + } + Ok(x) => x, + }; + + match secp256k1::Secp256k1::verification_only().recover_ecdsa(&secp256k1_msg, &secp256k1_sig) { + Err(err) => { + debug!( + "secp256k1_recover_pubkey() failed to recover pubkey: {:?}", + err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L98 + Ok(to_high_half(WasmApiCryptoError::GenericErr as u32) as i64) + } + Ok(pubkey) => { + let answer = pubkey.serialize(); + let ptr_to_region_in_wasm_vm = write_to_memory(&mut call_context.runtime, &answer).map_err(|err| { + debug!( + "secp256k1_recover_pubkey() error while trying to allocate and write the answer {:?} to the WASM VM", + &answer, + ); + err + })?; + + // Return pointer to the allocated buffer with the value written to it + Ok(to_low_half(ptr_to_region_in_wasm_vm) as i64) + } + } } fn host_ed25519_verify( @@ -769,7 +980,79 @@ fn host_ed25519_verify( (message_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let cost = context.gas_costs.external_ed25519_verify as u64; + context.use_gas_externally(cost)?; + + let message_data = memory.extract_vector(message_ptr as u32).map_err( + debug_err!(err => "ed25519_verify error while trying to read message_hash from wasm memory: {err}") + )?; + let signature_data = memory.extract_vector(signature_ptr as u32).map_err( + debug_err!(err => "ed25519_verify error while trying to read signature from wasm memory: {err}") + )?; + let public_key_data = memory.extract_vector(public_key_ptr as u32).map_err( + debug_err!(err => "ed25519_verify error while trying to read public_key from wasm memory: {err}") + )?; + + trace!( + "ed25519_verify was called from WASM code with message {:x?} (len {:?})", + &message_data, + message_data.len() + ); + trace!( + "ed25519_verify was called from WASM code with signature {:x?} (len {:?} should be 64)", + &signature_data, + signature_data.len() + ); + trace!( + "ed25519_verify was called from WASM code with public_key {:x?} (len {:?} should be 32)", + &public_key_data, + public_key_data.len() + ); + + let signature: ed25519_zebra::Signature = + match ed25519_zebra::Signature::try_from(signature_data.as_slice()) { + Ok(x) => x, + Err(err) => { + debug!( + "ed25519_verify() failed to create an ed25519 signature from signature: {:?}", + err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L94 + return Ok(WasmApiCryptoError::InvalidSignatureFormat as i32); + } + }; + + let public_key: ed25519_zebra::VerificationKey = match ed25519_zebra::VerificationKey::try_from( + public_key_data.as_slice(), + ) { + Ok(x) => x, + Err(err) => { + debug!( + "ed25519_verify() failed to create an ed25519 VerificationKey from public_key: {:?}", + err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L95 + return Ok(WasmApiCryptoError::InvalidPubkeyFormat as i32); + } + }; + + match public_key.verify(&signature, &message_data) { + Err(err) => { + debug!("ed25519_verify() failed to verify signature: {:?}", err); + + // return 1 == failed, invalid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L281 + Ok(1) + } + Ok(()) => { + // return 0 == success, valid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L281 + Ok(0) + } + } } fn host_ed25519_batch_verify( @@ -778,7 +1061,150 @@ fn host_ed25519_batch_verify( (messages_ptr, signatures_ptr, public_keys_ptr): (i32, i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let messages_data = memory + .decode_sections(messages_ptr as u32) + .map_err(debug_err!( + err => "ed25519_batch_verify error while trying to read messages from wasm memory: {err}" + ))?; + + let signatures_data = memory + .decode_sections(signatures_ptr as u32) + .map_err(debug_err!( + err => "ed25519_batch_verify error while trying to read signatures from wasm memory: {err}" + ))?; + + let pubkeys_data = memory + .decode_sections(public_keys_ptr as u32) + .map_err(debug_err!( + err => "ed25519_batch_verify error while trying to read public_keys from wasm memory: {err}" + ))?; + + let messages_len = messages_data.len(); + let signatures_len = signatures_data.len(); + let pubkeys_len = pubkeys_data.len(); + + if messages_len == 0 || signatures_len == 0 || pubkeys_len == 0 { + debug!("ed25519_batch_verify trying to bach verify with empty inputs!"); + return Err(WasmEngineError::MemoryReadError); + } + + let lengths = (messages_len, signatures_len, pubkeys_len); + let (messages, signatures, pubkeys): (Vec<&[u8]>, Vec<&[u8]>, Vec<&[u8]>) = match lengths { + (ml, sl, pl) if ml == sl && sl == pl => { + let messages = messages_data.iter().map(Vec::as_slice).collect(); + let signatures = signatures_data.iter().map(Vec::as_slice).collect(); + let pubkeys = pubkeys_data.iter().map(Vec::as_slice).collect(); + (messages, signatures, pubkeys) + } + (ml, sl, pl) if ml == 1 && sl == pl => { + let messages = vec![messages_data[0].as_slice()].repeat(signatures_len); + let signatures = signatures_data.iter().map(Vec::as_slice).collect(); + let pubkeys = pubkeys_data.iter().map(Vec::as_slice).collect(); + (messages, signatures, pubkeys) + } + (ml, sl, pl) if ml == sl && pl == 1 => { + let messages = messages_data.iter().map(Vec::as_slice).collect(); + let signatures = signatures_data.iter().map(Vec::as_slice).collect(); + let pubkeys = vec![pubkeys_data[0].as_slice()].repeat(signatures_len); + (messages, signatures, pubkeys) + } + _ => { + debug!( + "ed25519_batch_verify() mismatched number of messages ({}) / signatures ({}) / public keys ({})", + messages_len, + signatures_len, + pubkeys_len, + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L97 + return Ok(WasmApiCryptoError::BatchErr as i32); + } + }; + + let base_cost = context.gas_costs.external_ed25519_batch_verify_base as u64; + let each_cost = context.gas_costs.external_ed25519_batch_verify_each as u64; + context.use_gas_externally(base_cost + (signatures.len() as u64) * each_cost)?; + + let mut batch = ed25519_zebra::batch::Verifier::new(); + for i in 0..signatures.len() { + let signature = match ed25519_zebra::Signature::try_from(signatures[i]) { + Ok(x) => x, + Err(err) => { + debug!( + "ed25519_batch_verify() failed to create an ed25519 signature from signatures[{}]: {:?}", + i, err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L94 + return Ok(WasmApiCryptoError::InvalidSignatureFormat as i32); + } + }; + + let pubkey = match ed25519_zebra::VerificationKeyBytes::try_from(pubkeys[i]) { + Ok(x) => x, + Err(err) => { + debug!( + "ed25519_batch_verify() failed to create an ed25519 VerificationKey from public_keys[{}]: {:?}", + i, err + ); + + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/errors.rs#L95 + return Ok(WasmApiCryptoError::InvalidPubkeyFormat as i32); + } + }; + + batch.queue((pubkey, signature, messages[i])); + } + + // Assaf: + // To verify a batch of ed25519 signatures we need to provide an RNG source. + // In theory this doesn't have to be deterministic because the same signatures + // should produce the same output (true/false) regardless of the RNG being used. + // In practice I'm too afraid to do something non-deterministic in concensus code + // So I've decided to use a PRNG instead. + // For entropy I'm using the entire ed25519 batch verify input data + the gas consumed + // up until now in this WASM call. This will be deterministic, but also kinda-random in + // different situations. Note that the gas includes every WASM opcode and + // every WASM memory allocation up until now. + // Secret data from the enclave can also be used here but I'm not sure if that's necessary. + // A few more notes: + // 1. The vanilla CosmWasm v1 implementation is using RNG from the OS, + // meaning that different values are used in differents nodes for the same operation inside + // consensus code, but the output should be the same (https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/crypto/src/ed25519.rs#L108) + // 2. In Zcash (zebra) this is also used with RNG from the OS, however Zcash is a PoW chain + // and therefore there's no risk of consensus breaking (https://github.com/ZcashFoundation/zebra/blob/00aa5d96a30539a609bfdd17146b223c4e6cf424/tower-batch/tests/ed25519.rs#L72-L83). + // 3. In dalek-ed25519 they warn agains using deterministic RNG, as an attacker can derive a falsy signature from the right signature. For me this is an acceptable risk compared to breaking consensus (https://docs.rs/ed25519-dalek/1.0.1/ed25519_dalek/fn.verify_batch.html#on-deterministic-nonces and https://github.com/dalek-cryptography/ed25519-dalek/pull/147). + let mut rng_entropy: Vec = vec![]; + rng_entropy.append(&mut messages_data.into_iter().flatten().collect()); + rng_entropy.append(&mut signatures_data.into_iter().flatten().collect()); + rng_entropy.append(&mut pubkeys_data.into_iter().flatten().collect()); + rng_entropy.append( + &mut (context.gas_used.saturating_add(context.gas_used_externally)) + .to_be_bytes() + .to_vec(), + ); + + let rng_seed: [u8; 32] = sha_256(&rng_entropy); + let mut rng = ChaChaRng::from_seed(rng_seed); + + match batch.verify(&mut rng) { + Err(err) => { + debug!( + "ed25519_batch_verify() failed to verify signatures: {:?}", + err + ); + + // return 1 == failed, invalid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L329 + Ok(1) + } + Ok(()) => { + // return 0 == success, valid signature + // https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/src/imports.rs#L329 + Ok(0) + } + } } fn host_secp256k1_sign( @@ -787,7 +1213,75 @@ fn host_secp256k1_sign( (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let cost = context.gas_costs.external_secp256k1_sign as u64; + context.use_gas_externally(cost)?; + + let message_data = memory.extract_vector(message_ptr as u32).map_err( + debug_err!(err => "secp256k1_sign error while trying to read message_hash from wasm memory: {err}") + )?; + let private_key_data = memory.extract_vector(private_key_ptr as u32).map_err( + debug_err!(err => "secp256k1_sign error while trying to read private key from wasm memory: {err}") + )?; + + trace!( + "secp256k1_sign() was called from WASM code with message {:x?} (len {:?} should be 32)", + &message_data, + message_data.len() + ); + trace!( + "secp256k1_sign() was called from WASM code with private_key {:x?} (len {:?} should be 64)", + &private_key_data, + private_key_data.len() + ); + + if private_key_data.len() != 32 { + return Ok(to_high_half(WasmApiCryptoError::InvalidPrivateKeyFormat as u32) as i64); + } + + let secp = secp256k1::Secp256k1::new(); + + let message_hash: [u8; 32] = sha_256(message_data.as_slice()); + let secp256k1_msg = match secp256k1::Message::from_slice(&message_hash) { + Err(err) => { + debug!( + "secp256k1_sign() failed to create a secp256k1 message from message: {:?}", + err + ); + + return Ok(to_high_half(WasmApiCryptoError::GenericErr as u32) as i64); + } + Ok(x) => x, + }; + + let secp256k1_signing_key = match secp256k1::SecretKey::from_slice(private_key_data.as_slice()) + { + Err(err) => { + debug!( + "secp256k1_sign() failed to create a secp256k1 secret key from private key: {:?}", + err + ); + + return Ok(to_high_half(WasmApiCryptoError::InvalidPrivateKeyFormat as u32) as i64); + } + Ok(x) => x, + }; + + let sig = secp + .sign_ecdsa(&secp256k1_msg, &secp256k1_signing_key) + .serialize_compact(); + + let ptr_to_region_in_wasm_vm = + write_to_memory(&mut call_context.runtime, &sig).map_err(|err| { + debug!( + "secp256k1_sign() error while trying to allocate and write the sig {:?} to the WASM VM", + &sig, + ); + err + })?; + + // Return pointer to the allocated buffer with the value written to it + Ok(to_low_half(ptr_to_region_in_wasm_vm) as i64) } fn host_ed25519_sign( @@ -796,5 +1290,56 @@ fn host_ed25519_sign( (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { let memory = CWMemory::new(&mut call_context.runtime); - todo!() + + let cost = context.gas_costs.external_ed25519_sign as u64; + context.use_gas_externally(cost)?; + + let message_data = memory.extract_vector(message_ptr as u32).map_err( + debug_err!(err => "ed25519_sign error while trying to read message_hash from wasm memory: {err}") + )?; + let private_key_data = memory.extract_vector(private_key_ptr as u32).map_err( + debug_err!(err => "ed25519_sign error while trying to read private key from wasm memory: {err}") + )?; + + trace!( + "ed25519_sign() was called from WASM code with message {:x?} (len {:?} should be 32)", + &message_data, + message_data.len() + ); + trace!( + "ed25519_sign() was called from WASM code with private_key {:x?} (len {:?} should be 64)", + &private_key_data, + private_key_data.len() + ); + + // check private_key input + if private_key_data.len() != 32 { + return Ok(to_high_half(WasmApiCryptoError::InvalidPrivateKeyFormat as u32) as i64); + } + + let ed25519_signing_key = match ed25519_zebra::SigningKey::try_from(private_key_data.as_slice()) + { + Ok(x) => x, + Err(err) => { + debug!( + "ed25519_sign() failed to create an ed25519 signing key from private_key: {:?}", + err + ); + + return Ok(to_high_half(WasmApiCryptoError::InvalidPrivateKeyFormat as u32) as i64); + } + }; + + let sig: [u8; 64] = ed25519_signing_key.sign(message_data.as_slice()).into(); + + let ptr_to_region_in_wasm_vm = write_to_memory(&mut call_context.runtime, &sig).map_err(|err| { + debug!( + "ed25519_sign() error while trying to allocate and write the sig {:?} to the WASM VM", + &sig, + ); + err + })?; + + // Return pointer to the allocated buffer with the value written to it + Ok(to_low_half(ptr_to_region_in_wasm_vm) as i64) } From c954fb7aec8399fde255183dac96df993212c907 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 8 Aug 2022 00:13:27 +0300 Subject: [PATCH 14/67] added walrus based gas metering and code validation - almost working --- cosmwasm/enclaves/Cargo.lock | 70 ++++- .../shared/contract-engine/Cargo.toml | 6 +- .../shared/contract-engine/src/errors.rs | 2 + .../shared/contract-engine/src/wasm3/gas.rs | 175 ++++++++++++ .../shared/contract-engine/src/wasm3/mod.rs | 30 +- .../contract-engine/src/wasm3/validation.rs | 259 ++++++++++++++++++ 6 files changed, 532 insertions(+), 10 deletions(-) create mode 100644 cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs create mode 100644 cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index 57d1d8fca..70eeacbd3 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -60,6 +60,12 @@ name = "anyhow" version = "1.0.28" source = "git+https://github.com/mesalock-linux/anyhow-sgx#9b7763f58b5dedc11f388ea9a0072049c309e27d" +[[package]] +name = "anyhow" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c794e162a5eff65c72ef524dfe393eb923c354e350bb78b9c7383df13f3bc142" + [[package]] name = "atty" version = "0.2.14" @@ -488,6 +494,7 @@ dependencies = [ "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sha2 0.8.2", + "walrus", "wasm3", "wasmi", ] @@ -640,6 +647,15 @@ name = "hashbrown_tstd" version = "0.9.0" source = "git+https://github.com/apache/teaclave-sgx-sdk.git?rev=v1.1.3#a6a172e652b4db4eaa17e4faa078fda8922abdd0" +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -667,6 +683,12 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "instant" version = "0.1.12" @@ -711,6 +733,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "libc" version = "0.2.119" @@ -889,7 +917,7 @@ name = "prost-derive" version = "0.6.1" source = "git+https://github.com/mesalock-linux/prost-sgx?rev=cd3103a6d45cf7a43b6c1c5e4223428097d1c547#cd3103a6d45cf7a43b6c1c5e4223428097d1c547" dependencies = [ - "anyhow", + "anyhow 1.0.28", "itertools", "proc-macro2", "quote", @@ -1554,6 +1582,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + [[package]] name = "unicode-width" version = "0.1.9" @@ -1590,6 +1624,30 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walrus" +version = "0.19.0" +source = "git+https://github.com/scrtlabs/walrus?rev=ff51789#ff51789e33b75efd155a63c980e02f8115007644" +dependencies = [ + "anyhow 1.0.60", + "id-arena", + "leb128", + "log", + "walrus-macro", + "wasmparser", +] + +[[package]] +name = "walrus-macro" +version = "0.19.0" +source = "git+https://github.com/scrtlabs/walrus?rev=ff51789#ff51789e33b75efd155a63c980e02f8115007644" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" @@ -1599,7 +1657,7 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm3" version = "0.5.0" -source = "git+https://github.com/scrtlabs/wasm3-rs?rev=3ecaba2#3ecaba22e5a37631c71720a75cc7d4fcb3b8f858" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=004a3e7#004a3e7c38bea53b21f7991ab250476139c302c5" dependencies = [ "cty", "wasm3-sys", @@ -1608,7 +1666,7 @@ dependencies = [ [[package]] name = "wasm3-sys" version = "0.5.0" -source = "git+https://github.com/scrtlabs/wasm3-rs?rev=3ecaba2#3ecaba22e5a37631c71720a75cc7d4fcb3b8f858" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=004a3e7#004a3e7c38bea53b21f7991ab250476139c302c5" dependencies = [ "bindgen", "cc", @@ -1638,6 +1696,12 @@ dependencies = [ "parity-wasm", ] +[[package]] +name = "wasmparser" +version = "0.78.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" + [[package]] name = "webpki" version = "0.21.4" diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 322839440..0e9015726 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -25,6 +25,7 @@ enclave_crypto = { path = "../crypto" } enclave_cosmos_types = { path = "../cosmos-types" } enclave_cosmwasm_types = { path = "../cosmwasm-types" } enclave_utils = { path = "../utils" } + serde = { git = "https://github.com/mesalock-linux/serde-sgx", features = [ "derive" ] } @@ -36,9 +37,12 @@ log = "0.4.14" derive_more = "0.99" sha2 = "0.8.1" bech32 = "0.7.2" + pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } -wasm3 = { rev = "3ecaba2", git = "https://github.com/scrtlabs/wasm3-rs", features = ["build-bindgen"] } +wasm3 = { rev = "004a3e7", git = "https://github.com/scrtlabs/wasm3-rs", features = ["build-bindgen"] } +walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "ff51789" } + lru = { version = "0.6", default-features = false } hex = "0.4.2" secp256k1 = { version = "0.21.3", features = ["recovery"] } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index 1cd52816f..b9ce08906 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -100,6 +100,8 @@ pub fn wasm3_error_to_enclave_error( Wasm3RsError::ModuleNotFound => EnclaveError::InvalidWasm, Wasm3RsError::ModuleLoadEnvMismatch => EnclaveError::FailedFunctionCall, Wasm3RsError::RuntimeIsActive => EnclaveError::FailedFunctionCall, + Wasm3RsError::GlobalNotFound => EnclaveError::InvalidWasm, + Wasm3RsError::ArgumentTypeMismatch => EnclaveError::InvalidWasm, }, } } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs new file mode 100644 index 000000000..dd4159d0d --- /dev/null +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -0,0 +1,175 @@ +//! Gas metering instrumentation. +use std::collections::BTreeMap; + +use walrus::{ir::*, FunctionBuilder, GlobalId, LocalFunction, Module}; + +use enclave_ffi_types::EnclaveError; + +/// Name of the exported global that holds the gas limit. +pub const EXPORT_GAS_LIMIT: &str = "gas_limit"; +/// Name of the exported global that holds the gas limit exhausted flag. +pub const EXPORT_GAS_LIMIT_EXHAUSTED: &str = "gas_limit_exhausted"; + +/// Configures the gas limit on the given instance. +pub fn set_gas_limit(instance: &wasm3::Module<'_>, gas_limit: u64) -> Result<(), EnclaveError> { + instance + .set_global(EXPORT_GAS_LIMIT, gas_limit) + .map_err(|_err| EnclaveError::FailedGasMeteringInjection) +} + +/// Returns the remaining gas. +pub fn get_remaining_gas(instance: &wasm3::Module<'_>) -> u64 { + instance.get_global(EXPORT_GAS_LIMIT).unwrap_or_default() +} + +/// Returns the amount of gas requested that was over the limit. +pub fn get_exhausted_amount(instance: &wasm3::Module<'_>) -> u64 { + instance + .get_global(EXPORT_GAS_LIMIT_EXHAUSTED) + .unwrap_or_default() +} + +/// Attempts to use the given amount of gas. +pub fn use_gas(instance: &wasm3::Module<'_>, amount: u64) -> Result<(), wasm3::error::Trap> { + let gas_limit: u64 = instance + .get_global(EXPORT_GAS_LIMIT) + .map_err(|_| wasm3::error::Trap::Abort)?; + if gas_limit < amount { + let _ = instance.set_global(EXPORT_GAS_LIMIT_EXHAUSTED, amount); + return Err(wasm3::error::Trap::Abort); + } + instance + .set_global(EXPORT_GAS_LIMIT, gas_limit - amount) + .map_err(|_| wasm3::error::Trap::Abort)?; + Ok(()) +} + +/// Inject gas metering instrumentation into the module. +pub fn add_metering(module: &mut Module) { + let gas_limit_global = module.globals.add_local( + walrus::ValType::I64, + true, + walrus::InitExpr::Value(Value::I64(0)), + ); + let gas_limit_exhausted_global = module.globals.add_local( + walrus::ValType::I64, + true, + walrus::InitExpr::Value(Value::I64(0)), + ); + module.exports.add(EXPORT_GAS_LIMIT, gas_limit_global); + module + .exports + .add(EXPORT_GAS_LIMIT_EXHAUSTED, gas_limit_exhausted_global); + + for (_, func) in module.funcs.iter_local_mut() { + transform_function(func, gas_limit_global, gas_limit_exhausted_global); + } +} + +// todo copy from pwasm_utils +/// Instruction cost function. +fn instruction_cost(_instr: &Instr) -> u64 { + // Currently default to 1 for all instructions. + 1 +} + +// todo remove +/// A block of instructions which is metered. +#[derive(Debug)] +struct MeteredBlock { + /// Instruction sequence where metering code should be injected. + seq_id: InstrSeqId, + /// Start index of instruction within the instruction sequence before which the metering code + /// should be injected. + start_index: usize, + /// Instruction cost. + cost: u64, + /// Indication of whether the metered block can be merged in case instruction sequence and start + /// index match. In case the block cannot be merged this contains the index + merge_index: Option, +} + +impl MeteredBlock { + fn new(seq_id: InstrSeqId, start_index: usize) -> Self { + Self { + seq_id, + start_index, + cost: 0, + merge_index: None, + } + } + + /// Create a mergable version of this metered block with the given start index. + fn mergable(&self, start_index: usize) -> Self { + Self { + seq_id: self.seq_id, + start_index, + cost: 0, + merge_index: Some(self.start_index), + } + } +} + +fn transform_function( + func: &mut LocalFunction, + gas_limit_global: GlobalId, + gas_limit_exhausted_global: GlobalId, +) { + let block_ids: Vec<_> = func.blocks().map(|(block_id, block)| block_id).collect(); + for block_id in block_ids { + let block = func.block(block_id); + let new_block_len = block.len() + METERING_INSTRUCTION_COUNT; + let mut new_block = Vec::with_capacity(new_block_len); + + let mut metered_block = MeteredBlock::new(block_id, 0); + // todo replace with usage of fn instruction_cost + metered_block.cost = block.len() as u64; + + let builder = func.builder_mut(); + inject_metering( + builder, + &mut new_block, + metered_block, + gas_limit_global, + gas_limit_exhausted_global, + ); + + let block = func.block_mut(block_id); + new_block.extend_from_slice(&block); + block.instrs = new_block; + } +} + +/// Number of injected metering instructions (needed to calculate final instruction size). +const METERING_INSTRUCTION_COUNT: usize = 8; + +fn inject_metering( + builder: &mut FunctionBuilder, + instrs: &mut Vec<(Instr, InstrLocId)>, + block: MeteredBlock, + gas_limit_global: GlobalId, + gas_limit_exhausted_global: GlobalId, +) { + let mut builder = builder.dangling_instr_seq(None); + let seq = builder + // if unsigned(globals[gas_limit]) < unsigned(block.cost) { throw(); } + .global_get(gas_limit_global) + .i64_const(block.cost as i64) + .binop(BinaryOp::I64LtU) + .if_else( + None, + |then| { + then.i64_const(block.cost as i64) + .global_set(gas_limit_exhausted_global) + .unreachable(); + }, + |_else| {}, + ) + // globals[gas_limit] -= block.cost; + .global_get(gas_limit_global) + .i64_const(block.cost as i64) + .binop(BinaryOp::I64Sub) + .global_set(gas_limit_global); + + instrs.append(seq.instrs_mut()); +} diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 3909f02c9..0eced6084 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -25,6 +25,9 @@ use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::ContractOperation; +mod gas; +mod validation; + type Wasm3RsError = wasm3::error::Error; type Wasm3RsResult = wasm3::error::Result; @@ -135,9 +138,9 @@ impl Context { self.gas_limit < self.gas_used.saturating_add(self.gas_used_externally) } - fn use_gas_externally(&mut self, gas: u64) -> WasmEngineResult<()> { - // todo implement gas consumption - Ok(()) + fn use_gas_externally(&mut self, gas_amount: u64) -> WasmEngineResult<()> { + self.gas_used_externally = self.gas_used_externally.saturating_add(gas_amount); + self.check_gas_usage() } fn gas_left(&self) -> u64 { @@ -169,6 +172,21 @@ impl Engine { user_nonce: IoNonce, user_public_key: Ed25519PublicKey, ) -> Result { + let mut module = walrus::ModuleConfig::new() + .generate_producers_section(false) + .parse(contract_code.code()) + .map_err(|_| EnclaveError::InvalidWasm)?; + + validation::validate_memory(&mut module)?; + + if let ContractOperation::Init = operation { + validation::deny_floating_point(&module)?; + } + + gas::add_metering(&mut module); + + let transformed_code = module.emit_wasm(); + let context = Context { context, gas_limit, @@ -184,7 +202,7 @@ impl Engine { let context = Box::new(RefCell::new(context)); let context_ptr = Box::into_raw(context); - Engine::setup_runtime(context_ptr, contract_code).map_err(|err| unsafe { + Engine::setup_runtime(context_ptr, &transformed_code).map_err(|err| unsafe { let context = &*context_ptr; let mut context = context.borrow_mut(); wasm3_error_to_enclave_error(context.deref_mut(), err) @@ -193,7 +211,7 @@ impl Engine { fn setup_runtime( context_ptr: *mut RefCell, - contract_code: ContractCode, + contract_bytes: &[u8], ) -> Wasm3RsResult { debug!("setting up runtime"); let environment = wasm3::Environment::new()?; @@ -201,7 +219,7 @@ impl Engine { let runtime = environment.create_runtime(1024 * 60)?; debug!("initialized runtime"); - let mut module = runtime.parse_and_load_module(contract_code.code())?; + let mut module = runtime.parse_and_load_module(contract_bytes)?; debug!("parsed module"); #[rustfmt::skip] { diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs new file mode 100644 index 000000000..ef5846e80 --- /dev/null +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs @@ -0,0 +1,259 @@ +use log::*; + +use walrus::Module; + +use enclave_ffi_types::EnclaveError; + +pub fn validate_memory(module: &mut Module) -> Result<(), EnclaveError> { + // Verify that there is no start function defined. + if module.start.is_some() { + return Err(EnclaveError::WasmModuleWithStart); + } + + // Verify that there is at most one memory defined. + if module.memories.iter().count() > 1 { + return Err(EnclaveError::CannotInitializeWasmMemory); + } + + for memory in module.memories.iter_mut() { + let requested_initial_pages: u32 = memory.initial; + let maximum_allowed_pages: u32 = 192; // 12 MiB + + if requested_initial_pages > maximum_allowed_pages { + error!( + "WASM Requested to initialize with {} pages, maximum allowed is {}", + requested_initial_pages, maximum_allowed_pages + ); + return Err(EnclaveError::CannotInitializeWasmMemory); + } + + memory.maximum = Some(maximum_allowed_pages); + } + + Ok(()) +} + +pub fn deny_floating_point(module: &Module) -> Result<(), EnclaveError> { + for func in module.funcs.iter() { + if let walrus::FunctionKind::Local(func) = &func.kind { + for (_block_id, block) in func.blocks() { + deny_fp_block(module, block)? + } + } + } + + Ok(()) +} + +fn deny_fp_block(module: &Module, block: &walrus::ir::InstrSeq) -> Result<(), EnclaveError> { + use walrus::ir::*; + for (instr, _instr_loc_id) in &block.instrs { + match instr { + Instr::LocalGet(LocalGet { local }) => deny_fp_local(module, *local), + Instr::LocalSet(LocalSet { local }) => deny_fp_local(module, *local), + Instr::LocalTee(LocalTee { local }) => deny_fp_local(module, *local), + Instr::GlobalGet(GlobalGet { global }) => deny_fp_global(module, *global), + Instr::GlobalSet(GlobalSet { global }) => deny_fp_global(module, *global), + Instr::Const(Const { value }) => deny_fp_const(*value), + Instr::Binop(Binop { op }) => deny_fp_binop(*op), + Instr::Unop(Unop { op }) => deny_fp_unop(*op), + Instr::Select(Select { ty: Some(ty) }) => deny_fp_valtype(*ty), + Instr::Load(Load { kind, .. }) => deny_fp_load_kind(*kind), + Instr::Store(Store { kind, .. }) => deny_fp_store_kind(*kind), + Instr::RefNull(RefNull { ty }) => deny_fp_valtype(*ty), + + _ => Ok(()), + }?; + } + + Ok(()) +} + +#[inline(always)] +fn deny_fp_valtype(ty: walrus::ValType) -> Result<(), EnclaveError> { + use walrus::ValType::{F32, F64}; + + match ty { + F32 | F64 => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} + +fn deny_fp_local(module: &Module, local: walrus::LocalId) -> Result<(), EnclaveError> { + deny_fp_valtype(module.locals.get(local).ty()) +} + +fn deny_fp_global(module: &Module, global: walrus::GlobalId) -> Result<(), EnclaveError> { + deny_fp_valtype(module.globals.get(global).ty) +} + +fn deny_fp_const(value: walrus::ir::Value) -> Result<(), EnclaveError> { + use walrus::ir::Value::{F32, F64}; + + match value { + F32(_) | F64(_) => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} + +fn deny_fp_binop(op: walrus::ir::BinaryOp) -> Result<(), EnclaveError> { + use walrus::ir::BinaryOp::*; + + match op { + F32Eq + | F32Ne + | F32Lt + | F32Gt + | F32Le + | F32Ge + | F64Eq + | F64Ne + | F64Lt + | F64Gt + | F64Le + | F64Ge + | F32Add + | F32Sub + | F32Mul + | F32Div + | F32Min + | F32Max + | F32Copysign + | F64Add + | F64Sub + | F64Mul + | F64Div + | F64Min + | F64Max + | F64Copysign + | F32x4ReplaceLane { .. } + | F64x2ReplaceLane { .. } + | F32x4Eq + | F32x4Ne + | F32x4Lt + | F32x4Gt + | F32x4Le + | F32x4Ge + | F64x2Eq + | F64x2Ne + | F64x2Lt + | F64x2Gt + | F64x2Le + | F64x2Ge + | F32x4Add + | F32x4Sub + | F32x4Mul + | F32x4Div + | F32x4Min + | F32x4Max + | F32x4PMin + | F32x4PMax + | F64x2Add + | F64x2Sub + | F64x2Mul + | F64x2Div + | F64x2Min + | F64x2Max + | F64x2PMin + | F64x2PMax => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} + +fn deny_fp_unop(op: walrus::ir::UnaryOp) -> Result<(), EnclaveError> { + use walrus::ir::UnaryOp::*; + + match op { + F32Abs + | F32Neg + | F32Ceil + | F32Floor + | F32Trunc + | F32Nearest + | F32Sqrt + | F64Abs + | F64Neg + | F64Ceil + | F64Floor + | F64Trunc + | F64Nearest + | F64Sqrt + | I32TruncSF32 + | I32TruncUF32 + | I32TruncSF64 + | I32TruncUF64 + | I64TruncSF32 + | I64TruncUF32 + | I64TruncSF64 + | I64TruncUF64 + | F32ConvertSI32 + | F32ConvertUI32 + | F32ConvertSI64 + | F32ConvertUI64 + | F32DemoteF64 + | F64ConvertSI32 + | F64ConvertUI32 + | F64ConvertSI64 + | F64ConvertUI64 + | F64PromoteF32 + | I32ReinterpretF32 + | I64ReinterpretF64 + | F32ReinterpretI32 + | F64ReinterpretI64 + | F32x4Splat + | F32x4ExtractLane { .. } + | F64x2Splat + | F64x2ExtractLane { .. } + | F32x4Abs + | F32x4Neg + | F32x4Sqrt + | F32x4Ceil + | F32x4Floor + | F32x4Trunc + | F32x4Nearest + | F64x2Abs + | F64x2Neg + | F64x2Sqrt + | F64x2Ceil + | F64x2Floor + | F64x2Trunc + | F64x2Nearest + | I32x4TruncSatF64x2SZero + | I32x4TruncSatF64x2UZero + | F64x2ConvertLowI32x4S + | F64x2ConvertLowI32x4U + | F32x4DemoteF64x2Zero + | F64x2PromoteLowF32x4 + | I32x4TruncSatF32x4S + | I32x4TruncSatF32x4U + | F32x4ConvertI32x4S + | F32x4ConvertI32x4U + | I32TruncSSatF32 + | I32TruncUSatF32 + | I32TruncSSatF64 + | I32TruncUSatF64 + | I64TruncSSatF32 + | I64TruncUSatF32 + | I64TruncSSatF64 + | I64TruncUSatF64 => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} + +fn deny_fp_load_kind(kind: walrus::ir::LoadKind) -> Result<(), EnclaveError> { + use walrus::ir::LoadKind::{F32, F64}; + + match kind { + F32 | F64 => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} + +fn deny_fp_store_kind(kind: walrus::ir::StoreKind) -> Result<(), EnclaveError> { + use walrus::ir::StoreKind::{F32, F64}; + + match kind { + F32 | F64 => Err(EnclaveError::WasmModuleWithFP), + _ => Ok(()), + } +} From a6ab2ae5762a9e69f6dc146336ec0e148d43152a Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 9 Aug 2022 15:52:26 +0300 Subject: [PATCH 15/67] some gas limit fixes --- .../shared/contract-engine/src/wasm3/mod.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 0eced6084..92bdeb0a1 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -202,7 +202,7 @@ impl Engine { let context = Box::new(RefCell::new(context)); let context_ptr = Box::into_raw(context); - Engine::setup_runtime(context_ptr, &transformed_code).map_err(|err| unsafe { + Engine::setup_runtime(context_ptr, &transformed_code, gas_limit).map_err(|err| unsafe { let context = &*context_ptr; let mut context = context.borrow_mut(); wasm3_error_to_enclave_error(context.deref_mut(), err) @@ -212,6 +212,7 @@ impl Engine { fn setup_runtime( context_ptr: *mut RefCell, contract_bytes: &[u8], + gas_limit: u64, ) -> Wasm3RsResult { debug!("setting up runtime"); let environment = wasm3::Environment::new()?; @@ -222,6 +223,9 @@ impl Engine { let mut module = runtime.parse_and_load_module(contract_bytes)?; debug!("parsed module"); + gas::set_gas_limit(&module, gas_limit); + debug!("set gas limit"); + #[rustfmt::skip] { link_fn!(module, context_ptr, "db_read", host_read_db)?; #[cfg(not(feature = "query-only"))] { @@ -262,9 +266,10 @@ impl Engine { } pub fn gas_used(&self) -> u64 { - let context = unsafe { &*self.context }; - let context = context.borrow(); - context.gas_used + // let context = unsafe { &*self.context }; + // let context = context.borrow(); + // context.gas_used + 0 } pub fn write_to_memory(&mut self, buffer: &[u8]) -> Result { @@ -281,7 +286,7 @@ impl Engine { debug!("init failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); - debug!("booped context"); + debug!("borrowed context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; @@ -300,7 +305,7 @@ impl Engine { debug!("handle failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); - debug!("booped context"); + debug!("borrowed context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; @@ -319,7 +324,7 @@ impl Engine { debug!("query failed with {:?}", err); let context = &*self.context; let mut context = context.borrow_mut(); - debug!("booped context"); + debug!("borrowed context"); wasm3_error_to_enclave_error(context.deref_mut(), err) }; From ce0a88cb9a43a51f5d0793aa8d47190d0985de7b Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 9 Aug 2022 15:52:44 +0300 Subject: [PATCH 16/67] filter out walrus logs --- cosmwasm/enclaves/shared/utils/src/logger.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cosmwasm/enclaves/shared/utils/src/logger.rs b/cosmwasm/enclaves/shared/utils/src/logger.rs index d8668ee10..dc3eacd0c 100644 --- a/cosmwasm/enclaves/shared/utils/src/logger.rs +++ b/cosmwasm/enclaves/shared/utils/src/logger.rs @@ -11,12 +11,14 @@ impl log::Log for SimpleLogger { } fn log(&self, record: &Record) { - println!( - "{} [{}] {}", - record.level(), - record.target(), - record.args() - ); + if !record.target().starts_with("walrus::") { + println!( + "{} [{}] {}", + record.level(), + record.target(), + record.args() + ); + } } fn flush(&self) {} From c540d2f1dae9ec44c7522a177ebb72031118dbb0 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Wed, 10 Aug 2022 17:17:11 +0300 Subject: [PATCH 17/67] added checking of function signatures to deny_floating_point --- .../contract-engine/src/wasm3/validation.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs index ef5846e80..880c70066 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs @@ -35,9 +35,18 @@ pub fn validate_memory(module: &mut Module) -> Result<(), EnclaveError> { pub fn deny_floating_point(module: &Module) -> Result<(), EnclaveError> { for func in module.funcs.iter() { - if let walrus::FunctionKind::Local(func) = &func.kind { - for (_block_id, block) in func.blocks() { - deny_fp_block(module, block)? + use walrus::FunctionKind::*; + match &func.kind { + Local(func) => { + for (_block_id, block) in func.blocks() { + deny_fp_block(module, block)? + } + } + Import(walrus::ImportedFunction { ty, .. }) | Uninitialized(ty) => { + let ty = module.types.get(*ty); + for val_type in ty.params().iter().chain(ty.results().iter()) { + deny_fp_valtype(*val_type)?; + } } } } From 58b3f7eae56522166115ca44ea9618ba3424dfb3 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Thu, 11 Aug 2022 16:20:54 +0300 Subject: [PATCH 18/67] moved float check code into walrus --- cosmwasm/enclaves/Cargo.lock | 4 +- .../shared/contract-engine/Cargo.toml | 2 +- .../shared/contract-engine/src/wasm3/mod.rs | 5 +- .../contract-engine/src/wasm3/validation.rs | 234 ------------------ 4 files changed, 7 insertions(+), 238 deletions(-) diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index 70eeacbd3..c648d50fb 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -1627,7 +1627,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walrus" version = "0.19.0" -source = "git+https://github.com/scrtlabs/walrus?rev=ff51789#ff51789e33b75efd155a63c980e02f8115007644" +source = "git+https://github.com/scrtlabs/walrus?rev=81c459c#81c459ca288eff97af05a8c4001e9bc760b8cb3a" dependencies = [ "anyhow 1.0.60", "id-arena", @@ -1640,7 +1640,7 @@ dependencies = [ [[package]] name = "walrus-macro" version = "0.19.0" -source = "git+https://github.com/scrtlabs/walrus?rev=ff51789#ff51789e33b75efd155a63c980e02f8115007644" +source = "git+https://github.com/scrtlabs/walrus?rev=81c459c#81c459ca288eff97af05a8c4001e9bc760b8cb3a" dependencies = [ "heck", "proc-macro2", diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 0e9015726..9263de706 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -41,7 +41,7 @@ bech32 = "0.7.2" pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } wasm3 = { rev = "004a3e7", git = "https://github.com/scrtlabs/wasm3-rs", features = ["build-bindgen"] } -walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "ff51789" } +walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "81c459c" } lru = { version = "0.6", default-features = false } hex = "0.4.2" diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 92bdeb0a1..527c387cb 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -180,7 +180,10 @@ impl Engine { validation::validate_memory(&mut module)?; if let ContractOperation::Init = operation { - validation::deny_floating_point(&module)?; + if module.has_floats() { + debug!("contract was found to contain floating point operations"); + return Err(EnclaveError::WasmModuleWithFP); + } } gas::add_metering(&mut module); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs index 880c70066..aff4f673d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/validation.rs @@ -32,237 +32,3 @@ pub fn validate_memory(module: &mut Module) -> Result<(), EnclaveError> { Ok(()) } - -pub fn deny_floating_point(module: &Module) -> Result<(), EnclaveError> { - for func in module.funcs.iter() { - use walrus::FunctionKind::*; - match &func.kind { - Local(func) => { - for (_block_id, block) in func.blocks() { - deny_fp_block(module, block)? - } - } - Import(walrus::ImportedFunction { ty, .. }) | Uninitialized(ty) => { - let ty = module.types.get(*ty); - for val_type in ty.params().iter().chain(ty.results().iter()) { - deny_fp_valtype(*val_type)?; - } - } - } - } - - Ok(()) -} - -fn deny_fp_block(module: &Module, block: &walrus::ir::InstrSeq) -> Result<(), EnclaveError> { - use walrus::ir::*; - for (instr, _instr_loc_id) in &block.instrs { - match instr { - Instr::LocalGet(LocalGet { local }) => deny_fp_local(module, *local), - Instr::LocalSet(LocalSet { local }) => deny_fp_local(module, *local), - Instr::LocalTee(LocalTee { local }) => deny_fp_local(module, *local), - Instr::GlobalGet(GlobalGet { global }) => deny_fp_global(module, *global), - Instr::GlobalSet(GlobalSet { global }) => deny_fp_global(module, *global), - Instr::Const(Const { value }) => deny_fp_const(*value), - Instr::Binop(Binop { op }) => deny_fp_binop(*op), - Instr::Unop(Unop { op }) => deny_fp_unop(*op), - Instr::Select(Select { ty: Some(ty) }) => deny_fp_valtype(*ty), - Instr::Load(Load { kind, .. }) => deny_fp_load_kind(*kind), - Instr::Store(Store { kind, .. }) => deny_fp_store_kind(*kind), - Instr::RefNull(RefNull { ty }) => deny_fp_valtype(*ty), - - _ => Ok(()), - }?; - } - - Ok(()) -} - -#[inline(always)] -fn deny_fp_valtype(ty: walrus::ValType) -> Result<(), EnclaveError> { - use walrus::ValType::{F32, F64}; - - match ty { - F32 | F64 => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} - -fn deny_fp_local(module: &Module, local: walrus::LocalId) -> Result<(), EnclaveError> { - deny_fp_valtype(module.locals.get(local).ty()) -} - -fn deny_fp_global(module: &Module, global: walrus::GlobalId) -> Result<(), EnclaveError> { - deny_fp_valtype(module.globals.get(global).ty) -} - -fn deny_fp_const(value: walrus::ir::Value) -> Result<(), EnclaveError> { - use walrus::ir::Value::{F32, F64}; - - match value { - F32(_) | F64(_) => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} - -fn deny_fp_binop(op: walrus::ir::BinaryOp) -> Result<(), EnclaveError> { - use walrus::ir::BinaryOp::*; - - match op { - F32Eq - | F32Ne - | F32Lt - | F32Gt - | F32Le - | F32Ge - | F64Eq - | F64Ne - | F64Lt - | F64Gt - | F64Le - | F64Ge - | F32Add - | F32Sub - | F32Mul - | F32Div - | F32Min - | F32Max - | F32Copysign - | F64Add - | F64Sub - | F64Mul - | F64Div - | F64Min - | F64Max - | F64Copysign - | F32x4ReplaceLane { .. } - | F64x2ReplaceLane { .. } - | F32x4Eq - | F32x4Ne - | F32x4Lt - | F32x4Gt - | F32x4Le - | F32x4Ge - | F64x2Eq - | F64x2Ne - | F64x2Lt - | F64x2Gt - | F64x2Le - | F64x2Ge - | F32x4Add - | F32x4Sub - | F32x4Mul - | F32x4Div - | F32x4Min - | F32x4Max - | F32x4PMin - | F32x4PMax - | F64x2Add - | F64x2Sub - | F64x2Mul - | F64x2Div - | F64x2Min - | F64x2Max - | F64x2PMin - | F64x2PMax => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} - -fn deny_fp_unop(op: walrus::ir::UnaryOp) -> Result<(), EnclaveError> { - use walrus::ir::UnaryOp::*; - - match op { - F32Abs - | F32Neg - | F32Ceil - | F32Floor - | F32Trunc - | F32Nearest - | F32Sqrt - | F64Abs - | F64Neg - | F64Ceil - | F64Floor - | F64Trunc - | F64Nearest - | F64Sqrt - | I32TruncSF32 - | I32TruncUF32 - | I32TruncSF64 - | I32TruncUF64 - | I64TruncSF32 - | I64TruncUF32 - | I64TruncSF64 - | I64TruncUF64 - | F32ConvertSI32 - | F32ConvertUI32 - | F32ConvertSI64 - | F32ConvertUI64 - | F32DemoteF64 - | F64ConvertSI32 - | F64ConvertUI32 - | F64ConvertSI64 - | F64ConvertUI64 - | F64PromoteF32 - | I32ReinterpretF32 - | I64ReinterpretF64 - | F32ReinterpretI32 - | F64ReinterpretI64 - | F32x4Splat - | F32x4ExtractLane { .. } - | F64x2Splat - | F64x2ExtractLane { .. } - | F32x4Abs - | F32x4Neg - | F32x4Sqrt - | F32x4Ceil - | F32x4Floor - | F32x4Trunc - | F32x4Nearest - | F64x2Abs - | F64x2Neg - | F64x2Sqrt - | F64x2Ceil - | F64x2Floor - | F64x2Trunc - | F64x2Nearest - | I32x4TruncSatF64x2SZero - | I32x4TruncSatF64x2UZero - | F64x2ConvertLowI32x4S - | F64x2ConvertLowI32x4U - | F32x4DemoteF64x2Zero - | F64x2PromoteLowF32x4 - | I32x4TruncSatF32x4S - | I32x4TruncSatF32x4U - | F32x4ConvertI32x4S - | F32x4ConvertI32x4U - | I32TruncSSatF32 - | I32TruncUSatF32 - | I32TruncSSatF64 - | I32TruncUSatF64 - | I64TruncSSatF32 - | I64TruncUSatF32 - | I64TruncSSatF64 - | I64TruncUSatF64 => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} - -fn deny_fp_load_kind(kind: walrus::ir::LoadKind) -> Result<(), EnclaveError> { - use walrus::ir::LoadKind::{F32, F64}; - - match kind { - F32 | F64 => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} - -fn deny_fp_store_kind(kind: walrus::ir::StoreKind) -> Result<(), EnclaveError> { - use walrus::ir::StoreKind::{F32, F64}; - - match kind { - F32 | F64 => Err(EnclaveError::WasmModuleWithFP), - _ => Ok(()), - } -} From bdf606edb77b2f87c46e1047d9090c8e5d215b36 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Thu, 18 Aug 2022 23:11:46 +0300 Subject: [PATCH 19/67] rewrite wasm3 integration to use improved fork --- cosmwasm/enclaves/Cargo.lock | 57 +- cosmwasm/enclaves/ffi-types/src/types.rs | 3 + .../shared/contract-engine/Cargo.toml | 2 +- .../src/contract_operations.rs | 107 ++-- .../shared/contract-engine/src/errors.rs | 92 ++- .../shared/contract-engine/src/wasm3/gas.rs | 41 +- .../shared/contract-engine/src/wasm3/mod.rs | 582 +++++++++--------- 7 files changed, 446 insertions(+), 438 deletions(-) diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index c648d50fb..486e2a0bf 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -116,9 +116,9 @@ checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" [[package]] name = "bindgen" -version = "0.59.2" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" +checksum = "0f8523b410d7187a43085e7e064416ea32ded16bd0a4e6fc025e21616d01258f" dependencies = [ "bitflags", "cexpr", @@ -134,7 +134,7 @@ dependencies = [ "regex", "rustc-hash", "shlex 1.1.0", - "which", + "which 3.1.1", ] [[package]] @@ -224,9 +224,9 @@ checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cexpr" -version = "0.6.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" dependencies = [ "nom", ] @@ -564,9 +564,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.9.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ "atty", "humantime", @@ -689,6 +689,16 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "git+https://github.com/scrtlabs/impl-trait-for-tuples?tag=v0.2.2-secret#ec2ad4dd1b381f0395c95a9ad7c1505aff83df45" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "instant" version = "0.1.12" @@ -788,20 +798,14 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "nom" -version = "7.1.1" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" dependencies = [ "memchr", - "minimal-lexical", + "version_check", ] [[package]] @@ -946,7 +950,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac70cfc8935f5db2a29c0929db697035d02284011a9b78a5ef5d48092ce9673" dependencies = [ "log", - "which", + "which 4.2.4", ] [[package]] @@ -1656,17 +1660,19 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm3" -version = "0.5.0" -source = "git+https://github.com/scrtlabs/wasm3-rs?rev=004a3e7#004a3e7c38bea53b21f7991ab250476139c302c5" +version = "0.3.1" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=ad1c868#ad1c868bb6c5f62161f33d80f90c5b4541190018" dependencies = [ "cty", + "impl-trait-for-tuples", + "thiserror", "wasm3-sys", ] [[package]] name = "wasm3-sys" -version = "0.5.0" -source = "git+https://github.com/scrtlabs/wasm3-rs?rev=004a3e7#004a3e7c38bea53b21f7991ab250476139c302c5" +version = "0.3.1" +source = "git+https://github.com/scrtlabs/wasm3-rs?rev=ad1c868#ad1c868bb6c5f62161f33d80f90c5b4541190018" dependencies = [ "bindgen", "cc", @@ -1721,6 +1727,15 @@ dependencies = [ "webpki", ] +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + [[package]] name = "which" version = "4.2.4" diff --git a/cosmwasm/enclaves/ffi-types/src/types.rs b/cosmwasm/enclaves/ffi-types/src/types.rs index 5df9aaf35..0188b686c 100644 --- a/cosmwasm/enclaves/ffi-types/src/types.rs +++ b/cosmwasm/enclaves/ffi-types/src/types.rs @@ -117,6 +117,9 @@ pub enum EnclaveError { /// The contract has run out of space on the stack. #[display(fmt = "the contract has run out of space on the stack")] ContractPanicStackOverflow, + /// The contract performed integer overflow. + #[display(fmt = "the contract has run out of space on the stack")] + ContractPanicIntegerOverflow, /// The contract tried to call a function but expected an incorrect function signature. #[display( fmt = "the contract tried to call a function but expected an incorrect function signature" diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 9263de706..05f7d17b7 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -40,7 +40,7 @@ bech32 = "0.7.2" pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } -wasm3 = { rev = "004a3e7", git = "https://github.com/scrtlabs/wasm3-rs", features = ["build-bindgen"] } +wasm3 = { git = "https://github.com/scrtlabs/wasm3-rs", rev = "ad1c868" } walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "81c459c" } lru = { version = "0.6", default-features = false } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 74270985b..9881227d8 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -111,32 +111,20 @@ pub fn init( EnclaveError::FailedToSerialize })?; - let env_ptr = engine.write_to_memory(&new_env)?; - let msg_ptr = engine.write_to_memory(&validated_msg)?; - - // This wrapper is used to coalesce all errors in this block to one object - // so we can `.map_err()` in one place for all of them - let output = coalesce!(EnclaveError, { - let vec_ptr = engine.init(env_ptr, msg_ptr)?; - let output = engine.extract_vector(vec_ptr)?; - // TODO: copy cosmwasm's structures to enclave - // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/init_handle.rs#L129 - // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/query.rs#L13 - let output = encrypt_output( - output, - secret_msg.nonce, - secret_msg.user_public_key, - &canonical_contract_address, - )?; - - Ok(output) - }) - .map_err(|err| { - *used_gas = engine.gas_used(); - err - })?; - + let result = engine.init(new_env, validated_msg); *used_gas = engine.gas_used(); + let output = result?; + + // TODO: copy cosmwasm's structures to enclave + // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/init_handle.rs#L129 + // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/query.rs#L13 + let output = encrypt_output( + output, + secret_msg.nonce, + secret_msg.user_public_key, + &canonical_contract_address, + )?; + // todo: can move the key to somewhere in the output message if we want Ok(InitSuccess { @@ -229,34 +217,21 @@ pub fn handle( EnclaveError::FailedToSerialize })?; - let env_ptr = engine.write_to_memory(&new_env)?; - let msg_ptr = engine.write_to_memory(&validated_msg)?; - - // This wrapper is used to coalesce all errors in this block to one object - // so we can `.map_err()` in one place for all of them - let output = coalesce!(EnclaveError, { - let vec_ptr = engine.handle(env_ptr, msg_ptr)?; - - let output = engine.extract_vector(vec_ptr)?; + let result = engine.handle(new_env, validated_msg); + *used_gas = engine.gas_used(); + let output = result?; - debug!( - "(2) nonce just before encrypt_output: nonce = {:?} pubkey = {:?}", - secret_msg.nonce, secret_msg.user_public_key - ); - let output = encrypt_output( - output, - secret_msg.nonce, - secret_msg.user_public_key, - &canonical_contract_address, - )?; - Ok(output) - }) - .map_err(|err| { - *used_gas = engine.gas_used(); - err - })?; + debug!( + "(2) nonce just before encrypt_output: nonce = {:?} pubkey = {:?}", + secret_msg.nonce, secret_msg.user_public_key + ); + let output = encrypt_output( + output, + secret_msg.nonce, + secret_msg.user_public_key, + &canonical_contract_address, + )?; - *used_gas = engine.gas_used(); Ok(HandleSuccess { output }) } @@ -318,29 +293,17 @@ pub fn query( secret_msg.user_public_key, )?; - let msg_ptr = engine.write_to_memory(&validated_msg)?; - - // This wrapper is used to coalesce all errors in this block to one object - // so we can `.map_err()` in one place for all of them - let output = coalesce!(EnclaveError, { - let vec_ptr = engine.query(msg_ptr)?; - - let output = engine.extract_vector(vec_ptr)?; + let result = engine.query(validated_msg); + *used_gas = engine.gas_used(); + let output = result?; - let output = encrypt_output( - output, - secret_msg.nonce, - secret_msg.user_public_key, - &CanonicalAddr(Binary(Vec::new())), // Not used for queries (can't init a new contract from a query) - )?; - Ok(output) - }) - .map_err(|err| { - *used_gas = engine.gas_used(); - err - })?; + let output = encrypt_output( + output, + secret_msg.nonce, + secret_msg.user_public_key, + &CanonicalAddr(Binary(Vec::new())), // Not used for queries (can't init a new contract from a query) + )?; - *used_gas = engine.gas_used(); Ok(QuerySuccess { output }) } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index b9ce08906..6a1c3620e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -3,6 +3,8 @@ use log::*; use wasmi::{Error as InterpreterError, HostError, TrapKind}; +use wasm3::Error as Wasm3RsError; + use enclave_ffi_types::{EnclaveError, UntrustedVmError}; use crate::external::ecalls::BufferRecoveryError; @@ -73,36 +75,68 @@ impl From> for EnclaveError { } } -pub fn wasm3_error_to_enclave_error( - context: &mut crate::wasm3::Context, - wasm3_error: wasm3::error::Error, -) -> EnclaveError { - use wasm3::error::Error as Wasm3RsError; - use wasm3::error::Trap; - - match context.take_last_error() { - Some(wasm_engine_error) => wasm_engine_error.into(), - None => match wasm3_error { - Wasm3RsError::Wasm3(wasm3_error) => match Trap::from(wasm3_error) { - Trap::OutOfBoundsMemoryAccess => EnclaveError::ContractPanicMemoryAccessOutOfBounds, - Trap::DivisionByZero => EnclaveError::ContractPanicDivisionByZero, - Trap::IntegerOverflow => EnclaveError::Panic, - Trap::IntegerConversion => EnclaveError::ContractPanicInvalidConversionToInt, - Trap::IndirectCallTypeMismatch => EnclaveError::FailedFunctionCall, - Trap::TableIndexOutOfRange => EnclaveError::ContractPanicTableAccessOutOfBounds, - Trap::Exit => EnclaveError::Panic, - Trap::Abort => EnclaveError::Panic, - Trap::Unreachable => EnclaveError::ContractPanicUnreachable, - Trap::StackOverflow => EnclaveError::ContractPanicStackOverflow, - }, - Wasm3RsError::InvalidFunctionSignature => EnclaveError::InvalidWasm, - Wasm3RsError::FunctionNotFound => EnclaveError::FailedFunctionCall, - Wasm3RsError::ModuleNotFound => EnclaveError::InvalidWasm, - Wasm3RsError::ModuleLoadEnvMismatch => EnclaveError::FailedFunctionCall, - Wasm3RsError::RuntimeIsActive => EnclaveError::FailedFunctionCall, +/// This trait is used to convert foreign error types to EnclaveError +pub trait ToEnclaveError { + fn to_enclave_error(self) -> EnclaveError; +} + +impl ToEnclaveError for Wasm3RsError { + fn to_enclave_error(self) -> EnclaveError { + match self { + Wasm3RsError::MemoryAllocationFailure => EnclaveError::MemoryAllocationError, + Wasm3RsError::ParseError(_parse_error) => EnclaveError::InvalidWasm, + Wasm3RsError::ModuleAlreadyLinked => EnclaveError::CannotInitializeWasmMemory, + Wasm3RsError::ModuleTooLarge => EnclaveError::InvalidWasm, + Wasm3RsError::MalformedModuleName => EnclaveError::InvalidWasm, + Wasm3RsError::MalformedFunctionName => EnclaveError::InvalidWasm, + Wasm3RsError::MalformedFunctionSignature => EnclaveError::InvalidWasm, + Wasm3RsError::MalformedGlobalName => EnclaveError::InvalidWasm, Wasm3RsError::GlobalNotFound => EnclaveError::InvalidWasm, - Wasm3RsError::ArgumentTypeMismatch => EnclaveError::InvalidWasm, - }, + Wasm3RsError::FunctionNotFound => EnclaveError::FailedFunctionCall, + Wasm3RsError::FunctionImportMissing => EnclaveError::FailedFunctionCall, + Wasm3RsError::ArgumentCountMismatch => EnclaveError::FailedFunctionCall, + Wasm3RsError::ArgumentTypeMismatch => EnclaveError::FailedFunctionCall, + Wasm3RsError::MemoryInUse => EnclaveError::MemoryReadError, + Wasm3RsError::OutOfMemory => EnclaveError::OutOfMemory, + + // Traps. + Wasm3RsError::OutOfBoundsMemoryAccess => { + EnclaveError::ContractPanicMemoryAccessOutOfBounds + } + Wasm3RsError::DivisionByZero => EnclaveError::ContractPanicDivisionByZero, + Wasm3RsError::IntegerOverflow => EnclaveError::ContractPanicUnreachable, + Wasm3RsError::InvalidIntegerConversion => { + EnclaveError::ContractPanicInvalidConversionToInt + } + Wasm3RsError::IndirectCallTypeMismatch => { + EnclaveError::ContractPanicUnexpectedSignature + } + Wasm3RsError::UndefinedTableElement => { + EnclaveError::ContractPanicTableAccessOutOfBounds + } + Wasm3RsError::NullTableElement => EnclaveError::ContractPanicTableAccessOutOfBounds, + Wasm3RsError::ExitCalled => EnclaveError::ContractPanicUnreachable, + Wasm3RsError::AbortCalled => EnclaveError::ContractPanicUnreachable, + Wasm3RsError::UnreachableExecuted => EnclaveError::ContractPanicUnreachable, + Wasm3RsError::StackOverflow => EnclaveError::ContractPanicStackOverflow, + + // Other errors. + Wasm3RsError::Unknown(_string) => EnclaveError::Unknown, + } + } +} + +/// This trait is used to convert foreign result types to EnclaveError +pub trait ToEnclaveResult { + fn to_enclave_result(self) -> Result; +} + +impl ToEnclaveResult for Result +where + E: ToEnclaveError, +{ + fn to_enclave_result(self) -> Result { + self.map_err(|err| err.to_enclave_error()) } } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs index dd4159d0d..b811764d8 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -1,5 +1,4 @@ //! Gas metering instrumentation. -use std::collections::BTreeMap; use walrus::{ir::*, FunctionBuilder, GlobalId, LocalFunction, Module}; @@ -11,36 +10,39 @@ pub const EXPORT_GAS_LIMIT: &str = "gas_limit"; pub const EXPORT_GAS_LIMIT_EXHAUSTED: &str = "gas_limit_exhausted"; /// Configures the gas limit on the given instance. -pub fn set_gas_limit(instance: &wasm3::Module<'_>, gas_limit: u64) -> Result<(), EnclaveError> { +pub fn set_gas_limit( + instance: &wasm3::Instance<'_, '_, C>, + gas_limit: u64, +) -> Result<(), EnclaveError> { instance .set_global(EXPORT_GAS_LIMIT, gas_limit) .map_err(|_err| EnclaveError::FailedGasMeteringInjection) } /// Returns the remaining gas. -pub fn get_remaining_gas(instance: &wasm3::Module<'_>) -> u64 { +pub fn get_remaining_gas(instance: &wasm3::Instance<'_, '_, C>) -> u64 { instance.get_global(EXPORT_GAS_LIMIT).unwrap_or_default() } /// Returns the amount of gas requested that was over the limit. -pub fn get_exhausted_amount(instance: &wasm3::Module<'_>) -> u64 { +pub fn get_exhausted_amount(instance: &wasm3::Instance<'_, '_, C>) -> u64 { instance .get_global(EXPORT_GAS_LIMIT_EXHAUSTED) .unwrap_or_default() } /// Attempts to use the given amount of gas. -pub fn use_gas(instance: &wasm3::Module<'_>, amount: u64) -> Result<(), wasm3::error::Trap> { +pub fn use_gas(instance: &wasm3::Instance<'_, '_, C>, amount: u64) -> Result<(), wasm3::Trap> { let gas_limit: u64 = instance .get_global(EXPORT_GAS_LIMIT) - .map_err(|_| wasm3::error::Trap::Abort)?; + .map_err(|_| wasm3::Trap::Abort)?; if gas_limit < amount { let _ = instance.set_global(EXPORT_GAS_LIMIT_EXHAUSTED, amount); - return Err(wasm3::error::Trap::Abort); + return Err(wasm3::Trap::Abort); } instance .set_global(EXPORT_GAS_LIMIT, gas_limit - amount) - .map_err(|_| wasm3::error::Trap::Abort)?; + .map_err(|_| wasm3::Trap::Abort)?; Ok(()) } @@ -84,9 +86,6 @@ struct MeteredBlock { start_index: usize, /// Instruction cost. cost: u64, - /// Indication of whether the metered block can be merged in case instruction sequence and start - /// index match. In case the block cannot be merged this contains the index - merge_index: Option, } impl MeteredBlock { @@ -95,17 +94,6 @@ impl MeteredBlock { seq_id, start_index, cost: 0, - merge_index: None, - } - } - - /// Create a mergable version of this metered block with the given start index. - fn mergable(&self, start_index: usize) -> Self { - Self { - seq_id: self.seq_id, - start_index, - cost: 0, - merge_index: Some(self.start_index), } } } @@ -115,15 +103,18 @@ fn transform_function( gas_limit_global: GlobalId, gas_limit_exhausted_global: GlobalId, ) { - let block_ids: Vec<_> = func.blocks().map(|(block_id, block)| block_id).collect(); + let block_ids: Vec<_> = func.blocks().map(|(block_id, _block)| block_id).collect(); for block_id in block_ids { let block = func.block(block_id); let new_block_len = block.len() + METERING_INSTRUCTION_COUNT; let mut new_block = Vec::with_capacity(new_block_len); let mut metered_block = MeteredBlock::new(block_id, 0); - // todo replace with usage of fn instruction_cost - metered_block.cost = block.len() as u64; + metered_block.cost = block + .instrs + .iter() + .map(|(inst, _instr_loc)| instruction_cost(inst)) + .sum(); let builder = func.builder_mut(); inject_metering( diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 527c387cb..831a5b5c4 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -1,14 +1,11 @@ -use std::cell::RefCell; use std::convert::{TryFrom, TryInto}; -use std::marker::PhantomData; -use std::ops::DerefMut; use log::*; use bech32::{FromBase32, ToBase32}; use rand_chacha::ChaChaRng; use rand_core::SeedableRng; -use wasm3::error::Trap; +use wasm3::{Memory, Trap}; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; @@ -19,17 +16,18 @@ use crate::contract_validation::ContractKey; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] use crate::db::{remove_encrypted_key, write_encrypted_key}; -use crate::errors::{wasm3_error_to_enclave_error, WasmEngineError, WasmEngineResult}; +use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngineResult}; use crate::gas::WasmCosts; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::ContractOperation; +use crate::wasm3::gas::get_remaining_gas; mod gas; mod validation; -type Wasm3RsError = wasm3::error::Error; -type Wasm3RsResult = wasm3::error::Result; +type Wasm3RsError = wasm3::Error; +type Wasm3RsResult = Result; macro_rules! debug_err { ($message: literal) => { @@ -50,25 +48,16 @@ macro_rules! set_last_error { ($context: expr) => { |err| { $context.set_last_error(err); - wasm3::error::Trap::Exit + wasm3::Trap::Abort } }; } macro_rules! link_fn { - ($module: expr, $context_ptr: expr, $name: expr, $implementation: expr) => { - $module - .link_closure("env", $name, move |call_context, args| { - debug!("{} was called", $name); - let context = unsafe { &*$context_ptr }; - let mut context = context.borrow_mut(); - let ret = $implementation(&mut context, call_context, args) - .map_err(set_last_error!(context)); - debug!("{} finished", $name); - ret - }) - .allow_missing_import() - }; + ($instance: expr, $name: expr, $implementation: expr) => {{ + let func = expect_context($implementation); + $instance.link_function("env", $name, func) + }}; } trait Wasm3ResultEx { @@ -79,16 +68,32 @@ impl Wasm3ResultEx for Wasm3RsResult<()> { fn allow_missing_import(self) -> Self { match self { Err(Wasm3RsError::FunctionNotFound) => Ok(()), + // TODO check how this looks like in oasis's version // Workaround for erroneous non-enumerated error in this case in wasm3. // Search for the string "function signature mismatch" in the C source - Err(Wasm3RsError::Wasm3(wasm3_error)) if Trap::from(wasm3_error) == Trap::Abort => { - Err(Wasm3RsError::InvalidFunctionSignature) - } + // Err(Wasm3RsError::Wasm3(wasm3_error)) if Trap::from(wasm3_error) == Trap::Abort => { + // Err(Wasm3RsError::InvalidFunctionSignature) + // } other => other, } } } +trait Wasm3RuntimeEx { + fn try_with_memory_or(&self, error: E, f: F) -> Result + where + F: FnOnce(wasm3::Memory<'_>) -> R; +} + +impl<'env, C> Wasm3RuntimeEx for wasm3::Runtime<'env, C> { + fn try_with_memory_or(&self, error: E, f: F) -> Result + where + F: FnOnce(Memory<'_>) -> R, + { + self.try_with_memory(f).map_err(|_err| error) + } +} + pub struct Context { context: Ctx, gas_limit: u64, @@ -150,15 +155,35 @@ impl Context { } } +/// Wrap the hook function such that we expect the context to be passed in, +/// and we save the WasmEngineError in the Context. +fn expect_context( + mut func: F, +) -> impl FnMut(wasm3::CallContext, A) -> Result + 'static +where + F: FnMut(&mut Context, &wasm3::Instance, A) -> Result + 'static, + A: wasm3::Arg, + R: wasm3::Arg, +{ + move |call_context, input| { + let err_msg = "module functions must be called with a context"; + let context = call_context.context.expect(err_msg); + let instance = call_context.instance; + func(context, instance, input).map_err(set_last_error!(context)) + } +} + pub struct Engine { // WARNING! // This box is dropped when the Engine is dropped. You MUST NOT use the pointer // after destroying the engine. Using this pointer in the `host_*` functions // is only legal because we do not provide direct access to the `runtime` field outside // the Engine. We also use a RefCell to ensure that we don't access the Context incorrectly. - context: *mut RefCell, + context: Context, + gas_limit: u64, + used_gas: u64, environment: wasm3::Environment, - runtime: wasm3::Runtime, + code: Vec, } impl Engine { @@ -188,7 +213,7 @@ impl Engine { gas::add_metering(&mut module); - let transformed_code = module.emit_wasm(); + let code = module.emit_wasm(); let context = Context { context, @@ -202,172 +227,177 @@ impl Engine { user_public_key, last_error: None, }; - let context = Box::new(RefCell::new(context)); - let context_ptr = Box::into_raw(context); - Engine::setup_runtime(context_ptr, &transformed_code, gas_limit).map_err(|err| unsafe { - let context = &*context_ptr; - let mut context = context.borrow_mut(); - wasm3_error_to_enclave_error(context.deref_mut(), err) + debug!("setting up runtime"); + let environment = wasm3::Environment::new().to_enclave_result()?; + debug!("initialized environment"); + + Ok(Self { + context, + gas_limit, + used_gas: 0, + environment, + code, }) } - fn setup_runtime( - context_ptr: *mut RefCell, - contract_bytes: &[u8], - gas_limit: u64, - ) -> Wasm3RsResult { - debug!("setting up runtime"); - let environment = wasm3::Environment::new()?; - debug!("initialized environment"); - let runtime = environment.create_runtime(1024 * 60)?; + fn with_instance(&mut self, func: F) -> Result, EnclaveError> + where + F: FnOnce(&mut wasm3::Instance, &mut Context) -> Result, EnclaveError>, + { + let runtime = self + .environment + .new_runtime::(1024 * 60, Some(192 /* 12 MiB */)) + .to_enclave_result()?; debug!("initialized runtime"); - let mut module = runtime.parse_and_load_module(contract_bytes)?; + let module = self + .environment + .parse_module(&self.code) + .to_enclave_result()?; debug!("parsed module"); - gas::set_gas_limit(&module, gas_limit); + let mut instance = runtime.load_module(module).to_enclave_result()?; + debug!("created instance"); + + gas::set_gas_limit(&instance, self.gas_limit)?; debug!("set gas limit"); - #[rustfmt::skip] { - link_fn!(module, context_ptr, "db_read", host_read_db)?; - #[cfg(not(feature = "query-only"))] { - link_fn!(module, context_ptr, "db_write", host_write_db)?; - link_fn!(module, context_ptr, "db_remove", host_remove_db)?; - } - link_fn!(module, context_ptr, "canonicalize_address", host_canonicalize_address)?; - link_fn!(module, context_ptr, "humanize_address", host_humanize_address)?; - link_fn!(module, context_ptr, "query_chain", host_query_chain)?; - link_fn!(module, context_ptr, "debug_print", host_debug_print)?; - link_fn!(module, context_ptr, "gas", host_gas)?; - link_fn!(module, context_ptr, "secp256k1_verify", host_secp256k1_verify)?; - link_fn!(module, context_ptr, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; - link_fn!(module, context_ptr, "ed25519_verify", host_ed25519_verify)?; - link_fn!(module, context_ptr, "ed25519_batch_verify", host_ed25519_batch_verify)?; - link_fn!(module, context_ptr, "secp256k1_sign", host_secp256k1_sign)?; - link_fn!(module, context_ptr, "ed25519_sign", host_ed25519_sign)?; - } + Self::link_host_functions(&mut instance) + .allow_missing_import() + .to_enclave_result()?; debug!("linked functions"); - Ok(Self { - context: context_ptr, - environment, - runtime, - }) - } + let result = func(&mut instance, &mut self.context); + debug!("function returned {:?}", result); - fn init_fn(&self) -> Wasm3RsResult> { - self.runtime.find_function::<(u32, u32), u32>("init") - } + // TODO make gas reporting more accurate + self.used_gas = self.gas_limit - get_remaining_gas(&instance); - fn handle_fn(&self) -> Wasm3RsResult> { - self.runtime.find_function::<(u32, u32), u32>("handle") + result } - fn query_fn(&self) -> Wasm3RsResult> { - self.runtime.find_function::("query") + fn link_host_functions(instance: &mut wasm3::Instance) -> Wasm3RsResult<()> { + link_fn!(instance, "db_read", host_read_db)?; + #[cfg(not(feature = "query-only"))] + { + link_fn!(instance, "db_write", host_write_db)?; + link_fn!(instance, "db_remove", host_remove_db)?; + } + link_fn!(instance, "canonicalize_address", host_canonicalize_address)?; + link_fn!(instance, "humanize_address", host_humanize_address)?; + link_fn!(instance, "query_chain", host_query_chain)?; + link_fn!(instance, "debug_print", host_debug_print)?; + link_fn!(instance, "gas", host_gas)?; + link_fn!(instance, "secp256k1_verify", host_secp256k1_verify)?; + link_fn!( + instance, + "secp256k1_recover_pubkey", + host_secp256k1_recover_pubkey + )?; + link_fn!(instance, "ed25519_verify", host_ed25519_verify)?; + link_fn!(instance, "ed25519_batch_verify", host_ed25519_batch_verify)?; + link_fn!(instance, "secp256k1_sign", host_secp256k1_sign)?; + link_fn!(instance, "ed25519_sign", host_ed25519_sign)?; + + Ok(()) } + /// get the amount of gas used by the last contract execution pub fn gas_used(&self) -> u64 { - // let context = unsafe { &*self.context }; - // let context = context.borrow(); - // context.gas_used - 0 + self.used_gas } - pub fn write_to_memory(&mut self, buffer: &[u8]) -> Result { - write_to_memory(&mut self.runtime, buffer) - } + pub fn init(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { + self.with_instance(|instance, context| { + let env_ptr = write_to_memory(instance, &env)?; + let msg_ptr = write_to_memory(instance, &msg)?; - pub fn extract_vector(&mut self, region_ptr: u32) -> Result, WasmEngineError> { - let mem = CWMemory::new(&mut self.runtime); - mem.extract_vector(region_ptr) - } + let init = instance + .find_function::<(u32, u32), u32>("init") + .to_enclave_result()?; - pub fn init(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { - let handle_wasm3_err = |err| unsafe { - debug!("init failed with {:?}", err); - let context = &*self.context; - let mut context = context.borrow_mut(); - debug!("borrowed context"); - wasm3_error_to_enclave_error(context.deref_mut(), err) - }; + let output_ptr = init + .call_with_context(context, (env_ptr, msg_ptr)) + .map_err(|err| match context.take_last_error() { + Some(err) => err.into(), + None => err.to_enclave_error(), + })?; - debug!("init starting"); - let ret = self - .init_fn() - .map_err(handle_wasm3_err)? - .call(env_ptr, msg_ptr) - .map_err(handle_wasm3_err); - debug!("init returned {:?}", ret); - ret - } + let output = read_from_memory(instance, output_ptr)?; - pub fn handle(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { - let handle_wasm3_err = |err| unsafe { - debug!("handle failed with {:?}", err); - let context = &*self.context; - let mut context = context.borrow_mut(); - debug!("borrowed context"); - wasm3_error_to_enclave_error(context.deref_mut(), err) - }; + Ok(output) + }) + } - debug!("handle starting"); - let ret = self - .handle_fn() - .map_err(handle_wasm3_err)? - .call(env_ptr, msg_ptr) - .map_err(handle_wasm3_err); - debug!("handle returned {:?}", ret); - ret + pub fn handle(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { + self.with_instance(|instance, context| { + let env_ptr = write_to_memory(instance, &env)?; + debug!("handle written env"); + let msg_ptr = write_to_memory(instance, &msg)?; + debug!("handle written msg"); + + let handle = instance + .find_function::<(u32, u32), u32>("handle") + .map_err(debug_err!(err => "couldn't find handle: {err:?}")) + .to_enclave_result()?; + debug!("found handle"); + + let output_ptr = handle + .call_with_context(context, (env_ptr, msg_ptr)) + .map_err(debug_err!(err => "failed to call handle: {err:?}")) + .map_err(|err| match context.take_last_error() { + Some(err) => err.into(), + None => err.to_enclave_error(), + })?; + debug!("called handle"); + + let output = read_from_memory(instance, output_ptr)?; + debug!("extracted handle output: {:?}", output); + + Ok(output) + }) } - pub fn query(&mut self, msg_ptr: u32) -> Result { - let handle_wasm3_err = |err| unsafe { - debug!("query failed with {:?}", err); - let context = &*self.context; - let mut context = context.borrow_mut(); - debug!("borrowed context"); - wasm3_error_to_enclave_error(context.deref_mut(), err) - }; + pub fn query(&mut self, msg: Vec) -> Result, EnclaveError> { + self.with_instance(|instance, context| { + let msg_ptr = write_to_memory(instance, &msg)?; - debug!("query starting"); - let ret = self - .query_fn() - .map_err(handle_wasm3_err)? - .call(msg_ptr) - .map_err(handle_wasm3_err); - debug!("query returned {:?}", ret); - ret - } -} + let query = instance + .find_function::("query") + .to_enclave_result()?; -impl Drop for Engine { - fn drop(&mut self) { - let context = unsafe { Box::from_raw(self.context) }; - drop(context) + let output_ptr = + query.call_with_context(context, msg_ptr).map_err(|err| { + match context.take_last_error() { + Some(err) => err.into(), + None => err.to_enclave_error(), + } + })?; + + let output = read_from_memory(instance, output_ptr)?; + + Ok(output) + }) } } struct CWMemory<'m> { - memory: &'m mut [u8], - _phantom: PhantomData<&'m mut wasm3::Runtime>, + memory: wasm3::Memory<'m>, } const SIZE_OF_U32: usize = std::mem::size_of::(); impl<'m> CWMemory<'m> { - fn new(runtime: &'m mut wasm3::Runtime) -> Self { - Self { - memory: runtime.memory(), - _phantom: PhantomData, - } + fn new(memory: wasm3::Memory<'m>) -> Self { + Self { memory } } fn get_u32_at(&self, idx: u32) -> WasmEngineResult { let idx = idx as usize; let bytes: [u8; SIZE_OF_U32] = self .memory + .as_slice() .get(idx..idx + SIZE_OF_U32) .ok_or(WasmEngineError::MemoryReadError)? .try_into() @@ -378,6 +408,7 @@ impl<'m> CWMemory<'m> { fn set_u32_at(&mut self, idx: u32, val: u32) -> WasmEngineResult { let i = idx as usize; self.memory + .as_slice_mut() .get_mut(i..i + SIZE_OF_U32) .ok_or(WasmEngineError::MemoryReadError)? .copy_from_slice(&val.to_le_bytes()); @@ -396,7 +427,7 @@ impl<'m> CWMemory<'m> { return Err(WasmEngineError::MemoryReadError); } - match self.memory.get(vec_ptr..vec_ptr + vec_len) { + match self.memory.as_slice().get(vec_ptr..vec_ptr + vec_len) { Some(slice) => Ok(slice.to_owned()), None => Err(WasmEngineError::MemoryReadError), } @@ -417,7 +448,7 @@ impl<'m> CWMemory<'m> { let data_len = self.get_u32_at(region_ptr + (SIZE_OF_U32 as u32) * 2)? as usize; let mut remaining_len = data_len as usize; - let data = self.memory.get(data_ptr..data_ptr + data_len); + let data = self.memory.as_slice().get(data_ptr..data_ptr + data_len); let data = data.ok_or(WasmEngineError::MemoryReadError)?; let mut result: Vec> = vec![]; @@ -456,6 +487,7 @@ impl<'m> CWMemory<'m> { let idx = vec_ptr as usize; self.memory + .as_slice_mut() .get_mut(idx..idx + buffer.len()) .ok_or(WasmEngineError::MemoryReadError)? .copy_from_slice(buffer); @@ -465,17 +497,49 @@ impl<'m> CWMemory<'m> { } } -fn write_to_memory(runtime: &mut wasm3::Runtime, buffer: &[u8]) -> WasmEngineResult { +fn read_from_memory( + instance: &wasm3::Instance, + region_ptr: u32, +) -> WasmEngineResult> { + let runtime = instance.runtime(); + runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { + CWMemory::new(memory).extract_vector(region_ptr) + })? +} + +fn decode_sections_from_memory( + instance: &wasm3::Instance, + region_ptr: u32, +) -> WasmEngineResult>> { + let runtime = instance.runtime(); + runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { + CWMemory::new(memory).decode_sections(region_ptr) + })? +} + +fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngineResult { let region_ptr = (|| { - let alloc_fn = runtime.find_function::("allocate")?; + let alloc_fn = instance.find_function::("allocate")?; alloc_fn.call(buffer.len() as u32) })() .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; - let mut memory = CWMemory::new(runtime); - memory - .write_to_allocated_memory(region_ptr, buffer) - .map_err(debug_err!(err => "failed to write to contract memory {err}")) + + write_to_allocated_memory(instance, region_ptr, buffer) +} + +fn write_to_allocated_memory( + instance: &wasm3::Instance, + region_ptr: u32, + buffer: &[u8], +) -> WasmEngineResult { + instance + .runtime() + .try_with_memory_or(WasmEngineError::MemoryWriteError, |memory| { + CWMemory::new(memory) + .write_to_allocated_memory(region_ptr, buffer) + .map_err(debug_err!(err => "failed to write to contract memory {err}")) + })? } fn show_bytes(bytes: &[u8]) -> String { @@ -508,12 +572,10 @@ fn to_low_half(data: u32) -> u64 { fn host_read_db( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, state_key_region_ptr: i32, ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - - let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_read failed to extract vector from state_key_region_ptr: {err}"), )?; @@ -535,7 +597,7 @@ fn host_read_db( None => return Ok(0), }; - let region_ptr = write_to_memory(&mut call_context.runtime, &value)?; + let region_ptr = write_to_memory(instance, &value)?; Ok(region_ptr as i32) } @@ -543,17 +605,15 @@ fn host_read_db( #[cfg(not(feature = "query-only"))] fn host_remove_db( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, state_key_region_ptr: i32, ) -> WasmEngineResult<()> { - let memory = CWMemory::new(&mut call_context.runtime); - if context.operation.is_query() { debug!("db_remove was called while in query mode"); return Err(WasmEngineError::UnauthorizedWrite); } - let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_remove failed to extract vector from state_key_region_ptr: {err}"), )?; @@ -568,21 +628,18 @@ fn host_remove_db( #[cfg(not(feature = "query-only"))] fn host_write_db( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (state_key_region_ptr, value_region_ptr): (i32, i32), ) -> WasmEngineResult<()> { - let memory = CWMemory::new(&mut call_context.runtime); - if context.operation.is_query() { debug!("db_write was called while in query mode"); return Err(WasmEngineError::UnauthorizedWrite); } - let state_key_name = memory.extract_vector(state_key_region_ptr as u32).map_err( + let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), )?; - - let value = memory.extract_vector(value_region_ptr as u32).map_err( + let value = read_from_memory(instance, value_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), )?; @@ -606,19 +663,14 @@ fn host_write_db( fn host_canonicalize_address( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (human_region_ptr, canonical_region_ptr): (i32, i32), ) -> WasmEngineResult { - let mut memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_canonicalize_address as u64; context.use_gas_externally(cost)?; - let human = memory - .extract_vector(human_region_ptr as u32) - .map_err( - debug_err!(err => "canonicalize_address failed to extract vector from human_region_ptr: {err}"), - )?; + let human = read_from_memory(instance, human_region_ptr as u32) + .map_err(debug_err!(err => "canonicalize_address failed to extract vector from human_region_ptr: {err}"))?; let mut human_addr_str = match std::str::from_utf8(&human) { Ok(addr) => addr, @@ -627,7 +679,7 @@ fn host_canonicalize_address( "canonicalize_address input was not valid UTF-8: {}", show_bytes(&human) ); - return write_to_memory(&mut call_context.runtime, b"input is not valid UTF-8") + return write_to_memory(instance, b"input is not valid UTF-8") .map(|n| n as i32) .map_err(debug_err!("failed to write error message to contract")); } @@ -635,7 +687,7 @@ fn host_canonicalize_address( human_addr_str = human_addr_str.trim(); if human_addr_str.is_empty() { debug!("canonicalize_address input was empty"); - return write_to_memory(&mut call_context.runtime, b"input is empty") + return write_to_memory(instance, b"input is empty") .map(|n| n as i32) .map_err(debug_err!("failed to write error message to contract")); } @@ -649,7 +701,7 @@ fn host_canonicalize_address( "canonicalize_address failed to parse input as bech32: {:?}", err ); - return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + return write_to_memory(instance, err.to_string().as_bytes()) .map(|n| n as i32) .map_err(debug_err!("failed to write error message to contract")); } @@ -658,7 +710,7 @@ fn host_canonicalize_address( if decoded_prefix != BECH32_PREFIX_ACC_ADDR { debug!("canonicalize_address was called with an unexpected address prefix"); return write_to_memory( - &mut call_context.runtime, + instance, format!("wrong address prefix: {:?}", decoded_prefix).as_bytes(), ) .map(|n| n as i32) @@ -677,11 +729,7 @@ fn host_canonicalize_address( hex::encode(human_addr_str) ); - memory - .write_to_allocated_memory(canonical_region_ptr as u32, &canonical) - .map_err(debug_err!( - "canonicalize_address failed to write to canonical_region_ptr" - ))?; + write_to_allocated_memory(instance, canonical_region_ptr as u32, &canonical)?; // return 0 == ok Ok(0) @@ -689,19 +737,14 @@ fn host_canonicalize_address( fn host_humanize_address( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (canonical_region_ptr, human_region_ptr): (i32, i32), ) -> WasmEngineResult { - let mut memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_canonicalize_address as u64; context.use_gas_externally(cost)?; - let canonical = memory - .extract_vector(canonical_region_ptr as u32) - .map_err( - debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"), - )?; + let canonical = read_from_memory(instance, canonical_region_ptr as u32) + .map_err(debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"))?; debug!( "humanize_address was called with {}", @@ -712,7 +755,7 @@ fn host_humanize_address( Ok(addr) => addr, Err(err) => { debug!("humanize_address failed to encode address as bech32"); - return write_to_memory(&mut call_context.runtime, err.to_string().as_bytes()) + return write_to_memory(instance, err.to_string().as_bytes()) .map(|n| n as i32) .map_err(debug_err!("failed to write error message to contract")); } @@ -722,11 +765,7 @@ fn host_humanize_address( let human_bytes = human_addr_str.into_bytes(); - memory - .write_to_allocated_memory(human_region_ptr as u32, &human_bytes) - .map_err(debug_err!( - "humanize_address failed to write to canonical_region_ptr" - ))?; + write_to_allocated_memory(instance, human_region_ptr as u32, &human_bytes)?; // return 0 == ok Ok(0) @@ -734,12 +773,10 @@ fn host_humanize_address( fn host_query_chain( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, query_region_ptr: i32, ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - - let query_buffer = memory.extract_vector(query_region_ptr as u32).map_err( + let query_buffer = read_from_memory(instance, query_region_ptr as u32).map_err( debug_err!(err => "query_chain failed to extract vector from query_region_ptr: {err}"), )?; @@ -755,18 +792,15 @@ fn host_query_chain( context.use_gas_externally(gas_used)?; - write_to_memory(&mut call_context.runtime, &answer).map(|region_ptr| region_ptr as i32) + write_to_memory(instance, &answer).map(|region_ptr| region_ptr as i32) } fn host_debug_print( _context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, message_region_ptr: i32, ) -> WasmEngineResult<()> { - let memory = CWMemory::new(&mut call_context.runtime); - - let message_buffer = memory.extract_vector(message_region_ptr as u32)?; - + let message_buffer = read_from_memory(instance, message_region_ptr as u32)?; let message = String::from_utf8(message_buffer).unwrap_or_else(|err| hex::encode(err.into_bytes())); @@ -777,7 +811,7 @@ fn host_debug_print( fn host_gas( context: &mut Context, - mut _call_context: wasm3::CallContext, + _instance: &wasm3::Instance, gas_amount: i32, ) -> WasmEngineResult<()> { context.use_gas(gas_amount as u64)?; @@ -786,23 +820,18 @@ fn host_gas( fn host_secp256k1_verify( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (message_hash_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_secp256k1_verify as u64; context.use_gas_externally(cost)?; - let message_hash_data = memory.extract_vector(message_hash_ptr as u32).map_err( - debug_err!(err => "secp256k1_verify error while trying to read message_hash from wasm memory: {err}") - )?; - let signature_data = memory.extract_vector(signature_ptr as u32).map_err( - debug_err!(err => "secp256k1_verify error while trying to read signature from wasm memory: {err}") - )?; - let public_key = memory.extract_vector(public_key_ptr as u32).map_err( - debug_err!(err => "secp256k1_verify error while trying to read public_key from wasm memory: {err}") - )?; + let message_hash_data = read_from_memory(instance, message_hash_ptr as u32) + .map_err(debug_err!(err => "secp256k1_verify error while trying to read message_hash from wasm memory: {err}"))?; + let signature_data = read_from_memory(instance, signature_ptr as u32) + .map_err(debug_err!(err => "secp256k1_verify error while trying to read signature from wasm memory: {err}"))?; + let public_key = read_from_memory(instance, public_key_ptr as u32) + .map_err(debug_err!(err => "secp256k1_verify error while trying to read public_key from wasm memory: {err}"))?; trace!( "secp256k1_verify() was called from WASM code with message_hash {:x?} (len {:?} should be 32)", @@ -898,20 +927,16 @@ fn host_secp256k1_verify( fn host_secp256k1_recover_pubkey( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_secp256k1_recover_pubkey as u64; context.use_gas_externally(cost)?; - let message_hash_data = memory.extract_vector(message_hash_ptr as u32).map_err( - debug_err!(err => "secp256k1_recover_pubkey error while trying to read message_hash from wasm memory: {err}") - )?; - let signature_data = memory.extract_vector(signature_ptr as u32).map_err( - debug_err!(err => "secp256k1_recover_pubkey error while trying to read signature from wasm memory: {err}") - )?; + let message_hash_data = read_from_memory(instance, message_hash_ptr as u32) + .map_err(debug_err!(err => "secp256k1_recover_pubkey error while trying to read message_hash from wasm memory: {err}"))?; + let signature_data = read_from_memory(instance, signature_ptr as u32) + .map_err(debug_err!(err => "secp256k1_recover_pubkey error while trying to read signature from wasm memory: {err}"))?; trace!( "secp256k1_recover_pubkey was called from WASM code with message_hash {:x?} (len {:?} should be 32)", @@ -986,7 +1011,7 @@ fn host_secp256k1_recover_pubkey( } Ok(pubkey) => { let answer = pubkey.serialize(); - let ptr_to_region_in_wasm_vm = write_to_memory(&mut call_context.runtime, &answer).map_err(|err| { + let ptr_to_region_in_wasm_vm = write_to_memory(instance, &answer).map_err(|err| { debug!( "secp256k1_recover_pubkey() error while trying to allocate and write the answer {:?} to the WASM VM", &answer, @@ -1002,23 +1027,18 @@ fn host_secp256k1_recover_pubkey( fn host_ed25519_verify( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (message_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_ed25519_verify as u64; context.use_gas_externally(cost)?; - let message_data = memory.extract_vector(message_ptr as u32).map_err( - debug_err!(err => "ed25519_verify error while trying to read message_hash from wasm memory: {err}") - )?; - let signature_data = memory.extract_vector(signature_ptr as u32).map_err( - debug_err!(err => "ed25519_verify error while trying to read signature from wasm memory: {err}") - )?; - let public_key_data = memory.extract_vector(public_key_ptr as u32).map_err( - debug_err!(err => "ed25519_verify error while trying to read public_key from wasm memory: {err}") - )?; + let message_data = read_from_memory(instance, message_ptr as u32) + .map_err(debug_err!(err => "ed25519_verify error while trying to read message_hash from wasm memory: {err}"))?; + let signature_data = read_from_memory(instance, signature_ptr as u32) + .map_err(debug_err!(err => "ed25519_verify error while trying to read signature from wasm memory: {err}"))?; + let public_key_data = read_from_memory(instance, public_key_ptr as u32) + .map_err(debug_err!(err => "ed25519_verify error while trying to read public_key from wasm memory: {err}"))?; trace!( "ed25519_verify was called from WASM code with message {:x?} (len {:?})", @@ -1083,28 +1103,17 @@ fn host_ed25519_verify( fn host_ed25519_batch_verify( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (messages_ptr, signatures_ptr, public_keys_ptr): (i32, i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - - let messages_data = memory - .decode_sections(messages_ptr as u32) - .map_err(debug_err!( - err => "ed25519_batch_verify error while trying to read messages from wasm memory: {err}" - ))?; - - let signatures_data = memory - .decode_sections(signatures_ptr as u32) - .map_err(debug_err!( - err => "ed25519_batch_verify error while trying to read signatures from wasm memory: {err}" - ))?; - - let pubkeys_data = memory - .decode_sections(public_keys_ptr as u32) - .map_err(debug_err!( - err => "ed25519_batch_verify error while trying to read public_keys from wasm memory: {err}" - ))?; + let messages_data = decode_sections_from_memory(instance, messages_ptr as u32) + .map_err(debug_err!(err => "ed25519_batch_verify error while trying to read messages from wasm memory: {err}"))?; + + let signatures_data = decode_sections_from_memory(instance, signatures_ptr as u32) + .map_err(debug_err!(err => "ed25519_batch_verify error while trying to read signatures from wasm memory: {err}"))?; + + let pubkeys_data = decode_sections_from_memory(instance, public_keys_ptr as u32) + .map_err(debug_err!(err => "ed25519_batch_verify error while trying to read public_keys from wasm memory: {err}"))?; let messages_len = messages_data.len(); let signatures_len = signatures_data.len(); @@ -1235,20 +1244,16 @@ fn host_ed25519_batch_verify( fn host_secp256k1_sign( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_secp256k1_sign as u64; context.use_gas_externally(cost)?; - let message_data = memory.extract_vector(message_ptr as u32).map_err( - debug_err!(err => "secp256k1_sign error while trying to read message_hash from wasm memory: {err}") - )?; - let private_key_data = memory.extract_vector(private_key_ptr as u32).map_err( - debug_err!(err => "secp256k1_sign error while trying to read private key from wasm memory: {err}") - )?; + let message_data = read_from_memory(instance, message_ptr as u32) + .map_err(debug_err!(err => "secp256k1_sign error while trying to read message_hash from wasm memory: {err}"))?; + let private_key_data = read_from_memory(instance, private_key_ptr as u32) + .map_err(debug_err!(err => "secp256k1_sign error while trying to read private key from wasm memory: {err}"))?; trace!( "secp256k1_sign() was called from WASM code with message {:x?} (len {:?} should be 32)", @@ -1297,14 +1302,13 @@ fn host_secp256k1_sign( .sign_ecdsa(&secp256k1_msg, &secp256k1_signing_key) .serialize_compact(); - let ptr_to_region_in_wasm_vm = - write_to_memory(&mut call_context.runtime, &sig).map_err(|err| { - debug!( + let ptr_to_region_in_wasm_vm = write_to_memory(instance, &sig).map_err(|err| { + debug!( "secp256k1_sign() error while trying to allocate and write the sig {:?} to the WASM VM", &sig, ); - err - })?; + err + })?; // Return pointer to the allocated buffer with the value written to it Ok(to_low_half(ptr_to_region_in_wasm_vm) as i64) @@ -1312,18 +1316,16 @@ fn host_secp256k1_sign( fn host_ed25519_sign( context: &mut Context, - mut call_context: wasm3::CallContext, + instance: &wasm3::Instance, (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { - let memory = CWMemory::new(&mut call_context.runtime); - let cost = context.gas_costs.external_ed25519_sign as u64; context.use_gas_externally(cost)?; - let message_data = memory.extract_vector(message_ptr as u32).map_err( + let message_data = read_from_memory(instance, message_ptr as u32).map_err( debug_err!(err => "ed25519_sign error while trying to read message_hash from wasm memory: {err}") )?; - let private_key_data = memory.extract_vector(private_key_ptr as u32).map_err( + let private_key_data = read_from_memory(instance, private_key_ptr as u32).map_err( debug_err!(err => "ed25519_sign error while trying to read private key from wasm memory: {err}") )?; @@ -1358,11 +1360,11 @@ fn host_ed25519_sign( let sig: [u8; 64] = ed25519_signing_key.sign(message_data.as_slice()).into(); - let ptr_to_region_in_wasm_vm = write_to_memory(&mut call_context.runtime, &sig).map_err(|err| { + let ptr_to_region_in_wasm_vm = write_to_memory(instance, &sig).map_err(|err| { debug!( - "ed25519_sign() error while trying to allocate and write the sig {:?} to the WASM VM", - &sig, - ); + "ed25519_sign() error while trying to allocate and write the sig {:?} to the WASM VM", + &sig, + ); err })?; From 102855b33df6c315f649a6eee71b423d8d662055 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Thu, 18 Aug 2022 23:13:26 +0300 Subject: [PATCH 20/67] removed unneeded comment with a warning --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 831a5b5c4..80d754589 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -174,11 +174,6 @@ where } pub struct Engine { - // WARNING! - // This box is dropped when the Engine is dropped. You MUST NOT use the pointer - // after destroying the engine. Using this pointer in the `host_*` functions - // is only legal because we do not provide direct access to the `runtime` field outside - // the Engine. We also use a RefCell to ensure that we don't access the Context incorrectly. context: Context, gas_limit: u64, used_gas: u64, From 790c4da5eed8df30cc14485797373388e1435095 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 21 Aug 2022 16:34:05 +0300 Subject: [PATCH 21/67] fixed issue with linking host functions --- .../shared/contract-engine/src/wasm3/mod.rs | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 80d754589..0784ec160 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -56,7 +56,9 @@ macro_rules! set_last_error { macro_rules! link_fn { ($instance: expr, $name: expr, $implementation: expr) => {{ let func = expect_context($implementation); - $instance.link_function("env", $name, func) + $instance + .link_function("env", $name, func) + .allow_missing_import() }}; } @@ -197,6 +199,10 @@ impl Engine { .parse(contract_code.code()) .map_err(|_| EnclaveError::InvalidWasm)?; + for import in module.imports.iter() { + eprintln!("import {:?}", import) + } + validation::validate_memory(&mut module)?; if let ContractOperation::Init = operation { @@ -258,9 +264,7 @@ impl Engine { gas::set_gas_limit(&instance, self.gas_limit)?; debug!("set gas limit"); - Self::link_host_functions(&mut instance) - .allow_missing_import() - .to_enclave_result()?; + Self::link_host_functions(&mut instance).to_enclave_result()?; debug!("linked functions"); let result = func(&mut instance, &mut self.context); @@ -274,22 +278,16 @@ impl Engine { fn link_host_functions(instance: &mut wasm3::Instance) -> Wasm3RsResult<()> { link_fn!(instance, "db_read", host_read_db)?; - #[cfg(not(feature = "query-only"))] - { - link_fn!(instance, "db_write", host_write_db)?; - link_fn!(instance, "db_remove", host_remove_db)?; - } + link_fn!(instance, "db_write", host_write_db)?; + link_fn!(instance, "db_remove", host_remove_db)?; link_fn!(instance, "canonicalize_address", host_canonicalize_address)?; link_fn!(instance, "humanize_address", host_humanize_address)?; link_fn!(instance, "query_chain", host_query_chain)?; link_fn!(instance, "debug_print", host_debug_print)?; link_fn!(instance, "gas", host_gas)?; link_fn!(instance, "secp256k1_verify", host_secp256k1_verify)?; - link_fn!( - instance, - "secp256k1_recover_pubkey", - host_secp256k1_recover_pubkey - )?; + #[rustfmt::skip] + link_fn!(instance, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; link_fn!(instance, "ed25519_verify", host_ed25519_verify)?; link_fn!(instance, "ed25519_batch_verify", host_ed25519_batch_verify)?; link_fn!(instance, "secp256k1_sign", host_secp256k1_sign)?; @@ -305,6 +303,7 @@ impl Engine { pub fn init(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { self.with_instance(|instance, context| { + debug!("starting init"); let env_ptr = write_to_memory(instance, &env)?; let msg_ptr = write_to_memory(instance, &msg)?; @@ -327,6 +326,7 @@ impl Engine { pub fn handle(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { self.with_instance(|instance, context| { + debug!("starting handle"); let env_ptr = write_to_memory(instance, &env)?; debug!("handle written env"); let msg_ptr = write_to_memory(instance, &msg)?; @@ -356,6 +356,7 @@ impl Engine { pub fn query(&mut self, msg: Vec) -> Result, EnclaveError> { self.with_instance(|instance, context| { + debug!("starting query"); let msg_ptr = write_to_memory(instance, &msg)?; let query = instance @@ -656,6 +657,24 @@ fn host_write_db( Ok(()) } +#[cfg(feature = "query-only")] +fn host_remove_db( + _context: &mut Context, + _instance: &wasm3::Instance, + _state_key_region_ptr: i32, +) -> WasmEngineResult<()> { + Err(WasmEngineError::UnauthorizedWrite) +} + +#[cfg(feature = "query-only")] +fn host_write_db( + _context: &mut Context, + _instance: &wasm3::Instance, + (_state_key_region_ptr, _value_region_ptr): (i32, i32), +) -> WasmEngineResult<()> { + Err(WasmEngineError::UnauthorizedWrite) +} + fn host_canonicalize_address( context: &mut Context, instance: &wasm3::Instance, From 1b76df284033ca8ef3140e1b28b7a2072a7929bb Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 23 Aug 2022 00:24:22 +0300 Subject: [PATCH 22/67] lots of gas metering fixes for wasm3 --- .../shared/contract-engine/src/wasm3/gas.rs | 101 +++----- .../shared/contract-engine/src/wasm3/mod.rs | 233 +++++++----------- 2 files changed, 130 insertions(+), 204 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs index b811764d8..4a88bd07e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -1,7 +1,10 @@ //! Gas metering instrumentation. -use walrus::{ir::*, FunctionBuilder, GlobalId, LocalFunction, Module}; +use log::*; +use walrus::{ir::*, GlobalId, LocalFunction, Module}; + +use crate::errors::{WasmEngineError, WasmEngineResult}; use enclave_ffi_types::EnclaveError; /// Name of the exported global that holds the gas limit. @@ -10,39 +13,36 @@ pub const EXPORT_GAS_LIMIT: &str = "gas_limit"; pub const EXPORT_GAS_LIMIT_EXHAUSTED: &str = "gas_limit_exhausted"; /// Configures the gas limit on the given instance. -pub fn set_gas_limit( - instance: &wasm3::Instance<'_, '_, C>, - gas_limit: u64, -) -> Result<(), EnclaveError> { +pub fn set_gas_limit(instance: &wasm3::Instance, gas_limit: u64) -> Result<(), EnclaveError> { instance .set_global(EXPORT_GAS_LIMIT, gas_limit) .map_err(|_err| EnclaveError::FailedGasMeteringInjection) } /// Returns the remaining gas. -pub fn get_remaining_gas(instance: &wasm3::Instance<'_, '_, C>) -> u64 { +pub fn get_remaining_gas(instance: &wasm3::Instance) -> u64 { instance.get_global(EXPORT_GAS_LIMIT).unwrap_or_default() } /// Returns the amount of gas requested that was over the limit. -pub fn get_exhausted_amount(instance: &wasm3::Instance<'_, '_, C>) -> u64 { +pub fn get_exhausted_amount(instance: &wasm3::Instance) -> u64 { instance .get_global(EXPORT_GAS_LIMIT_EXHAUSTED) .unwrap_or_default() } /// Attempts to use the given amount of gas. -pub fn use_gas(instance: &wasm3::Instance<'_, '_, C>, amount: u64) -> Result<(), wasm3::Trap> { +pub fn use_gas(instance: &wasm3::Instance, amount: u64) -> WasmEngineResult<()> { let gas_limit: u64 = instance .get_global(EXPORT_GAS_LIMIT) - .map_err(|_| wasm3::Trap::Abort)?; + .map_err(|_| WasmEngineError::OutOfGas)?; if gas_limit < amount { let _ = instance.set_global(EXPORT_GAS_LIMIT_EXHAUSTED, amount); - return Err(wasm3::Trap::Abort); + return Err(WasmEngineError::OutOfGas); } instance .set_global(EXPORT_GAS_LIMIT, gas_limit - amount) - .map_err(|_| wasm3::Trap::Abort)?; + .map_err(|_| WasmEngineError::OutOfGas)?; Ok(()) } @@ -75,29 +75,6 @@ fn instruction_cost(_instr: &Instr) -> u64 { 1 } -// todo remove -/// A block of instructions which is metered. -#[derive(Debug)] -struct MeteredBlock { - /// Instruction sequence where metering code should be injected. - seq_id: InstrSeqId, - /// Start index of instruction within the instruction sequence before which the metering code - /// should be injected. - start_index: usize, - /// Instruction cost. - cost: u64, -} - -impl MeteredBlock { - fn new(seq_id: InstrSeqId, start_index: usize) -> Self { - Self { - seq_id, - start_index, - cost: 0, - } - } -} - fn transform_function( func: &mut LocalFunction, gas_limit_global: GlobalId, @@ -105,29 +82,7 @@ fn transform_function( ) { let block_ids: Vec<_> = func.blocks().map(|(block_id, _block)| block_id).collect(); for block_id in block_ids { - let block = func.block(block_id); - let new_block_len = block.len() + METERING_INSTRUCTION_COUNT; - let mut new_block = Vec::with_capacity(new_block_len); - - let mut metered_block = MeteredBlock::new(block_id, 0); - metered_block.cost = block - .instrs - .iter() - .map(|(inst, _instr_loc)| instruction_cost(inst)) - .sum(); - - let builder = func.builder_mut(); - inject_metering( - builder, - &mut new_block, - metered_block, - gas_limit_global, - gas_limit_exhausted_global, - ); - - let block = func.block_mut(block_id); - new_block.extend_from_slice(&block); - block.instrs = new_block; + inject_metering(func, block_id, gas_limit_global, gas_limit_exhausted_global); } } @@ -135,32 +90,46 @@ fn transform_function( const METERING_INSTRUCTION_COUNT: usize = 8; fn inject_metering( - builder: &mut FunctionBuilder, - instrs: &mut Vec<(Instr, InstrLocId)>, - block: MeteredBlock, + func: &mut LocalFunction, + block_id: InstrSeqId, gas_limit_global: GlobalId, gas_limit_exhausted_global: GlobalId, ) { + let block = func.block(block_id); + let block_instrs = &block.instrs; + let block_len = block_instrs.len(); + let block_cost: u64 = block_instrs + .iter() + .map(|(inst, _instr_loc)| instruction_cost(inst)) + .sum(); + + let builder = func.builder_mut(); + let mut builder = builder.dangling_instr_seq(None); let seq = builder - // if unsigned(globals[gas_limit]) < unsigned(block.cost) { throw(); } + // if unsigned(globals[gas_limit]) < unsigned(block_cost) { throw(); } .global_get(gas_limit_global) - .i64_const(block.cost as i64) + .i64_const(block_cost as i64) .binop(BinaryOp::I64LtU) .if_else( None, |then| { - then.i64_const(block.cost as i64) + then.i64_const(block_cost as i64) .global_set(gas_limit_exhausted_global) .unreachable(); }, |_else| {}, ) - // globals[gas_limit] -= block.cost; + // globals[gas_limit] -= block_cost; .global_get(gas_limit_global) - .i64_const(block.cost as i64) + .i64_const(block_cost as i64) .binop(BinaryOp::I64Sub) .global_set(gas_limit_global); - instrs.append(seq.instrs_mut()); + let mut new_instrs = Vec::with_capacity(block_len + METERING_INSTRUCTION_COUNT); + new_instrs.append(seq.instrs_mut()); + + let block = func.block_mut(block_id); + new_instrs.extend_from_slice(&block); + block.instrs = new_instrs; } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 0784ec160..aa87e88f0 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -5,7 +5,7 @@ use log::*; use bech32::{FromBase32, ToBase32}; use rand_chacha::ChaChaRng; use rand_core::SeedableRng; -use wasm3::{Memory, Trap}; +use wasm3::{Instance, Memory, Trap}; use enclave_cosmos_types::types::ContractCode; use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; @@ -21,7 +21,7 @@ use crate::gas::WasmCosts; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::ContractOperation; -use crate::wasm3::gas::get_remaining_gas; +use crate::wasm3::gas::{get_exhausted_amount, get_remaining_gas, use_gas}; mod gas; mod validation; @@ -44,24 +44,6 @@ macro_rules! debug_err { }; } -macro_rules! set_last_error { - ($context: expr) => { - |err| { - $context.set_last_error(err); - wasm3::Trap::Abort - } - }; -} - -macro_rules! link_fn { - ($instance: expr, $name: expr, $implementation: expr) => {{ - let func = expect_context($implementation); - $instance - .link_function("env", $name, func) - .allow_missing_import() - }}; -} - trait Wasm3ResultEx { fn allow_missing_import(self) -> Self; } @@ -99,16 +81,14 @@ impl<'env, C> Wasm3RuntimeEx for wasm3::Runtime<'env, C> { pub struct Context { context: Ctx, gas_limit: u64, - /// Gas used by wasmi - gas_used: u64, - /// Gas used by external services. This is tracked separately so we don't double-charge for external services later. - gas_used_externally: u64, gas_costs: WasmCosts, - contract_key: ContractKey, #[cfg_attr(feature = "query-only", allow(unused))] operation: ContractOperation, + + contract_key: ContractKey, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, + last_error: Option, } @@ -120,41 +100,6 @@ impl Context { pub fn set_last_error(&mut self, error: WasmEngineError) { self.last_error = Some(error); } - - /// Track gas used inside wasmi - fn use_gas(&mut self, gas_amount: u64) -> Result<(), WasmEngineError> { - self.gas_used = self.gas_used.saturating_add(gas_amount); - self.check_gas_usage() - } - - fn check_gas_usage(&self) -> Result<(), WasmEngineError> { - // Check if new amount is bigger than gas limit - // If is above the limit, halt execution - if self.is_gas_depleted() { - debug!( - "Out of gas! Gas limit: {}, gas used: {}, gas used externally: {}", - self.gas_limit, self.gas_used, self.gas_used_externally - ); - Err(WasmEngineError::OutOfGas) - } else { - Ok(()) - } - } - - fn is_gas_depleted(&self) -> bool { - self.gas_limit < self.gas_used.saturating_add(self.gas_used_externally) - } - - fn use_gas_externally(&mut self, gas_amount: u64) -> WasmEngineResult<()> { - self.gas_used_externally = self.gas_used_externally.saturating_add(gas_amount); - self.check_gas_usage() - } - - fn gas_left(&self) -> u64 { - self.gas_limit - .saturating_sub(self.gas_used) - .saturating_sub(self.gas_used_externally) - } } /// Wrap the hook function such that we expect the context to be passed in, @@ -171,10 +116,49 @@ where let err_msg = "module functions must be called with a context"; let context = call_context.context.expect(err_msg); let instance = call_context.instance; - func(context, instance, input).map_err(set_last_error!(context)) + func(context, instance, input).map_err(|err| { + context.set_last_error(err); + wasm3::Trap::Abort + }) } } +fn link_fn(instance: &mut Instance, name: &str, func: F) -> Wasm3RsResult<()> +where + F: FnMut(&mut Context, &wasm3::Instance, A) -> Result + 'static, + A: wasm3::Arg + 'static, + R: wasm3::Arg + 'static, +{ + let func = expect_context(func); + instance + .link_function("env", name, func) + .allow_missing_import() +} + +fn check_execution_result( + instance: &Instance, + context: &mut Context, + result: Result, +) -> Result { + result.map_err(|err| match err { + // If Unreachable was executed, and "exhausted" isn't 0, that means we ran out of gas. + wasm3::Error::UnreachableExecuted if get_exhausted_amount(instance) != 0 => { + debug!( + "Detected out of gas! Limit: {}, Remaining: {}, Exhausted: {}", + context.gas_limit, + get_remaining_gas(instance), + get_exhausted_amount(instance) + ); + EnclaveError::OutOfGas + } + // Otherwise, check if a hook set an error, in which case we propagate it. + err => match context.take_last_error() { + Some(err) => err.into(), + None => err.to_enclave_error(), + }, + }) +} + pub struct Engine { context: Context, gas_limit: u64, @@ -219,11 +203,9 @@ impl Engine { let context = Context { context, gas_limit, - gas_used: 0, - gas_used_externally: 0, gas_costs, - contract_key, operation, + contract_key, user_nonce, user_public_key, last_error: None, @@ -270,28 +252,27 @@ impl Engine { let result = func(&mut instance, &mut self.context); debug!("function returned {:?}", result); - // TODO make gas reporting more accurate - self.used_gas = self.gas_limit - get_remaining_gas(&instance); + self.used_gas = + self.gas_limit - get_remaining_gas(&instance) + get_exhausted_amount(&instance); result } fn link_host_functions(instance: &mut wasm3::Instance) -> Wasm3RsResult<()> { - link_fn!(instance, "db_read", host_read_db)?; - link_fn!(instance, "db_write", host_write_db)?; - link_fn!(instance, "db_remove", host_remove_db)?; - link_fn!(instance, "canonicalize_address", host_canonicalize_address)?; - link_fn!(instance, "humanize_address", host_humanize_address)?; - link_fn!(instance, "query_chain", host_query_chain)?; - link_fn!(instance, "debug_print", host_debug_print)?; - link_fn!(instance, "gas", host_gas)?; - link_fn!(instance, "secp256k1_verify", host_secp256k1_verify)?; + link_fn(instance, "db_read", host_read_db)?; + link_fn(instance, "db_write", host_write_db)?; + link_fn(instance, "db_remove", host_remove_db)?; + link_fn(instance, "canonicalize_address", host_canonicalize_address)?; + link_fn(instance, "humanize_address", host_humanize_address)?; + link_fn(instance, "query_chain", host_query_chain)?; + link_fn(instance, "debug_print", host_debug_print)?; + link_fn(instance, "secp256k1_verify", host_secp256k1_verify)?; #[rustfmt::skip] - link_fn!(instance, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; - link_fn!(instance, "ed25519_verify", host_ed25519_verify)?; - link_fn!(instance, "ed25519_batch_verify", host_ed25519_batch_verify)?; - link_fn!(instance, "secp256k1_sign", host_secp256k1_sign)?; - link_fn!(instance, "ed25519_sign", host_ed25519_sign)?; + link_fn(instance, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; + link_fn(instance, "ed25519_verify", host_ed25519_verify)?; + link_fn(instance, "ed25519_batch_verify", host_ed25519_batch_verify)?; + link_fn(instance, "secp256k1_sign", host_secp256k1_sign)?; + link_fn(instance, "ed25519_sign", host_ed25519_sign)?; Ok(()) } @@ -311,12 +292,8 @@ impl Engine { .find_function::<(u32, u32), u32>("init") .to_enclave_result()?; - let output_ptr = init - .call_with_context(context, (env_ptr, msg_ptr)) - .map_err(|err| match context.take_last_error() { - Some(err) => err.into(), - None => err.to_enclave_error(), - })?; + let result = init.call_with_context(context, (env_ptr, msg_ptr)); + let output_ptr = check_execution_result(instance, context, result)?; let output = read_from_memory(instance, output_ptr)?; @@ -338,13 +315,8 @@ impl Engine { .to_enclave_result()?; debug!("found handle"); - let output_ptr = handle - .call_with_context(context, (env_ptr, msg_ptr)) - .map_err(debug_err!(err => "failed to call handle: {err:?}")) - .map_err(|err| match context.take_last_error() { - Some(err) => err.into(), - None => err.to_enclave_error(), - })?; + let result = handle.call_with_context(context, (env_ptr, msg_ptr)); + let output_ptr = check_execution_result(instance, context, result)?; debug!("called handle"); let output = read_from_memory(instance, output_ptr)?; @@ -363,13 +335,8 @@ impl Engine { .find_function::("query") .to_enclave_result()?; - let output_ptr = - query.call_with_context(context, msg_ptr).map_err(|err| { - match context.take_last_error() { - Some(err) => err.into(), - None => err.to_enclave_error(), - } - })?; + let result = query.call_with_context(context, msg_ptr); + let output_ptr = check_execution_result(instance, context, result)?; let output = read_from_memory(instance, output_ptr)?; @@ -577,10 +544,10 @@ fn host_read_db( debug!("db_read reading key {}", show_bytes(&state_key_name)); - let (value, gas_used) = + let (value, used_gas) = read_encrypted_key(&state_key_name, &context.context, &context.contract_key) .map_err(debug_err!("db_read failed to read key from storage"))?; - context.use_gas_externally(gas_used)?; + use_gas(instance, used_gas)?; debug!( "db_read received value {:?}", @@ -615,8 +582,8 @@ fn host_remove_db( debug!("db_remove removing key {}", show_bytes(&state_key_name)); - let gas_used = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key)?; - context.use_gas_externally(gas_used)?; + let used_gas = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key)?; + use_gas(instance, used_gas)?; Ok(()) } @@ -652,7 +619,7 @@ fn host_write_db( &context.contract_key, ) .map_err(debug_err!("db_write failed to write key to storage",))?; - context.use_gas_externally(used_gas)?; + use_gas(instance, used_gas)?; Ok(()) } @@ -680,8 +647,8 @@ fn host_canonicalize_address( instance: &wasm3::Instance, (human_region_ptr, canonical_region_ptr): (i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_canonicalize_address as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_canonicalize_address as u64; + use_gas(instance, used_gas)?; let human = read_from_memory(instance, human_region_ptr as u32) .map_err(debug_err!(err => "canonicalize_address failed to extract vector from human_region_ptr: {err}"))?; @@ -754,8 +721,8 @@ fn host_humanize_address( instance: &wasm3::Instance, (canonical_region_ptr, human_region_ptr): (i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_canonicalize_address as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_canonicalize_address as u64; + use_gas(instance, used_gas)?; let canonical = read_from_memory(instance, canonical_region_ptr as u32) .map_err(debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"))?; @@ -794,17 +761,17 @@ fn host_query_chain( debug_err!(err => "query_chain failed to extract vector from query_region_ptr: {err}"), )?; - let mut gas_used: u64 = 0; + let mut used_gas: u64 = 0; let answer = encrypt_and_query_chain( &query_buffer, &context.context, context.user_nonce, context.user_public_key, - &mut gas_used, - context.gas_left(), + &mut used_gas, + get_remaining_gas(instance), )?; - context.use_gas_externally(gas_used)?; + use_gas(instance, used_gas)?; write_to_memory(instance, &answer).map(|region_ptr| region_ptr as i32) } @@ -823,22 +790,13 @@ fn host_debug_print( Ok(()) } -fn host_gas( - context: &mut Context, - _instance: &wasm3::Instance, - gas_amount: i32, -) -> WasmEngineResult<()> { - context.use_gas(gas_amount as u64)?; - Ok(()) -} - fn host_secp256k1_verify( context: &mut Context, instance: &wasm3::Instance, (message_hash_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_secp256k1_verify as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_secp256k1_verify as u64; + use_gas(instance, used_gas)?; let message_hash_data = read_from_memory(instance, message_hash_ptr as u32) .map_err(debug_err!(err => "secp256k1_verify error while trying to read message_hash from wasm memory: {err}"))?; @@ -944,8 +902,8 @@ fn host_secp256k1_recover_pubkey( instance: &wasm3::Instance, (message_hash_ptr, signature_ptr, recovery_param): (i32, i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_secp256k1_recover_pubkey as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_secp256k1_recover_pubkey as u64; + use_gas(instance, used_gas)?; let message_hash_data = read_from_memory(instance, message_hash_ptr as u32) .map_err(debug_err!(err => "secp256k1_recover_pubkey error while trying to read message_hash from wasm memory: {err}"))?; @@ -1044,8 +1002,8 @@ fn host_ed25519_verify( instance: &wasm3::Instance, (message_ptr, signature_ptr, public_key_ptr): (i32, i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_ed25519_verify as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_ed25519_verify as u64; + use_gas(instance, used_gas)?; let message_data = read_from_memory(instance, message_ptr as u32) .map_err(debug_err!(err => "ed25519_verify error while trying to read message_hash from wasm memory: {err}"))?; @@ -1173,7 +1131,8 @@ fn host_ed25519_batch_verify( let base_cost = context.gas_costs.external_ed25519_batch_verify_base as u64; let each_cost = context.gas_costs.external_ed25519_batch_verify_each as u64; - context.use_gas_externally(base_cost + (signatures.len() as u64) * each_cost)?; + let used_gas = base_cost + (signatures.len() as u64) * each_cost; + use_gas(instance, used_gas)?; let mut batch = ed25519_zebra::batch::Verifier::new(); for i in 0..signatures.len() { @@ -1228,11 +1187,9 @@ fn host_ed25519_batch_verify( rng_entropy.append(&mut messages_data.into_iter().flatten().collect()); rng_entropy.append(&mut signatures_data.into_iter().flatten().collect()); rng_entropy.append(&mut pubkeys_data.into_iter().flatten().collect()); - rng_entropy.append( - &mut (context.gas_used.saturating_add(context.gas_used_externally)) - .to_be_bytes() - .to_vec(), - ); + let remaining_gas = get_remaining_gas(instance); + let used_gas = context.gas_limit.saturating_sub(remaining_gas); + rng_entropy.append(&mut used_gas.to_be_bytes().to_vec()); let rng_seed: [u8; 32] = sha_256(&rng_entropy); let mut rng = ChaChaRng::from_seed(rng_seed); @@ -1261,8 +1218,8 @@ fn host_secp256k1_sign( instance: &wasm3::Instance, (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_secp256k1_sign as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_secp256k1_sign as u64; + use_gas(instance, used_gas)?; let message_data = read_from_memory(instance, message_ptr as u32) .map_err(debug_err!(err => "secp256k1_sign error while trying to read message_hash from wasm memory: {err}"))?; @@ -1333,8 +1290,8 @@ fn host_ed25519_sign( instance: &wasm3::Instance, (message_ptr, private_key_ptr): (i32, i32), ) -> WasmEngineResult { - let cost = context.gas_costs.external_ed25519_sign as u64; - context.use_gas_externally(cost)?; + let used_gas = context.gas_costs.external_ed25519_sign as u64; + use_gas(instance, used_gas)?; let message_data = read_from_memory(instance, message_ptr as u32).map_err( debug_err!(err => "ed25519_sign error while trying to read message_hash from wasm memory: {err}") From 98d8109bc680a13c1b9ee806d96a7dbcb80a660e Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 23 Aug 2022 13:40:06 +0300 Subject: [PATCH 23/67] fixed bug in host_ed25519_batch_verify --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index aa87e88f0..0e3b44178 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -1091,11 +1091,6 @@ fn host_ed25519_batch_verify( let signatures_len = signatures_data.len(); let pubkeys_len = pubkeys_data.len(); - if messages_len == 0 || signatures_len == 0 || pubkeys_len == 0 { - debug!("ed25519_batch_verify trying to bach verify with empty inputs!"); - return Err(WasmEngineError::MemoryReadError); - } - let lengths = (messages_len, signatures_len, pubkeys_len); let (messages, signatures, pubkeys): (Vec<&[u8]>, Vec<&[u8]>, Vec<&[u8]>) = match lengths { (ml, sl, pl) if ml == sl && sl == pl => { From afec9d2b58a94c3a81bacea32f9d479c721c4ec3 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Tue, 23 Aug 2022 13:40:29 +0300 Subject: [PATCH 24/67] useful message when charging gas for external services --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs index 4a88bd07e..127f49756 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -33,6 +33,7 @@ pub fn get_exhausted_amount(instance: &wasm3::Instance) -> u64 { /// Attempts to use the given amount of gas. pub fn use_gas(instance: &wasm3::Instance, amount: u64) -> WasmEngineResult<()> { + debug!("external service used gas: {}", amount); let gas_limit: u64 = instance .get_global(EXPORT_GAS_LIMIT) .map_err(|_| WasmEngineError::OutOfGas)?; From 1a67f547ec5b5e3ca798a431aeb9e9a59bac8849 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Thu, 25 Aug 2022 01:16:40 +0300 Subject: [PATCH 25/67] added memory grow metering --- .../shared/contract-engine/src/wasm3/gas.rs | 140 +++++++++++++++--- .../shared/contract-engine/src/wasm3/mod.rs | 2 +- 2 files changed, 119 insertions(+), 23 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs index 127f49756..0b1a6bf80 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -2,9 +2,12 @@ use log::*; -use walrus::{ir::*, GlobalId, LocalFunction, Module}; +use walrus::{ + ir::*, FunctionBuilder, FunctionId, GlobalId, InitExpr, LocalFunction, Module, ValType, +}; use crate::errors::{WasmEngineError, WasmEngineResult}; +use crate::gas::WasmCosts; use enclave_ffi_types::EnclaveError; /// Name of the exported global that holds the gas limit. @@ -48,42 +51,64 @@ pub fn use_gas(instance: &wasm3::Instance, amount: u64) -> WasmEngineResul } /// Inject gas metering instrumentation into the module. -pub fn add_metering(module: &mut Module) { - let gas_limit_global = module.globals.add_local( - walrus::ValType::I64, - true, - walrus::InitExpr::Value(Value::I64(0)), - ); - let gas_limit_exhausted_global = module.globals.add_local( - walrus::ValType::I64, - true, - walrus::InitExpr::Value(Value::I64(0)), - ); +pub fn add_metering(module: &mut Module, gas_costs: &WasmCosts) { + let gas_limit_global = + module + .globals + .add_local(ValType::I64, true, InitExpr::Value(Value::I64(0))); + let gas_limit_exhausted_global = + module + .globals + .add_local(ValType::I64, true, InitExpr::Value(Value::I64(0))); module.exports.add(EXPORT_GAS_LIMIT, gas_limit_global); module .exports .add(EXPORT_GAS_LIMIT_EXHAUSTED, gas_limit_exhausted_global); + let memory_grow_meter = create_memory_grow_meter( + module, + gas_costs, + gas_limit_global, + gas_limit_exhausted_global, + ); + for (_, func) in module.funcs.iter_local_mut() { - transform_function(func, gas_limit_global, gas_limit_exhausted_global); + transform_function( + func, + gas_costs, + gas_limit_global, + gas_limit_exhausted_global, + memory_grow_meter, + ); } } // todo copy from pwasm_utils /// Instruction cost function. -fn instruction_cost(_instr: &Instr) -> u64 { +fn instruction_cost(_instr: &Instr, _gas_costs: &WasmCosts) -> u64 { // Currently default to 1 for all instructions. 1 } fn transform_function( func: &mut LocalFunction, + gas_costs: &WasmCosts, gas_limit_global: GlobalId, gas_limit_exhausted_global: GlobalId, + memory_grow_meter: FunctionId, ) { + // get the list of "original" blocks before we start adding more. let block_ids: Vec<_> = func.blocks().map(|(block_id, _block)| block_id).collect(); + // for each block, prepend it with metering instructions for block_id in block_ids { - inject_metering(func, block_id, gas_limit_global, gas_limit_exhausted_global); + inject_metering( + func, + block_id, + gas_costs, + gas_limit_global, + gas_limit_exhausted_global, + memory_grow_meter, + ); } } @@ -93,29 +118,51 @@ const METERING_INSTRUCTION_COUNT: usize = 8; fn inject_metering( func: &mut LocalFunction, block_id: InstrSeqId, + gas_costs: &WasmCosts, gas_limit_global: GlobalId, gas_limit_exhausted_global: GlobalId, + memory_grow_meter: FunctionId, ) { - let block = func.block(block_id); - let block_instrs = &block.instrs; + let block = func.block_mut(block_id); + let block_instrs = &mut block.instrs; let block_len = block_instrs.len(); let block_cost: u64 = block_instrs .iter() - .map(|(inst, _instr_loc)| instruction_cost(inst)) + .map(|(inst, _instr_loc)| instruction_cost(inst, gas_costs)) .sum(); + let block_cost = block_cost as i64; + + // find all location in the block that use Instr::MemoryGrow + let mut grow_locations = vec![]; + for (loc, (instr, _)) in block_instrs.iter().enumerate() { + if let Instr::MemoryGrow { .. } = instr { + grow_locations.push(loc); + } + } - let builder = func.builder_mut(); + // Prepend instances of Instr::MemoryGrow with a call to the memory grow meter. + // This is done in reverse because the indices are locations in the + // underlying instruction array. Doing this in order would invalidate the + // indices. + for loc in grow_locations.into_iter().rev() { + let call_grow_meter = Instr::from(Call { + func: memory_grow_meter, + }); + // using Default is fine - it's the same as what `InstrSeqBuilder::instr_at` does. + block_instrs.insert(loc, (call_grow_meter, Default::default())); + } + let builder = func.builder_mut(); let mut builder = builder.dangling_instr_seq(None); let seq = builder // if unsigned(globals[gas_limit]) < unsigned(block_cost) { throw(); } .global_get(gas_limit_global) - .i64_const(block_cost as i64) + .i64_const(block_cost) .binop(BinaryOp::I64LtU) .if_else( None, |then| { - then.i64_const(block_cost as i64) + then.i64_const(block_cost) .global_set(gas_limit_exhausted_global) .unreachable(); }, @@ -123,7 +170,7 @@ fn inject_metering( ) // globals[gas_limit] -= block_cost; .global_get(gas_limit_global) - .i64_const(block_cost as i64) + .i64_const(block_cost) .binop(BinaryOp::I64Sub) .global_set(gas_limit_global); @@ -134,3 +181,52 @@ fn inject_metering( new_instrs.extend_from_slice(&block); block.instrs = new_instrs; } + +fn create_memory_grow_meter( + module: &mut Module, + gas_costs: &WasmCosts, + gas_limit_global: GlobalId, + gas_limit_exhausted_global: GlobalId, +) -> FunctionId { + // function input + let num_pages = module.locals.add(ValType::I32); + // cache cost of memory grow + let grow_cost = module.locals.add(ValType::I64); + + let mut func = FunctionBuilder::new(&mut module.types, &[ValType::I32], &[ValType::I32]); + + func.func_body() + // multiply the number of pages by the grow cost + .local_get(num_pages) + // num_pages as i64 + .unop(UnaryOp::I64ExtendSI32) + .i64_const(gas_costs.grow_mem as i64) + .binop(BinaryOp::I64Mul) + // save the cost + .local_set(grow_cost) + // from here it's very similar to the code in `fn inject_metering()`. + // if unsigned(globals[gas_limit]) < unsigned(grow_cost) { throw(); } + .global_get(gas_limit_global) + .local_get(grow_cost) + .binop(BinaryOp::I64LtU) + .if_else( + None, + |then| { + then.local_get(grow_cost) + .global_set(gas_limit_exhausted_global) + .unreachable(); + }, + |_else| {}, + ) + // globals[gas_limit] -= grow_cost; + .global_get(gas_limit_global) + .local_get(grow_cost) + .binop(BinaryOp::I64Sub) + .global_set(gas_limit_global) + // return the original number of pages for the MemoryGrow instruction + // right after this function call. + .local_get(num_pages); + + // register the function + func.finish(vec![num_pages], &mut module.funcs) +} diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 0e3b44178..57fe2dcba 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -196,7 +196,7 @@ impl Engine { } } - gas::add_metering(&mut module); + gas::add_metering(&mut module, &gas_costs); let code = module.emit_wasm(); From 42188dce5cfb5b4674fe51cc6f2ae28c223d2e0d Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Mon, 29 Aug 2022 11:14:04 +0300 Subject: [PATCH 26/67] changed JS CI branch to reuven-fix-for-wasm3 --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5300e829b..58b11db0e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -278,7 +278,7 @@ jobs: DOCKER_TAG=v0.0.0 make build-localsecret - name: Run secret.js tests run: | - git clone --depth 1 --branch lior-fix-based-on-rpc-2 https://github.com/scrtlabs/secret.js + git clone --depth 1 --branch reuven-fix-for-wasm3 https://github.com/scrtlabs/secret.js cd secret.js # Use the docker images that we built just a few steps above perl -i -pe 's/localsecret:.+?"/localsecret:v0.0.0"/' ./test/* From e4e22aff4d993fbf70745752391570bb28c801b9 Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 7 Sep 2022 16:42:22 +0300 Subject: [PATCH 27/67] Added a cache that saves enclave reads/writes to the state and does them all at once at the end of the execution --- cosmwasm/enclaves/execute/Enclave.edl | 8 ++ .../shared/contract-engine/Cargo.toml | 1 + .../src/contract_operations.rs | 14 +++ .../enclaves/shared/contract-engine/src/db.rs | 89 ++++++++++++--- .../contract-engine/src/external/ocalls.rs | 9 ++ .../shared/contract-engine/src/lib.rs | 1 + .../contract-engine/src/wasm/contract.rs | 106 +++++++++++++++--- .../shared/contract-engine/src/wasm/traits.rs | 2 + .../enclaves/shared/utils/src/kv_cache.rs | 73 ++++++++++++ cosmwasm/enclaves/shared/utils/src/lib.rs | 2 + cosmwasm/packages/sgx-vm/src/wasmi/exports.rs | 98 +++++++++++++++- x/compute/internal/keeper/keeper_test.go | 3 +- 12 files changed, 374 insertions(+), 32 deletions(-) create mode 100644 cosmwasm/enclaves/shared/utils/src/kv_cache.rs diff --git a/cosmwasm/enclaves/execute/Enclave.edl b/cosmwasm/enclaves/execute/Enclave.edl index 59c296274..77b98488f 100644 --- a/cosmwasm/enclaves/execute/Enclave.edl +++ b/cosmwasm/enclaves/execute/Enclave.edl @@ -135,6 +135,14 @@ enclave { uintptr_t key_len ); + OcallReturn ocall_multiple_write_db( + Ctx context, + [out] UntrustedVmError* vm_error, + [out] uint64_t* gas_used, + [in, count=keys_len] const uint8_t* keys, + uintptr_t keys_len + ); + OcallReturn ocall_write_db( Ctx context, [out] UntrustedVmError* vm_error, diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index fdff6391f..4a45b7af0 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -9,6 +9,7 @@ query-only = [] debug-print = [] test = [] + # This annotation is here to trick the IDE into showing us type information about this crate. # We always compile to the "sgx" target, so this will always be false. # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 16868a033..886769484 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -12,6 +12,7 @@ use log::*; use crate::contract_validation::{ReplyParams, ValidatedMessage}; use crate::external::results::{HandleSuccess, InitSuccess, QuerySuccess}; use crate::message::{is_ibc_msg, parse_message, ParsedMessage}; +use crate::wasm::traits::WasmiApi; use super::contract_validation::{ generate_encryption_key, validate_contract_key, validate_msg, verify_params, ContractKey, @@ -113,6 +114,13 @@ pub fn init( // so we can `.map_err()` in one place for all of them let output = coalesce!(EnclaveError, { let vec_ptr = engine.init(env_ptr, msg_info_ptr, msg_ptr)?; + + // write all db keys to chain + engine + .contract_instance + .flush_cache() + .map_err(|_| EnclaveError::FailedFunctionCall)?; + let output = engine.extract_vector(vec_ptr)?; let output = encrypt_output( output, @@ -258,6 +266,12 @@ pub fn handle( let output = coalesce!(EnclaveError, { let vec_ptr = engine.handle(env_ptr, msg_info_ptr, msg_ptr, parsed_handle_type.clone())?; + // write all db keys to chain + engine + .contract_instance + .flush_cache() + .map_err(|_| EnclaveError::FailedFunctionCall)?; + let mut output = engine.extract_vector(vec_ptr)?; debug!( diff --git a/cosmwasm/enclaves/shared/contract-engine/src/db.rs b/cosmwasm/enclaves/shared/contract-engine/src/db.rs index 225f050c0..1c7803bfc 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/db.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/db.rs @@ -8,9 +8,50 @@ use enclave_crypto::{sha_256, AESKey, Kdf, SIVEncryptable, KEY_MANAGER}; use crate::external::{ecalls, ocalls}; +use enclave_utils::kv_cache::KvCache; +use serde_json::Value; + use super::contract_validation::ContractKey; use super::errors::WasmEngineError; +#[cfg(not(feature = "query-only"))] +pub fn write_multiple_db( + context: &Ctx, + keys: Vec<(Vec, Vec)>, +) -> Result { + let mut ocall_return = OcallReturn::Success; + + if keys.is_empty() { + return Ok(0); + } + + let x = serde_json::to_vec(&keys).unwrap(); + let len = x.len(); + let ptr = x.as_ptr(); + + let mut vm_err = UntrustedVmError::default(); + let mut gas_used = 0_u64; + match unsafe { + ocalls::ocall_multiple_write_db( + (&mut ocall_return) as *mut _, + context.unsafe_clone(), + (&mut vm_err) as *mut _, + (&mut gas_used) as *mut _, + ptr, + len, + ) + } { + sgx_status_t::SGX_SUCCESS => { /* continue */ } + _err_status => return Err(WasmEngineError::FailedOcall(vm_err)), + } + + match ocall_return { + OcallReturn::Success => Ok(gas_used), + OcallReturn::Failure => Err(WasmEngineError::FailedOcall(vm_err)), + OcallReturn::Panic => Err(WasmEngineError::Panic), + } +} + #[cfg(not(feature = "query-only"))] pub fn write_encrypted_key( key: &[u8], @@ -20,6 +61,28 @@ pub fn write_encrypted_key( ) -> Result { // Get the state key from the key manager + let (scrambled_field_name, ad_used_gas, db_data) = + encrypt_key(key, value, &context, contract_key)?; + + // Write the new data as concat(ad, encrypted_val) + let write_used_gas = write_db(context, &scrambled_field_name, &db_data).map_err(|err| { + warn!( + "write_db() go an error from ocall_write_db, stopping wasm: {:?}", + err + ); + err + })?; + + Ok(ad_used_gas + write_used_gas) +} + +#[cfg(not(feature = "query-only"))] +pub fn encrypt_key( + key: &[u8], + value: &[u8], + context: &Ctx, + contract_key: &ContractKey, +) -> Result<([u8; 32], u64, Vec), WasmEngineError> { let scrambled_field_name = field_name_digest(key, contract_key); debug!( @@ -29,27 +92,19 @@ pub fn write_encrypted_key( let (ad, ad_used_gas) = derive_ad_for_field(&scrambled_field_name, &context)?; - let encrypted_value = encrypt_key(&scrambled_field_name, value, contract_key, &ad)?; + let encrypted_value = encrypt_key_inner(&scrambled_field_name, value, contract_key, &ad)?; let mut db_data: Vec = ad.to_vec(); db_data.extend_from_slice(encrypted_value.as_slice()); - // Write the new data as concat(ad, encrypted_val) - let write_used_gas = write_db(context, &scrambled_field_name, &db_data).map_err(|err| { - warn!( - "write_db() go an error from ocall_write_db, stopping wasm: {:?}", - err - ); - err - })?; - - Ok(ad_used_gas + write_used_gas) + Ok((scrambled_field_name, ad_used_gas, db_data)) } pub fn read_encrypted_key( key: &[u8], context: &Ctx, contract_key: &ContractKey, + kv_cache: &mut KvCache, ) -> Result<(Option>, u64), WasmEngineError> { let scrambled_field_name = field_name_digest(key, contract_key); @@ -63,7 +118,10 @@ pub fn read_encrypted_key( match read_db(context, &scrambled_field_name) { Ok((value, gas_used)) => match value { Some(value) => match decrypt_key(&scrambled_field_name, &value, contract_key) { - Ok(decrypted) => Ok((Some(decrypted), gas_used)), + Ok(decrypted) => { + let _ = kv_cache.write(key, &decrypted); + Ok((Some(decrypted), gas_used)) + } // This error case is why we have all the matches here. // If we successfully collected a value, but failed to decrypt it, then we propagate that error. Err(err) => Err(err), @@ -109,6 +167,7 @@ fn read_db(context: &Ctx, key: &[u8]) -> Result<(Option>, u64), WasmEngi let mut enclave_buffer = std::mem::MaybeUninit::::uninit(); let mut vm_err = UntrustedVmError::default(); let mut gas_used = 0_u64; + let value = unsafe { let status = ocalls::ocall_read_db( (&mut ocall_return) as *mut _, @@ -201,7 +260,7 @@ fn write_db(context: &Ctx, key: &[u8], value: &[u8]) -> Result sgx_status_t; + + pub fn ocall_multiple_write_db( + retval: *mut OcallReturn, + context: Ctx, + vm_error: *mut UntrustedVmError, + gas_used: *mut u64, + keys: *const u8, + keys_len: usize, + ) -> sgx_status_t; } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs index 00a5f5af9..b02f55dd9 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs @@ -1,4 +1,5 @@ #![feature(stmt_expr_attributes)] +#![feature(vec_into_raw_parts)] // Trick to get the IDE to use sgx_tstd even when it doesn't know we're targeting SGX #[cfg(not(target_env = "sgx"))] diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 1dad2958d..52994e5c1 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -13,11 +13,12 @@ use cw_types_generic::CosmWasmApiVersion; use cw_types_v010::consts::BECH32_PREFIX_ACC_ADDR; use enclave_crypto::{sha_256, Ed25519PublicKey, WasmApiCryptoError}; +use enclave_utils::kv_cache::KvCache; use crate::contract_validation::ContractKey; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] -use crate::db::{remove_encrypted_key, write_encrypted_key}; +use crate::db::{encrypt_key, remove_encrypted_key, write_encrypted_key, write_multiple_db}; use crate::errors::WasmEngineError; use crate::gas::{WasmCosts, OCALL_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; @@ -62,6 +63,7 @@ const MAX_LOG_LENGTH: usize = 8192; pub struct ContractInstance { pub context: Ctx, pub memory: MemoryRef, + pub kv_cache: KvCache, pub gas_limit: u64, /// Gas used by wasmi pub gas_used: u64, @@ -105,9 +107,12 @@ impl ContractInstance { return Err(EnclaveError::InvalidWasm); }; + let kv_cache = KvCache::new(); + Ok(Self { context, memory, + kv_cache, gas_limit, gas_used: 0, gas_used_externally: 0, @@ -346,10 +351,35 @@ impl WasmiApi for ContractInstance { self.use_gas_externally(OCALL_BASE_GAS)?; - // Call read_db (this bubbles up to Tendermint via ocalls and FFI to Go code) - // This returns the value from Tendermint - let (value, gas_used) = - read_encrypted_key(&state_key_name, &self.context, &self.contract_key)?; + let value = self.kv_cache.read(&state_key_name); + + // ********************************* + // if value is in the cache + // ********************************* + if value.is_some() { + let unwrapped = value.unwrap(); + let ptr_to_region_in_wasm_vm = self.write_to_memory(&unwrapped).map_err(|err| { + debug!( + "read_db() error while trying to allocate {} bytes for the value", + unwrapped.len(), + ); + err + })?; + + // Return pointer to the allocated buffer with the value written to it + // https://github.com/scrtlabs/SecretNetwork/blob/2aacc3333ba3a10ed54c03c56576d72c7c9dcc59/cosmwasm/packages/std/src/imports.rs?plain=1#L80 + return Ok(Some(RuntimeValue::I32(ptr_to_region_in_wasm_vm as i32))); + } + + // ********************************* + // if value isn't in the cache + // ********************************* + let (value, gas_used) = read_encrypted_key( + &state_key_name, + &self.context, + &self.contract_key, + &mut self.kv_cache, + )?; self.use_gas_externally(gas_used)?; let value = match value { @@ -476,22 +506,68 @@ impl WasmiApi for ContractInstance { self.use_gas_externally(OCALL_BASE_GAS)?; - let used_gas = - write_encrypted_key(&state_key_name, &value, &self.context, &self.contract_key) - .map_err(|err| { - debug!( - "write_db() error while trying to write the value to state: {:?}", - err - ); - err - })?; - self.use_gas_externally(used_gas)?; + self.kv_cache.write(&state_key_name, &value); + + // let used_gas = + // write_encrypted_key(&state_key_name, &value, &self.context, &self.contract_key) + // .map_err(|err| { + // debug!( + // "write_db() error while trying to write the value to state: {:?}", + // err + // ); + // err + // })?; + // self.use_gas_externally(used_gas)?; // return value from here is never read // https://github.com/scrtlabs/SecretNetwork/blob/2aacc3333ba3a10ed54c03c56576d72c7c9dcc59/cosmwasm/packages/std/src/imports.rs?plain=1#L95 Ok(None) } + #[cfg(feature = "query-only")] + fn flush_cache(&mut self) -> Result, Trap> { + Ok(None) + } + + #[cfg(not(feature = "query-only"))] + fn flush_cache(&mut self) -> Result, Trap> { + let mut keys: Vec<(Vec, Vec)> = self + .kv_cache + .flush() + .into_iter() + .map(|(k, v)| { + let (enc_key, _, enc_v) = + encrypt_key(&k, &v, &self.context, &self.contract_key).unwrap(); + + (enc_key.to_vec(), enc_v) + }) + // todo: fix + // .map_err(|_| + // { + // debug!( + // "addr_validate() error while trying to parse human address from bytes to string: {:?}", + // err + // ); + // return Ok(Some(RuntimeValue::I32( + // self.write_to_memory(b"Input is not valid UTF-8")? as i32, + // ))); + // } + // )? + .collect(); + + let used_gas = write_multiple_db(&self.context, keys).map_err(|err| { + debug!( + "write_db() error while trying to write the value to state: {:?}", + err + ); + err + })?; + + self.use_gas_externally(used_gas)?; + + Ok(None) + } + /// Convert a human readable address into its bytes representation /// v0.10 /// diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/traits.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/traits.rs index 9046518cb..9775a0a65 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/traits.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/traits.rs @@ -2,6 +2,8 @@ use wasmi::{RuntimeValue, Trap}; /// These functions are imported to WASM code pub trait WasmiApi { + fn flush_cache(&mut self) -> Result, Trap>; + /// CosmWasm v0.10 + v1 fn read_db(&mut self, state_key_ptr: i32) -> Result, Trap>; diff --git a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs new file mode 100644 index 000000000..e5b2b7fca --- /dev/null +++ b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs @@ -0,0 +1,73 @@ +use log::trace; +// use serde::Serialize; +use std::collections::BTreeMap; + +// #[derive(Serialize, Clone, Debug, PartialEq)] +// pub struct MultiKv { +// keys: Vec>, +// values: Vec>, +// } + +pub struct KvCache(BTreeMap, Vec>, BTreeMap, Vec>); + +impl KvCache { + pub fn new() -> Self { + Self { + // 0 is cache that we need to write at the end of the tx (new keys) + 0: Default::default(), + // 1 is just used for a read cache (for reading multiple keys in a row) + 1: Default::default(), + } + } + + pub fn write(&mut self, k: &[u8], v: &[u8]) -> Option> { + trace!("************ Cache insert ***********"); + + self.0.insert(k.to_vec(), v.to_vec()) + } + + pub fn write_cache_only(&mut self, k: &[u8], v: &[u8]) -> Option> { + trace!("************ Cache insert ***********"); + + self.1.insert(k.to_vec(), v.to_vec()) + } + pub fn read(&self, k: &[u8]) -> Option> { + let x = self.0.get(k); + if x.is_some() { + trace!("************ Cache hit ***********"); + + return Some(x.unwrap().clone()); + } + + let x = self.1.get(k); + if x.is_some() { + trace!("************ Cache hit from RO cache ***********"); + + return Some(x.unwrap().clone()); + } + + trace!("************ Cache miss ***********"); + + return None; + } + + pub fn flush(&mut self) -> Vec<(Vec, Vec)> { + // let mut keys = vec![]; + // let mut values = vec![]; + // + // for (k, v) in self.0 { + // keys.push(k); + // values.push(v); + // } + // + // &self.0.clear(); + // + // MultiKv { keys, values } + + let items: Vec<(Vec, Vec)> = self.0.drain_filter(|_k, _v| true == true).collect(); + + self.1.clear(); + + items + } +} diff --git a/cosmwasm/enclaves/shared/utils/src/lib.rs b/cosmwasm/enclaves/shared/utils/src/lib.rs index c6e353b1e..6e512996e 100644 --- a/cosmwasm/enclaves/shared/utils/src/lib.rs +++ b/cosmwasm/enclaves/shared/utils/src/lib.rs @@ -1,9 +1,11 @@ #![feature(try_reserve)] +#![feature(btree_drain_filter)] #[cfg(not(target_env = "sgx"))] extern crate sgx_tstd as std; extern crate sgx_types; +pub mod kv_cache; pub mod logger; pub mod macros; pub mod oom_handler; diff --git a/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs b/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs index b93977bab..0ff69c778 100644 --- a/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs +++ b/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs @@ -1,4 +1,5 @@ use std::ffi::c_void; +use std::ops::Index; use sgx_types::SgxResult; @@ -249,6 +250,74 @@ pub extern "C" fn ocall_remove_db( } /// Write a value to the contracts key-value store. +#[no_mangle] +pub extern "C" fn ocall_multiple_write_db( + context: Ctx, + vm_error: *mut UntrustedVmError, + gas_used: *mut u64, + keys: *const u8, + keys_len: usize, // keys_capacity: usize, + // values: *const u8, + // values_len: usize, + // values_capacity: usize +) -> OcallReturn { + let from_raw = unsafe { std::slice::from_raw_parts(keys, keys_len) }; + let x: Vec<(Vec, Vec)> = serde_json::from_slice(from_raw).unwrap(); + + // let keys_vec: Vec = unsafe { std::vec::Vec::from_raw_parts(keys, keys_len, keys_capacity) }; + // let values_vec: Vec = + // unsafe { std::vec::Vec::from_raw_parts(values, values_len, values_capacity) }; + + let implementation = unsafe { get_implementations_from_context(&context).write_multiple_db }; + + std::panic::catch_unwind(|| match implementation(context, x) { + Ok(gas_cost) => { + unsafe { *gas_used = gas_cost }; + OcallReturn::Success + } + Err(err) => { + unsafe { store_vm_error(err, vm_error) }; + OcallReturn::Failure + } + }) + // This will happen only when `catch_unwind` returns `Err`, which indicates a caught panic + .unwrap_or(OcallReturn::Panic) + + // todo: if keys.len != values.len + + // for (key, value) in x.into_iter() { + // //let value = values_vec.get(index).unwrap(); + // + // // We explicitly ignore this potential panic here because we have no way of handling it at the moment. + // // In the future, if we see that panics do occur here, we should add a way to report this to the enclave. + // // TODO add logging if we fail to write + // let result = std::panic::catch_unwind(|| match implementation(context, &key, &value) { + // Ok(gas_cost) => { + // unsafe { *gas_used += gas_cost }; + // OcallReturn::Success + // } + // Err(err) => { + // unsafe { store_vm_error(err, vm_error) }; + // OcallReturn::Failure + // } + // }) + // // This will happen only when `catch_unwind` returns `Err`, which indicates a caught panic + // .unwrap_or_else(|_| OcallReturn::Panic); + // + // match result { + // OcallReturn::Panic => { + // return OcallReturn::Panic; + // } + // OcallReturn::Failure => { + // return OcallReturn::Failure; + // } + // _ => {} + // } + // } + // + // return OcallReturn::Success; +} + #[no_mangle] pub extern "C" fn ocall_write_db( context: Ctx, @@ -280,7 +349,6 @@ pub extern "C" fn ocall_write_db( // This will happen only when `catch_unwind` returns `Err`, which indicates a caught panic .unwrap_or(OcallReturn::Panic) } - /// Box the error and return a pointer to it. /// This box will be recovered on the side that called the enclave. /// @@ -306,6 +374,7 @@ struct ExportImplementations { ) -> VmResult<(SystemResult>, u64)>, remove_db: fn(context: Ctx, key: &[u8]) -> VmResult, write_db: fn(context: Ctx, key: &[u8], value: &[u8]) -> VmResult, + write_multiple_db: fn(context: Ctx, keys: Vec<(Vec, Vec)>) -> VmResult, } impl ExportImplementations { @@ -319,6 +388,7 @@ impl ExportImplementations { query_chain: ocall_query_chain_impl::, remove_db: ocall_remove_db_impl::, write_db: ocall_write_db_impl::, + write_multiple_db: ocall_write_multiple_db_impl::, } } } @@ -406,3 +476,29 @@ where .map_err(Into::into) }) } + +fn ocall_write_multiple_db_impl( + mut context: Ctx, + keys: Vec<(Vec, Vec)>, +) -> VmResult +where + S: Storage, + Q: Querier, +{ + with_storage_from_context::(&mut context, |storage: &mut S| { + let mut total_gas = 0; + + for (k, v) in keys.into_iter() { + let (ffi_result, gas_info) = storage.set(&k, &v); + total_gas += gas_info.externally_used; + + if ffi_result.is_err() { + return Err(VmError::FfiErr { + source: ffi_result.unwrap_err(), + }); + } + } + + Ok(total_gas) + }) +} diff --git a/x/compute/internal/keeper/keeper_test.go b/x/compute/internal/keeper/keeper_test.go index b7ed83e21..c02117274 100644 --- a/x/compute/internal/keeper/keeper_test.go +++ b/x/compute/internal/keeper/keeper_test.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "log" "os" "path/filepath" "testing" @@ -862,7 +863,7 @@ func TestExecuteWithStorageLoop(t *testing.T) { _, err = keeper.Execute(ctx, addr, fred, msgBz, nil, nil) diff := time.Since(start) - t.Logf("Duration till out of gas: %+v (%d gas)\n", diff, gasLimit) + log.Printf("Duration till out of gas: %+v (%d gas)\n", diff, gasLimit) require.Equal(t, err.Error(), outOfGasError.Error()) } From 1ae475940f9e2939b7ed5fc4172275996e197432 Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 7 Sep 2022 17:01:22 +0300 Subject: [PATCH 28/67] Now saves read cache properly --- cosmwasm/enclaves/shared/contract-engine/src/db.rs | 2 +- cosmwasm/enclaves/shared/utils/src/kv_cache.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/db.rs b/cosmwasm/enclaves/shared/contract-engine/src/db.rs index 1c7803bfc..863bb32e7 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/db.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/db.rs @@ -119,7 +119,7 @@ pub fn read_encrypted_key( Ok((value, gas_used)) => match value { Some(value) => match decrypt_key(&scrambled_field_name, &value, contract_key) { Ok(decrypted) => { - let _ = kv_cache.write(key, &decrypted); + let _ = kv_cache.write_cache_only(key, &decrypted); Ok((Some(decrypted), gas_used)) } // This error case is why we have all the matches here. diff --git a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs index e5b2b7fca..64887cda3 100644 --- a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs +++ b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs @@ -32,6 +32,7 @@ impl KvCache { self.1.insert(k.to_vec(), v.to_vec()) } pub fn read(&self, k: &[u8]) -> Option> { + // first to to read from the writeable cache - this will be more updated let x = self.0.get(k); if x.is_some() { trace!("************ Cache hit ***********"); @@ -39,6 +40,7 @@ impl KvCache { return Some(x.unwrap().clone()); } + // if no hit in the writeable cache, try the readable one let x = self.1.get(k); if x.is_some() { trace!("************ Cache hit from RO cache ***********"); From 072abc286cbc4d90c4e198da3aa3dad0722ae900 Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 7 Sep 2022 20:49:33 +0300 Subject: [PATCH 29/67] Testing bumping gas to 2_000_000 and removed debug prints --- cosmwasm/enclaves/shared/contract-engine/src/db.rs | 2 +- .../shared/contract-engine/src/wasm/contract.rs | 4 ++-- cosmwasm/enclaves/shared/utils/src/kv_cache.rs | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/db.rs b/cosmwasm/enclaves/shared/contract-engine/src/db.rs index 863bb32e7..aa5519bd2 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/db.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/db.rs @@ -15,7 +15,7 @@ use super::contract_validation::ContractKey; use super::errors::WasmEngineError; #[cfg(not(feature = "query-only"))] -pub fn write_multiple_db( +pub fn write_multiple_keys( context: &Ctx, keys: Vec<(Vec, Vec)>, ) -> Result { diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 52994e5c1..7b48008c2 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -18,7 +18,7 @@ use enclave_utils::kv_cache::KvCache; use crate::contract_validation::ContractKey; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] -use crate::db::{encrypt_key, remove_encrypted_key, write_encrypted_key, write_multiple_db}; +use crate::db::{encrypt_key, remove_encrypted_key, write_encrypted_key, write_multiple_keys}; use crate::errors::WasmEngineError; use crate::gas::{WasmCosts, OCALL_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; @@ -555,7 +555,7 @@ impl WasmiApi for ContractInstance { // )? .collect(); - let used_gas = write_multiple_db(&self.context, keys).map_err(|err| { + let used_gas = write_multiple_keys(&self.context, keys).map_err(|err| { debug!( "write_db() error while trying to write the value to state: {:?}", err diff --git a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs index 64887cda3..61bd57258 100644 --- a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs +++ b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs @@ -21,13 +21,13 @@ impl KvCache { } pub fn write(&mut self, k: &[u8], v: &[u8]) -> Option> { - trace!("************ Cache insert ***********"); + //trace!("************ Cache insert ***********"); self.0.insert(k.to_vec(), v.to_vec()) } pub fn write_cache_only(&mut self, k: &[u8], v: &[u8]) -> Option> { - trace!("************ Cache insert ***********"); + //trace!("************ Cache insert ***********"); self.1.insert(k.to_vec(), v.to_vec()) } @@ -35,7 +35,7 @@ impl KvCache { // first to to read from the writeable cache - this will be more updated let x = self.0.get(k); if x.is_some() { - trace!("************ Cache hit ***********"); + // trace!("************ Cache hit ***********"); return Some(x.unwrap().clone()); } @@ -43,12 +43,12 @@ impl KvCache { // if no hit in the writeable cache, try the readable one let x = self.1.get(k); if x.is_some() { - trace!("************ Cache hit from RO cache ***********"); + // trace!("************ Cache hit from RO cache ***********"); return Some(x.unwrap().clone()); } - trace!("************ Cache miss ***********"); + // trace!("************ Cache miss ***********"); return None; } From f69941b34187379b15ee7328033bde799cee6b8b Mon Sep 17 00:00:00 2001 From: Assaf Morami Date: Thu, 8 Sep 2022 10:09:03 +0300 Subject: [PATCH 30/67] lint --- x/compute/client/cli/query.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x/compute/client/cli/query.go b/x/compute/client/cli/query.go index bcc235580..7d789b716 100644 --- a/x/compute/client/cli/query.go +++ b/x/compute/client/cli/query.go @@ -312,6 +312,9 @@ func CmdDecryptText() *cobra.Command { } nonce, originalTxSenderPubkey, ciphertextInput, err := parseEncryptedBlob(dataCipherBz) + if err != nil { + return fmt.Errorf("error while parsing encrypted data: %w", err) + } wasmCtx := wasmUtils.WASMContext{CLIContext: clientCtx} _, myPubkey, err := wasmCtx.GetTxSenderKeyPair() From f541712512be7b0c2340a281575039d40d86e7dd Mon Sep 17 00:00:00 2001 From: Assaf Morami Date: Thu, 8 Sep 2022 10:27:16 +0300 Subject: [PATCH 31/67] clippy --- .../enclaves/shared/contract-engine/src/db.rs | 3 +- .../contract-engine/src/wasm/contract.rs | 9 ++--- .../enclaves/shared/utils/src/kv_cache.rs | 33 +++++++++---------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/db.rs b/cosmwasm/enclaves/shared/contract-engine/src/db.rs index aa5519bd2..76e2ccaac 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/db.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/db.rs @@ -9,7 +9,6 @@ use enclave_crypto::{sha_256, AESKey, Kdf, SIVEncryptable, KEY_MANAGER}; use crate::external::{ecalls, ocalls}; use enclave_utils::kv_cache::KvCache; -use serde_json::Value; use super::contract_validation::ContractKey; use super::errors::WasmEngineError; @@ -53,6 +52,7 @@ pub fn write_multiple_keys( } #[cfg(not(feature = "query-only"))] +#[allow(dead_code)] pub fn write_encrypted_key( key: &[u8], value: &[u8], @@ -233,6 +233,7 @@ fn remove_db(context: &Ctx, key: &[u8]) -> Result { /// Safe wrapper around writes to the contract storage #[cfg(not(feature = "query-only"))] +#[allow(dead_code)] fn write_db(context: &Ctx, key: &[u8], value: &[u8]) -> Result { let mut ocall_return = OcallReturn::Success; let mut vm_err = UntrustedVmError::default(); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 7b48008c2..72f8231e1 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -18,7 +18,9 @@ use enclave_utils::kv_cache::KvCache; use crate::contract_validation::ContractKey; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] -use crate::db::{encrypt_key, remove_encrypted_key, write_encrypted_key, write_multiple_keys}; +use crate::db::{ + encrypt_key, remove_encrypted_key, /* write_encrypted_key, */ write_multiple_keys, +}; use crate::errors::WasmEngineError; use crate::gas::{WasmCosts, OCALL_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; @@ -356,8 +358,7 @@ impl WasmiApi for ContractInstance { // ********************************* // if value is in the cache // ********************************* - if value.is_some() { - let unwrapped = value.unwrap(); + if let Some(unwrapped) = value { let ptr_to_region_in_wasm_vm = self.write_to_memory(&unwrapped).map_err(|err| { debug!( "read_db() error while trying to allocate {} bytes for the value", @@ -531,7 +532,7 @@ impl WasmiApi for ContractInstance { #[cfg(not(feature = "query-only"))] fn flush_cache(&mut self) -> Result, Trap> { - let mut keys: Vec<(Vec, Vec)> = self + let keys: Vec<(Vec, Vec)> = self .kv_cache .flush() .into_iter() diff --git a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs index 61bd57258..0a04f882a 100644 --- a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs +++ b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs @@ -1,4 +1,3 @@ -use log::trace; // use serde::Serialize; use std::collections::BTreeMap; @@ -31,26 +30,18 @@ impl KvCache { self.1.insert(k.to_vec(), v.to_vec()) } - pub fn read(&self, k: &[u8]) -> Option> { + pub fn read(&self, key: &[u8]) -> Option> { // first to to read from the writeable cache - this will be more updated - let x = self.0.get(k); - if x.is_some() { - // trace!("************ Cache hit ***********"); - - return Some(x.unwrap().clone()); + if let Some(value) = self.0.get(key) { + Some(value.clone()) } - // if no hit in the writeable cache, try the readable one - let x = self.1.get(k); - if x.is_some() { - // trace!("************ Cache hit from RO cache ***********"); - - return Some(x.unwrap().clone()); + else if let Some(value) = self.1.get(key) { + Some(value.clone()) + } else { + // trace!("************ Cache miss ***********"); + None } - - // trace!("************ Cache miss ***********"); - - return None; } pub fn flush(&mut self) -> Vec<(Vec, Vec)> { @@ -66,10 +57,16 @@ impl KvCache { // // MultiKv { keys, values } - let items: Vec<(Vec, Vec)> = self.0.drain_filter(|_k, _v| true == true).collect(); + let items: Vec<(Vec, Vec)> = self.0.drain_filter(|_k, _v| true).collect(); self.1.clear(); items } } + +impl Default for KvCache { + fn default() -> Self { + Self::new() + } +} From 2a8be29db4250cccc1a69c67c8ef941298c2fb41 Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 14 Sep 2022 20:12:09 +0300 Subject: [PATCH 32/67] Added standardized benchmarking tests for contracts --- Makefile | 2 +- .../compute-tests/bench-contract/.gitignore | 13 + .../compute-tests/bench-contract/Cargo.lock | 646 ++++++++++++++++++ .../compute-tests/bench-contract/Cargo.toml | 37 + .../v1/compute-tests/bench-contract/Makefile | 8 + .../bench-contract/rust-toolchain | 1 + .../bench-contract/src/benches/allocate.rs | 21 + .../bench-contract/src/benches/cpu.rs | 19 + .../bench-contract/src/benches/mod.rs | 4 + .../src/benches/read_storage.rs | 21 + .../src/benches/write_storage.rs | 18 + .../bench-contract/src/contract.rs | 51 ++ .../compute-tests/bench-contract/src/lib.rs | 3 + .../compute-tests/bench-contract/src/msg.rs | 33 + deployment/dockerfiles/dev-image.Dockerfile | 3 + x/compute/client/utils/utils.go | 1 + x/compute/internal/keeper/bench_test.go | 184 +++++ x/compute/internal/keeper/test_common.go | 3 + 18 files changed, 1067 insertions(+), 1 deletion(-) create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs create mode 100644 cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs create mode 100644 x/compute/internal/keeper/bench_test.go diff --git a/Makefile b/Makefile index af1205b6d..ff07943df 100644 --- a/Makefile +++ b/Makefile @@ -232,7 +232,7 @@ build-rocksdb-image: docker build --build-arg BUILD_VERSION=${VERSION} -f deployment/dockerfiles/db-compile.Dockerfile -t enigmampc/rocksdb:${VERSION} . build-localsecret: - docker build --build-arg BUILD_VERSION=${VERSION} --build-arg SGX_MODE=SW --build-arg FEATURES_U="${FEATURES_U}" --build-arg FEATURES="${FEATURES},debug-print" -f deployment/dockerfiles/base.Dockerfile -t rust-go-base-image . + docker build --build-arg BUILD_VERSION=${VERSION} --build-arg SGX_MODE=SW --build-arg FEATURES_U="${FEATURES_U},query-node" --build-arg FEATURES="${FEATURES},debug-print" -f deployment/dockerfiles/base.Dockerfile -t rust-go-base-image . docker build --build-arg SGX_MODE=SW --build-arg SECRET_NODE_TYPE=BOOTSTRAP --build-arg CHAIN_ID=secretdev-1 -f deployment/dockerfiles/release.Dockerfile -t build-release . docker build --build-arg SGX_MODE=SW --build-arg SECRET_NODE_TYPE=BOOTSTRAP --build-arg CHAIN_ID=secretdev-1 -f deployment/dockerfiles/dev-image.Dockerfile -t ghcr.io/scrtlabs/localsecret:${DOCKER_TAG} . diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore b/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore new file mode 100644 index 000000000..0e24e33d5 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/.gitignore @@ -0,0 +1,13 @@ +# Build results +/target +*.wasm + +# Text file backups +**/*.rs.bk + +# macOS +.DS_Store + +# IDEs +*.iml +.idea diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock new file mode 100644 index 000000000..85691eba5 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.lock @@ -0,0 +1,646 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "base64ct" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851" + +[[package]] +name = "bench-contract" +version = "1.0.0" +dependencies = [ + "cosmwasm-std", + "cosmwasm-storage", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.5", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "cosmwasm-crypto" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "digest 0.9.0", + "ed25519-zebra", + "k256", + "rand_core 0.6.3", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "syn", +] + +[[package]] +name = "cosmwasm-std" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "base64", + "cosmwasm-crypto", + "cosmwasm-derive", + "forward_ref", + "schemars", + "serde", + "serde-json-wasm", + "thiserror", + "uint", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.0.0" +source = "git+https://github.com/scrtlabs/cosmwasm?branch=secret#e69869a8565e4e2318bdbfd3711fd1ceda0db209" +dependencies = [ + "cosmwasm-std", + "serde", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array", + "rand_core 0.6.3", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", +] + +[[package]] +name = "dyn-clone" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d07a982d1fb29db01e5a59b1918e03da4df7297eaeee7686ac45542fd4e59c8" + +[[package]] +name = "ecdsa" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519-zebra" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403ef3e961ab98f0ba902771d29f842058578bb1ce7e3c59dad5a6a93e784c69" +dependencies = [ + "curve25519-dalek", + "hex", + "rand_core 0.6.3", + "serde", + "sha2 0.9.9", + "thiserror", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array", + "group", + "rand_core 0.6.3", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "group" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" +dependencies = [ + "ff", + "rand_core 0.6.3", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "k256" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sec1", + "sha2 0.9.9", +] + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "proc-macro2" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom 0.2.7", +] + +[[package]] +name = "rfc6979" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac", + "zeroize", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "schemars" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479b4dbc401ca13ee8ce902851b834893251404c4f3c65370a49e047a6be09a5" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "signature" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +dependencies = [ + "digest 0.9.0", + "rand_core 0.6.3", +] + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "uint" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f03af7ccf01dd611cc450a0d10dbc9b745770d096473e2faf0ca6e2d66d1e0" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml new file mode 100644 index 000000000..26835d8bc --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "bench-contract" +version = "1.0.0" +authors = ["Enigma "] +edition = "2018" +description = "A Test contract intended to use in system tests for the Secret Netowrk" +license = "MIT" +exclude = [ + # Those files are cosmwasm-opt artifacts. You might want to commit them for convenience but they should not be part of the source code publication. + "bench-contract.wasm", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = 'abort' +incremental = false +overflow-checks = true + +[dependencies] +cosmwasm-std = { git = "https://github.com/scrtlabs/cosmwasm", branch = "secret" } +cosmwasm-storage = { git = "https://github.com/scrtlabs/cosmwasm", branch = "secret" } +schemars = "0.8.1" +serde = { version = "1.0.114", default-features = false, features = [ + "derive", + "alloc" +] } +serde-json-wasm = "0.4.1" +sha2 = "0.10.2" diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile new file mode 100644 index 000000000..95e0c87f7 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile @@ -0,0 +1,8 @@ +all: src/contract.rs src src src Cargo.toml Cargo.lock + rustup target add wasm32-unknown-unknown + RUSTFLAGS='-C link-arg=-s' cargo build --release --target wasm32-unknown-unknown + cp ./target/wasm32-unknown-unknown/release/v1_sanity_contract.wasm ./v1-contract.wasm + +clean: + cargo clean + -rm -f ./v1-contract.wasm diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain b/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain new file mode 100644 index 000000000..a7efc46ca --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/rust-toolchain @@ -0,0 +1 @@ +1.61 \ No newline at end of file diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs new file mode 100644 index 000000000..c05f363f6 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs @@ -0,0 +1,21 @@ +use cosmwasm_std::{StdError, StdResult}; + +pub fn do_allocate_large_memory() -> StdResult<()> { + // We create memory pages explicitely since Rust's default allocator seems to be clever enough + // to not grow memory for unused capacity like `Vec::::with_capacity(100 * 1024 * 1024)`. + // Even with std::alloc::alloc the memory did now grow beyond 1.5 MiB. + + #[cfg(target_arch = "wasm32")] + { + use core::arch::wasm32; + let pages = 1_600; // 100 MiB + let ptr = wasm32::memory_grow(0, pages); + if ptr == usize::max_value() { + return Err(StdError::generic_err("Error in memory.grow instruction")); + } + Ok(()) + } + + #[cfg(not(target_arch = "wasm32"))] + Err(StdError::generic_err("Unsupported architecture")) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs new file mode 100644 index 000000000..cc000004e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/cpu.rs @@ -0,0 +1,19 @@ +use sha2::{Digest, Sha256}; + +// use crate::msg::BenchResponse; +use cosmwasm_std::StdError; + +const BENCH_NAME: &str = "bench_cpu_sha256"; + +pub fn do_cpu_loop(num_of_runs: usize) -> Result<(), StdError> { + let mut hashed: Vec = BENCH_NAME.into(); + for _i in 1..num_of_runs { + hashed = Sha256::digest(&hashed).to_vec() + } + + Ok(()) + // Ok(BenchResponse { + // name: BENCH_NAME.to_string(), + // time: 0, + // }) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs new file mode 100644 index 000000000..7b9f1eb72 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod allocate; +pub(crate) mod cpu; +pub(crate) mod read_storage; +pub(crate) mod write_storage; diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs new file mode 100644 index 000000000..aabfa72fe --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs @@ -0,0 +1,21 @@ +use cosmwasm_std::{Deps, DepsMut, StdResult}; + +pub fn bench_read_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { + deps.storage.set(b"test.key", b"test.value"); + + for _ in 1..keys { + deps.storage.get(b"test.key"); + } + + Ok(()) +} + +#[allow(dead_code)] +/// call this test only after the bench of write storage, so the keys are populated +pub fn bench_read_storage_different_key(deps: Deps, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.get(&i.to_be_bytes()).unwrap(); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs new file mode 100644 index 000000000..2f60b21cb --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs @@ -0,0 +1,18 @@ +use cosmwasm_std::{DepsMut, StdResult}; + +#[allow(dead_code)] +pub fn bench_write_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.set(b"test.key", i.to_string().as_bytes()); + } + + Ok(()) +} + +pub fn bench_write_storage_different_key(deps: DepsMut, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage.set(&i.to_be_bytes(), i.to_string().as_bytes()); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs new file mode 100644 index 000000000..6b023066e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs @@ -0,0 +1,51 @@ +use benches::cpu::do_cpu_loop; + +use crate::benches; +use crate::benches::allocate::do_allocate_large_memory; +use crate::benches::read_storage::bench_read_storage_same_key; +use crate::benches::write_storage::bench_write_storage_different_key; +use cosmwasm_std::{ + entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdResult, +}; + +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; + +#[entry_point] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + Ok(Response::default()) +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: ExecuteMsg, +) -> StdResult { + let _ = match msg { + ExecuteMsg::Noop {} => Ok(()), + ExecuteMsg::BenchCPU {} => do_cpu_loop(5000), + ExecuteMsg::BenchReadStorage {} => bench_read_storage_same_key(deps, 100), + ExecuteMsg::BenchWriteStorage {} => bench_write_storage_different_key(deps, 100), + ExecuteMsg::BenchAllocate {} => do_allocate_large_memory(), + ExecuteMsg::BenchReadLargeItemFromStorage { .. } => Ok(()), + ExecuteMsg::BenchWriteLargeItemToStorage { .. } => Ok(()), + }; + + Ok(Response::default()) +} + +#[entry_point] +pub fn query(_deps: Deps, _env: Env, _msg: QueryMsg) -> StdResult { + Ok(Binary::default()) +} + +#[entry_point] +pub fn reply(_deps: DepsMut, _env: Env, _reply: Reply) -> StdResult { + Ok(Response::default()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs new file mode 100644 index 000000000..635c14b17 --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/lib.rs @@ -0,0 +1,3 @@ +pub mod benches; +pub mod contract; +pub mod msg; diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs new file mode 100644 index 000000000..db4128c9e --- /dev/null +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs @@ -0,0 +1,33 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum InstantiateMsg { + Init {}, +} + +// #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +// #[serde(rename_all = "snake_case")] +// pub struct BenchResponse { +// /// benchmark name +// name: String, +// /// time in nanos to run the test +// time: u64, +// } + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + Noop {}, + BenchCPU {}, + BenchReadStorage {}, + BenchWriteStorage {}, + BenchAllocate {}, + BenchReadLargeItemFromStorage {}, + BenchWriteLargeItemToStorage {}, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg {} diff --git a/deployment/dockerfiles/dev-image.Dockerfile b/deployment/dockerfiles/dev-image.Dockerfile index 8473acbf2..4a28e8ab8 100644 --- a/deployment/dockerfiles/dev-image.Dockerfile +++ b/deployment/dockerfiles/dev-image.Dockerfile @@ -2,6 +2,9 @@ FROM build-release COPY deployment/docker/devimage/bootstrap_init_no_stop.sh bootstrap_init.sh + +RUN chmod +x bootstrap_init.sh + COPY deployment/docker/devimage/faucet/faucet_server.js . HEALTHCHECK --interval=5s --timeout=1s --retries=120 CMD bash -c 'curl -sfm1 http://localhost:26657/status && curl -s http://localhost:26657/status | jq -e "(.result.sync_info.latest_block_height | tonumber) > 0"' diff --git a/x/compute/client/utils/utils.go b/x/compute/client/utils/utils.go index a33f262a8..11d894e06 100644 --- a/x/compute/client/utils/utils.go +++ b/x/compute/client/utils/utils.go @@ -156,6 +156,7 @@ func (ctx WASMContext) getConsensusIoPubKey() ([]byte, error) { ioPubkey, err := ra.UNSAFE_VerifyRaCert(masterIoKey.Key) if err != nil { + println(masterIoKey.Key) return nil, err } diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go new file mode 100644 index 000000000..d606f7f97 --- /dev/null +++ b/x/compute/internal/keeper/bench_test.go @@ -0,0 +1,184 @@ +package keeper + +import ( + "fmt" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "math" + "os" + "testing" + "time" +) + +type Bench string + +// Available benches +const ( + Noop Bench = "noop" + BenchCPU = "bench_c_p_u" + BenchReadStorage = "bench_read_storage" + BenchWriteStorage = "bench_write_storage" + BenchAllocate = "bench_allocate" + BenchReadLargeItemFromStorage = "bench_read_large_item_from_storage" + BenchWriteLargeItemToStorage Bench = "bench_write_large_item_from_storage" +) + +func buildBenchMessage(bench Bench) []byte { + x := fmt.Sprintf("{\"%s\": {}}", bench) + return []byte(x) +} + +type BenchTime struct { + Name string + Case Bench + Avg time.Duration + iterations uint64 + Min time.Duration + Max time.Duration + // StdEv int64 +} + +func NewBenchTimer(name string, bench Bench) BenchTime { + return BenchTime{ + Name: name, + Case: bench, + Avg: 0, + Min: math.MaxInt64, + Max: 0, + // StdEv: 0, + } +} + +func (b *BenchTime) AppendTime(singleRunTime time.Duration) { + if singleRunTime > b.Max { + b.Max = singleRunTime + } + if singleRunTime < b.Min { + b.Min = singleRunTime + } + + currentAvgSum := uint64(b.Avg) * b.iterations + newAvgSum := currentAvgSum + uint64(singleRunTime) + b.iterations += 1 + + b.Avg = time.Duration(newAvgSum / b.iterations) +} + +func (b *BenchTime) PrintReport() { + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n \t Results: \n\t Average: %s \n\t Min: %s \n\t Max: %s \n\t", + b.Name, + b.Case, + b.iterations, + b.Avg, + b.Min, + b.Max) + + // todo: log this properly + println(s) +} + +func initBenchContract(t *testing.T) (contract sdk.AccAddress, creator sdk.AccAddress, creatorPriv crypto.PrivKey, ctx sdk.Context, keeper Keeper) { + + encodingConfig := MakeEncodingConfig() + + encoders := DefaultEncoders(nil, encodingConfig.Marshaler) + ctx, keepers := CreateTestInput(t, false, SupportedFeatures, &encoders, nil) + accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper + + deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) + creator, creatorPriv = CreateFakeFundedAccount(ctx, accKeeper, keeper.bankKeeper, deposit.Add(deposit...)) + + // store the code + wasmCode, err := os.ReadFile(TestContractPaths[benchContract]) + require.NoError(t, err) + codeID, err := keeper.Create(ctx, creator, wasmCode, "", "") + require.NoError(t, err) + + _, _, contractAddr, _, initErr := initHelper(t, keeper, ctx, codeID, creator, creatorPriv, `{"init": {}}`, true, true, defaultGasForTests) + require.Empty(t, initErr) + + return contractAddr, creator, creatorPriv, ctx, keeper +} + +func TestRunBenchmarks(t *testing.T) { + + cases := map[string]struct { + gasLimit uint64 + bench Bench + loops uint64 + callbackfn func() uint64 + }{ + "warmup": { + gasLimit: 1_000_000, + bench: Noop, + loops: 10, + }, + "Empty execution (contract startup time)": { + gasLimit: 1_000_000, + bench: Noop, + loops: 10, + }, + "CPU 5000 rounds of sha2": { + gasLimit: 1_000_000, + bench: BenchCPU, + loops: 10, + }, + "Storage Write 100 different keys": { + gasLimit: 1_000_000, + bench: BenchWriteStorage, + loops: 10, + }, + "Storage Read 100 times same key": { + gasLimit: 1_000_000, + bench: BenchReadStorage, + loops: 10, + }, + } + + contractAddr, creator, creatorPriv, ctx, keeper := initBenchContract(t) + + timers := make(map[string]BenchTime) + + for name, tc := range cases { + + t.Run(name, func(t *testing.T) { + timer := NewBenchTimer(name, tc.bench) + // make sure we set a limit before calling + ctx = ctx.WithGasMeter(sdk.NewGasMeter(tc.gasLimit)) + require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) + + msg := buildBenchMessage(tc.bench) + + for i := uint64(1); i < tc.loops+1; i++ { + start := time.Now() + // call bench + _, _, qErr, _, _, _ := execHelper( + t, + keeper, + ctx, + contractAddr, + creator, + creatorPriv, + string(msg), + false, + true, + tc.gasLimit, + 0, + false, + ) + elapsed := time.Since(start) + require.Empty(t, qErr) + + timer.AppendTime(elapsed) + } + timers[name] = timer + }) + + } + + for name := range cases { + timer, _ := timers[name] + timer.PrintReport() + } +} diff --git a/x/compute/internal/keeper/test_common.go b/x/compute/internal/keeper/test_common.go index 9b5169e4a..c2208d97a 100644 --- a/x/compute/internal/keeper/test_common.go +++ b/x/compute/internal/keeper/test_common.go @@ -107,6 +107,8 @@ const v010WithFloats = "contract_with_floats.wasm" const tooHighMemoryContract = "too-high-initial-memory.wasm" const staticTooHighMemoryContract = "static-too-high-initial-memory.wasm" +const benchContract = "bench_contract.wasm" + const contractPath = "testdata" var TestContractPaths = map[string]string{ @@ -118,6 +120,7 @@ var TestContractPaths = map[string]string{ v010WithFloats: filepath.Join(".", contractPath, v010WithFloats), tooHighMemoryContract: filepath.Join(".", contractPath, tooHighMemoryContract), staticTooHighMemoryContract: filepath.Join(".", contractPath, staticTooHighMemoryContract), + benchContract: filepath.Join(".", contractPath, benchContract), } var outOfGasError = sdkerrors.Wrap(wasmtypes.ErrExecuteFailed, "Out of gas") From 05ad712f3125ab9e31d823393fc431b795215154 Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 14 Sep 2022 20:19:57 +0300 Subject: [PATCH 33/67] Added bench contract to repo (should we compile it from scratch to bench cosmwasm sdk changes?) --- x/compute/internal/keeper/bench_test.go | 2 +- .../keeper/testdata/bench_contract.wasm | Bin 0 -> 1867743 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 x/compute/internal/keeper/testdata/bench_contract.wasm diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index d606f7f97..bf0a8c63b 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -66,7 +66,7 @@ func (b *BenchTime) AppendTime(singleRunTime time.Duration) { } func (b *BenchTime) PrintReport() { - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n \t Results: \n\t Average: %s \n\t Min: %s \n\t Max: %s \n\t", + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Average: %s \n\t Min: %s \n\t Max: %s \n\t", b.Name, b.Case, b.iterations, diff --git a/x/compute/internal/keeper/testdata/bench_contract.wasm b/x/compute/internal/keeper/testdata/bench_contract.wasm new file mode 100644 index 0000000000000000000000000000000000000000..31d0d5c299a0d35327b7115f08c5e35d8e14227b GIT binary patch literal 1867743 zcmeFa4YXxfRp-0+KIh!ebMHO(qwYu5t*U)aDsT%@8hc<8(;02;YC__$-xF=$8}xg= zP9jM+To6-98Kv7!3KBvAQ7Ra;prceEm_i5^8YF16D@bcpd={8)3qiVU(-^uV6cU@D zDDU^5bFIDixnFfF6xfdOZjCx;pS{;wbFR7O*P3gtwUg^^{-HEUlJo=V!nLj2^p{-Q z^sh|U4X)GMuH~A~)IY-ATkY_>j+x>uF=Iyc|&(i{KLw_oy#Z@cD}8*X~}zj}4jP|^A7_Dwgu6lgbHbK{Tv;45x; zbuy^O<2PLYkG}oezwJBv>deHOKX~1Nm%gm;QS15}e(*>BwPQS9HGT8T|MjbqAvM^J zb*o#W`+wwyn_hj*OJ8=~%U?ymUe~z2kz~WkFn?K=4X64V<|`ZEVxZX^7~rGXXrvUe z0*$1>jp31IHat2o+~#_nKWYx>abq}Z&}@=5hch+qAI-7h)&PyR({y-zVtjnK(@C4H ztm$nIq$5p*rPg*v>$#=GHy5YuGzB<`Eblodo`NJ<&p*z!&>u)H3y*{0O`Ku1xaMQoK z?xi<~t8RYz55MY~%aS*xBiCF5(_eSZ4X?Vsk&a$-&C71M?#63=@Vc9CXk^2`k)}zJ zj_%+6o7pGQiw>o4NZ**=mHtHflj)n&!|C1WThgCO?@8a9{&c$MAARfdzU^BseqCef z?dkvX126ra>u!0;zr5!E`oaJEhJ)#C|LVq9T>nGMul%L#|G4VAU;MxQv+w^u|M&0v z-lOR|()-e%Pv4#X`}EQDquE!o|2O^p^bgXHrzg|jNuNspbNZR|Q|X_if0X`V`gnRO z{ZjgL`d8`yOz+Q*W$(@&$lj41&3-O>Jo~-u%h?CBPiBu~zn|UN_;mK?*^}Ap8=uSm zd-gxFLyeKwe0ccw#)FNld0Tqx1qb;{iu@J5)-Jou)1@rw4rF_?y?MGPX}o zRW0NVM~M~!_B2wY-|dYQ+1ia1?|eG>#{q?GSv_hMon_i<3X5hjBrm*va=V-4!0=JePK7WuM| z%IK%kv~gQCSef4zF+`X~o_-hINPJLwv~r-A=G@I2-@UDu7DE&p`tEJr)KIiB&FBTl z6{!GadGnHNhOY!9FUdMWJu7s@w?Oc#v)uV*Q5l#SrNkGR_rAvuN-Sl~Jn6jmwUl9` z^|RYBlyZZSRQ z2Z`vMikF>hgw8eUo#SS`bNbnZTF^UoE>q_kYjo~UMzU5VXou7PU(z-$X%aDbs8yU! z5E2H88$-Rp&Tm9%gBOvvYhlG!@no{RCrP?Z-MQX5oyUXX)4`&3fZ=KuUrYC2*&Xl( zi{?$;;l^Id(DHtYafN0X>J7jXrE*L2fuNZ5OtQ%xL{5sp^w2<5ZH{GHJo%av2Vo5K z$$yAwmPqEUJ;}>1Pp*&(0Lx3V%R=W`#bwLIQ&zL(?D&&G)?)vbvdg5E)xs4uo!lsO zax-c**Qd?8K5a@TqZR5px#@_vGij-%W$7X7f@>;MKhjgzUz%OirhcnN#5F*UfOuE(}vHJ$#QY>b%5$TCFO;ZHL7)P*I#Q5_lEEj|#xvKL}tU5o|@Ijsrj9?65`jV!_2NzwMEy63s zlj?hMDNP+pmy5gJs9#Ur$!F(NLG!nYU6GZVH}wYUEHhv%vnYnah6)?+T+J>n_C_vk z453;pyEwAiE*?&!Vf<{LA9L|5dck_QAJfbv;L(qf`slXYkI^-v-mF9&0SYo>ivSe|1D{9k05#=B$cmam3j>XxA(?5&0U9hFAiIm6_JKy*&?&d4 z7sqk_>q~|wF{8|@?SE$97a%zB-|4Ix_C|3g6_00~UkIIelHYc>^GmuTju4uAk|(kK z`|;J9-PC!4d!I{XB#OUDUc`fOdk`wWH#B#;Z0SudpzBd04 z&Y^F;(c&UHmyZ^IOD8j+a&s&#hUx6Ql#ty(3l$x^lQ%oD>nG`8=$hzvQr)?7Y*yDF zrvs|&AhMz-`q2Qb{Vk?ou9&8=Iq}0|{f#{4jcoBD`5h;})fV-sQGtgR{Q7`XeTlhF zw=H_#n{{b-DLayhcuUzmkXPS_v#~j0WPSa&%j1LD^z`8LbaNU!p4sjs+4pCk`S80Qc>k#nJe_frDQ?JHSB@<( za(Qd4VwmFfuRVca40YCS#n{SbE;W*k(GG@dETY(6SWOP*0|Qr%4Fqf>soq+m3Xkq? z7^+5^6*LCAQ9HH5PddUuPwm_~7;;#ok!?k5=jpgQvLZq^HmU3PfQTxu6ntw>qMu0gM>TMb;%I+6N4=en)9$_% zvQLc)0}an;pX_%;Fl66!KwT)*nxtP0(e6$HS?K9U@#V7aIb#azo|r?@w@m|q5OjXtoFwFfC zODR}Tj#3NW7*+dWu-2k4sv*z1<1!&p$-Lhz*c7}rv8_9mPrzDS7(Y8!FB%)K8pQ!y zHE57;T*K1J$4idm-jwcj>?5BlALPw$r#%LEqs+9vq0Ch1*+iYbeWMd`kph%Qfp>ISHmtre#noCqb7^)5ZRA@n$z(ToV?DcgDyHY%8?<3?Myz+$O;~p(&?ln=mXU~D zWf>(FtLQK4PmB6|RMc;yN9#b}x6;6f`)z=+o97c~Qhbzo=!AwTu_@`4UtY1Ccl_$I z<$ThwnAwl})y2%p{OY3Re9o_!5zM=%zPOx^`8}qQ9<(fGmh+i?`JsPeaA1*H$#9Y{ zXwH-$y9*y^@b)Cd3XfeAx6*Ra z$z~^5TZK@>64beZW_qKSCy(eip}U9qF6ew#x4suUEcdum&5x=1ZC&~91N3A*AMLjJ zo?YMY#%|TWF$VI&7u*;xm@#hP7*<~R)=^BAeqxNujxgB|$O(%jGr;q@-0cP`krS*i z%p;lT;y~J^AI`0|dE&tw<1aRRu4j`XHI!SMvrg2m5w-NgDPEx>b(!_q;;lisYzfL` zAqdY(KYUB^0Pjod`qPj&Ho;l6tU)COo`bSqaz2#MxYBF zWd2pW&9Eqa=&1MUY*hI4*9yBUUG`d@bJ(PC`UBgi^^9syp&Dvw|lYq}@u zJiLy(k9O-*1oN&46ek!AN@t;8K5)t_`H&T?$;YXzYgBkV_^KxZHL!dpACF~YOywoB zk+k_j-tN3j<69Z$g?x+Oa)*-=B`Zr}qr)2r0G@#*W?+fgJ}(7|?A9cC#x1GFD)Q(W zLs_zfT3lNM%%50r7@}*lvyN#EZc?4o!iX*8u*C#6b~^S-T)Yj#@&Lq}d7!&B-}V4Z zwD=%uce*>K`EDs;k)by!VZ)&#at*}GV3oJ+QdaATECLHw_n=xJ=Ftq$E?h{aEL}io z!JHOzsTNfb=`+^~!VX9+`9PFxU(y=RI3HeC*4fa@5{XZ`mu0*MuPwBRC^i(*3%rdP zWA3yknG_rDNjk>l?qZpfl)pWkYbiQrV39Y!*n|PTu5%lBB>-y2kSD;1ww9kLQ z=$a%UdnQRyd~9xyeVZ`-*oJ4aqIDIkEThFEX2n|WBCwVLQgCA0ZG-xV3Ms<5x)6F= z7R+LDTt{t#$Hmlcu}H5nGpXqg4nVAKYEi7ZScbl8PovsdF-Nkc4)lv_Tbm=r@j(M+pySlu+>2|&wI7d&k3Nd0I6&F2XZ$Vt&jjXms>wNl(tS4JW`yx&&5 zOP=uQYGj@1uVrlEq9#;kDQQep_J88m>w3m3#XnyjZw@9&s@4DEdzOs@hQA9>ZJcU& z<$(iW={X@^F~lhY_sb@QS@B}4*_~64VRfu-jj z+&6M-Z&n%_Pigjnp0Mz?mV0yg=y#d_#PS_A92AYd*xEP!_r3M@Q`)~AFr#8A)~j$< zDw5Cv?(9jv%O|NseH+v&|a`FM#NX`!?lGh+IuAxi*bG$53b>M;W7^F`8=jGVpF^?3^7*sd}R)dJ?;Fl)|+M9;*vDLSS?>`Ng5jL zZd}ajB7L6`L)-FlgQN=rtIqb=!}HMFyWaEkNuhb5p!!t~H;v_F=kP&iQqRtj$D5(F0O|oVQ1Kw#fUw$a&d#Us zkLw-JRos1l#}UA}itnO7onH~}8ZHbLj@OVQOO*%Z35n+585bb~nxH|Q-Pu2LWd@IX z56hT5qN47!g)YI*8oHMm5rMKN`3^((Z$NjL6282jDgL<%-HTQH1w!|OE6^P&(T%hH zHP8i(O`(euk`!_^v|JLpiuV&Zf`GosV4|>wsqU=6XAHXAjd#zH^Fe{ouZ@rMGvRQSao&UxrNAk?FPES8qjMy-_wL<+(4} zH?lA3{DcxM)al&~3&c9IAb>kz#yQ{$bI=t^bu2|Q!2j_cSz6!Eti=pZL=S?<2a}u0 zp3MD&%>08^-9N}m|G+%$9D@O2Z9f1upecHi)+c`xy`j-;uJkqS zcITM1v5kPVt!U|tU{^Nk#xQx)(brQiL>M{j58$_x2KQ5w*II75ept3~Bvlek4q>E< zec#Xe35Q&~IRF|Xep^tKzuG=9DQCxR;%YTScs;~}^1kfeH;jd{_Yq%X{t#V{Mru!Y&C3A4340?DMN zG~?8Jnd!A@@zb89FU)3W&9=AHLo1Ml%4N>niL^T*!Su8vB^-50HCW0XO1s0(p~p>j zGuG)tKh>c63EO5$mLrP=X3SJx|43iZ%`^$=Gvmd5uSLNWVexKTm)&iiJ~LiCU{6BK zjwfo@6ogHI$7w%}T4K0LpBab7F@1&#L((mS7R>Q6FPn{lIK~~5s*VFI#eoxECnF@}H z$NBm|U+tiqY=FZzrI&>L#L|P@u#S81)0>~RoAf~8i@s*|R?S3m*+i{OHCAgiJn-G8 zV&Ve%3gTNi=#cEPUf<&6#ojO-LnsFWX}%5hNNUi2)1O=RCEZziI>-MB{?AurT3-hm z%|yb!M1_p~3Q-FVvdm2>yWt8@cQ7bX`{OjMN?EX|?rs--Q=JTvWf^p&q8X-`GB`Nu zYkbvOtZ45O!H}cSw+1_?;uUP^z1kWqdXFVB(|fighu*WrV)UNC8m~*QY(;A<5PBXa zW6P4E2f4Xm8ZK*^+6#t+lm)51BxVf`$K5+IH&ELpEo*SNu&pYULbN4h%SRX%$YI(q z)!txT?G2V{FDHj#hzted9I!!9QL)+eRg^_$Ybt&)--g}Fx8&O*L?u|SKwWwYaGLuH zP}r1IW(%y=Q*#oa6}?0ydD4NTSb#$w8B*l0qJfZr6CkTP|(msbCu)4>s{+;E|8PBSP)5bj%`Q7#}%p;xL4) zbFVyXb56po3BToWY!ky^)FPv)I!iIBFIK>9V|b3eMO#~*XXOG}UwoiDK{$5SmH><@ zgC26OQNygS;U$VFj|``WEXq{VleXq6MC;Ay;eJ*K)^a9f>rD$w45a@n%W0xg@=s+Q zrs^vZ*oOeQw6rz*WwmK}TwK@b<2sDZ_6O;mGWCo-SWb(Kwjn!5+Ze6*pyD=$x2L)p z9-hqB$cM@6g8y>%AwQ%f-i_#E%!ihU-ci+cDSe~Hc6}pF+XA0%snfJ?J+Dp|xu`b3 zkrb3s8e0{7h>`l3A!eQ|oLR2pIhVgk3nXz6&7V2xPK;p(UyeHkH7yNJJ07$21hpWJkqHL$V(1LIlo`_#|GM9@~H;R6f*ZrmS$ez6b|z$oip>Orlx!M7lVs>tYi# z#7on^ioH63a}gmxjFclXk`617VR!W-gm!8?)`5lc<(~8h;yVXP2D?f+TFUNEB`LHO z*lifoS+N_D-YLw)0D0Jac9E5;WT=mK6v)yJem}1+SwOh``XvObAO(`sAwEuSxwUA zQ8cYz$rckrXLKzdsq+t72R1n7gUmClQJ#dsdXCoDxoNWXbszI_=-Zpa1SD(6&ge9Z za@n)Y`WG1t-K0zj(cHlt^Lu;Xz~*qvf?0m zAuH~Fo!C8#+nJ#|H4c)0>sOm={PMNi{*Tr+rxN)252580EP!!G+GCCAVu2AV5SI0H z(HI>$gyFFrSGv}Q>uPH{vKo45<)l+t#eh=~P_r}mEa5l@^`yHC9$qPMJ-dTyKLu@WK-e$=5ps9<_XdX_PC_}5c0l&zGyDiWCJ=anCnPZ zj2{T(y)p}cG6|dDIgcfxPF+>Xo3AJawFzF2hQg^2E9&n1i{JhIfB!R2ee##Slw6vG zlHPwB38YdxcFu#^iF@8xv=jHdTM=+LzZs!d+h29#?*u`xJjf4>lC49&{Tj35| zVdqtsH|>RgGI`}PzG|zuXqi}`t&m@-(l!=4a)e8Q!WOn}!08mRRdud7@<^Q5ceGOE zY&{caD|YU@%pJ%OPakpY2a3<=P=JCaYNw9`-gf>2m!abO87x$7S3V`{V}~r}YlLcJ z*MyW%@nKzmP<jK0PB<|8SkukiU3&cxR5OO<3g?{-;DMZo`+*}ID&IbyUsC0 zAV7dgY{@YsyD#?yiMn>8Lc1L4cK=A%>VEFAROcl$m<(s5(-J0D9(R@EYb>|6;wiswoQ7ZUy=aeFL|d~0>C#MsJn zC9LY#Nw_d*k`iRXl+1X8sF@vivSI(MOC@i?3PG8h3U3tu{dO^W(^Yt&cM~9Ir}wIc zrN~{3sXxR#58gAgCu7klK5vj%h$_C~Fk!e8;(!1(m1>s|U7q|v)bd(Cb$+o-h2n3m z<_N7{zud8-eL`ibT8F$?h>}t4#^ui4QQu;iq(HQk1Ygncp5zBQzak858W0E)(M*fK z3TUQ%Xlf>YHZ&{vplR@-NU1*7!(b%HHaq32wNo6#; zJIS-C8)%~4FS_y@))HMyD02-HdzuzMY50y7E$?Z?mQk@tpS}bji+m>^3UyT}AA3bHAn#a@27`BOgILw=O%%ye@-}gg&P1Cia16O|Z@ghu zeXMJ(ny;)!(N|v4YV?(@i22IS@$J<04$FYu0BeMtA*(DBATOqQ=*Mh+n+!L-7mQP&b-HqtF@dJ~L#= zdoh{S>@1w&Dt<)MHB`Luhs%?G zDaGPuMlq)TwyLRtNl)1YlKQT`G}GK5`ldFMIKS@jkk2sN#c+Lw+3ybTPChG6(hPG9 zUq;8QeO@=BZ$A8Wy2CbuK>|njX`_0Of=1^NbLMQ`WELUs_#6YSu($-9MWo`06>QSj zN^RgWpZ_^Un5MJ5xHb{@{pIgI`e#4=g+Kbx=fgBz3z6qMb6Yw0s@#NpY`n?zp@piNLu`cD~eFWysrKtS@9ZcWiS+}2BnCA8pT)Ztpt%h zXp`tom?D_mN-?#Fhc`0H*RqN=qzx>jyRmzK7_S{^ip8)U393U%h^GJKUsPu|Qu8w6 z>QS9uOx%@_P3Nfm6!^^8$76W;h8A*{WRKDpYqy8o%NNw5QklAF>gd@) zp0Ajaog}J2PdrIfec&uiS2BuN$w)q~!Iaf(;Vo%Kd`dSwazNGd7Gzpn5oFpWFTL09 z3o^;_9ZF5mnXf5c==s$W0N?oE!kd^U#H2H}mBU1)qYb_SN<$4RRtA(%!{+f+USP9S z$a+?5I7QoJno_gZYWpPP?i(u) zSYE!lS*>t%Xs9f1xv@uEOWBWAGsgpda;S2!(<(KFGEs$|O;wreo+~y}Q=s{nx=kya zi{864Q!WjNH^g+rFXD2CZ7Ik8<+JOBX(W&rt(V}q=3Uz7A!|`d(Aw~>aCoucnvGpi2WKVg z(5?WQ3dHpW!>e9k7pn~_;H1@>4Kvqz0XC@K=)>0ZTnYv-iDx5gvs}okaJp&LuvWWq zBfE`L#syF9%psI^@uvw8P+Xn+WB_GIZNq^PP^s-#p3Fv#ZrS%S?lR0 zTTgrqc6BFABs53RY7iebsu~X4reP^dGrg8C*&+#c7pqxqHMOu+UyjI#mW#G}W+duovoN z6*$YXJrv7YwDqk4cRsX4qza|;LF?pIKYK=(O%*E$)3kW6NfPP*)oK=~L{ya_aJ5d; zhc%b77y6ziRkW>854jYU{)g34+F4oRLso**&EAB}%!7j7rII=QwJT!5fVVin`1TdNNF*?J zoJX&y+Zz#MKO*9av9%_kdGtqhL-T00$~-zSc5KyRQF;_(Q7c-Feu@<_-RmRSWW6EG zh(4@opN0umw%N<3D6=Gyh<*fBIYl44p`+hBAej#a?~y|@P&`nQw6c_keX}sC&65IT zl%5a6X~PQ1WP5Bh?F4<(kerVn#im#75R(IE!)oV^SWb+!MH^b@53MZ97a4M2#O`tw zihL1Ju4U|;EcYEgko|q{pZk!81(xxRyXuGxcGyX`=KeVncU1^VSJd%wO_YQJC0yD( z1x?1V^b?-_mbtgQq&0@kkzcT_+;G?|T?1h1q>!}pHg$(zIx;0Ie?7@BxZp7y%BAdN z*7+%)fJ=3*{-@NZCo>NLHHu>mc|^ur_xq((^}T+n3I7qlR08ZBeyPL)AVQ(uu{kd+>Uig827!(~%p8xQ%= znUdmE{Sh^JdGZ85G`6StE{;>7FGK%$fXlfvBqfh3W=Yi#WL+ud;{>fSBx772VJ6O{ zHoZLDSSA-f>2|2lZmdDgmGs4KAe_CvW9|*ZCmObUZ&W+vfXYu;r`)Y_tin}Kj|o#9 z=F0VZz|Vaf6xb7Cv$SBOaqo&qn3j82Mn`?;-qHRhk9w1nPVW1h++k~i)u@o6|DaZG zO*q!{6N&HVoHH@l(Wa+G-^=*v_mSq<6s?ZZp|rS_BQ~?Kv9TtH?m%NF4|&A8pYXai zZCOc*Tl1-JO_G8fi5G2SAi`#qsp1P3+A4SNS+<5nwmj#V_DfkCtv0K$B2aEt0g;Xl z)MSKp96}t-vgMfIe}B_X5`x0TQ8S)ZpL{ExGePl$VU)$A?29$(X?Zku=PKFB&n zP3}af5&WV7Kn#adEvrHkGOFKR2A^Hv;H8z9ix0i!_Xd^ z^t^8$yE1Jx(BDQ0rey1ivP_%X#h{+v75scOKxtA_9&ksoL7)16A9a0;k(< z1329dFa#KR4Dm2|@R<<@NhEEAp}L#a;v&SZ|CFrZA5=FHh#PU3wTuvZXtvoq0jP3!+n| zUB5N?SzL-e$vfD8e&D7W=_(jC+1Qhqyc_Y%E0lml={OsIda8IOJFY}r$GebVKqW3k_f`AGR85G_Zugs7$-V3#lm}UiU6DuUZrRC zvE{*i^S3_WGyYlFpc&`+bJ~8LIrwc)aj78UxnjSBxj(C@s- zq__5I{JfI7Db&rNZWgGk{Wc6oD(a@|QP-wyvv@~!>ZYP@+DF|qYz?rHsZm!$X1lFN zG-O(yh^n6lmfvoBj`hy3+5^ix4%=v|0AHT$gDnmow9RRLF1R~+`7+0l1b5GhoCrTV z%ln%CV91LA6p8zE7F@uk>{R9sV1}<45m1qjSrI$JpVQo+!X%-}vWRc)IJ8=U9103V za5&sxr8lGqXsJ#QTJ>@>^Bs1ce({X*#Ry~aYJuo%RZ8|5ET^Aouz<3dHTMU~1L`X} z6qNJ&_jf1lNzz?VwaxfC-hBTjI!C_AilaeoBV_P@c4%bn1_R5%1*7d9^_|*h=tev@ z2=vYf@hitT<#tcHDXq`@I2KD{54G#U;_T zQwwVDkL`TJD3CyE7D&i&b;P)Cj!nL8H0^dn5uTmXx#ErHd^X?j3h6F6h&V!e<43!& zC7^1DuDL@vQUuX)ku1P2CrPcMpQvCTv|e&u%@yLP$FMT8C6wp@m6oDZ zusXJPl`q7e>J=D{;lLuS!M`cnjV2&yYXl%RW_zDyubozqTaA{TyK2nd|H3}x;GBT( zADh=zof5vuM%|E?+or^s4zqH7PE~B-tZ*twh9)B#I=}l#XAnQRcLi&#KDpP`J%?x^ zK^i{#esU$8lQlRq#yEO!mCfW!FPv!g3Rrz!xUn6+i7A&gyl^|h#QboZ&g4`1War(o zhmI069B#G!mT%gjM8!sM^6`eol?|s2-?9F1!$<9*hTMq-q73#%i8Y49_AIein1XUd zZPP8fo=wploV~5GrtG!Ss|&VyLoRCN_UcGSMLK*BRonsxsKQ&j z;=vDkP^01r8;4R?el&IJok;CK0@RA)(Px;Uq3;_{YTC#F82Mb-dxgSrAP<+LH*3Dk zp5((?Xbi%=6r8AKkX~7+ShRY5+oG#0^>n8S(vfJh2&6OIREm9Gt6y0%G zR!l(cT}w)f=fnr=8H4jwqq_q{P=13SCURMNRa~;<+VxFbF!6l5*qCe^~{jEl+-*T<>YvnllLD!2K zN3&)-B}RFBr+Q|0-K3Sb^VxEUS^wdeAK%BY+EL+Gj8jXLPHX*Ys%%zAE@hzX8hHhe^EOB>A!sRy#pAu zZk+Wm7Pbt*N`<}jjwhl8j0cn22T)2=*R5v#lXbKqdkANaJXx1GXEr z?Jp8>o+(xI@kVblp33tKs~v%*82~si9GumJUCm$N)~n6JMdhsfHGX7amS3f;A8>ZO zvD*b{)bc^>fYkCcB9IQE>PE*_z+UDaE#?p#vr_>FZoVA#PD;uC?gh|%7mE49O5EM) z>@CJqc@|AAC;0`gmNRNxAhkTbkByCAd-Juo+l(N;gF||_+bt#e^h!*wjhHM3+i;z2 zB1UB|IvxBRka$RsZqgy;boX`WB~>$#djG&U&Ti0gLW@qX9mwu;^*{wGnysZ2>-Svi^_JYwEupUzs@YL0$VE6F z-mn`mBksQL;FrXxuGYf>sv5t&AbRB(Y`!NcIQpEbrdF|}<|I+wT8roOERMFfiI!xZ z)f&;EM7&Otk~H&eM#A7?Evk40T)aKmrw^B;_0WgAgFZC9h`^bOjrwqR_j$A<+z_wb z#lMpZoNP``PTC87B6;#9dy?>GPd^cJM-f&9Yi|}>6l?7$!eU@}fL4c0O!;;cwva{6 zsJ{<1VUQN3H$h17cT2uaQ|l_m3R&%__8^}bBz*&McbV_H1CH=%~%K3 z7I9diE^Dgoc~CkiBJ&ahU7imTS@-!eHP6YPAJMQ|HWLf&$Ih>4ABsoSS!=(fyK?7O z5)KECe%X;6XwBH}3eBc=1G3Lkq<7?3)dV-MupuWa;=m2W%oe)yTq z8?|Mx?%b$=y+HL4bN0#V6kB0(s3}4zmd>#{yR*A2o-?7vzeaJ7g%pVaRWqZ>>O2j3 zJ(l7o2A6sXRz4~R_|%-G9X>?o9X969SYcz>$nJ9)@2>S z0*sWx&zBmhiSB5Ak)m|%{Guq#kjac;XCFS+wtNpK_Dn0JoOYj&oVRW1!SrS%&GSR^ z&yjwkH>lJ-`o_h)C_J)RO$s~Ne7TR$S9bs!d!B-XwLeecp~j^QuD9YtQ66LzS->Fp zn0LjnhdrWf$llfL?(jf#UP=>Oju`4xAd5TYCRXxp7wI&}O=~3qo5VE0S8JyCE%9om z#eDjKF3bPo4D{ZB>0s3k~lri+=AZs{gYiAvq(s>c5lDoRJ5ioxv zuv6)ns`p~2N$(izCXCV}H-8mvkttsi$+&5FI6qNeb_#0HR`NVn z5q8oFQTaJYJpMg85;LBf#^SP4S<(AhL%Z!jYb}MX=!m11#QS)bsMt4m0~)O@3{sqf zE}g9ogbk@WA=6L>x8t$(u@Rhkxa+V|~WNz!uF@%sJ#=z9e)iE$*!4LzhmJZJv z1EXm>xGt<3ns%v0!Ng}4mnYgu%)g3s!i}smOYIa-B86opO7zK|^xzG+?nyr9p&QMf zbQ0cq#LgC==g{++5Iv6#tJ4cw&ReK=8i_Pzw~`pp!B13OJuFg<9-GwbN7ouS<1G!G zgn*bvIPS`VQK`DsC%xYci?gx40V9h>5lKq&S|n*S-${Ilx58VGpKN$ifponByijg5 z{}!}Dk7Na!IF~Rj1bnI?{V}MenL#NLt#JE|ni4_Ec9_oDYV-f4j1VB^zF#xT8wyc+ zoQVZZL>I}2*umk&=1A3o_Rh=wg6AF@14+3RuG+o$;7D=l@YT*pLqS=dhdm1hK#s^t z17Jy8mgyei!1k85O&)Twt2(A@qzRp2L zHdYLr=c^ZE`M`QAhPplj#kWAuS>>dVczwXvGj)3Wq@9O3W8O6w$Ak?cGEOtsd}VS^ zzseiS$1Q==H;=NtJ|3#%b>-33&iL%3H$*Peim=;LwwPlxrKRjNd{u?5SG{6v)Es=9 zL!;|4F4mON^xadmOj6Gl1VnY;reV4tk6lB@;~|~NE^Qp=O5wl5cwl-#!XbHL>bje* zlS<|7JoQ@qX-3O^Glf#`tQ7E69u&%j92o=f6{rYCpiQ{dI{nF_DebP8$; zW$%#SopzVHr;A-RPgg@hs`OXygt!IKFY{mR#cWO}S@JbUcli7dt3wPp_@I(Pajt_3 zZO<`(B%Grqt=%H|w>B$b=r^7E0iyOQX>$~6sUI4H6V2saFxt6X#N;-nYAKzF_~6UXYfzq$c@p zDyg%X3=gLmj8yrYU--}Ii^hg!TB^Oy9=RMu1UaH86rK;Z3w!DJf-D6D?`^ zl}$846DakTzgCC_5q74PdRba{JyUg$gC-LxG6Sq~Qbn39nKJO~b^53raBoFNQrcU7 z)MT#E-A6<6=R+DYY@zn~2s};D3v@Y*Vw(z-4#A9-kBV<(H$zL!{+75cG^LllA^);n z<>fA#VsH`T+X>+2hz*yC^Ip=oU(l~j;ixsvaj9j7pG7X!4hdpIpTN|0;KDVsS z=-R(s!YGfT6F=EDk}ywaY?yvSAx&ihbXic*xTx}AKRH4XPeCB z@P>vkDR-K;zd+7AtO}5R5+gJXx@fdFpqjR(2Mzb|AI3xjNz$A8P zAnna@6+jvUKg1a>w9?Aj`VtCCA-iIsAU~>t%&}_a2I}Sbv0gdp#IikptXEF&H!I8W zqh2nP1}QO=NPEdO6kg~gJ(gK;twTrn@pU&SlU+8*kFUEyaeCPxKk5zgXpIij6KS|| z>?TG>XSl)8>4W{jo&PEKcXWTHLo0P4sa0q&qh;XI3NE$|>5+h$a^V*GCfv$XyV41h z7}BS86tk7<{H{QBQ+`CL%+t~TGLjA&XBsxb5`2Q`@mOtXdh9GxY)_uD%}hs&q|VLS zggC@IoAj==X5ie`m0ZSCzHjPgnY;_5nN7(u01aq6U==5B7P~4_(*#BFbx8cp`U_rM zFL=?~1p#NT;|-us*dcbIJv-MJGH`HzW~NlT2IFbuesKS)RAi$XInpg1+~1Owq}P|p z5pVii`_wku`}NV%vE=@f>u{7m-UCE<)*T0o^)&S71+`wEx9(g-cWj`Xz(#x<{n#NG zsp?SGbIQm~GJ31uyb}>}MKz@!y1Qc&XvYb+1$ zdoqcuCX)8@T@pcSS%0F5vHl2#9LuIlL(tOxs1%JA@+v2x6w%Bl8ZJZif`GSm9i6Og zj-@&bH$oLHLwwJxPrblAt84T1y#^E%ecfZ451KV=xg#muZX*UOCDz zae$|YTG{^^yrrmLr07fi0x3Z&aCOb5T5Hj=Ibtp{&d zjE+v30_Ild7v;uoEt1hMXVr_HJ2fBCl`rk498sayKxT5{+WOh~E@Y7JgU#=ePU7-A z_fzPm%M;#;$FKG+WYhDjZNCO?DIbrKh!Wo43W7TNBy^17%kj{|_HI23XJO!{YV}Ip z$q7i=G>8@AI?S;M<%Gdx)zvn6)r+u70$NkI6lc~%tHe5XV~iMFV1J{jSzSB-xz~6_ zo_>#G3l$HGindGM@C{gsU3qxd?IN+cyy^uEDyDWH9Ks)1&luCnH_RTt#2iJVr#yUd zB3}NGA8y@CUXf?&oZODX>;eYO-(;yn;%TqbZbq(ij+Obsa~gw(h?j*!;*}ey@uYljcb>2;0XIzCtIN2$*sk6DGu~Q| zlskBV_OSEE^68)}2$fS&UY!dgh{apV9)$MX&@3!a{WEG2E(8ANpI{k)e3ekE*UN!vcaT4TsVgpJFtZJei1Y!_$5bnFpV1KHjNK1`_5RGJ8{ zD&sx%ygVgjNZS4`OCfK1N{QXT(2yaiJ3x&Yk_27@3IeWmQ%hUZN~)g$V(kyb1WBDQ zru4`Gvc{Vp$k!yG3gK&sgqac}M01{*8nPp;cm?<}RV#Oazfc=6Np9(qcej*X;YX6_ z{68eVbY=A}8V(Q4qTN#rtf_nn6Y8rGHsXBY4ePdv)L@hg8p27hn6xVJXg&~DG<0}7 z8~x083EZiZN5HSl^;z;-@NI(wOW@)zFbUx3$}qo(7xSS$q#YwU5O^Nxg=NGs;!C@; zHYp_-45budd`#o;+9oN-5HyrEaG{|o#naU)?CmT$`iZRKri<%GI8-Ak?Nu>USPK{G z8dZFh@T_G+iz_eIXS;3!M;Q{*SZ8E?z6ekoVD8irr|8fRrzVlLFQYulTBn z%B$I=i6E+8lci=Zjx_zrY;&>jbB=(Un@$J}zjyQDZ?M)3#utf_j)jMVX#(lK+Y%1m zjYH`)#9^>Ycu9271H=}lt_%`f?^IAUv!sWL%iV}G@zKxxFGUZrD?POL;iTH+@wrdG z`(1Z>eL6}GC%)|C!QajjAHDh~9bx0o&eov)C4++vF4D|@hR=bf3|#SP8`sg0+pa(( zsHA*pg@_qbTKu_{mt%1HOB73euJ#7UCo$)CqV%ua;>qq=nS4W=` zvsHW43DiCNJ?ieSm%G%v>3QBLosW+^9H-&bK1WmB<45q{4RECyc3l z^3`Fk1eMg4Z6eIo47r#M=kPFHRdCAyX!v4mf!5<&{p?v5s+jYvQH;o1L7!8HfRN4PxUm$JYg z^-E>?(YX40DD9C3yp$bIJO5tV$oikLlfs}1i+j8d({Qz|m-5~PnjQVHWTQhFEJF+7 z;DQqnonJ@No}FuRH0}HXvmr_-Z`l^`LaI;Gy)`8++x8Dqnax3(vEyknjsn4vO^Xq{ zBC=;74v8H2Tt=mmsJba#7iiUYzcviT|5R$G>S72y*}SE z!2Yxovlkl0$J9$J8@*T`Ofp`w7xDy;axY(?7jjbUbP=PuW_018orgtn6|{pM{Dq)w z^vG=co5(C8b7oC($S-F+Jx2{h=Ws=ny)B*oM#*oMDfaQ+67zxs#4`DL4Nzf7=X6?# z<8$$HzNMOY__i$b0)11~-!M%XqC~`ONyW?kY!~Sa9@LAPU5eX&Q_3)8R}@sCZzGT%>bH+&kVJ0!106u z4;gya7G=KBlau38I2)(ZrW>4&h;u}XD#8m8J_-McdN5$Vf#WjEi* zP8Ruq(ITn{CG{+4=bI|qk^x0{;0u3{wOEYj@t z5%sC$kno68Nu{tRB%Nl0QVngzbaqOPP>JxQTGrquf8)4Qp|<@g)=KjEd?CyZ=cOeV z_yA{|6rc1;Hf!n2kEQC}Rod4RM}gTNBqdG8)k`=$Bgm+!c<wLs7vEh2Jd<1?G=d${*lRRMb8wB3;@Ugz1!uerv z7G34VAJ#W{^{4dBO#7I=L+uk>yIJEKBJg=CTkiat8T#;yP+?d+cDk4~mGYg5_vLTs z2JeaTRc6shH+IDvUUMn%EWw1>BFOSudLb*HNyGh^qPw2QLx;T`jug*`I|TXnhr19W z%thb5Mcte4zsHU#xto3EnDQt9P~KxefUOsxk(Bd7`TTCW&6^N!ls)tNkYG+_jW6U6 zz}Vi!idO2`9e5JvIRM}YM3*OVSj2bnJq*+LdlIzePgi*oM{M_zjkgB)FuUMtZUps0 z3Xv1>UeuqKv8L%~8YTk%BF_HC*3) zqlWH#np5;+k2WrCJSK+`YV`S4&Um6@KQ(|sX`TjZsP1Nz9QB+UblGMH;W$ZDenksg zXS0_Wr}>0tL7BV<^I?4gqnRyAt{2{!T~&re%!0He#ViPJ#ej^<3Xf~Ht1k!yVR5@2Riv#^5LcL9}GNxxRat9 zd7?C8iO4EkG6`5!sN@=jD(cJ>6p5VBpR4FMf6WZ}os;@&r6 zW{T&B<{z_P$8YCe=Tll{Nk-qXFgVCeGv)u_ZA}jMy#Vy6aw01ik@_cw)h}k$_=Mww z%_Pkl%_dP>g}{qnuy9AG^8o?S+l$*>md}-Rpv5b_wTIL_mLrnl(WLXn+bPr~yFxcv ze!>ZPQg11jmTD1N)r~XN4c0EW@l1JR9|h+r$j#G!Gxw&3^lo8*4t0l3N9)vMtui*d zBhr*jmWO*IdGotDB^3Qp4BXNid{9jd<-_@4=eKN#MyT`MygH~^?A_m0G)T{|bH2#h zrMvma<;g)Ie+Z$sE}Ti?5-f{XFksux>Cjmnjob6~_W`cGZ{W_nr9L*0__xLx=W(+cOiC-8Zl6uMXaR2iHqn|D8bWyX?>%cW^8) z7kBFZohr}YiLWJAa6a5P{hca2>-p9mca`agM5hC0Ofc=*a@~U zj$3i7aM{hpkk;yX?+&L^p_lZ2J}03_UHeHBLjQ;$Njq=zDE=CDaIe}Ipn1BK|l|0Z4EQb6zhdUVT8H(in}QfyGg25ZH* z4#jw6#pWr-xt|C4s9NJX6yuQ}%2n_^Qc zHdQOebtuLoD>g*2X%(BU72`S-_SE$wnU1^2Ri|hRQcr_occmd(=#7^aBGZeDUNBNt!M&y*m=d?H?o$S9`YD&5& zKUbZ=#+;3H!VquBL=_DFJ*WaRpo6Xo(oz*XTlwGW_d3~u7xef||N3H-64r$VlNR#H+T@EF_ zZMnzM(lWp06UF{)r^iU~tL8Wi6(6y06eVf9N`UH2%77&_B41)~-=8Hq{Rv5v)h(;# zgOj*f6hrYakl0=et85sEjT^@*8NOhe0OSCmu z(aj06Skhx&c1_0>m+QUKKu_p>n>hZX#fkRbq_~avs*RFcLTJhIot!k@T=Gs0kltLP z{Ab;GdvyZ`kQ;BQZt&}k@mF*q_8rxTa%x%vby>Z;OFdv^?~uOfeB4=59*IoBuY0-4 z*nw$*ne`Rj=XTo;?T*V$R=BCa?`3owSvCf6bkxs)2f0H{X`ZfBW(JU zY`#|M%6y4%u^2IxkdK*yUL{fb9plIGdXF+iOKPS`eGQ9sJvPXJI$|ZG3*S#s`rnaVzrZDKH2cquv3k5Sq-Zu zJ=K*W8mF3Zg^VL6|lIyuvJDPRQELeukFLsc?Ro_gM$NckQ>%SeTD34 z%b8>r#ga)&Okpczclo7O$PW9ZR>k+ zf(oSIQx3JZLiU8;;iUy^xweHaww&5gzs11;qwbkT&yIb3rcths5ig=Ko`(gpq)ViX zvqf1=($PK~on}u_EnGl|GAKh82+2)Rv^MqC{TiiX`AE`(A`|NLRLetGC;2XpYVeDb zt(CzVLt9U4!5UsM6UxS5y~b#F<0S8KyH}${)KqaX>yvNI-YV&(Q+M0DXM5BBDhlpR z`%=pYCsA>DOvFRPuoq2qJ}ir+nnxi$Yh=?UJ<2s5N4>1loAF9EtM!W3z}?(lPdJ4M&LAYJP~BF2uoa&V7Vd(*QO=AFFmcAE?0B;~>|>+$XX;C5 zbw*%NHH^|1@PsZ6xOl>ABaF3?^@T*HV|u9zi;1=rC<>3Vh&F9pRC4#++RV59LYSSM z$Jj!RGEeeILri;>m_VW)Pr9~MV`V}b8ooF=Wtoswu<{t%VU1uV4M}g%FW0kTZQWqd zs%0+S09@ZPm$dZeRf^Pr+U1i0s4a83QaNR6xQvHypi$;3)5{pG*Qaky-i^K3lRV&W zM_D1SVQAr}J&E|qk2B}+i#WDXha5tu!S3>$Df$L~fwrVKp=6ZagI2E;-#Z#6l+P&k z&pK%%O0c)_Oy(`By{}~FQHt&LLw!=rmeJ~9ZY@RBgz$``fkoiO44@$uu#O-PnjjP9 zYZRyZ8#(QbU`F;Ne`+h}S_W^{pnl_IIhS^^MeS!R&s7Ug(yf|MKk40?D+XMgKIdJN zQe#;>8mm&AHLk?ZN^7#NKpQ~W5xtcSBCQf?aVhI{ahy;e#-X1Sn?T}Ij+Yi=)d+$U zRTYafrK-9Y_S51mm9$tP%W0?BaLP$AUBh-x%~nnrne`(uPgebpjDON$1;+olQ(z_I zYoW4cw?0O80(jvtiy*u{CGeXw{)y0{dh+Nuk@4})BS8iFVMoIl|HGSRe1fy}Mvi$S z#`y2~CNuum$MjzNxDA|bj1WzZdv|7wmNVK1Du%aLfw^~f?hLOW_lC?)pgWQ^GW&gj z*^fF-=at#*tkok`-y^dhaae)b{jF){qt&%M;rBYT-{Z_qBwoyZcm=Z`3N4DdZ}=uM z`@xE!0)5cYFlK+vrkVW=!K1pVAU1>zG-m%|cuB!GOUs`RW+(nr*Y5T%r7Op_klkWh z^(*o4KHiJxnO<(RjuSJ3BQ~ww&&upiR%DIL{yD{18K-cV;CW?sOF%qb^*u8CX&=tO z?0@RLU#ZzoS-sMw`E+WUoirga`>C{Fv)j9I6gQ(MA6Jjg*Tm#3F3n>VK?RyMUGb?g z`|p6p=3JVG`x~)0#RO*m@IOFiKVbt`YW5ROlbNF7jP_{7>~_%8H%zl1ugDsi{R4s7 z!|QR*E3;dgz_F_Dk=c*+F?;#yntuQNsMRZ(odprOF-N#7zitJy+xuz)v%l?|$n1wJ zf{NM03uuhl@7^@Cv+=U7*$+B(OtZh{A0V?653g(XL*AX~BDfH5sF;1oPpJI{X?E>9 zSTPfSwaeR&nMyjZtWH`pS!+P7%~)=%EcAX0K}esoWK~X4_4<{Xr~XRg@YCFc!(SG) zx%lc@Yl#@%p5(gosL4lHg_xMaRFl(F6#)hLC5D70SO1F*_4tTQP4(^=dvi+7X}Q{( zAOg%wQj8)@Ob2Tazi|`O%7=JXK_-83b~U_3(3&r{4%s`!zPF4rh1bUSv9&3!vrk5~ z3vFHBTrphoy;d@H;Y_{PP-$AKb;V*r!Xv+yBVPJVZ1?lG7_5x3lAyn44)FVkMb~nG z@8@SN2bg$$ao1~D8?jiCMZh`RKr?4wXNW;>dqNKIOw0lHSh?o_`vRNC&&dInx<6-cOT-?bKA7W5OaW8d5Af{tVhHgU{)z&4zLia za)6KVz~Win=Fz^N3bG$2+;&QfBIE!+sqg8_lgCiq%0xb{Z*qYT>N~V@glh|WGs@N& z@VIlF>*>y~TXbDrV%X{#!9vQG7IeQaBUm@eyjf99H)(5h>}wIAFjHpaYH@<#qYqbqM((F+*_JV2hiB-p?d?&=J<@oFnze;u@ua}| z^Hnj(XZmB1XI8FiP%~`q=}Q7#HwLLNk4D%@vNGve4|l;htchBlvIax-pY>G%nixX**at;nk5@42*{-PlP8cQ->e7`%0iFYw(5;#j`#5bzb65 z7P&hwEyds#+Y^8Y`ioFG|MTUlr-v91!-8O=YcQXYmNW>BvU74 zGPPdkQzlc35zl8DbmVo|p5@k%f6&)4oT3X%2$GGdC;G3_F%yp&&51w?n6&{+G4Qoms+zg4_XC7D*w@DEe~2XJP-Ql?HJgY2mLFf*+{kH_B2Q6WDzS{H3}PU zGim>rVvuR`C;La|vCMqs{TT&XN4m_@12P@zqS!Txt9aTkMfRusl0$lQ_@D|5aQV1j z>WC8Zo&E3!9et>I4PcgfslF}_E9@MGr6=X~(_yjvo+L5%#X~#sm}QcQ{WX0fEd7mW z6+@NP2W!EXq(9_CVXv6YijNvD5;ThL&aNQi)=#>!8ooC4ESg}upN<;D4b+wvjbK(V zndYK50vUR?tw<07*Rw1vqXpI=JYk2?WuV02x>q>%#oeakw)5+<<)GrcO?b)rSFw%X zhn@U>$u=Y5M!5sTFyM{sV8J8w%`v`ZeUIw55sqnf-S~1_K>B%S|A*Il{I{43U6X(_6Nk!Zb?Xv2;2}O2t0qu*P?@Wcr_v5%Fv~X5@zGiN(O2=8I0fkSTq>sBHz{$ zwApa%qZBMp7hTOIITPfVi{%u3SV2zfsN=&YOxL`r^A7R4*S<^!!ifSCs++4>|6uB6 zA4#s)xA@7b>=e{6%s%>0bA1>WAmaPw$_o_Zl zzM4(+DenAmW_OKuqOS1(>I31>oiTeh9WZQN@&c#x)MpBkxdx&qDf4|TMidd$IJ=}w zdriWej)!99Y3+D<7?a+uv20&@1?!f0W0q;}$_0=PQtIflQg7#wzw^#OQweKn(WHEQ zyonC1Cbe#^A~ok^*csT?^*Y5(fP%`nwnlapce0;cLH4pCXR#iNg@H8v+GD%fwGIM` zhX>s2qd0|w^)!YJb}AX2<_tLN^ykI!Y&c?L(FB>3Iqcl|g6>U>&V@3-Yjn<7ITCs& zs=8mS>LL*$;ro@eH!=E&?@V{myw0C&=xe^qAs9>9Ot+=44yKDQ@^key)E&|n*(mx- zx+B?M_roMu0|%D7qm8}VYqOs%H6#0b?VI^Avj1j`(vBbHWBNyRIr5`7Gp!(Df9sF( zv4wjB#h~u7wS#LmUvRC{c-Uu2I&xM^N9H=DBlC!KYI1C5*a=WT1;PNCmat1!tpTY`GyImduezeW9Vp*wEqjvKng-Ea7lH&AF&FN2%d zPlDWp^)>TP;gT6HnfJJb0z;HQpsjATYu(~Hbc;vo)-+pmb5zMBcnE<35SSDKy#JVf zO*#U9@a5az|8EHr5CagjEe36i^?VC_FhRvBDh>dc18p}2c$TSaKDQ4#q zlmVV{!0-OhAN~HV>`>N=;kNAW&6Bv4G0GS`eF~Sh;nMb=kAnb7uOM*N4JN$>;x_q+ zNDm4iFbM*yN&l%kKJ~ke<=$30FK9CcZN_>&0~%YXI8Vitxu?L+iQscJf^!`R&La_g zTRyp*Z_Ov1ar@S@aC^#BVspHnJLzG%jk*0d-t=4d z!5A>zy4>z#PWCusJ|U9xve|MI2iJk*JQB&fPIBZ|3TAz7|INSo0Fk|O;C7BY+!VL> zHp%Tz|LRxXii)M@XW@1-;5WtX7nIySUsEvi(s1*p;pSb#{oSAa^_@S4UX^Z#+jpIn z+sVfVfpL+Zw_lZ{=Q@y{M>4|bBxP{lC29( z&M!1MzYw7lx9>7Jzrp~Yo!i?Y`D6~a??TbdQ(qc#mjLfFz`Gpq)Bp7gcl|gbA>O!f zKM`oaA>qVW^eJ2>4VOvR?VV!$N7+fSfK}=gjazQc$CmS*QrQ!-mSfx=FGg;;Sz&5i zUu-0!nS())*431M^bh~yeryZy#{`TsY-nT5Iz9##7gBKs#HR&!+TczbTx@nu_*!t= z1{dQaxD)wS!G+gF@Lhp!s|kMRo4@k6ZqugnvHiX0us3g#9-|ucDO9Eml_~G{tl-ZY z{8@uP&3kScS;608@G-=KKa&$Dos(kUnC`#zYj^%#Vm7rSU>yV2v3_^JVhqHeL%$aU zcfsH;7+frNkGQ_zP8eKVAHmH;@45WKWlpxL=sm6RCI=UqPWyO&>^FbuD9BN6F7K${ zK%>WV{wY*yHfEXhXy9)%_}dIV2Kxe>2Em^(_?ThApBLRPgxh(EEEoj3&k8;VIRSsx z;eX-O{a*k+rhGxb7OdY3)^EMtu@m~eD7cFTchTVTCSnX%Cb*fw#my32Uj8dfKDLZa z2Qt;CA=@^=-DYsNIow}(!zca_w{e&FVqrgL4d{f8g`&wdD%O1WM6qQ)C& z^cWV=r%>5tsO<87?-cx<27jl)-vP5Ru!4V~!AB_x{#ee4bR=gR)BO|g{K}&!HsEg; zu5E9qKpG==ZFD3YA$yW!A_0 z0>Qt);9p?yQ7%}lX~Ca1_|p!5L27;*!Uo;J0QfoZSJVAVKXdRy*c0G)1*~hpy4LS5 zSnLS>9v9qkgF9|;Q7RWA$b!4o;3A0X_b#dVZTWWi2YQQL7J<86{oZc<-X8k>&Yyb_ zcaa6sZFzTpua^Uje#4yl6e`;cm2KYdw&1r7e%s)qTrijmg1=z!(Mf_o4#^=n{JRJX ztxxxl|JHjhF*eTyD>qoVbvp-%E_nCAdyBwsF|b<hC*R@Z z7Po9)liYv)iTm%vS*2Vj&(&?98JpXuQ0Zgy3BjK*_!9;n-7>ef`9|^VfY;AL_Se1j z)4z^7UysejC+hc%;LaFa(z|dQ&?(bvn{UWHi)lRzxgY+>Q)hrnIb-wQS=c-i{LJ8I z1|Qvmy;{qBL-#JSW^BGb-M{*&4}1=DvJsoB-}8byZ*b=gE;K$~xwI zbA0}~Pd@fjn9t4f`JCX-8T>hek8)YZd~c4=@B8@I-ijGL8=tRo&rvGtnD5Q;`R{$~ zb0>hiSw7#Yes8sYZ?%4-T-Gt)o8$8{KmGoe^a{u(}> z{I%_Ph`@z^JH&{io4A_ZAN(l#p zAOEla6Mu<*Pcp>x8))=Eua+oy^j6fDY!cg?oNl>lbW9ppG^_PD^5IAEmxyRiDBQv{ z%mPdk{<(_J*RtQte-;IQ(clv@5Z%W_cUwQ0AzGv;*@bKJ`R8Bv8~5Wk!Rqq@#y)qZ zii9ro3H}1h;2!dk%M2YCaR6%|Y)N&zuvz=ZxNSPVX=L)?5E0a0xRJ znA*>r3}_qh`C9fHL0)V6jYnl+CSrUW(EXk>_x(Kn+IsO+F^b|PYuRsR;Ir!Yto56D zvgpmqkHV?=1EROWv2$zE`_LWte%Ad&3#V>7OE`5c`;8#4o_;IRB3&Uqs^~r;x=$G0 zC!Fqo{k6Y&9sc4pDe#quDRhf~$>wd^+rWA*fVt323gm>oX%J>WC<#&fAnz+pBfyrO%@=uRjUx{K<&@Z{hk;6wEZ?q%vV zCv3yRnfLn3zx~-S|67Je({sE^*(}^!s`ltuvhPh#{P|n|^5HlC(Zjcm&a>XnYP~*eX@98mJIbC&M*ng3ayeet z*a!&+V4;Rd22jH~siAoMEhosrAU}Z=oG&YpU}fDTCMy*8AEl^aRO~T~il^UUcYxn{ z%;El1N2r@*d&xuiqVf>zl!CPLmwrt@(#}UcKf$hFdpl+H@)GWURrg09O8bzH*&&ve z0HRRx@rQt0jCH=G^4!sTMAfmZ_)~i_%vF22cuGGyA6KERD&C@KYWQDW?`l8)d>fkDL0w85zlz`IFH?B#Z zY;U&Lc%dgckq43%_q<GlD zAvLH)LW7)yAO#(@q@$D&uz&)B1S~K}A%WcQZ;UzDTKk-R>XC=WzD<#{*IM&6 z<``p+G3J((;o=nYGnN-OE-Uv5)6hA9XHYdB4@UzWT^vGiiCJ<=jwxREQy;9}g$krA-wl zB>l4+_;w6l80`BR1OG-n_m^SaqSGc|{iBBUKU{SfIMyBCE#cdcy&Q#xt>q~E$HJCk zyqtyp$~yCl zv8BE1r!RPTm4dM1=?m@`pG{~Hc0GN;hwhkM5F(wv;K5Zug^;H&c;6~5TJ$Yg^{C2- z%9~>Dto(HmY!vn>YAHzkM-i2hGcqP|hvv`h^S zxB5uS9hE#2p0m=9J`doW6)a+g3Y2uUG57b&B%NvO{!(MijkBo%8&%KgF@KZP(h4RC zG3s?!0~0?^%o{ly-K_`SaT|E=X~^#J9%;bEAs3~{={vR>_n(o8SL6PtHWP0MGR$nx zbl@EG{sxCEC6y$rd70aa?Lt6Zpg{~@`DK>}WkblW$w>N!J_~_H;Q<8#O|sNF*P|c{FtUdnXP@T0msG zak9B7AU06^-h&1bZI%bcSaB%&Ez1H#z-=+HFo>df*-+eFH(S)0v(Bs680$Em6mJ=J zAlfHId6N`BaW-1Up_Gyg?3%e%I>Cw#K5W8YEymkEi?q+xi{DM7Vsp1~LO?$K^r&!| zk!c9c@4v1!@uKZGNM@#{rqXOm)=jsE$`$og5yAgVVid3GwQ5FF)jGprV6x^yMnaJT zAY7=yOPx_hL!FPv8tqkRv<%aSoVH6%W>iEF zDc(tX%oGbkg&y-#XM2nliodH0d3oFwrp*d@X;w&5MUuM1cE`zBzWz-Lr>t+m*81ctL~NuJqTL&teY)zo!GuHzFc zVLjG&AO)rajYQnrNznPOBGs)TfC?7BY<*FJ^+l+q2a?q!-lRFnMQmLlCq0CrGe)4} z7sT%wBX+<$(7Td&k_7gPY`9q)BQ7_VfPnz9bIGnEQ|C0mvS#Oio$aIantqW|^^9!l z8NK;O$bC6}Z9n3kPmcg55pO zFWyN}H*$mSdXC)i|B4$#%kh7CV>e4l(VwS7vyG3vfJ?(_lxwtwf0-O!ruLSBNUn24Xno9u)tUA3DLVRL_ z+gPCgP+E`4lNg_Yi&dwDA0(BaGR}-5IiF`rrF-NS-?$`^%t_f%Bwt2>oQQu}je3&H zX$!yPy0XZ%r*s={*p2+<+M@^MNF6*RjuQ(*a!(z6OrK!qa`E-#D6il%TZetVUhcbD zrNYfl^pyiOwz-b58w_RBlAjRtuy0vuzsh4Dn& zwgx7&HBr!pc;K%@j=Q#PJF(m4{jvM)n%He|(=)|^qHmk3ob-Cq)M1-_b0*;Ws_og; ze)|KrPLxMs0#4+Is^eTBa6EY>7jOZ@s$9TLR6CY)L0d-&1vY4-xg#4a4dHpVK$QodZBSZ9yb@mtCicaKwb9!|oR7^9aa zR}gf(uptd0Lt(v`0M}ZGHX1SxX>~T&_|U3={uL%l806fSn<5#qN@|l5Z*@XE=wJ>g z5Y(~>M``IX0if~Y(jnEkTDGVnbBm1Qk^=c*;z+_$n>g8&E;$0R!i5f2t!i(XAS)>z zo;Y!*B}wH?d7)7G7(BYy-ozZ8h*vX!-5}49f|Z`?UqIWSjJgb4^wHH@75po<@1Nmq&}4u{aQNy$*hX2;RQUKoChV6@nkoIr_E7gRgSEP?my{-gK_MB z7u`r@lwz|FWJdt14HUUPX_sA!>%8BrQsSzp(W|mbVF#*aGTkw z=`FCq!7`cYaIF%;-jTP**iQmbZ6cXA0}Iae&va`e=s4U|3ks>QF?MpMn)Fw~VTUuC zaS^YjSY(u!zj6J-+%w=>$te?PUwCYbXeYh*k z{?M7op4lc1_E~vH`-Z^fBTNZ?g^5cxBX2(q`_;Ha2hZ-)FeKREo-!PUGED#H^ zFBg$_fC(57;L_~5u8m-^Mt{K`sS?4um0O$Yn@GIUz@?R~NqxD*R0E6K zlzkbv+m!usf&2Ak;7(WI{`TtN0>)W^tM&I%=aT3``OwuVJsC%sOG+oJnG%uquwyuU zkdsN;&-*U55K(}F3gu0hSb5ex&IFHY(v4c7tTan$WldF_9`!0K#2>E)`A4!^W#G=P z4B!TXqh%42HhP2L<`OB%CyDNMZYi0J8V&1~>xY&Nwv^A6LO@38H1{q7NsEz{UZ|xy zxv5j57%?uvMLs^P9k$h6z(z>7O3a)Ve3IQcv$iPf{J<6 zJlW}k4U)FnGi{IKmDwX0iDJ}-lhxE3uPK1(oT!StJ{wMPj@^GtHrcdZPWdN@-jGh(3DF{Z(h9X$mi+`5sF*p;FVr=wtY(zg2=J(rk=AwQ;SoAP7W? zJ`y<~%6@%%emXm$-&rzS<(O*W-AnO%-6{ntTjiYt4)5Q9I5RW4!S0 zte&IG#H`eh=IC&$PuE;R+f`ef)c*(b+i)b)_Ur|E+@8IN#BHh)n|JUoIcEHs`H`gz4ux-cUv@ZP zm;0I+8fcqtT}PtVV@x9uk4>1X2h14A)DPG?qKlDZJs<$%^CFMnKVB*9?_l)UG<`N1 zd_njiJt^<>u0-3S|DSNjSuW-b%$LD~L1*CT&dnh$lr49s30xG7dW$r0r|60raUX`( ztYDa+e&T!D9lKS$%kAR9rO@!BHOG1L8F66OW$!LBEfQn|f}yMPpB%R9Tm{DwBE37J zUmFp1w@@+SNHmk?GUMsh)tcgO7cmtF30`254+<%x-aF?z*Nvv;i~YCFrld^WX4f&Q ze&%CZWH6OfF$aRN_IU1)seo-eL}PLO8UdV?YL%ImCZXy@1xGGmU@QjX>jjM%C zQ3_%rJfWPXTvyW+Drj&-kTv^g&=97I*)-Ql+N^@L@qG5Md@z)z`QdohK0kDM#wN+M zjq`Zdh~u2hkv^jfC})eA=K)x6I7d5c(9!%1^qA9G03RTGNBv?T=ox*_gV-8``~K?^ zj>LFd;{l86ytsV$*Yq`B>qrdoLeafu*62bv(}E!97PiW0dg1%|J2n4k`XjO`gaW!; zr>rG~%SLG&M99M(@??!X>#982Sf0F*XML52nAk==twx>=RUX1;8+qD|Jm*z;pi?7H zr;+FUDo@ArSg*Q`92Zy)uuu}fi?@FIom{V840H|AK5k`Wme5fcHV1pmU;gT1YW}KM z?<>~Le=mR6b4~lcV#EB1zvs(jqn1hqU#Lv`CE&A#Fn=EmGsWkak`p zEmGtBkam6}EmGrxkaj^M?M&1_*FD9ku`%>wW1|;N3HF4CvXn)!(`a2<%*&lB}?pZQ=jkLzd8 z6ZLbyL_as`asBLhqJHj!5z7NHq={>YqkhKCM2>#Zw+jM|QKX--&!nH9dZS@ZY__qO z6JKl`&K0d8wgp3iMUdy?nQ0D%eYZ9ZGP%y5Q*HN`KBsl$x_WazHpzm5Di(4d>y#4?RW&00nZqXs1IOz_6 zs?1Hl+8AMF&c9pjOXLJ*s-aA;Ds#tJnO4~Fb@E10~QdgYheXeOW_KR9;sW&sf_z#JM^T1Uk zG}8Jpnvm+4sVZuSEhHz$ z)|_*q$vG9K9-jDh->*0Lfi0fXILi?w%!W;J1Wn2pL{HUlYKB3DM-IY{BKU1%)vcvM z`Z81g^iPyOxci;V0>K4+>{(yyexd>-;lQ<|;R*>DG48*`%-q!41b0GW8^;D;knbev z&-bVRhqwqfGuxjZgx8eUng0C7`juRLeJaL3@!909lD14pN{1Vn1J7@poJ8q?RIqf` z{f6m33bIvSZXWxB$S&`+FHsNSrY;|7j@=5OcZ~6Oh31L0eE4+@T2|)e%}tVk9W2kF zS&Szk?NqV$)qc-|1+PsP-JS5|G>EefafGKaTu*!<6^0U!F3-&VfEON3Z)EzuZ$1;J z{6RkepQiQzih)_+7AX3s_+$n8RjZJ`8X zRVDh(5+Prvd|N_3tTp9ZGa(-Vt@4{W1PprR+c+T~T0)Ko&xh5fe1i%3+R8Tw`6SG7 zi{V`Jj_ll|6}K^4Smv{_XG#3LLL;JH+{AddH5H%M7QrB%Wua*(OJafsbdyuF}_@-MUVn^a3{Ikv7%-0 z^76|@7W4g%rmo2G{>nwXakN&uGN^EyrV*EBmk-w!39h_i%43g+Kv?Tfc-z;hoW(79 zQ&eZ`YkZTFS#4EufDKtR&VGcvl!uHVgKGHY$*UH+@IXNlc$RJH3E%BvHu!+B6yy&p zj|yO{-&%wT5CEElsI4{=q8Mvy&hdNAyQ{GUsPOb6l}o}7?p3Xb2h0Jzo|44S!X_)4 zAe6q@<`BcHEj5uft~BAY{;&%^Ya+}F0o&uZ6o5;4ZTjJ7h96MZEB`_})JtB4!h5wH zraYlfG30VagiHq~1W3OHdi!j}>@JIarF6cBXjD0w<-P>~4J6)hEDyVAOYA&wq`6*4 zb3FwHLFN|eUCj}@7JAZjlcRsBHQPg)R5fu=`bTa6DDMXbc+c*eegacpVlg!{`SD8zGa=Zbn6drVMwP@{F&A4w$($V6elNCisJaMh>p=1JQSw<_rAID6@1qIgQ!aG zZ|3N~d@RzL0cHe9i~tHrt_T2cG!|HJ;a3YTU_6DG$N{2V3VtB1FLiO712xtls7zqo zKO2upPd7u`#l)CEV@)0AjCa*66neZPrA-26I}|mNQw zuD1t<28}h5B1+bP3;KI0xKQASFlo3D1KEn9RU(g3oz!Ze#6Cx%(W=nXs?pPO^t8&V zlbW`aW1W03gkqsg zk8cVPo`peLeXk#j7){!F2yx) z444LA8S&yc6)xj*i>82_M`-J~dhFHK3H0jR5_XLRsb|uuLFjwOYxSXiYz-Z%KUVx@8 z$&!)XxZK(Pus$@|{!sk^V#DaS*B^L07~hQT-v;PQTxu$UuVj1pR5qgc6uIR+YKkqG z_l$gcTc)&yutI7Z^33J zUK(6v^JQ@v&7lvxj)qWSq#2hn;n0B7jIWZ0+OCD1K)2i;xGb-wp*DB9G_)9@f>%X6 zttt(f&ehUTc_&Ci26)RtRD7trNe5BWC=DAOlg?O88XD3ka2Z7+f8@0|th!l=L&L(D zIDG6S@6E@IpWbFjyJ(cob~LzQN*u%`>9P*&hgrSJz(yVf1wzoKX#OKPDY7;4z$$XS zGq;hYXj2?!7J;`S=lZYO!5Db8@mhDTkFQLwGXB?PvRsAr@u65Z72oki!L7Z@r0PWsbKsksRK0S^8L3A$q~{U6RW`IWBdKrAcyPC?Q~RKRI{{+- z6(9rz@#7z5s%Tc!RZ!~~cN=Pav`jUgd+@GPVwoasD%HmG4Xvg+#E9)S>6kSs8LqN4 zN@D40SYoECU-j5um6GEWLK?_c?8x;q_<5s~MRSeXbKNx2c>&r4LNuq3efbAyM`R$> z3r>Iqg36roq0dhP2}WY~q?pQtlop`et!Rh?GR}j#PQz|Z!>(v}Y#9xaKNhluixt42 zi|_l=-a^8<_$o39N=B6M;iTy`p1Ws38m6exa-Rg^9hzck1Q>|pQ?=8VtY$G*a!dq# z>8U=D_x~df>}WwcErDhP{cTC)jq-? zxJ`0tx;gkc^UC#fC1hUk(;MOh(!a(y4|ajc0-K_0rpm#T3Dw}cMC;ep6qp!Pvk@2B z3PE9pg~@t}d>cMJG%Zu(Ze77Pq#+e-8Tw?W@_S)WxIVBSO?+0-2SAAJ@tP-?jqW3; z*Q}CCAzbYW;h7*I@X?h#vfuLdWqfqnqJfb@(ObrfK2}C*7*~?Lx{6o+3BT98)3ihy z(#vyREIS_2W`7WFlWZ2xIWsc02pT`DbN1?uhi9ji9;>_IwIXp-0QcXLFVkl#f=5Lk9SR-W>Z17vA z-&*BS-tB9(&pM~R*4E@GqH8zXAPW|V_5SC!&2iK#zscTWwb}E1?9=Qq9Ljlhgw;~7 z={D6p_y-e1lswYH6GZ4ERfP<`X?R5uj%Bby!kC(*AXDV6$%k4540!HvaDyh!M_K@5 z8`gQbuQi-T7@*Hf53zn|<(p*=e=PRSsD z*6c=Q1v~K^h-9e68-eAR0l70X8v}MeC z6_K0~OT^6BQuJKWzm4q|0NW~$v)_9*p0^;Zyf|)Zote2HAm#tDMQ!63>*WQ+y;i+s z3leW{cQ)LTy@=Q>Xty=_57aYSdsVVerp#b_wrCV3^Pt(<3%s>txDKkXXY>Ee%m%>P zn*4}}S{~3;^4j4B9uMdCcpi^SEC8NgtQ{(zXFdO|%VD(B|06;{dw$pWp5HaLu|DTY zDL$ghrfBvVed1g6%1)4~bJ|26;1y6;1MRbBhkD#;K@K#&7J!&m@3X)jZzb@|U^qjw zIvIlN<7mOi!49oPh1;ycOPn9S-_SgQ=7wdm*MQJ_-h5B3#!Rlz%PrZxxk4|uWJ|fw zwI#bNr%iqj=d(j9ouM;p%AZ-7%d?r*jLue=2^=_QUz04w*?JwJkkjSKusP7S({2J> zX71OOM2?i-vXrndkrZ*onrBhG#FYxWr&nEvt4y|o%-pJM_l|}06V}cumh|{59na@I4pWx zIQ#UOOElKtW{7x5Lq%jzy9ZhXRM{{;zt|9t-Z)?8)CM24SU~a(dS3>EZ`J*fJDLha zai!Pz8|R9dr-#xNfzJVSi&9;^YRMgw!c3AblC9P%AE1jD`lG}%fvD5Py80dW`o{W= zZeCz-#ro|?c8X*D9nr7YeRdE}L!g_7^N1&>gCE2rv`a3y7HD8zPz@dwvSywpAdis= zSQwAOF`j<^1l-dVp2N2qL=_qX@d0TaKs=`3rKaE%F}Ef=Y&28(RzEq!#(vt6mA8A1 zi0Qb*)GB5SqT8wR()@TnYD#FNi$vV?%(~DA?-HNb5y=QO(gJ1ZDGTzBj@GpmvCnRJ zQP4Sws@Eg-^@?cWfIu4|7l!0@O;#LZ+i-WnLB6iiw`Vcr3**LPlvG}bP z&S4_p7JoE~-i%2wbDsLPrIMY(jL>|khM6B9qG(&GkM+t48~SXvT2DI$TgmP>Hap>- zCu23S>6ih3=HkI|RTUp|U73|ut&vb!(<~`k-f zXQOUezFMhQ9Ab7svmkbv)VeXtQr1xG&YepQb0-a&{cbaN+}JUt10ibFe%LChRQusf z*cR}2sjAW7s^k&aR*`C_G$Ia>eL9$*+3 zgThN>y-1xuVuyE_L4e>foje#`K*Lh!J=FOHI^CBQ=x1 zM#6Nh(GRvxFrT|h%_$WVpqYwZRz0S`*HFIF-D_F4SWjK9r&{GH1WTni545CFw`724(g5(* z=^gOa%adIdgn;E|e`jeC-_D>CKF}4h>a?Dbk*=9PoOCJWH6*ni)tjAOO+9iAdMJ01 z`)b-ybDpLPp{T_rx$1MDV&ZO8NV*NKelZvmCYV0r5Ler*hqJ9bL1`E&B z%`&BQkv<=&hXrE_F}^iA1==a1oFUa>HkxbBbWY(iv+V-l;v4C3T0?JlQvyozh>}RawYAhMCQMv1%GMJX zGg0jWS4q8-fD-@_8BRJF1aNLmz5*Ch1m48@DCTCkxJ&Gy^Xz7{eUVw> zcqPZZl9r?FQ{fPxIB}sw-8?p%lRlZNC7)YX8q*A~ntDKHhSOh(17U$< z-X}R=4kuYX$9I;9&YvYJP zC>ZZkRV%EGC9Yir}~v^m!P5v+~FHGJyCVMnwf{XM`U>37c7#_i*E-tKh< zYvb)>!|+MBHa>Oab+7NPYHh^Se*|meA#+ds&uMMMzCC_xgSC_=)!Lwbvo;RdDE=My zaftB`Ig~Ga1v1ME|i9lbTVSyioYx9%tVn7egj1fGhfUd zz=ooT2i5ZutJ0=bTa(@6URUxz9>V=%!Jzadfu4t75Xjry)wmp zY`#~`jmLZZ?`CaGG@P#y^a&o!8s3H%P(~$M|H9dUoBJ}6o5y{ z3DB?RI(8wrs%w|%yC>NH%5we_?SD1VcZ~i&LH<`jG)2Y<^U*xln0|$g>C}zSpRzGM zW}1VkbN9Zotrbl)Zmnx}6(?#HO)F2w#K9C-F_2vp1sBVdm}FGL|0-|9Q_cTsv%m*y zF&gI)|JkPzKMwYz1J(ivZLVW;%V#kK;kYMfL}cpoqs;`BhEgfTxwg0Vy8j^+H6AMESPj5_oUbpa4{iEr9pj`6uqj2ev-U_Cpvz z?Eq6p3=#_mSbzF8Z^2`Rh_)HE6wcRkuZ(zvqhPQtLZC!A4&A*N>otAvRZbN3qZhpx za#zXkuGJ^pReD6}2uwYizQm1>#iDNL00xB8dWBlp(;DA}xyC}MW}CY(wT^nXRz^m% z0E^it|3}<V_+(Z6Kt+U6F|@Hwn!@4Q8Q<5+1I)XksT zv0`ihlK7rCzc&ydDOk*^9(p&&5`#>}RTn5ks0K1@O~ck!)xWSXqKNe1IgX?cOPi;| zsNv7CDz^qskOmS&Po0FXamJ$se}t8RX}XWp#--Gj3z0vtL>Qh128k=agEt>Rk=p8Y z;0Q@SdI@WXiH<|I6(@WJK%D42o89=5Ikb*{-Tu_A<2(icOGG*d^af})f~&FQ5~o;W zLUH=>H%YEF2Jt%9DgU5rt|{-`SJ5$-)HH8>@_+huTlti3D{2J8;qBr8y^J zXxu4`h*4)u08%$u_#z?y-D1;iBSJd6?5coSJZ!-=x_aNb)|EtLPkc160nFhtrXgH| z++8nGiQE-4Slp4sG0{od_JUaMd9vAQhrnF$(6eA>NTolwgE3|}^=3D=j+8g+;v~L@ zot08`XvX9GvVxgc(|9u_nz!Yz%G}eY9v}PG$C*YY9=)rLOZg&b>~w_k=o69jf~NrgN{8dBB7^ zk3X(DksKLfu>4I2hnQzk%-B#w(Un{r`=PtNM7zUvTcLo{ZZL^0j1e2K*5$?Z4*zeOTL{ht9CH- z|D;~4VW&V24p}ub6JWdRaW)_kNCUU5 z+JiCvJ*aGv2_@+$`iL?3B-qA^?r#>AK%?mWR&?EjZjBXvNZCTG6dZg~<7X&I81GL; zxXmW>zi{I7Z}{rrU;60b>-!rqE)hcdgWO^Z;^5b1sV4n@JvQj$Q3iIEh;DR6!fMwC z;^@}HG)k0q#!TVslgcJ8_2AB>C9;~FET86kv)=4qXn%04m%YRRl3;YeXhQ(T%NaL# zx&s_PvUU5P>D9SUi7S%dBGhL)?05>PrOa{e_dj!H1)Nc7I=vDZDx2KT+6ro zoik0ISK6@d+;<3LQs84Z$Q;sWa4!KCLGlFLAhWE-$v4Qfz+?Z9TJ@McyP4Uz+NM7m za&za6&D3V+)(qCJTff0(Y`^_S*1av|Xqd<)ot1BhUoPYe?ue}X#(P7ai}^ypZ&rRX ze%Ztqg4?q4eeugBe9?W~<*&vs-^mx&WwP=scZGVk@WpP6{Db)A3clcL%*xltFWifTBSUa=mDr3&wjYC|m`Et%OEHAhQ4`o_(_LQ&Z^e_CU6r%@f(iD*0 ze8ky==hde|^zYVPjAbf|-J7xl7C9BBYN}oHy)~+woD-#HY4ha^bDKH9q|5)8|F8Ke zC+3VsfF~C`*wQ$$ikzr6n1l1f>|RAaIDT>+bPMQ)OuO+G9=A01QFJh z8(aeTI+(#(jR}qzPaM|fkbTYs6x(r%C>`LCJ?hg%#A~!L$g!f@-I&1;9I3z&ssaP& zAIE{{9xG10;dElOpumF#IF=JH9^TesiV`g9L4R)iQS(bFR~eoWi)}mgx90r0|1C-K zoc}NX--J&g%jqyGx(XTAH^D5FG8$IF9R01?wEw5;(|$a~Vv<&ItgakmC8xCVAN%xm zAZkDX=ZxDZo3eObeBck*8Yu2=j!ji=$wPaaf;ovn)`nXSYSseT6f0{uy*X=8NiWq= z6;@1~WVB)YVNe+E8I68mtd7cHWid3*fMF?EC*tU|Sn}&;kPOji!(ZQb)o0@ttT~yx zmV?zcTs&N&8xt% z{IdoLeaqC4PSqt;o_Sxvt+|@?@e#*>elAu${3i^h{MY6`1P9=BVZzZ=S%|_A!H#tw z2Q9uawJ?O>JZGz^k>fcMxLzshliH@r7c7XkOD=&x6@h(UzIq?`PJd@&|68-_|3bQs z2jwJMjc1(OI=7ZnmS`r7thTm-aMAFV>|)@40Y}fq2BCUML-xuEzd5h}ExtaV#j>gL z?F>YnT(8;$oq&(s(=S=L^!kO#`o{mpUK-ygK6>Vqv@E3O{I=G&*Q^(MAPV=xDwbJ_ zl|{I>%9z&2ftFtQ?Tuh*?{eT+ER}O8S@v`!mGioj{ji+Epwatt=uth`f}Np%~^ zRJjxGQLR%fjS*G=@A;+3Vs<`HH@S~Z#ZB&G3xIK-U8_8;niQ}=O@qBCLTa+5eH%7> z?u^&e8Lz2hHQCYh9o2-HI>mX>UXPDAAkxZWV>HMBXp9EVn6X->BwXI)vuQq28zwFX z(C%Th&+NGts5P2fd#)X6#M>I-l#duPES?16i-$NQK2aj*XGAU@df)XgEf){mb^T7e zjw7VWWc@HAKKlCz0Ld$KDVkHe+Odxbu@r?Dk8+I_gI>*X zJ~_gmT!Wx#m(zQwbWu0GEA846BXGe0%7JI`E<}Mr#i}dW7Vkxwz->JL8|qB2y(-yc zZ|nA!C-tTaFs91R-YWSb`!G{~xDZNdJQuxibhZy_JiTudLM!&Fhc!oP9Sz!}k0w9qv9Lgn|BZd1p@T_sfp?$eWQ#9s$ z%5!u@9{&>a;8CYm=|EHtGE^;P)rtnTvTTg7R`FAs9dV?Qjb5{eqwR*s6R((A+|JRR z;HWt*8g(@dL2nn`Fb%=drA^(-R;-)`$q*|#cH48o_0maydzx$7Xl*W^{`sWO?tCa( zp$t}9*WJ=p2UZ$kS@jNTTJM-FhSL3e z($#!Fg?u_TX6q%U;8SWWF`X2L8OCgIM+bq+4icD~Xo<>w4=X(lxI##;|aKr!b{YL0=Q6unfGl)~T&0ec@w)sU)=BgYKtgneTz+GnQIxq)J zLQIJqexqzxiIFds$jWvQS4tSdvYNlO0gF_=z=5bBPH_IqdxVOFuK-;pTa%CJ10*uR z9vN`F4ZCJRZA3-UY(rhI+9)4B@fYvtP<^Cl|D9Q`L)s^JN)de*0D)l1=@I{*w*w+_ z{V-W6via#(-BxasqGLlr%P}!O{qO0p6)eRvri!M;Cvp_-Nt>J_^r*d*#p^VMUe==J$;)cdd=|7o`ecDhG zTC>T(liAwC&DQLMrzf+uFE?AW11O%%);`y4P5k|&vgB8rt<}~$t+vYot4PBG<6Xi- z#=8c-8Sg|A@)+kDgk1B6U2VoYJDGWF%r#~)-rMGjc~blGHS5c{56f+jZ8R@0MxWR0 z<`}%`op?!mh&b@lW1Akg95OrKkZK99~X)Y#eKPK=BbDe|%dA38u z+X{s+Dw{N(ja0Si)eO@slm5*tgxiCJIH6j>1{Ie?wwYyyWwJsdmn)l!wyR5~zrkLS zVrxiVbQSZ8c2t+-Lz2n>H?79Gi^y&B++jI3b>VVB9`!6ff`+k-WDg24#tig-)R%ig zWmJlB#f*u_r7%gB4H0#_5*nsBniLo+`v+_H%YXCk&zSwA>w20-e)e;upgiY+Xk83=PRec5%VR_Z^{mU?3RyBshH?8U; z*|KwQd*c=fv;QU)rkXur3M)@Q1N~E>S_TcF!42$4t?M{pt_I{mEHUz$M>@>bRrQLx zg#&85$_I}c8o585N%QK(mSZ3SxC{dkRGB~8iDV%ATII;*37pY?X|`cBt%z!y3)@$` zXlB9NTtX!)%Wh(5$BXNE4Iu=H0>-H{H{UHy5x1aCdG&)A-CMb5ahK(*GjNa{wG}*hds!$k*!jAR;|*N z7eOVgXe-#IFHGsU)RKW*a7!^`68=B*0W}wI;5;fgSsOiQU!&K6VQW{?0VmhhPF;$v zIX!>nt4IC$tM=cfB@>ZQo)V-ByG7==a2>1tZ|TwGMmC|%U%vk~G*O*1i#eM&3Qu!; zrjU)=!(vCMaS!`MMS%Ld}9xeNfTxR>kd~d(%JhkRVo;T|Gk?xKA1S8Mi z&h_=m{j@fH8%GD7FJD^?C6+&1=J1$~ePw~bdbw}@;$dPe7ga6M!HNvRZ|M)<%%d$U*C3&T~T0 zdMmX8LAt+c0tcP1&yS0PE>I0CIOsfUu9#klPyCWX(7II-bYUoZW)5QL8=KCb6M{Bb zsTBy)hNuY$dRlDbv2)PVRRtV0wS4ehq695hGzMRXX>S`r$wa!xf}N)PLCBQ{nqn-> zGE;$%rjjcG+8$+mzuK9{1B`MO5U}}jKq~_m0sh~Zl&Z} zOUY2y*(F1@+`jn7lVs@0X1%zXIugGq1If@fLKA_L?Tyl=Lz5)7nT0E<*X*?mRwBCh zke*sPSlCluy!YC%Y$jEyLEEQDe)?E)mkIe4&XsO4M+^tL1K&3IIo`xu8O8t6Cg_gM z<$sG=T;g+ClA&NhuNDhH1y#$PudXD;TmZH1r73w9-Jj2jxs;0axV5L;R!Q9{xgoGT zrtk|}wJ?G5<4st-+BvWSy#PY%zdWPZp3hb_;XE_}INjASr#2}bfDce*d&*}uIET%3!GHTqb<<35L-*W#7T`-6Lg8&+m=mSI6) zn^Q;C1I2IfgIWJlOuGJGXSEf$G6to&FW5BckGCg;?-5T<=@M)T_h_g|B4(o)pC8zbH?Ah~GhA3rgjC`xX}n zmv4L-%upVTjNU&}X!(D4VxM(r`C-+J0iLlSaE8$Gn?4?p!TIDqGyK-a>`PK4gAaSV z6XzEfl7T@w(jPrB@f`fU#(?fm{f;DKIzY-;jPHE{%NbNNnkOK}cUg^-V|-8M49Vd5 zUO5N=RM3xd211sn{lR_SX^;oM1Fp~*+JTWZYtpX06W$lCCDU_0#Ql^g8x33=`?zfo zG(t?jbxCGiK!xAA~K9xj6Jz z?)pS}YF0W#Vn|q^Kji!nga{Y)$=1h(0h@bHYUo3CL+YO)%A0JW!`4uMmrXaJfbdDZ zE>k2$gw6xbbPCa0R_`d(EO2emPHJOpRJJspK61mYpS=46kNoZJ*Do7gPl?$2IqWm5P zdo(PxAUB>^KKKBc8X4BPtf0^X>NsaX_rIRigOb&#Y%|;>l=wfO^r#OT95Z?y5E=td zYq5wlR_m#48s z1w@Xuw#MFS@1!7UIH~6>xe*W}?__EVTn&(`T*1@5tP**;Vpd|K}o2U90A1O~roOq8RK(5B)PFIjT^fIq>a)#I-6)T2MMP`-S3`Ll}n zZ?uG!#X>jMbAHXHBHdLa&tp`lrCgaXZB+x;rWDCFn_`8dX4*pe$^{40FPX~+|HWWS zLf44B0z?Hz!}LDh@zvAHuH7Lgqc7GhQ(*9@;UH5U4ZB?ejtB}(Sh8Ki9E2r-~pj1ARZYh zZNd*%S!ycJvp506u?IxLh1*@UzQOdbwoCL1=A-4)_Li;PlE=__lsspX5;oy#V(E!S zrIDpCJOa-*MRBIT*>NS4!aaj;3cLy(y9Kv+@DY9f@fBUl`#HcfUdB7XEb#d>4EQ(* zcJ3Z^HUT=11rMt2m(*Ep?PsFOP9q>viw9o?vPK|LohKXR@x+kDk)xEreF|_nA&3mq zc}-`PRJNa218Q-wUr*T%M1qmizI|3jB~O@D?`7Wrdwp&Z@v*#BpJCk_v z2tq;T|7!R&+olKnpL>NRQnCt<&%=!v?7)0yNKN6&_G%B zbLXgQG=&Fv5F^yYJuT@#ekJC1;u7n61F-4@0#@D96`wjEh%WaUbYuSu2N#KdhQt>| z^5I}CdV5Aa+s)Py`Fc!Ngv25#iL++-;s^tUkhnZ(9AKjcJ43&k=r~`DS_<9aT~tLm zI91_;E=ROxFW((l0m_OXdz{XZ%=l{*d;?#}LvzXQ5gBZhkvreBJ5U5Y1Q^{3V1U>N z23Kxsuo3CnU@qib>@m>fZBSBv>WNj-n8}vYj6~vVeQ-7Z)`$UoTd3TUy)6nUZL+~ZDy{*! zW`Cd)V64jEm}q;*GG?~mYHaXElT-40=x`EAcB1`jbSH2sP2>2h$BMxr4?yT$kekwB z`f448v$7RTh$FgU1C0{Vz;g2#@h|3fwy?Y|MuWHlHn0w?#P>PR9TG0|r8QzbfX3~E zr`>6ILLN{hrqcGzJ~(#O!8?==yOoFaFidjwG#UJg5Tf{Vvh<`O7_f$r`>a0GM&x6I zlC}ybgV!rROq&dDHdI<%uMG%mVDJV@$3tP?LM60B9RkWe@X}cTBLNbJ5qJOr=yh^v z1x%(;>y?daBVyI5W=*-t8mmXvL+GEPL1oQ`E>d)8TERMx45%1qG_|Yz&+@qlk5Ow7 z0pQ%j)(NmK4A7wj$Kf!G<~_FAx{M*UcLI8!$>oUJPu&XsTmT;M8dP0U}c z*)sI2dw)QSTwv|v@ zEbrAvphZO76&_)JE6UgD?OrN}$sQrMSJJ4FjgF8={q**$#1z+Z%)(pb|#8$y2e1`T7A7MOz6!gakFY z@T*i3U{;z*0|S;bO-eV#A-oe@EL>KUtppWHyBny@J;s4Xig^Zf7!3InP(oRrqiKaO zH}*r8FYJL}I?-tth15|_(RQ)bj;q6g_l)irf09M<4uLC^xHhAjo~? zaAEHq@MmG#Ox{KZXrrZxW5t_U#haP)=6GhaDP_k*t9SyJW_w0qWldbF=xO89tih#{ zaL%P+Yb~%jmzpUMBn$}7M9W7n*`6H@WAjWS*5QH}QofWm(+$doSF_pBZQ=EH{i1)y zGuv0n9`e+?#xvVjQV)CTy&*MZwy&fvdFp*3HDtE0q#p6q`$KBTY+p$|>ZuQe)R5V} zl6uTjPlVKv*}m4P$3v?9ZqFVXe|<2#+VA%4;qlj#;njY(XOE1(o(iw_yFJ^tc(>s> zye@`U``w=1H2%6jyxQ;f?B?;;1L4(vw`aGGzuppF?HBrn*Ms_nzT>I(6>Qw@sdtWN zwy&ff^3=ORYRGI~Nj>bT_lDGv*}jsxXVvwbD?sHZ*DPkQPjAvI*SucV&x)O~VG)S2xo zuZ#K&K|^ZDY+p&;@2NM3)R5V}l6t^XZw;v-vwf{oZ&7Nn2RP$3=$eMXL(pGs4`5|B zERjlI$?rAoVqJneS|ZYKOcGGbSR&I{B2ii+g@QajZOffT%W|dU-h}jyCi0Uk5#-h| zuOzip0q#P8e!`Rm=62aVhbvSUKFg5yg zAlVh>0d@vPemV``Lfg8Aw?jbKndJIGhhnVI@cEdA&vpRYqBk$FDp1iT)_q_KlMERT z_GXHc9*aWN^hw#gzpQCC`|fI#o?Gq}R)gnutAXaD!f#?$SgEF1)r<{?Xco*LCyap` z@su?!A+68I{y}>OJZ09Ih$rdMGvG<6i4(eU*eXKzjZmy%ncq$M&0dw`R_1Ec5J&~9 zsxfY0RtnmqAz%~3UT4S=aIjz3dBGlI!~)Pep-v$PFYv%7m}^=CUURbD63 z7U9U84dx-^aC47^-{eRM^JSSCgI_kjhM&CPD0gR)TEUKuFXoB^2AH?VH+ig&`FdH* z$C2vQvoRWZF_8I)$8R9#p7u%;PXp}cJk`pl5e=9xu3e(G?q;^HMlBolzz7Qm&n67f ztZ*jy@;PE1$|fh2$48C1ov~n5nJid)2l+4u@i0OL)yVBd84+GrJy8Q!UPb4xr_li= zV{%#YntuNiLM$Q*F#$wIUcA}zT10O)E0Vm)o1M8gJB!|IVU@j)>VRA}T5+%3+2+DE zf3||A{ zJ%Z%QYd80(qY;AR3UbNC4eMER4S%|hIZ$+E<}HiNTJAMrW2Pw+IrmE$>Ja`S^+ssG z6vSabBI%AXl~HCD?Y}xtXIZt5;HLlQZ{Yw~|nkH5)h+&_)B#DON+_)o7G8KsqCv>Ep#6%H$M-G#=yVk}Z0ag1pG z#nDxdxyG{b!q~#Ighe$Pk*+L(Y7ktr$<`n%4{4|#qb&~Tw61*Ea16_*8~re5my8fD zQX_KXV6AB>yA6cbzf>ORSMH`P-7unaKuG2M%y(o6DFjeqVdl|g$%}M?L??0%4B)a< zdknVVgN-KQ1o1^NAVHo)d6?4#hK74*>9(rn2!hJYRP!oiDB-BEUyXv$HjR54rl|V{ z$>_pFAM8mTGZfG<9=(s?TNDb?GmGeyV<#?-Ac2CR2iDLe%py?2%Z$7rV54F+B#pNO z7YZ>3bj1ZE)bffiT7#vBy8p+p>3%Ksnab&~JrqGu>NSoT~$bmC#`0x5cIQ=aALH_Jl7#^ zGB)zxa{Bx?rggklGk8_!Yn=KvP5ByMeZ&ZNG_WF9?o$Y!8R;=*d$Zf?m+_O;(b;-1V3ro@LX@j&*~lW{*`xuf|fvI3{`(^TVb? z+XlmIBVQ5jL(ENVK(q|j2F=m|cV@T4tlVt52)*?nhSo^_azqDfrj=CEQdhlr{cK__ zILis2(zSW}lo(2D6oa}P{9N>To5dIZOk8PF=vvZ8x4iBaYLlhP3R0UOSqK*7HtRUTqNs&0Iz6 zsLTeeB#$gnm;y1=AvzYkLY6Fz84S>dvq{lC;L<^Ym*EEA>Rv$)IGw;-?31bbp|9@h z?+#w2p3w&_c7^o;!D5aL^N7G??n_|9SMVipj;)ZvHsu)%e{!$%C5*4Cz)%hMoVcn2 z5w2?j)(Z$`&Atu=t2zm<<4N5G4moQMSP#!bE_*ddBGm%WT4?bq^0#}X?e&PU;B1i{+qvWLj z?ksE7k#V&M2Lv6G1MrMnc_}n}kwqqniHvmzMUk=LfFp}6SPn_eWlrogkjDdESq0r;5*Q*^>h5+3_9YbJ?WuVfE-DMll7nmEE*fkzJZ|K9os)s|zQUa)flwKMY$T za%#mAN`3PFVB~HO8LzC3% z=15vo<4g#ne(L4_j9}}_stA+sHDV_qY(hZu=@F*c{W65%g|B;JzMw`={w>yr(N{W6 z^o8DKk5%a!S$br?>O2o+dy9&M}2L?DVKkIM{JTMk7i>206hSmAD~r#Q%hQNeqg>;E(Ww7VAm z!P&DRBv$Qk9G10lJsq?bkcl?g!DQ<*0#)bWl#fOol~$XB*=8T-5JzGY>Ejj?8`Qp` z{1;KWmGH-p+*r`Q9xB_lyT3-1;NAuGF4=W0=8ioS$?pC-9?J`rymuFWFM0MR>L|Nr z5i!!sSM2VCIq=^qGxi7VtrAkNR+eR}ybj-?HnRAe9p>8ahhhX2^uLQ|Pb2Ity|$Ex z*7$_ELinyP{iiD*vxHTW-DdOT{`sEQ6roBHbq^o*pTXetWd#Gu>RXSJc>bzC7s~q$J)`pUe1pn` z=YP=m{;S64Es;^_3KI|zYqCT=qZz1^4jxu98qth8-{Gt*j<%gw$0SDvpHddosfM{a z$g~o-bzgp(Pb*0^AtS?>(1kY!+*_1Zy}fnp?E_}}_d(KH?=+D7rgDI>uQlWn0pXzw z5+eQ&u3WLlM^j)v#{*vL%|2(da|SC71b~wXyMNv(pe*e)yMM4^K;>yS7{RK|ERShd zkU{CwO^6XU!Q{J|JAB@5@R~Cjs6=P&Q96qqK2Og6o+X>4W&r#6_xCiqhHO6b{+??7 zj&jSLIU#e3J4ZWiWw(a8I~Kr`a}&;Qi5RpgSY=J-J^&SijjBevU`j?6u2yH<`|T`*|ItpjTw>D& z*DzDpXbRQBmmlH-A(p~oR}-FYY>*gTm0%Ati%HT&?1kwg8vUOZR13~j0d9KVR&gz` z>0_yr1htrl*Mi=lGBE#!=BA-OS*Miff~1uF0W9}od8=s^c<%^Hi0`RKdWmVs`IYrJ&vW1y-;})owYYMVt-ttJn;Sko{xokBb3L2Wcd7Cr!6wu^~(SXq-ENNd%r-FsBiU-9OIKsEwakX)fY-{UwQNV0oKu#~X#+(*BXd5O? z;O!f+O4K3`2bah_#e{KzKkU-s)MLYpw0KXozt7GGmO%49QJfMKHQAsugsUvqg)Bq` z$1K-j3pBI*?8+cp09Nq{Oh7WRT6hbCZ_njkCA# z1D7z4E<TaXV4MnVXe4{@i&r)Bp0>xuDK-8ezs&(s<2=gW!eb-sN?b~&}&`b8LY zd$x_oKla4u(j=GMC$zc49(Cy8kK2qvD1gm{JjTCpP<>gcD7^6PaDnhpGP@cUlJ&ozX7!?}lOlCDL3 z3;U~|Iuw?-PJPb0iDNX+@QVpwIhtv?bS04CufFzHJ zn<<+In(-up>4QjD@GF1cGSqy?Q4$Y5`AGW3vb69?t-Vol3g3|}24S?46x?LWtc6s)83DV*i zqvh?!U?VfMlh`RVGF6sxuw`1-j5dUQ>FQK!PP&usbX%flSj4&^qeXCvqx4`#zl{CW z=^$^JuYt*s0Qb1AXq)oc;7ekQ2vcSNd8{aL(Zg=Y&CE$#@c|96pen49m4wk~!Op&j zxJFSKY6N{kPgnc);xQou+LmmA7(3>`V=g% zS;#rxd1Sl2PiwLr=m{Lg#fbf}W&Z3<^kXj1l2lu5G>dZZndt1b8j0uTNw$f2km2b} z47R~%i?)T`hLFSkltT5W#m!wQ4UFI;|JS8t$H(tn!qyZyn=M|A1W%;0w&PK^fI z{k^fb!((rM;BW73r_*uHf`+Z6b-6jXq!2n+C5YO2fxFo9D^Y-~fSVBKLM^D%&p?C4 z2aH5%8z8ivsJUlHJR=9m(0&F(P0cHJgeC(mc^6=d=)15}D)5gLwiG6TwI$o!U?d$+ zPJOhD;152%z>GSyg0HlpsV^<6DUB{x!!>SwG2DDLN!i{b77wr>Q5gdm76vID9EZt@ z)G*QbI7|p9jYaK;W)Q(8hB$+c`TczH8X->yWUKlqwKA|fAT=;e($N2)W9ITS(OHgD zxNz96tL3g~0&_<*jLGt|VjKle^Cl#4&S;s+bHa^pVj??`Lg&`lNg$1?t>>|77Wnr7 z1y=yze;KQmH>;MVvUCW_tUe8szGyvdh^H{!Bx9fe6-4yQ=WTdr`waSe)Ugn3`hcNq zOGAFYov>FJs>1+Bq-4;CK}E(~ zxMT?2CpL!@(;(KEsz{#68&KcW6h;`M(4CH1dBBICVv>QG?zk&k;|hr#>(%l=Mi&D( zdH+OX8DlZ6;L)J)f5y!t){AsvM_v}X5HuMR6CBJEczc+DGlZq|9Y+K*``A`~Q~+@I zLyNl~HgPhK&MB2tHo?8-8h97@_6pNTWKtFxT1k0>LRCRQS|0q&(jvmkt0WPm6Jq%} zA&G|RjuC!B!&f|+?JBwyP>cEi)n%`lI#Lmx6Z^jW<P`Pj_OJ6|U9Q#F{A*jEnyy+Ajm3*ZHu~X)q;zz-CLNCyeo&7yF zede$mjc!0T%@9(;K+Vca)R&A}Y4ZJTwaMEh!VuGws-5%p(t$D=rk0GNLA0n~TUP_? z5}ProaHc1_gUL!YHMr+#w-w>p;txo$Ynam5`z5B{uY0rsRHM92LoFnNIlL@LuDt0R z>habjL5G^74w02fqh=Dj1^a8vNxR#;s6~13>twI4W(CM{Y3z%-S{`bCTFki$3^D~< z*cezX?2-M-IQ=&92EDzuKrqd_F6)Ac0W#GLW(IwcGF2GyJPV3=PDW`lWsFu#ap8I~ z%k4EY^q2cUQECh=vdtE{8Q$%d2{Djdu_MMP+JfIspWgVg(X6}Fr#)y7 z02IL-8oN-RKaoLFlbVOJI+{8Pp2sW|bt=%@5#eJ2xo#xRHPfIZ~!89;$EdW~6O}LI*1)4gn zfI-a$3y0`U8Os;&b2@9wKFbO{cNXz%FNpV$j zrJk@^}#AG18W7TltxQ z6<#i{@#afLbfaBh1YectwC<&3Ve=yYONzt-M1=0a|4^$*e>@1Ovd`sB!B3*;f@YEC z{W#_&2>eQo2lS^ErXz~A!73jMn%SBRIBc`IB3n;NHdKfCvJ5K|=zh0|BoRL?P;FzN zn%CS#afUW;!7}=QL$T2s44^c4fS7~kB7JNz+GnU<*=Ha?$cC`8Vyj3zUpkX|h@T41 zeX*D?)T5ONF$aRPGR%_x>(jcQjR6F;4Uf=5cpM8&gD&yp;Wmq*<>$QD5Z4bWRAoW z4qLTYGVQAQi3FQ@Yi^%KTi@lcq*-IViD5?!c*6L@FThciyX7^IZLH;7liy|mGV$kM z7o{UJa2oN)Jz-KXCFTH#;weJ;XsKa+7F3iB~ zVkS#h+p0iS({3%;D4FTwE~E|m5ef)90g4KbX@NR2JT72;xCMlcvwI<@eFh1VJ38$O zPS(P;jU*?7{3a#|E$Mk6w=-07r&?-iNdr=B7xPAba9sf~WYTmYlLX2rKmw~&rk6@N zVv^{Q&vu|1Q#!Gd&9WUN(mz=^{AiVn*$R29rm>9msu5hEsqm=j5HG9``=F1pnXBp{ z$wF>>GvjNKj`?CKMvRY0^BTi;Cfo;q?81ecfr*us-ZQ(42V3>Gb+I9~iCbgF>l#iY zSskVdO}dm{v|*%q>N0iXr?N@{m49P-(n)z_t|GwIar1X3&*{Hmg^CW6+7JeO7SsSN z>;?inyU)(wz^8%O5u8LlxW2{`srB{W3Y4NHP0hN=CT7*kz@7z62#707kD^sSuIu5Xdx(xi=Ez+|vstx0)lYEpO{ez_`Pm?0Y#vMh(xQbU>U z%ZaBSvz!81=v@oMG%Y9I{h!lA;qHXUh#pjqsbr>Ud{lX9`HkgQ1D~{45CzLXsI(yI zD!W@?G76W`&?jY9@7ZA8mgs3AV4Yt%$oUz7e7;v$2L`ip4Bf(d_l#JF5U0Vq&7xS6 zZW2l-C7_1fs3FRGj1D0n8k6R@MlUwb6^wj(nl>mPY%>lvmix>@k%|ZnYg3EOY5)FC zJ7ar9Y8N?I0~a=hLB(eL|F%^~C)Vc-ENFWR|e zQ%&p*t`MRGSCG#he#Zi~PTm+r&Dc>R(7rrk^{&j-jEPtB9 z^9TMkSzIl{E0ker-w&*sVXrbQ-t*D#TfD72k-TI=8+$Crk#`;Zj#aZQDSuHx}Uub7S8(R-<+V+T&cHTYlPK#{f56* zg+FycxZ{_CAofJ^lPq#gs=g(>bxQE|lcxhVS9}-{cS;aQ&Q*YACPFJevCCF6plNxX ziY%j5-=uN-HX!2f#+S8%UkYP8qT}VSmPb{NJ#DxlS0Ep-x_1YX8q$IU!w)w=nfQfJ?I#^mMEI zF1CoIhS79>aj|%z3CeBatz`c1e&^WTZ+g>v?|Z}b^BnqgBb5PI;b|ZF)Ng(4OSgUK z=l`CJRoYP<+rL^tM7kwTEJ>mRZY@-gglAZHMtE>9&5Ku#5LqvL=PR+Pc-`?zK6iLU zjI~PI4#gN7m*y{E0~$$niTNMgk1kC4DLV7ntM|E;kj$^&&&RE=-Z%f=x4i1D|K%O6 z#UVY=OkdlrpoV0~@k77=-+uqruO;)>$F5$QmS5iBd?shyojgc5$8BZ>xOGwIgnM14B z*R2-GZQLk)Rq`JJ08{KH#IdGZ<~YZA44o0IqwYfaU6{YYsmxx^@<8Rg&HDR#c$1uI zWOsZ|skK7axHuH-xNzb$3H|bgZu7jL-=#>?aw~R;mvuWSvC{|b3r2~X%6VAP?YIF% zXlUs=81`2jYsg)%=xW+zhwz`i#JNL zWZLZRDLOh{8!f0lvQ247PFXf27@hY1(O;eRo{~fJ3x@9C%i<9XJt;}3-)6WjvmkVq zQ~XD&FLP0=%~E6l_jb=hJ?iA+uF(`T6RN{dU`%l4b66?P)66dQS>CeENLOu{YLS1A zM?~aa>l$*ACmkH@osCP&Q|bf@e%6;THzELzeZ_L_O#>b)P!pDxwUSpaEw6@_F}uML zb}^Qy@MbgGG~1DbC#1a2215D=XSmTr^Ppvo13lhGnlhM_O;W$|n?r!^>Kjn0TA z8>m=DGcjO=^V}&^PQZMY_!>R-@kB&wX7xlPGHLMBIN~hjVgNV9X;?6HU}KYBO5n|;o5vyaMLl^B&Y$!XRw>24t4Zf1FGTX*QXR+~|$=0OB48HyqFHSO=NaZoQ^ z(kwXeHAmAT{E5CUlobD`?+y1?h#aS8?zFf?rWucMxzbv!ykKd)?&l$2xy)R zRnz~U=<%dnc626^T%I6Ch_EO$0nq=5B;}LblI(#I{fwBKQJM_5UJT7eam!b1D8Z^z=cnTZ@*fGTSV7cVGn*2Eg*I3WO!U0PMEVk?i2o=T`?L%}7TS(L)ILQL7=qHrN zD@1Z**24mfpJai5KP=dPp3Q>&=8*;a%kZ)Q#A_5SjcicDZKAh$R~MF>q#YQIWFy3r zIOu{%RzijT0`u&TW>Oev%*Y>I@`nf%i{u$XP-U}+@`efQP8PU!?)<5vZD6|~=0{smb&k(Des+LkuLs!TQSKk`NnZ@)+FLyT=G#$WXaiYi|F4x|#>1J# zlsF0}V4@ThKB~xC9tADSpf1!LbfoIH>Wq{CgvQ}ghjqrTP?%bl@o76={PlaVt3}$s zU-goJ7N-`?h;19T%_sNmi3D2k&5jiGMvehLWEr30R|lwsJ!n$fNI3#QbhfaM0F6U! zEIoZlK`1#|mJLB8csb_l8#eAkoXFqk^e3ds$&a9pfuni{tRVkO_>iVS26{Kmz-Eo*G9mJ6`T> zhm{P02i#TK52+3vrllDI+&eJ2=#$THnOKy7SeGE2b!kT|h<7^z!f6l_I?ydottEg~ zQjW800eNz590nOyzb1?;ZWK(NUJ+O$u6ish;b;=v5UJB0SU z!px3d3N;AlhUyhr+ydlH2SOiFjmMr98td#gORhVZrgS$Q}d5)A|wU#c6&Ss4?>o1F}cHZ3L^w1%j~Vc>j4TTnArGdzC? zU3I7d{jX{$0#I`!YFe5Q0%jf}7Kh`t7)AZi7#c#n_rlxQX)!Sj6@-d*BPPoH3=lv| z5-K_aWylT~O$5(C7@JYs?}x+$K?L?bF;sRg$yT{jVi*?2-%fN*aVR>PSWAv7+OlR+ zOwew1%bKY%GysrPKR?Y!3ZiNH@WXRQ71d3O!Lba|${T2vjzUPjC+sH^*uJ6;ip_2R z5NQqf8KZV3DTuib&yUnsCO}hH?9u{*YhNiD57&k z?~+~?VV+&$rUaykZWrIH&V*=bP>-z)dPm);Y3^^bdrnnLcQ4r}5^@0sJqR8#dd)-9 zM#n?aJmR0sbg+@DVlD;EqBuA~WUzpRfdCh+mA-`m2*(s2Sck?T9|*d6&P}5Qlq~|0 zD#Q(4&Ll_Q+Z|B*D0T;~KTrp#m(lItb;=v$lVJOtH|2w!IUxClBERj}cL(xM)J<-% z@@g|ljt9#rgf#-&fWr*NxB+;XBad0k!F1MiL8C0+qN6n13lm0n?Fc3%!=%#Uat4V| zSVhzMMtF$fJ&X)?fNAm#n=q!U{=o+O7$fR96ntkx z0@x~;4XY76vZutcFHf=4h41auH(+kd<5|EugKnZ|;r2_VS zS7JYNUOJQqXgUwW)8QSBUr;~4x@CxR2MyH$Y_E;#Stt*=hZgS%k0MlW=-Ijd^ZUAV22!{fx6Wbx#=Uf1dx>EuH z6nWUd-WrE%qq&=$4nN?(nM(EZoJ)q%{ASb*2h#I@h@hZ1Z9-~y>K7FKeq)dq*(4%y0ct$cyPaSpD5 zrNIQHY~VB<4?&RLaq;#RI3>+4h>$3^q>Hv7Gz>{Hm&^C91Y{9S8RJ^@*$`V}Twnv7 z3BKaU1qsH8o(Au>H}Q++SdP+xU5T&%ux>*q{ad}xV;uOux6|OQJb}4`Z=n?7;6=xP zo#!Kp^7TFsyq7*()N^{<8S}RFwA2S&ET=F|2&Eufd0Dn%?%RsJ2MYy&U|rD*2P(zW zhbTk;Ri{sc*E;FO@{p&-wK<$;`4%sd5z_kRJ#;DlT@s0}58+g3G9(YOC)eaSst^{= z1~bP1pj^01;j}F{ssx#Z#jhRgbdHN^GNf9xo9K%GbmW-ahh;y$JWvU_!A;afViKR* z?Nna2Uw+!0d0TQOxF7yu!9b4SpkNpqT-efd*u)LaXykn;YqBYDW{c#E{4SHjIDXgx z3#Xzlod#sFp9sXO&o`;_zhH~!{4Y2F6c}KevEmOu{p;n8!?GwubRbZO@SGu+EH1dQ zJ$SkV>onhL6gO~Gaqr%^>e06vt{36(hLpf+cw`2ju-aV>$822qL>yp}-WK9p zfz@=(X5WZZxPsvg>yO25j-Q8`AkFwS@UXu6*kkbuOw>apon>_|JA`kCk1YwrB2861U%lxnf;{!#?~X7)|XsTGrB?+q2scrT!OHt&YGfq zPel~IzG(a^7TQSdB?Xt39hkX=$s%6N!+k5RATARZ|1?|{E*~yGE^m4OFw2H;Md6CZ z6@x1lR~)W*TnV_mbvgk)xW2lsB2rghTUuM+Qr9eLLvQPv(BbO(y7Kxu+4rhQ^^&UQ z=IYu=c~xn3-QwzsrU>daR<_htG?i9VG)9`5%Ihm4i>peTs)%vrKKubo(#xwN<;&_@ znw!$g>zisM}IlRHUAkMOG~@t!arw>dG5eH8e*m zW=5JC>d_;#-5D2Ug5%!>S65u!aFvF~S2s1(l&%U_*EZBdYJt6!10QaTG=m$Fig0ON zSav7eQil|$I1KXGH|tO zu|iQ;2mvT8oY4|#T!oR`Z|3ASp*c{I3AXegyM5cgkz}_T9^}B2PxjO3_6<0^I?U$h zN5rRftDBlI?%~SnNDWYw%(LR9ep-S%^;<Xy~juc$){jn$Zyz%n%4Toq}IgiCSN)vFBZ(uWXk#X%nVaVR*eSUh47RPG?h9 zX_jqrhRaD;vbjVl+I7p7eCZ^?(jr6=69qZuSJMF49Gh=6*T4h~${p-i~?f&e} z`K2{Yk;axtOHB=gslG8>T^Fv6)YdnyN?X!czXBliM~gI3&fIHgS*%^^MRicFKyz>gGuMB&oU}n4T&%F#M6l zC|SF>va!CleR&&&rwFWy(+2v#!=dLb+-a{r!kzZ`2i&Eu4#Z1c*aPscs8Ta3+ zcsbH?$U$vmdTB)|>_cNydZezUHqwY*QARhT4a#2zF8UJQKac#vH0~q1|CW3Y0z&Em z>X^Z}hTs~COW7s(Ya$I7UOW1K!YG~; ztBHi^-V}y~csUd=$LNodH~5g%aQaHi%Uf!t$rk~%H8gie++lZoR^O|fPcGQwKX&~Yj#?OoMsi$QMCK|4ccR0|B82uNrq8bOcXh~rzeE0~9r8cxkpFdu{O>yC|I{IWZ-;yf&a0Q+0AMeD_;tW` z`3W8J>&R1F{PXCK{jaA`M)lhO9eEw#ejXUdkmT5@^2vZH2MQkCA)hdPU6r5KA)oL- zPyR5#oIk33HefIQBEa-hRsMLuw1Zxlx?I7NkRSBG^8i!FtNcp9ltl%v1nlMWI>6rc zPX%?8mbdR)0efk^1u*+M%~>XgS5!sn!tfZ& zTWYYdfaizhpCm%Af5Ub&ZGAZxb-9N9Bj+MKcW5=t#mSCCHD~t3e6-OTXU|K{efp-< zk4qwr?h=1r+U-SqxT*SRuBlXg$~eb|W2o%ga6I1*9m+q&Qsu`@i9diJ_q&(KO<0~` z@#d_NE6~nDv`<+kC0>~8(b-c*jGtK;KAdYtTVU$yAsvx0BOh20)`e%;J`vVl5oADg z=!Vr(XyB4Ig;&+L;HfU$(iCYc+6Xrd5=RdWZdF=%N<9Xhj?b#X@T3T02mtK{q;u93 zrt2gN!21eUH^G5Ns3lTUgTPAzSNvRqA`nvr8WD1-YfcN#!aZDH2~nbB=omHmP+5va zGif4{ifV>fP=o7s^s9LVmd4>yG*CAzvJ$}>WQE}=V$EVNb7i+BRcYaw40xdEilM5T zMA;a@jKV61)RaXqwW>)2Nb&Y4Ej+tE+|XE$ut2k{EPL48Sl>bmi)la^tHYFwu-gq` zE?wBE#>Q3QO8B}&Ud_-8*80^D-biwIZX{d*kKIDYDeV;k^yX6rv1t(bA5fdhVsE~Gvu-u+^Z2PM%Zj(ePb;I{oigvRH2O#o;D^rIPDb^ zbzV3N&K+iF1ymN~$d!*UJeA=GCLTEN1MVUZ?g<^}r_J*AC*r_=ybL+ZzQ(4R2(V)6 zH6UWi8AMHig~t)FCXd>LdSAl<$qZsyD`|H^+%D z$gme=?kAL^FRIK(BYZoUw^iYW(#F!-2#CS#b#;}k)e2#9sa7(vpy|>rUao^x{ifHIqCU)+R(K2Y$xBsET9ZnIwkz7~@smz_2Rmj$y6Ry%1+HrZbasG}jlYlb zslch2#0akR0kDK}BBG=4BY7ps5;|h45tlgG4k1;Ns&7Ax7_7i z71Akd&LD;xTFN*UE@NAfPhXY;DlI8_1|qjO^$rKNN(Rt8!*MtAxDIR^D8>CISg-PS za+HU1_Lz-ZbtFd2D`V7Ws-`!c^KF(hY7q>gjdd}{15r|lVG~m^3ztNiW$M)W=7}5< zn5YVeL35fb^PR`>43I+`E8ezSrxl_to7GNfo3RcX(Tu~m>5^}NQQk}I2-0fvPG)-Z zMk3G4KNj%jk7C`bnpsti)9Y6p)>4Bgeo;k*BSp3YE$95;9`SO2CKGq=)#Tw$eWZ8? zy!DOs4UD^Bl-ko5Mmd>PSCQ%5v-TY~iJ={BjI~M4;|jH$cWUB^KZ6GP?N8uNx%7^4 z8$ERu)wYX_z{F842&A=vb{M%1F{~C(9NbxQx74}5nyQI5_Mk1wvcIQ2=M$a#0NlBM zm4-WY8*OleJVAU!hOM2(oe}07Kuoy3PFjz;j7_(jKY+I)o&LqR(&q9id)kQYNMnr6 z!Dowxt-E9~^dGw`jg4QR9Cgc=xEr_+0R8=NCFAOYt0%4`T(pbI&mV{9gK>G&#skji zW&8ez%$hb8&H^0-xNWti;nGSPFS>X&Tz$zgqu&5Gy0o#;cFk%_8`9j0^j23?A#B%# z9kEE5p_CfVd<1N`D+$f(!70(D$;pKl;ab7*YXNJQK&ivwtf~f6;1NM@!Tn{kvKe~z zNTpvx?_VyLD(Fu_Cl1R`n^v}zo-FkcjV?+-{n^_$YKU6kbJ5?B|40j+rn0C8)H9-u zWw4eCj5L*(LT5Ko*5IC`O>nfS?Y6odl$)?L;%HaWYxlCPG`wvpnQ#QVu3&CyxCFuB z2txfOm5d|ff$n9vg!aGWms(-(T^s|34#19vtT^Df0iJqf?20zNh6j#6I3we|*0aV> zoH%jNuSE~C1}tokot}O>^!YaWasM@XVk;!JX%jixSZ*j2*`9U#$#zC`KQ-&Z^-==% zi?s%Vlm-ojBQL5u_q~I zNCw)b_l*~2n0x(kF+Sq`^TeN^ZraDMRXxT?sqgvcDZl@C)l|?^66TK7l|5J2g z1k-Io<#ZH#(AFZ*@ER`C>Mr4>5%}e}bWO4ym;Nuu2Y9`Ip7Q&Q|8F0gedE4vtO8rs`6D=o>5ePCSP_@LhPOPo(k*Q~nkFJ)Y?gEBGfo zGhXF|8T(T3zwpepgcnZsz@0UFk4EJa<`^otO9wcrLwUm9@-cwvBdGe(9rC$u_Lfg@ z;I>#NVluU*JaW>wl&NFPH4GfZNT+|&5x4RU_l-H) zHj^m{`I_0pb(`U?_HG9tC^Nu)jeo1Lrc}1kEdg-#7+J>VV+n1Z>6r78a zvRvg7yJTHG$~HB(EMKv5)zNLu3>li1{`)YbrMF@GEtq~wowgQ-E&hG=hotlT>FQawPXUL%DYt7{e0wi0<8s zF)bW1a_`^W|zDG~He{HhSzV|u9|3~(}t-B8S(H(l-)?d3o$6oKl!2dyP7`=Dzuay5Wd;kBD zfAoIum|xldz5lQGzc>}~8eC8Ij~5$o72^umn-0sHaIZMj%lg<-|mFi>$=P|Y(?a# zGZW4-0g*oheBe+uU|XhK3`CpsNj^izxaTkpm+4&7ai4)}CN6a@aasf8Y8}rdhD)$y zi#X>J?M;QSbEb>2Qt-ox{#GKu5~+am^Df%uI`SLbxi(UVSk-}KSsN?QE@@8u-tjLx zmXp2Ub{xu%L|OXV6Txhrtx)hJz>u~t*;h55TdCMFD z_()vyaVZ`x!1F>}TyuHT7dtR+a?BaySG3E%$yIh^>59e6BjunS!J1Nx3U&_>@8=nK zl<$&mpTXJV^owUk80#!`wh!cXuRQ+qUmh^tx9Q5-W-jcT&<58qbAVg&4jaad7b9d> z-zX0=wC`65%F3lA?%w{E0(QLV74OmWM*V#WM|}L4A02T$jivjD9Fsn%*@Qn%+Aco9G;n*nU|TL zS&)^Hm6?^5m7SH7H9RXfD=#ZQs~|fgJ2N{gJ3Bikdw6zkc3yUVc0o=?PG(M4PIgXC z&hQ+bWY5nj7@jdab9mP9?BO}XhY!yko;N&yctLJPZf0&)Zgy@??(p2)+`L@8t&o?I zmzkH9mz|fBH#{#lFE1}YuOL4oKQlioKRZ7se|UaweqMflenA09EI{)GKwW@p1xPAw zf+m#PHMZg@3=b|x$TmDWoLL~m3E*W<@ZtjuBIlKtM|FVfaW&w=D;qdHA-6gqr5rXj zz;+Hrya`HGDt!{+s_m!teakfAP=rsTcW( z@BEmYXXYL(%AMs zymNLf(y{A}*IsZqhfu&V$_tbjneY=H?A;z$%G%dr()U&i}^lSC&%%FBp;LbRDJ^}>f`yCUTYuW=XKuRomV54f?D40be&_uU_6jqh z)1b_pyuuNqCLgkJ{prZO{hoUtfBL!S-~T|EF|jhYaKwa(lMh)`5m|rcg%>~d-19LB zgOD_N?)(Ld7FR@0JM&spdF-io-~V8DOu~f86_M8Ux8C=_gRi`{`^)1`IOWQ#A9(Pw zC!Tx$jW>%o-~a66&pkhR>a@8>EL!}h)6cl&&buCb= zjqO`k->diH<5u5v^O}3_>z3H3@5D({r_DQZ!J^e`?s)9wSKiwF<+qJZXEe8*o0^t> z&CPc`_{8(Cy?epf^EPLk(f6+}Keu=4v?J&H199;K(m(&Au0C(nm~j&}o;hnt%ac#N z@ZyfwKl*vE2ro`q_pZ5ae4wZ4OIUkDZ0q$_-{9JwM)!bbrkgpYA3xaV^CyI+$93}0 z@f&8ZP|ye%enZEUi8d`G%BRJ4wWj)e`sey}U$>a)=E24=Lo*Y6anXfl@BWL!wdT_P ztxsC(wi!Kq>;7dN;qMkq3U-O^61~(H^7Zf?;U8j63=K7-P0h%R8fy0NMH#I(AS*rd zFr)R#z(^y`80pUs46)YjO-Kr)Ck!)^+_FKOe9_&NzX=dvKMo%LyM)>gRre^Av->(M( zK|N$e;cJ8OT7urm>YUI;>#8T}-D7%Ly#xKUrRFmIX5&8ndHqHG<>*&}uj;SqZ)iKM zUHV7n$NJ~t-R2%0f~rLi7%_V4v@N7UgFMjazFODqx=BK?ET$q+VVBnmKw_J9`mDg;&@t*r0^+iQ@?Oix#!i=l0 zdFI(I{_Z_e`i~y-(LcV}``F`V_@Mr&1GDoBiw~JHeHH?a5W14`NaeDomB+0)`O52V z-nRXPn{KYFKWkCSF_vKtGb#-&J*{_ta-yal zyf!b`Efh!^F`>XH4+Jy1S;TOJ#oM*%aLcRij zXl-uy*1NR0teE33tZa#Dee~ohn~>-y<^TXzj-1?tQHn9FMoEj2NRi`UpQ}QCzf{kIoDXq)c5q zJG!f38UA2zBg*oHLcRdBYU^M6ht~TJsGuE1y_hF&Y#rS)B3_=^<{Eb(E(LQ*a!BF+8L8KGspFD-0oyH^bsgt3)j9yhU_M z4EK!=m-PK&=$0XaGr~jbuiiOS-&!)P&yOW(;^%PgC3{P9|E2B9)k4X6{bF|IT_0Oo zke+l|K}N4#lfLegJZ1ONUDKx3Cr`ilzRRYI=SycqUc79Ecq4hH*tu&~#;(#iH@$b+ z;V*o=>+rCso4Z@vI~NX~UkroegO3zwT5(iH*LW=g#ir|;d63qp=lrO`U{FgkwIK9> zHN+Sh7@VYq@e@Rv8Gr)whxFbWKJ}{UCcdhzh4dbpt`|UIm^u`u)<-w+zBphD1+*@D zH>eYo25$V2g%Q&GXd_TJ8Z`$3J+NZ%G}Dh)w274@p;4W1FTDWtsaASx#TveOYG_(O zn}JVkMhD6?Js9OXMDGcFnwA%lf52P0a_Q^zOQ8#GCkbpYGGJ^J563x84W; zjny@O0KXj&)S$+-7Cl8biw~57qD zfM4k6M`fDFXt{BN(94jK35oB&gnk{8I07#L7X1U3Czj5?%2+lbao4Id-$$x-s@ zMjDtc{9uMQvl|EjmZN=W0Q`oeu_+DxfGrc+7;^@n)AU3*;n;Er1ayBN^K3)pnOOlX zR_kVIaln)yu~?8;ZImhewSH03x?4y;tv99;{WWzh!CLYVT>WtUjJ2s;pKg3OF)FPh zg448%tMOWDw{2t^|4i+~fkCYQuSunEif8~J{v~}WgkAwZO%LNRk$yos{wW`VfB5rN z#zXje=j>hqp+Bb?(dP+qR8Ksgr5S7A*TukOJH7TrQ&cehcFkC|%@E1)c)m_ETF)}Y zWlnh^wXNrxKS6=#^L!c&6qdH6eo|zbB1QthBPs)4=NuG zOf4U2;+aHLZa^CsoPy=!Ax;}FC!3;s5IK*d*n)f^R@4G`89>x!hDfhLG3MNXp3G_l zz#QvIL(Hjmax!khLAQD*XDQfF+8+QYHdnoFh+#tkurEhFZHjRLr=7VEY2xG>r=8)$ zOfhPigRS*7LmYaPgYBT>HF0V>ibaF!O|R;rdlvwmF|Yf)V2UZ-0DOvOR+{1lKKDYY zVR42it#Xk0NBP9CItN+I=Z2Wu1mJy8v-C1ctjlyTe+N!|+7-ZXU>=!hi5bN9o@N#d zH*K!10p?rtG;z_j$YA}qt~14_2LTzoHs&)+ELq~TnQ*)%dPDdnqaGjT6BCv?Ij!#q zF{;7I`EwCMReoS2bNeM3;=E-5$lUlGpE$c2#n?{ag+eTdMb0gzW`6Xs5HB5y9E!tp zZT`68BTWM~Yhud))F7FM{a}ds1MTYO%1d-H8X|6< zh@3T*kbyAjRH2{GzHf=09JT4lc^x5!K5UXe|0+$K*4IJ()iJvG6PY#vbq;>m5H%F9 z{t#~cu{20^;a@GW2U2am4UH;Zw(JS`FQ7?AI5UePJ{UQdf2E7(I0b8wbM8x;c$;(f z2H^DF3EF$1*k>sARoD_&f0;Pmr_LSS4H06mjz+Ob6~abv z5`d?EvPAbmDAo;ie#Y=$MIZ>EcSsjk^aIcf#cuh)6t9prm^pL8!e}B`;UauU^y;#&1y3-aA`jw zK1Qaw%XEM zZ$-o7`zD9(aB>;qGH*5GLet9Z;$4_9P7C^%M%f9t32UPPdlrNO5>K*Ex0$J-w*j~e z`Lj91kFjnWt|3OE2;OkI5Ib4^L9?#}_~tHwP>fR<5+Ka`fo%`s^~5Fd9Qyt@-WF&ww7t(HkN-y(*n(1gy_x#_qxP@ zUqWJ0#4w>9F-&lX5x(gd|0MKq{E(#3#W0j?S91SNtP{?;!jsTd>m>ZDi0ty4W`7aA z5C~W)9$3excaI`M!W@(FDM@Y(8D|F4j;-|Hw-ph!)Iq`k&-m2t{yR+@DT74jRI8JS z>V#gfnFN*?og7;3h=Oc}qOigd1@_h!g{UD;oksL?{Ftu3zJN2(_lX6aqgBUPe`0iJ zDR=Xj7vK57au-K(ymH3`yRid{nw*TTs5PJsSJXB-fGZieS5cu+j*I~_l<;ti-y_DZa2h4Xqk!e> zY(so`zEknluunXFu2c3b421sIgFyXhm{oMd@iVs|%bYOT5*HKw^*}%I2UA=~^aM8b z)kWQTHlVM=_{UIeZ^n?q*6Np@RAY(5;5V6zELWdM4OC$z`{6K1A(w`x(dro*j5*Be z-9d-hXeG3_lsEbM{DP&FGx{bUOwnBqTB!`1fHu!T%ix9C1hmS+NvS7VW#O36-ojDB zO`;7v3bZ9qYvu~8YhWQX|4IVSYMlbpt6*XQgznRlT#`APgQ?mOmt-bL+_(pB!93o| z`pc~Z|EFi$-R{J;?nYZ7EKwvQB&&|Gx`vjbJ#t1;{HE3^v=D8o1lg{)PqN*8`ULEu z2hc97$%%S2+Wy{YTPCpWz(r6!Pm;8CR-Zst349;|NoGiTI!V~Y=)cbB7W@Q$#aIHz z8>rMD<>moGxp0s!M+37^P6V$7z75PuG<%59J5JA}4Lt#4aj?@fnE-BvG^b}wV9%nI zN5zETr!g)=2`h&B3*Z2;W8By>iTCeLLy}`BB4K(*7RGd7VN^R7qM`k9&|l&-Bn5+b zRYOvW*IM1(hGYWAN;Sj;*(22u6WAlw5MkA$06Ddld~3D32gs%E1SoIh&<+5^W9prKwGgdrD@N}WXa=wqz_=&$VBmHDFA%8L`^1`OKynE@$Y~!~2Pxzm zsb-uW6QD5-6IhLX5Bh@B3BddX=z6sRpy>aJ1>*^dgo;ZAa`CCGs~TqCCq9!FXPDOJ3aF;+UaX1 zsBTDo{Uqz(-NX{$;C@Ut-TKGsK@kSdTO2)@L_q1m z3;?bkEC!(TUaOSyz_9`5 z)%O`<>v!<3cbS@WpBa{y2BG&jL*&!@Pq6|U60zoGwS%mn>q|>1``qj$gH`jGyT|M! zgHL(&;x#aO1aJN*kcZH-9BkvelTNPw@(WA z?>8?}>k}`%bP9yT`;(avqNnaAupxTuDxsYPV3l?jfC);4xQi8wo%|7q>B19_9D;wE zF|Hf$&U_i7+s<*=i$P(CZU+Gl3PW_e0mwn2zZ^()2SsUKsaAh?h^}o=4t7|>xdMuY zxTaVVEUXyUbCoT7Jy#}3oA0H~>$$Rk%PQp}OB+SJYB?htGGJWPaz-Y2morR|gQ6N@ zf*cfOewg64)NZM#1F>4)$fh+b#$DgI_OiVS_rWLrGbSbnQp%7Ia}73)N4|OHxN)Nd;%k76OXTF92}) z%r8B9_?!XIwH?I(Tt1foP<&p=N?zNsk=2y#*iOLavug)@6sg@NMA)<@Yog?H+nShZ zgH54f^T!-)*{0=S+q9UMeuaqrtJqdGv)k4h456C&aF70mmCbH8GYUiZDuDPQ0ESpW zX=gGBC_6KqfU+}H09-rM3gCb3jI>1m7wpVtj)Sr@+ti@Y&OE6Gg?46V+n^{F8|0|} zubuh-+|KNwNGSam9ty>#>`XBMrTUj6q1t111*4;lZWoylMUWoL>3xON7I$lC18N&tU| zo#97SO=V{`vT?=dy8*a--bq05c@F`_=lFC0ZG0XG(B*S60mbK)1QegQ0&w}f1AvFm zfefc0?Rgl0%jbLmiqF&W+>Xyxtfu(9nSirK5$;A_0=30Bt5bW^lV|l3=8HE9v6?33 z4eX2DIz$&=GnO^S!Y0j!rkKfXfXNm%Ain9LiQU{y*n$m&>0K?+gWDJc;;t}7+-3)u zKgJY`xZ80ib4*Jd&SC@>TxE)FECxX67M7;Q{Y!n~wG{yo=z^mweqAJ=Z9hjY)J1j^ zo})B9I|>EkXA5!lQAoh&5R5^qgt)(1mK6F4h!)BX9JvM?3UAr}nStJlOJDoU6sxfN zq>ZrxhcX3!+IXvH)EGR_b-WyR{p?QB_0w!PhVWlUMSbGrH%K@q@F4K{Tz4({_93Q|EvXL*G$I(4?v(-58o!- zxAVDouh566KuX5~*7s`N06k6xBPSWMB z=|XUlCE}1^@0yCx*G>zYSxe}#A$FF9xSy=wq9^>p+vVgj=YqR;&jhm1-MeRk!@`gn zi5iC(ITZ2es5=w`0l0H(EC6>X_)%eZC?Jn^w>S~d&x8DDl-dc5?~t`3_EZc)11bgj z(zYT3xkVR8<0O$*4Dr`nkz)=UrHhNOve&-xBWV*v&#Zw6pMm37S^>`D&puIzJFx+$ zt#o1nS+OYcnJ_OMhNE*lo1-0J1TKRAoe>RTTxi6Fa)6ioz7WJ`70OMRo~}yR(^bMwR|7>L_63r($n4~vGsAqw`U>aF zc(iOcbBl10i$}`>$dby3(Yi1ITLeQ(9EJs06NUevAexL!<)ayM90=fwVY(uKD~75z z0-7BHLL>l%|Db?T;80ksRuVAL>=rn>T8Pa64j!rnec1rE0SNX91`n>nT87W%8udkB zEvVVaS`*9!xgo!YfZE`RhZgzwmtAs$XCSJW<2{i)z|IB_zXMMJwwN**(LWWzk_p}j z787K~DtHW1k03%cQ5R2SxnzP7UnOpqkB-w8Sqzn~lBNxrSbFdMjc0QYtqh;g@s zWS@yn#pK)`bu5y&Z;|%9MrhHkBYV8T7v+D>9vqa9HP%y zrrhW$`Le^ymp#9mFZkMP8((m=oe6R(yf5@T_GqNqY)B;5o|@0^YN3m?n0D5&s{}{0zvU3~2P@VP_Z-+1mkm;3Q@g7KNenf-O0bEM+Bk`P zQ`$HKfUAv*0Vr);!e>Vte}XQoWG$tQHxf|Vcq@Qksg1X@{{FQwe{F?C%L(^?SsMrD z!C37iZO6k{omh>969CDcu>j)X+mJm=VXOx7*S}(;egYqz(MXmAn*Xukmwjs(a!LYedKRsZ9|%)MtQF z6Oy!(l%4@|q_(dlt7)dy-V_t0J#~wqw{#2=-6Bk|O|CliLS%QdQoB$jtEmtfzhR`dVw8Q93_F<~ z2_=^@-w7NtFF%mm-JQ8)%bWC{E&U^Rbv92Ruk0YqM(J>%2Cn;4@8^D6v zmD&sfN@|M{2! zgT5UAN&p0+t>}jxH-dx3(BrqrTgklMy?i~9xLKC#9#{cvciRZkeRLpq5cpev=|Aq_ zv*SO;BM9&x@E_5lFyTM;pJDe|PSz=KsikGZRY_n zPr_kW9vyBVKwpeUhc^JAFD8!;Zvmi=%-xM=IgQX(sGUo?0i>z()6z%v9u8pw@ww-x znczJfLRjIIYUTx!1DtZT`Y{0z>UuPoXTm($!wi|=WrnoZwiB@t{icqUI^j>~?h165 zpO=vvK;6;ZBmlCzw2K)4*j?JLVmvFd{Awtr=>i_q*^USsQ5OKAw#XP1>R-~9Q1mI@ zR8r0}EwemSi)JUjA;f!(;`YJ&C^zF{E zW7<*R91Tf)5851AX33YEwWAm-UW-+}eiHsM|8Wl9FGkq62(P9J{URoPzR->Y7kz>k zNv8QNaW7sPDZ)GM<}oFPxEayoqV+617vi8Vz$lol+w9jmihO*nL+E%L6cM!bK5;TB zeuyo83L=c_YfO=gS5LJYNdpIHcC;=!GwS>a3+1!kmK@zK^gNTk#6;2mItb}0hZ$lh zJH3S)32f%lEc|mkJ3K6?iO=%5>=7&ox@#Zijy^NimjUV7!gvjc!Z1zrToVv6Z{dCJTQzak zYWw;1%T4jkcRmsGux50{8h1egs^R(Z>ojrq1pB!ZbGhXcSw_fr%*}t|=)~vm0mG^6 zuH@Xwdmw86M3O~n`L?>b<9I_H!46pXSb@-o4#YoCky}5s8X^|#NlXF@^d9WlKVH;C zGGsY%NkEIEq(LtWwdd422G6zlhZz+3#Hs)URv!h7=0EY`_;^@}#2JvQ3;J1N`Tzh& zW83ZFET1?CL!G!94C=dF7mYoGBJpbgb5{7o`#H$r2N>o(tBKS50*IA-=Fq(OcTF5d zoHvGWR0Kb$xq@W#C7#DG(Zmxyk#k!p^aLmhqw|xHnRt6B7+AXr;Z~^C#AD33;2Z#V z0|?L3aT>T8&hqk`rsdgV#njV14sgXk$5cPq^Co{ zorVNRx=4D$7vq2SV0^O;37n!ykNXls_fHq%WCsfq{8xAq?3o?fj!L~>*5rpeK}V<1 z!)Qk(B;6MXM&0HqF=$Sw(A5r{!e;Pgp1|sfc!G*g8fFATrvMlNd>B8G8rGuy-=A(L z7)+?f?hl5Ilukk+Nol}8T2eX%2`rR^1WBn%kd*r0J{w<~L=g@(igdyadnp|JS$I%V z5jz&Fy2p`<$;e2&DTE*k+G9zXFcVa=lPbaOq)JeoB;2l(N#0H}w_PWh(6N(DYu8Ct z$nB&`XzL_XAO~%ov=!ez6X1?<9Vb8u-fb~ID;M^pSscJTx)CIrFMb8v7X~k0=hV83 zNsA6Q#7!lBkyy&4`$4z4?Fe1OVe%wi!KAmCbl)l;-rYme4a6mt+S3s zV~zROW1ZeDD!0}yPT}r;PM>H>E*T@?g=3M5KYceUo3}L?;>Y1=cqr!W-MjH#J*hDL z_^1Hp<;Gk9_hQ3v(}zNQ$DFgE1y1@v7mwrssDLpT^qDSlb_GPzE6@Vn*9uWVY~P^R zGcTE9$w1@`0k#)$RBQ)x9)uqLxSJu)P6tqrVly`2hk(-@prF4`9K&{sLC)Z1J~5cU zbpY0FGsS%*=OX~|P)f&;g13RKEEg{^64(ZEG9S=IZx-tX)Jd?h%d!A;MV&SG3h^$1 zzUWUux+QwD4k@_x2%o577q(Kl@5lsie#8J8Bl_s#Bj6e|i-Wb9YV6Y4LY%oA_1?la zC-nQlMspZc?~Clri9u+~Q!Vi`I|D%IhfoX_|7?jYn2x0Pkw4)sON?M)0%z6hVw002 z^xKFmFw-aQXZ>Nse-PR=|Net6P9^6q#7{8jZ}b5vv;}%k_yx8-ZCGrG1?Ws;J<1yw z=2$kglvHyY%)I9tNEfjt0IU7Y6?5t-rZ^?QM$N* z&mY3Lour9dAhanzXy(_K>*AFDc#Z?BjH?#;#Nm*ll%@DW$qG{xqYdIS9xF5izwDAS zPt!N|15sHUG?4;zkaD$Vyo9QP&$r{W##dM4dke5=tY&WdhaqCX5Q)P=uZoG|IDD@m z!zZ%%JQ}4Q1>0|MC^tXGw`F@_R9QvnFQbh98U8T`y`V|CPUV*~{I?2m7Ye0TfwnI{ zHbf8bGZi0-DKEFAB&Qy)8J{gN#OW-wTQeVdTN5#$D)kr&b-fVhgT1LWniezh6-~U! zk>cFE0Q-c`5Y-?paNk6{mzE7JJs7Y3^f^O_5|o6p5UD3>z5EHDgaLPIJ%s=GG9fBa z1Vbr{gl;`oh!!MJH>aMgbq=jRr!8T~r>5n<%2Q%U7%xT&S?MHHf^3S^Q=CdF!L8&b z$Vx%(3Qs4g8}ZiM&9DqrHqhDs6ms?g9i#B6XJR8P_-(Net#-G9!u)QWC01ZYrXB{q z6yxWYIagDQ0W6vA6Eg{H25>*5_TFG%4__|zLCxR$EFqW=r$wYbsde)Y2cZ*? zfGHvaVphTzbEL+&^oLIkQ3AD+ znq*7O7Lw3g>m{Y;RFs6FY?B(5&?YsTQKX&JT!VymQlk=F0dN!Aq~_14)J|$tf?LT= zXp@?|Nve{X7i_?mnoPKK?WN{pyIV}eC!IJk;Y>jn&9%fOmS2o)gz8>@yAT&d0yc2N zi9YeXY3B(2&{PyY7`F8qCcO+3^4{g}L|K@?#1d1iCmH}k$D8XA&dY>dKLQ1R$$d~@ zEKK0sk950D07CBtTI3gb-b2$+CBPYPC`wq?`?I#oDQH;WQ z9TE~@ncI~}y4+6S>T=|AU$p-wPr~qr{ghkG-!Ub2F{o5AvKU{%hNote@QXltAavhj8YK}I$P_J0sWa_Ml? zQCwPjq$PB66P9QbE&r{K~ky?tgr+V0z9y?HOm18V8U*90I8C80QeP$R659LmAz9s@^4W`{$2PV zZ6Ifn4irfpl4~~JLUs`rs<6-ZXR@_DLU=) zi%Ew-1+00<5Gk7iHc-Dx7v0{obA)~>w#D=ms2kf2;-?4lVfz=o2V?T{a?J*A){L@8 z@Ks@ETm=#s$T0H}Vi*fMx9B^Nc;*k9`1t*RSo98n!8clV**Jtk?6vzzI1>8h-;jR< zoYA2p@d+#}_ZO8hS|cM75B^gVc|-BB|Ht6QE{`A*K>$822s@)2{*gXu{CQBH7}v$1 z4r!^w@Xuw)HUG535;uS97sk^-|K%cloaBOl1oR78S>ujR~Ta2!%og$ zurPf79iLsN>{={*-vvO_zL!lg=~Ji9)gS8OI|9f7KU(qH&cIOB@cuoUJ*dF2aAP;$C#qk2Y_|neby3v z@fA2(?8grb(XiCXnX^NP5%?sW%*mPwet^}o&Pe!~WVOsmT4acgAX=iPsRoXQKn3Il}8~H9#zjHG_l7@Au1fKrD65snAU{i%57W$n! z6-SzqQxd_`jiyM%i1geE_bl#aEV4QUMbF2`!n^K*O@A9A1>J2vcCslpSAc~CzI?zG zBfs$3!1s+p9R0Hc#7@IR{ijoB^ey-tq2|=Nca|>BMl4Js=x-n@csKwIi22Ov_?c)7 zu*|vY4pYoH&nXr>(G-1F0HEw7!laM5-x<+t%>LSY>=89D(R`xkCa2i4Pb_iVnGWhj zn|$J&9u5$ONK7aNz%Gp2i`8kdgKg|-hKQT!VEbT;AuRpUl?M| zT(m>lj8jdq;VmbpB_3atL?lAyj4IH@VfZGV1m-nr;`^}@o<7e%bq=838w_w8QhPd_5GBdOp)|wUvi)h(i=+n=%_6h&^+)ls> zPvn27#YA;0)@2FAbVWf*ICOhj8$9Ai-3q-oxGkYDR`-RX9JeSAH44`t;`PI2cB@Pn zexpzNNl~kuQuKKW4vO(F@xa61)Zk-=p2D$wQp+OwAAy!f@3RpxA#*`6s`Hs`a7M3S z$mfCkmSgGk<>Iyiea}V!{)Cxr3GzcUz{EcpOhRp!YsKJHU(c&yd@F(WQN_FBNRz*bxe4^W5Rb% z0<6B>i+G14c`Cu^kPx^Oen*2Mnoh_D00(kHLSLW&2Mxy5Zh$pZ!hvd`EY4I-*Tr?z z=wQx1QhZ60E@m8WOYx$^ZH%rIfB(NyOb!ZDpNUU=O|;cV%v@-U!AMmaW57sV9RI!4 zI-$$vBAS7G<;TmD=-vb=s$0~kQ&jJE04b_30B}Wh6%cW_Q`PBnmEfK}H=7Zhy9w?Y z$5zfYI5{q1T#JR&`U?>%TW-|)%S}*ApkG{nN#rFS%1_}18cwS=gf+A9fmXwC%juDlC7a;XaVNCD_V~6IY=PCq{5;)YL~#p z+xaMwph|F@y$SMd114A~;g0u}NN6|SD#0CZVLn`juK^3sWQKR_4*0*Wg@?1lmc$`P z+LO7^p&^hu5dm>B~c%wp_Vz6O>%I z3BOS;ioG2u`GpSrR=L1rUxV)*9sw_0I$Xw^woflzmj`Cp-mT2}af2ycf0=_fg~Ti0 zKw#+M95c?8o~kT%`0cv*{A=XUed}Lmij(Mu5J-o|*1u8;nP#rVHh&*1(KtHh?br)E z6U#9Pd@)oLSJ)1TW>$ZviN8hc;Wz&>)Djq#!sCON5`CVwY~S#KCNb2(FFQMZR+1F1`l)BP_eoRTRDz3s3N3agtSygF? zL(X!5d2yDA!4|a48MVn0#~$qf2{ne8gcY33xo4UtURI;<^xKv=H{K!V5=^=oA34Bt zPa7gtIqQG@rztLG4hj87sSr8!KZ5s#T7L%HN@h8p4wXSD4%MD;(#Vv&6={xMgt)Wx}2d;9Oj3iX(SEOEgC0AFCd z&N6f{`4k6uq^l_=%yWSG1M#jO))M{})DfF4IiF;mwa;53xd=JLw)X}@oP?2-K=x!q zoD=0B2z`n7>adQKb)GE1=Q_`KfcR)jR71`s>hUXt)B>_t?Y9uQG01rnsArvNiq}G@ z0|1@4=?#3*9P6|GT=g&e(GpQug-KxQErxjM-hd6vzX?+XYb}|R_K+qnLrW6)`)ETH zPI8LP`oa=t9^wGuM@(@d`YMZcegsmB9!bDRGQ~?!BoY|A)f96fs0e~;=J#DR@h2z+ z3HYuu#9^4=61b;_F2;P|)ah>-q8lVb=2Rgb^9nSc#MX6+A#T9TwHw7(-B%JQ1nQo< zP4NNdn#{T98m!N5aDY3%g~GbjX>>r1PwZXg01thkizrM8S?BC?H4%Z-N?`diL)-_c zmB8^g8RAJr&Y^`qaT;V(=5+s)5U)X+B%xE5;fEZiI@sdQ)Wl7YO<62{haol*AfYd} z7-BcXQRdwExG5gOB8~`zeq(P4-^2LFylbpal#U4qYd6O9%uG}41ew;!sD3SCKQF@8 z$(*aPvwHvA0Qw;a|2`&4&09{+r(=b9>;<2lQ?m(Mj|7PApZ|g(JQ~;VVcZg5})0n|yj5pF>*AXNV5u1c()oYnU6mY2uu}11~%C7*wYZ_Q%?Q<_}ro6Zd}Ww3xL$lcd^b2iAx`yOiBOtkNCT|qi3G@ysVP1&?|pQe zho%;9^oh~1OtNzpwDPQr91652vCO*40Y1cT(xYsY>^5%~8mH zQivb@PMx$*5M8|&Iqbp|goKV$InN!2jYd_c^G8D5azBc(+s`2~x<>(jzR?hULr$Zo zKZXcE&}p>r8$;Xyg(%5+r%4xE36Pv!c)h>qYbWR4O@_!Jz?>)M8e->H0D@>|+XO?r z8*m7HY>Fi=RD@nM7w_wJs3>7MK##Wl*1Og=IqZ@T`;olt|9Q7WIIO~wt(=v6jg#f#dc)BTa z9&?KQe3&U_T?c@|x8!jlvY&B)lZP8(CdHB*{rj7`i2ncpvEBBrCi-8BMhV<{mJkbr zLA%%|*shHu1z8xZ4O4`;`5^~e{gFO#Qot#8*&a(+|3J=dX!Onb7_0}KVjH@fB5$|T zxvRTdVsQv{s6Zy&jEMn1M5>lKIAZWL0p>JM#fi#F2Y3UALsr8}lT)+!A|W373xJ_$ z=lBJfn)4mhxkvlN3<8|NYd=9x55kzTr``Uhi#2Lyy`FB05wJFr@i8w5(TxD7^P8tw z;`En*nsqL@zz`RYKn_*SF+NiS(t(XCV8>VR0%DLuLgTK17yXFS(}D(FypH32a^#+_ zH$>&b0H|GFsql&Gw%MqKjx$5TeBlsFq_6?}bddQIv|LZk0Y<&6i{r*Pz=f~l0L>H! z_2%(B10t$#yq!$&$LWu;8C_IQXQ4kwJ5kye|MFbUzs1zSd?AQ@h zu)|{k#qxf?Gxy%yCGd#t_x?Wb=gl9RIcLtaGiT16nK?68e(T2EhEY-sAI88i9I3wg zgejh&AOR3Ma5{q3y=ZDcT=yB0{05YBctV#Z9gdd5ST-yuQn9%m zen&If<89^!*eMUghh%J`DS{WOaG#o(i&v`f;b*Y7kG*Wt#Fm+Oa$klW-+;!g17c4A zl&xSr)p*Rwt~!7vBeAMvegvBIz>?t}hwM(A?a162(+e+t3?76m(*cZwt4aO6Aj7wj z%n=2K82%A}`T)K!FhyhNJ4rU-OHIr!abkXpnj-ya0Ib3O9Bh?ubI9PVFM1C})-0!A zW!R0(jlhLf46zT|M&@=s-dOw=?2;K69bu9XV4+Wb38s+@Y1HA4`OXxly~7c|yq%_6 zMPN6~Kv~_v0PbxTP!ke^R#*czJpzx3A6|sLnG2u?zPLp{Ec1z7_~0sQ4hJ|P zy`jym6@v<;(U?|eZ}qxjWc3T--VSPB|9MT^3ER}ZIuW09>xNH#LHg_&m~Bs=5flrN zn_UaQGMtvZ(FbWBMVhfMnc}H)9AK*jf8VAcV@#{&nn-Ep0E<5jh{k;#GCdpXS~sT6 z5mVgQ+lirnV_z583rDkl*@$@`Drn94fLMrOB7tuvX`(;cZudnwd+)(K%vyIqt)IRi zAZCGEvOPBx;e3HjI1jb1z6~F=Vg~SAHuq-)vEBqw2N`^SM?idmgC3dnm^58f!hBD_ zSi1_IiWm&`>*$mDLOjbPuj5>@Z9r@z9*i;y(o9i@5x0WTg*ao-+ropzSOKkG0Cd(Y z_^M$9eTEUn@W$^j<3W8g{L_knc(}3(R|bb7kX7K#8?j>e<#Bk<=iv0K7o4j14M*Z% zG^0ZReuR)zCSLv>Of^)S;b%XC62UEaR0uS{%y|2(V@OaNKb6c>FjL{0D` z>vRAwJQNV??{H#%tPvEq&OmySZMUINoD77%7%eh3;C%CaHl`mw)pjYqO@_uZT>2f< zKO2B>XE-^{LwLXd%_tcM;~n%2x54W5BlJ(!Xw8@gC!;G^f6#w@8eW4z{YmrlQmj0J zGA&$BspHR2(uBoSQi0UNWMSMlx{RY=W3TN~s6#e>Cx*Psh@CL;98N>`Cm>Y=yp!ux zUFZiO_~siSOjGxv;QQbWRi`#EwJ+AiP+}g!U~#-@^TrxtIdRv>wG4)_S$(4r>DQu` z_}m{n9XZU-dnF*LvTluMPAB^Z{hoh zNk8EU&G>!`_Tw1&u4dem8W7*XgdqN^#xUfW-@6Wz%z?0&CFNxh)B8I+(Ew0eUMi3m zG9t%T`N$<;LhpKpbfHeX6e>nf17GC6D^{o8Vy}1s!kQ%#`&yyP+p8_z48#L&uc(It zk~Yi!bWKdcW*kXBT%$;N`Xousb(t7VXb>QE3WN^wN*VNqE)J(OA1N*WW%;q@!F?X#(;v z)fJwsUv-fL^AOas9bS_&{)Jt5EH#-;%VV2t_JtW+4|0Uq@~rL*DWqk|q%U8pYT&Y3 zNHIzC)qoVT=;>|?hFCc9!8#l1?T^te3Ko3U3Aaz2IZYvY0#PA~0}9zBe}*^40^(u} zV35mvhr0O|d;r&FthiaPbccza^hi>k4!fL5NH#?^=tkD!5af=vU_5IP`t?Co3nDTq z^7?o=&OXo;Uv-254f=9%Q?Au9NdiJ$(vkJ< z4A8B2W(l0mF$aJ?d<&R08>5tI6_Y(VJ%YiK_p54NL!@UhIQ5aFCwaqQHF7@r8wTcv zT>&x5mK9Sn>+rPaCS9BF=PjiZPwSZl7ugc3s#OaA>y99K*stl$IXYftMjezN@ zC53fV>aU%egckr&0!r=sP}T4{)boG>kd5p`zq(4C7!Zx1kjawL7gR>>7_zrG2pkTH z2%gRf-LykdNJLMALS0VgmOg?fjg+=Ae}rAhwIp&^Ea73UD?tD1sf)8Zs-ovlQW?{& z5X9~6yS6EWE0Okm2SJHUNzg0V)BFg$-xlKgZImuaA>VL|<0BGzeDrIkp#kg(V8er* z%Bh4|xE-PR#lh!R`u!J7QAt9RDx>g2>2*Ey1X<~m%w`e>3*T)bH#XRi>mCM#LlGDWd{fYX>bEy9eBe@_Xn z8-GBH$SQk#7%cK6iy8YziYYgErrwG*=pos+<>Gq5b7HreR?MP(`1&mlN6=g~u&#Hz zz2CLiep4~_{;7&neOyj;ag>&a80R3c=2kblCS5E z2Nr))rFc^J!1n?1{in{He5}-!n?t^shP?r7FQFOXCm_m8QL+?;a*ZDZp>K^XD#XfM zJjv)jE+C$*sm9JAXY9nAOjo%|vnA&EtEWj)dj?v}rksOFmS`__5Lcl|T1zd*UWEWD zE+gWyK*fZ6oZQ<0psqt&L$K=?lXFQ>*<4s7CdMt{OI%f1DO=P~L8vmA4 zhYpBj<3k@VRB73Xf88;!0LWf*FCBlkt3pX&rsI<(Nc>$I} zat-4r4qoME1XpDwDM!%obdNyjI5-t%^eM-fse&7Fb;mpW2Y^ougW>vmEH%wvvBmb$ zGnS|{9UB&HvCW;n-2qmOG{rN84)E|eO_cr=Qe-7_@R3DqbIUZ7@l-^0_=^(|`t{k! zv-TKW9EMC*nu=wpb6MrhLs%<<5s9@~{!M7P`75NcEtX}8&56S1eR*^A9c+O+rgFK_ zGyP8ZpkhbW9X&B0YqjM8aVn~dxX`R)mqjwCOds|38t6PV4$GC&?lx0Ar%EXocf)kt z?pF4{dHt2}1$|2y^+I2PE-Xjh1)B%X5D+@nz~w30Hu20)T)x8wg8U%zEHF`udwO+U zv^F5_cPH@5Hl=whnvu97)8?&h7xr#$6Tx<>o7=%UeKfI~!)^sG9z$C)dH|xUT@uXl zd>Xq0LH7pFN5@0BJ~|%4_0c)aO>%NRjRz_4C_!DUK(GJZzFVk{9O;7)kbFCGEgX7V zp!IAqHenM zRtd~$uE2DJm&5+ie^y`;@UDzxSwB>aLi5Bk3O)m{WLZgPRWBmy!Oz#b&rU?#eRd*F zc%MB7E%z?%vyU)(gm-D52(re1X`eU@AbCe$UfOqwe&;?r6p-&eyBu9BU1nX}SBUew z{Ap&LoBVmV9BhP97H}4^)A*D?dP3dWkc$njfWV$6ho>u!0Qd)Vg`7#T`|ZukpJ5w! z(7l*E?v_*brHGPhWF%(ycua0NOnx~`b~#Loa+ovAVN!uHPBn44iaTd_YsQ9Ny13*6 zR!TD#;VfbX=Yh>Qf`OCYfzB$tx2h>t=qlU_+}gGZ^q{HM+!QUT1`ytkHJEm%!oT*0 zDGcTb{8f(!#A{qL)4X{T1JK;~SU_zIY{sQ86FyeYj$|~qA}cYz042+fgLe^s=6;+s zFdl%=aVD-zX#bkDGfrA1{SnJvg62^osag|%w8Ejue#Cn?0WY8aKR8X1MIikOKRMH1 z>qp4+YQwl(=iai|5NEOd&qlw1k4)6p?`hbRX^g$w#Al^q!01%{Ueq+Gy5ZRb&LpgN zE7tqDus5kl7=!-*%}GTWoBqB$Ei<5W<+GB({-`GVgqm~8M@8DhZGm#D7|a(GxLx1)ZXARU*$VGTv?;_l;CtRI<;J)Rw z(BJje8_wki_bn$PFwMl7g*AbTGYjiFM4nmbBFdgQY5u9qq;f~?)P--1u&G10qDR^W#mZ)2951=2{b-8H832BkXWw#X?K5l_>6x$tj4v_i zaDS*m1dxt&!hG;Bwk}!=QD+xC2|ME5!c{E+yojuZ;dt;$0`I{Qa2ni!Rug~&kMVd6 zpR9sWR|iiWRm_3Q4kL=``XId#5)WXvi_wcT^T7=PQ8Nu;I)%YzAAlOK`X1$%9^HIB{=zE^TW)o z59ecM$+nz%hVp2*=ym{o=i~jX20~o)5rE+})H4Pb;Xx)d>oQY1J6tpa!0pLATLBpz z9cSS^Kt6DA5&d9V76-~Ic(^&%22KT?rxPZ2^)~w-csbH2pKa3yq`vZF(dya1TP-Q zn9XMe#T5h^f;V66gnBLpK(g!W1m*PtNj4t0gj#lT$kI!MylWt1y5KbIG**Xc3Qt!z z3S>;zx8T5ooqfjOdt4ZSW&_-y;4_X@r}2Hp5p2#w({%ChyFpR)W%#`A+h~f71Re&E z|E4B>fya}KdFbMx(3SvTO!w|^X8qWSx#Tn);S)fN&_BV1W+oxTSIVm5sUM+V#A5Ou z#%pl{L3KGCPVN7g;;h>oV4?v>UFOV~et24P434S^fZ=ad#?Qs+NI&puU5vwM zYa15_L|Zf?=jx!Qob0BKz#|fjz7cGERyP&x*#I8I`yZPiH93t@@r-_&cpAet=X@~h zv@hWaS{uOW7%DUW4S#S5dCnw|t+)ld4a|QP$eu2SA8;K29{~7qKW-m41^{P12$S9g znd$xUW4@4zRlzq9biB}M&UzVY#Rbm47Z<0nUt9B54FAjVxJmAh0Q#bw=@9=bk2t^! z9~z?lK_`QzFXFu&ymC;p337V@gY`RRz)kP|mj%RczkrOu=XeYJsV4zEimbPFgR>AE zeLy_7695Z+rLQ46z=ONyZ^+=9$4#+CAZtD=TX{IVzX+TGV929* zsdNEqK(Fr?;b=1d7N?@0O$>KX zPNXG}{vMo0a5F)s$-OQpwqEPBbaobQim-94XvZqJT;bH(c}8*E7kB~l2;%cB&75;v zKoqly1gyz8>tN9YKFT&kCv3|}p!MlNG1CPKiZt;bCyle!UjX;^I&kE#Sr;h>t%OG` zvmvne3R8UG0O;mzl*4nX<9^&eOXQvkf_8JDzJd-AhA;ce7dpV=qqrgq7q8p}AUpg+ zK-@RZ0WO2@cZYi&vUjkJQR5yb#=;&*H+XZ%G!5~X#S|Ps$#V2I0WoPWfc@OApa-0} zd?j8WJ1r#YZ^6SR=QIUoeg%9Cu_rK1z`LSzaccl$zkW7=)A053TAx@l26t|Yg`&G3 zDetX-hAoCDo9(*jf;rbO3ZM)gZShfVk*N#Hd2n{9E)zHVuXzHrBqF>ft3#UvN_eiN?X;mQDGgpMsEcn(5Ol$D7* zg?V@;-b(UnCKowVzJarwhmzB8f3%`Ii~JfjdkLJP=t4G(tA*!rFrem()6G*O^SJRAIl&rI>@ua;=gP3V_EDVHO->)L>rM}j3n?+DFh z+@2E@kHYb&!9GnIeP{b}ThkiXU1VHBA80Mw+Fa-~*cV9X{-N6cc3}ICVJaRyDjJ=o z<=St7mrOuJpms1E>Vuq#K&|ACZfJ;u;L1g9+=uRSa)D-6xorGV72_g80bjNaOEsR& z3S;zMyy1ckG`9_Yj$HRJE@a5K#Pp@A24SQ@8-(%3>v&KSN3?Fb7Z4$LVa{I_a3X>| zkto%a34%|21pTVQ_C|k$)9}H`k9{?h4Zi5u22U;5;P5lZB_BC9LJro~*!dXX0&fDC z2%z!fFe*D(x|mJiRjo>JWe8Vu05ppRf}5Vi@iD?pW8om59w|k*NyRjauZ|oJRP7zT4(0|3iTv^Xyu%zRc8n;0G+ z3+{&rS&DG;%d1)MAbbGf%r~{Lbx$`m4OV>SC_OE>6aZZ2MD6Rs30t}$V!COW<)Z)d7NoAtVa{v>Fz+4?FFn@~JUak0pHWLp0oyXn*pF(q$xQ zSfYjPXYW$=r9NtO4W0&i*oSC2PJMFHdIQ56_Kc`8QBSsZ0)W*b&tNT{!R{e|^HJ`>cU=r*i)*#9H3P2O2kUJ3P zZ`Z_F2e4~mEHGgd37Z$=!RXLADkq897_g^++9i+*M(g4uSe7384x`2;$ZQ{?qo2Un zk&#W2TO!{JS?2*$xAeq zLwXL<&{4&^NeZ@mU`Akj2sd7!B?bGhz=9Q066maN|g(f zecnq|H9;T|?n_l3!hNaAL%1(hxd{3E4?dW!`h#7)&H-ds?*tIn)qvx>nh39}%U-I2 z9#K_tU*z!+u2+YL_>*28dz^YouZ|-C{(%iTVO)vZAbIIhQyMR~2#V)^mIjdVKE9HD z^d}V_`=};j4*ttM0dd1oi5JQ=m$yrXz(4TXiCf&Sj4~8LjDAFnAWizUAzVd?3ODKbNd5${e-}^uzbxbAL8W(TyK`y zT+SlDo+ZS4SXH-N6U5SYC*CDQaV<+iNI63jBN(#+KtWwioQImV>;*vJ@%7O#)LZUB znogrkk<$>sa{%7lp^1Al0pwsAWVYXr9Iz5=c_ggqdDT%`T8XZR-vU!^ft@akeiFdz zxE(DE7=pFv=a~t#V$0z_?F%$9n#R06Y zT6O`@xQ;2B5=aLyvbrhmB7l0Bb|DlLfjbaWx*X3NvW86a7;X^XP9_rQ3Vkw+05iB7 z=ZrH6FoTO9FvWT-^%#RbiY4L)3sf){+bqLyy571LnlSrrEUA7DDPZ&&LM(&NmyGGz z(G>4te}RDG4|ppytkL)hP2}g`rR-Kf(<9Hg5HDlYA!aWy(ygyc0#?Ef#@YLO^&?$0 z{uHJ5M5*%{<2xE(IzWX>;P;627GqGyF}V;C>X$18D$5<|=b}N;6&}^6J|OWh8kChV zbgLmQuN-pm9{s;@i~srF#5;HVMq*OZ!}amgi!G=(&J`#1F&vw2gca#>%f5+WbCtr4G*nWnbp} z9eE*_;n}xnqT{C_G4f)x=gD@a$iL132KO+;t9TJp#!Nb*iS6?g;MD1s2rg_gWmnA@ z^P{d3BD}n!lMdl=vz=sJSt^e-RS#TTs*ATi#x_?D>c_2NV6Gh~B`C){^V`s+)256gwH6 zzT);Gc7268y-*Vyi8>QnM_s@>3Kt+rbur}hnn!U35*sO<063$kFV+b%$##yO{dkjs z@c`6)cVod6A=b3OSJkj_A>BQV%1_{7PX{CPZj{B2FjDm~_%X(h)5KZt2gSg9p=j_r zNcJn17&rr4J;okW%v*toOQA`N$Pc?VYTW-ENHEb;r5C|nR#2R~JR}CLPSVWl8VAL; zAxQsplBRzOTipERA$&}u7|{>Gwa0v}p(#4tiFo*(n!Co~c`Dom9{3J!;=TdD+0Byy zv_zwBN-)IImQFQRq-*$MFUmWLYP`j*2w9E$UJ>GUq66$Nvt>S>{()ocz(iEz=7=tK zvQBkT4Q`Z}FSSQC7#(FbOuWecB)WQFEj(u|bS(!z$p{(0osZ|1&bP$mx|;q2Mw~JD zX;b_g`-79Q8wjFvFcIiykZb3x3y8~cv+X*_`df7aq7uWiG@~1wTy!|#B8&w1Fcs!w zeFo&qY=}L?)jwLIGw;nuAa;`vJ3x=McoQD?ePzs@&7g}8C;(+q0{da#Krm%hq+EmL z;Iq(T5@@*35P7(}A%XR0V7rMaN!Ac=>uiE$Ac3P#=^}>(AV%m7VYSMkXB@)ba}ku_ zw3{`f3m!tg9M%KE&V|ouTXiv$u?d=S>TI}XGZxHN3SsU5C<|I$2$yUcqvGYJsoc{s}u&d)?t*0*!h@Vs8KKLBSoj0Z%AY@v5W_Ojl0qQ{F^pC{Bs6gq!@OMoA$DL%UlUo&d)c&Cj8T^e9L3;B z20n&LPqgWSnT41&z%+vSXy(3$C$aE=%c%1?1~D}7EG2F(OVlp10=sv@NZh20o1lM2 z!9c*cq#$!OWp3%Mi{w{v*M22a-;ZXR?XsX$q4&O*x~9HGHYi(`#s(P0omx= zG4dzF8U5#`*p$5oONn+0Eh<6;2!{|97jI3b` zux!TsJvtWy{OEa_C~|?^!PpoJsTiT}qxzW(`^Wh7EUf7;)RvBt9awhXINCWV`8Dox zymk$~84u0HD-eI- zt;eL|?M$JkHA8iZ=Lbc&8gg!}8E0VuZ$}XBprzBS$Wx^l#Z4AsEr_Ni*Gg=gtrl2Z zgeKR{6d5E$mwG!YVkWkJ&}qqa%S9EH;!p;oD!Hl9tD+pEeq%B(#5cxU4tO8~bcw{t$|5o4Xz&xrMQ;YFdAzGHa zUNaKm9BQQ?4DZD^2cp{<=4?abMm7=oc{Q(;<>cEZaZZU^xG_5UY^?62E|DqD0t&1b z#jE-URW;5{d|3;hV1EeW9HJc8uDrnnm?kabGQjYiP!o3k>l%hH*MHPvMogiV9;eH3RfFNh___~_mJ-N#`mIWkrudrhR&G#i zhMcDtB-VaPu`M0Z=~spmUK*m{p@gReybA~Y0n63$Keja8^o1%xE=@}T`~yo<{bTf( zQG&z2COK#yUINH~P5N>buGW4N4L4OKEZjZku2{q;JjS z(DO&l3Ya1b+5?@d&hpDqbS%VMq!fibP;3EPvzQ0;q$gpY;2oDbtY3F6)XeE0Oj9EL zbl%y5(!fep{}c-kW6B~^3~z$nkNFUgoAD(cSPjqg7gWLM)sY_A9cVM@s|iL3kSR3jD0AKHH5=On}oAWs8!GQ2NK9tP||*gFh3 z0sw~riTuU{W`HI2U1jU@Gxv;7JF~E~>9N9lsC=tG7ZX z0~m53;{@K_(@Hv83tSTB{sb%@S>4PNM76pYDA3>k^7 z@>efX2&g+T1V;(>w-d?`cIU*f=b%Rlds9l-tA#}HrUs;(qMQFUvbfj?TiZ~`Pym$K z;3J4B0swinRw2Bc5v~K|CIa}FrF8>XQ3~L9@5G=7DRb&WmSkAKL3npSh$wS@BnfNi z$f@-s+Is*64H;`>TVDbY-=JCHVAT2$Kqi5K!A90k;c(X2Y5bRWX~(lz3g1o~&ctKZPX0~Y$>J!K%u$5D*e;T=VDE4vmR)Mjn5vQa~3 z#}mq7EITK`Sfe_HtNj%4JpdK)s*j5v@^q5|GNj(2mh6F|!}qK*M4odGmZ6M56)O^&*LG z=cFJyyDsNZuH2-^QWLn!=f(!gn9I&fbf0!eW{NgA)Rg9)OmP-aa_TIdg_xYo24Y^uWSsR^R{u# zTiBH1AY4Xa)DOXAP{#TUI23W^61xr-2mDY(+TJr&g=3j&Rno<6314dv@&nCjkBoIv zMUJ6)S<>9z2t^)&x6X?C$oXl_m^D=sU!oIZSOAQ_2~UNi{Mc8TQ5)+_nzga#G-Cza zyIM3yco!DeXTXUl7vWblqcz;;_SZxB4NRC=?$;vC+nRAbp0K^A7Q&xsM()D_(GTs6 zeS}u<>QmY@EGJ~Ueo-}~z_>kl>1HtMYHmbsGzDB{MXVjZ?g{Ta?7)gxK4S51t}s%-oUW|QA{btH zvpomgh%G_vi?rL%yiF79FgwK#1H*-TISaDu2fE;%S8Sq?`!?kWPFt>a0Ah2?+lP}c z4T_D-Ue`iDz=EWHLX}0#&;sSDhkOH185mcw3@!AzpSq$;jpd-nx7<7-Iz&KSNek(Y z?TMm9tg=h(w^Xl!L*ou8iC8@?lqM;^qY;RSG^O69oaY!xgd zrJj;f;^+VO1ww4Z60=Ghk?qS#6rVTT6g}D49`QNhSzq{9lF@a;`00ZmBOey(`xs9Kid0-v$&-t1;*y_zr?bGLt5QtH5r@M>wV+6 zS8_Pv-62ZD)I~A9QUdnqZVE=%3h9rqzAL6$Se7SRua}dP53Qj12FkWqIyRer3W!h+ z!qp*gdnuUQ7fK85GsQKSCI_W!X}z1Mp*<+72B3eUK65K-A@@vWDG)q0k|rjpmpTR| z_(qPOy-TAwNkexIs_fe+qByzyzbA@g!rCCHh61SSjSAQ!y|bPW6GDoAy;WgY?ZF)S zfDu`VZ+u(EoC!IV67RTK!Ble-njn9@2?S1G)CBpB0nfO2pA^-M=eOhT62nPg!;A#P z4!r|UloA6|MCj*(UHS$1F}`Vw#{y8;45ZrK1>YWNjxa{jbp_^J8}scJQ{`L_ zIkT5_QW=BsK?9mCv!MK(iT#fAof3n`lz7I|C{gIR$t8^22H|c2Y>x%3D8Id}w$5+D z-Y%gmxXl17Pw3KIS<5#it6k3jR|_9F;;`w>>cC3sd4*$mmChl5Xy#}Wv@#qH7) z4k65`7V})(Vobt=^O48<3$Ud^>Qj@f!wBy|_@XFKBZB*}p12PegdgdWX*o3AlV-N5JKC zDFKJi2N`zueXOBAKIZ^95ufuI=kU2V!hey^6)(Y#6|x!fu*2sf02kLk89ti}ar{T> z21!;Ggi8><=vweO0^lHlJdMWEv3#BdKAU}Z;INjmy_aJ_zNGL)H{~gxGMFeF`wDYe zrh}Tvq1HSXUCzFT)#VL@$%n8ufb67f(Cn+%sqRGAh?GaQoP=IjSTO+++4oknJNe+u z&x|D7>aGY{fgp1&5Jyi_2q-pDdzhAKzk%76SxCfse5Re#EfE;CqIyh=cpp2K2&j`# zem5UQZLWbs-#g_{N|7y<98~BhaBQi7BfXSIG~?In;8loA4G25eAg1mz#B*6_i3k8i z_hB;y`ZtYA1s4X?Qql~52WN^Lw$}hk9wYuX7GKO^w(>xeYTew1F5!A71)m$heKHho zJ_jdciQ+5NIz7eBrQ;2Sl6MTQAl3TcH2L}8ls7;n^m*X4z6Z3iThCU?EE3k#Br%=j zU*XmR-+QTuEy z(fS&(xr{wqYbL*V&seBqQM*{H5Q;2Nx6isPsaB5h#Pu{DEav%iIx63cc7_A<(rVb2}ba+R|GgLJq>) zk0e69Nn=r_S2N3fT1ATjy%PY1*`hEXAmA5d=&pD{mWaPB$d<}h3bO1oG{qZ}m(A8i zQ_QcCG(AL%m^{LIOGGN`6-BI15$-;w0lGq0-JPSl+bCW-GboQhB7^iW&p*b?Cf7KIWh~bt|OE5 ziuNl$#E^&{P8{bHLW&{xp_9uOE1T}0v&VMOL^n$O^}1IA#*B!}K{MPEh=?meB3Ocu zMnEb8?nJ)`AIX@3_{iJ3`TewjC}@GOFcjzfif|wNPp)L-QQhAAylNZuUgQ@&YWo!- z94IROFVlpQjhPs6Qi0@E3W^EjVQs^XrK+>`!)!?%qhi9#6I9cP7+WQfu<~LBzY2Iv z!_+W$7<>1}L{VF-1(ZcrECd{BV8qneApjQ0u~P!T8#}uR{IRi6HleNUt(b zKWk^mo3W96cb3rU%wWz~g^$8{*)%Udk_gCTTh<5R$m`?a|pQH%>&?Zw>JToyJG?TKf&E1G^C8X zxcOKILVYE^c)%4cW(o+RemeBGRIAu~@y5?T3YtUHQ2;7)YaYKXyBPMmT} z#XGYnqulba{&$tzH5X#B2RM=*s21!w4w?=?I2sNw8w(?W;UUu2loD6uR^h5Ox;URz z$UmkE9Z#|fC1q7m26@EC+26vj`M`t7SAo!6%)=a2C|N}Q6UZ!2J#2_3Pt+qh!FcLw z!D{6v!|Dfdqc|6NH4Q4?4SD=&*1J$`VMNA2yUDiRD|$E07>%$6@t8)ITb+d!C`qbb0NbgaK>28IA>8_g7AqJ z<=(V{DvP9r0k&7lYc9GFwvSPKXsssQE+Tz{_H9EIbJ9T-=@+bO&+{Q_oniz++XpEM zZfEc*%+PBN0-SLA+wR^~(PXJy(mk`3h|D{1vCB0}iHI{xB|@5|7JWc=qh*o)xUcOx zfUqax96;EfI0q0S;v7IE!tVeg5k3cygDAvv0LjFP$#Ve72jDt@jAexD08&K2bpTlk zAkG1VgZtP=Q7NH+)B%L~_#Hsjp&-uzWG4X60b~yW*8$`R0oMT}72WfP96;g?_j7}p z|H}+_xv?oFxFy)*u37R&m}*oO7&eC-RX{bwN2b9yh{MlAUB7yH>WxuQt}=bS6Is^w`7g=KDNQKb^ zfTu9J18^0_P=-&SFs3rjQ5Xvm{v!%Qe+|l_9M4y7)D_RGnRZ7XMBMQ0Mn6aZg025YX3FN9+5n=oS9YofF|B+g}BpAb-$&Y z2LA}o*E~Xvz*S#=8ugJa8;$(sTCl~N>hw1Lgj7%Mg3Ff(j#cC;gwHzG3J4A}0)QX=G88t)L7pa==@V(D%NPOu7fF*jJ(mc18_{B4Ml#kzY5QxN)%} zU>5n$bJh^LIG$D+z1dKrIwWXOOXfm4BNqh2(m=^4;2J0c0C)z0s8TgVfy$fZFkjt7uwq#&4N&BKyJ3NP@9SuHeq^53r;&k4EOR68@3 zrz>x=e%*mrhv>2bUEG}dw^2p(L%iAj6WniTC`7+8*vH|Kr0lK3E^Uw7l|JY*TdM&2B?myW4V#-yT5xE90tzrH<_j%1+dx|0EqL0osHT9lS zM+hvWI89b$%*?B-mk*58U8F1=c;q=mnv>GT7iryy*TXxB`&w70wX;`^lcb5v69)!UoyJd>7IYNDSrEilvEzEvy;`JiJp?6R)^>? zuMhbxHt*9^sDV)5Uz6I;Y}!NFfYIGS2t-$~EY=SaNWqN`cQWhYmUt<0viN{T{uV^z z@eGT8sRIC<=-~`==7Wa#2?H#O@vfgy2iX_n!MxirLr1^C{k-4S;S=sz03x`#-vv*y zA0q8wTmW3SJRmA`2#M(CkQQqV|1mNzdWEIMdfugroJIg1v(zRRIpzv%xUVi|H9_RE zP`SGdFMNgSKlmIL!;gX>VpX(wyJ0GTlzn<-dCOrT0QZ)|YJ|Ph?h*p-Y4>gd?rAr} z?rHZ%s8e?{G6%qk=B+%&xu@L-pJ?7X$y*NS-l(z()7iZdyr3_YD&)sw%&fXW@oqiD z*0m&Ko>rY|6r207k}E~ea(s4V`bk!n{gi`{8GaYe3GLacC?N47dWMERvuBJ_DD;Jh zPQg3;g{i6*81o|Vu?Y)I7WEK7j0>YUQm&{?R`{ffTHq8_lSLs>Xn|7{q~9q@YG3%j zvZz3D-fKd9Xn}Yyz5?j9h4xx>pOtn}CAx_)n=?_JlS(w%>4v4?5)y^&)bACG?qV+0 zwV1trj6z^3Bcem~K&Xa8(FO?l%`Fl7VX>mY7!=W(T76;P;WYnxVvuj>Zm0Rxm`ZMP z$>#Hb1$;@JTh_V)MsBoTGtoS<{PIXMfY%6X9=q z9vi{WjUA`yq5GVsQv!G=oiR0}senSKtvd9UiBQ&=e^ zvaUtTi`epNX!#c_Rjk|c1Xl_sf&3C|kh?a>S2k_8n1cS4=t*@khsHRVUGL#-;TPDz%in zK`B-vjD&RnD73+a;Mz_Ad{D_)qUs}C*GsePO81o^>hB07C49ONNqIysXRsEn>9;a0Ecs?EvZmNPP^`S*jVa z3;?+VW?*Y413V(DIA-y|?Uc}J2ay0oRy(bhoepwRuqs*Y;jVGFqX>vVlKLo_W@tXM zT(4D2<_cl}0GOemkbn03PUp!EXOBGU400lf6g`2L!ycF1RR=%wvnlWp5~l95 z4!#If(Gh>OgE2TyqI;q*-d76S^4+xnYO2OchYx0c9t|K7fY2j@crZS(b9Rvlau zvUnO*%H~~y(*vGH9RPr`Qsh7!3cwqPQvvwJK0v zI|jl*R(&D>R6EGK%CiwhmE~3CSYMHgJ{_ghN#pCEnA}ok-+A0^Z{oOWfE`)Q4;{(AnFdl9YjMB_6E^Z z0`4GMNWd9Hs~L6%Q3=A{AleP!M1$xcSGaYVQ(RjNix48(1?(Vpxi2Z`8T-! zQ47)46J#8xV^=iyKB0^CRQ~l6%*wbYG#pODQTfHZ#mLd@I9_ckMK9z7SG-Sau6@Bl z?W21e_nCBFE|R;!{yWsA}L_`(0b8}Z~nKlK~$(qM-^E!ITCrPNRqUEMD1opi*!%J zRzUjbHF~bcSZo5Fh_RuCg{r0{DiKNXI0;m+nb0dB#x_LC0o>re3Mk`8eBw}|@J^DB zhu4I8Q%~jc9leU%&nuDKObHrdb_&vk@QBois{>*!njYN;5AK_5=;Ag4hX4#u49M$P z(fa{J#_94|+31}BmVIrC7&EAV3?dbD(UYBd3u49`!5vWYf3D;DdnS92top92COXwY z%og3^Dsa=i2tTD~SzH3{Cg5KP*F__pg>Xv{b3T!>wpCBGx&v{92}NnX)gh~*5^X)VcvkM0b+2Okp&z)G_CzQR%hcmg8KCm_}VC_C^7 zxowk6`fX_2^(b>EXrj-cZG`~#5J)qsSxW%q+z((m{8&~1=uTj%UeBroQ(!28c{p0H zewX4F)f^4l#2si7*+&G7TKu9qca6YqACqJlsnV)nP9O{IqE%lCz_aStAgp}M)JH!l zyY7Hmau}9e-i<-ESGh}9pR4DYpG)!8#R2gW)JF78Jw$5Oq%v}dz6EzDwt|T1M7*O{ z57j|Sh>%^4*2tzcK@H-XHXP(}O(Q}zP4-cDCU{5Blq-*+tUp#BQUazj=3PD2Tl}yf z|Kdl&lmzKzyik$HLX-s73nNTK-^aN1zpTNcJU6lsDB|46i153S5q1T@JZm)GfXG3f z__&PxqI*S*SeJF3@F-f-+KBvFmy)oWwfR*~4;^y$2PBu4!LOa7!RpF))J+7y9>}rYIorgN0?nh{frPXH7Fo9cml>c{*I zql)#)5ey@eexj#`DSSf-EYic_767KYKt})z9RNwqK68U2yCo>)BY|{V)2TGgr?8Zw zTPhR=R4x0?oP57}w*}2X6?MF|EQ}d=tB{jd^l4BnhH-5^_!PYP>HyP=vm0;f$TOBYYOvR6;gMcRr8^^+s+OE(ClAAUck%<4rKx zx;bd3E9+whspkcw(+z7j8n~O;TxFz&sUQy$ScP3JsrIY~0Tmh5m2MzFd8XPM0DyWS znJTXcfYJ#zrwDfY9M*an8qb-5h{i;?v%_j6h}#%RK&)RkNSM08<}AVV6gtin@lq&f zi;yd8by)_cBQ<@Lu)f7cbvb_a0DxS|=|eoE#*TbND3gGH+)!zp_}n~1ZSK}5y4=W= zTCfQ+iQZ_`mPHLN65S2NvW6rlaIq&x6EY>2eI|pVG@HgVW z=j`dMbI7o3jRrQSHMUA3{A!AbIQ>tAqyM=>)dVFYha5SVb!Ro49jc)W%egGRwCnzC zY21UG%F?cLx^%fJO?K%{hFxy#A>il6fA3NZ9bA!7euw&8ZAaZc1}v zHR(1&_~a%bff9&_+$8iR66@VWaxiBCjQ-mwoB5$8$|k6M#=4_>A^>l6F9qQ1@e&g5 zaEjXvz^&s!h8^ogUlai&)4p+ZbS1np|02$n2Y|iNYV^@+Oh(_C5|q9|(W5k%OHmyo zcaU-)iqfW*_b=aoI^|2o(YHY)m6;WAIw|+^fM7w;h8Wlu&w3d?L{Y`C&5zu3C^1D*SgT<3L-#I% z-#88NWA`4y`QW{ikaQIhqr5CgBbV!>1ZIRJ|KhV7pn9ZNaK zW8CpKAG7*u^^SA%5vuhzrvNr~;2bMG)J3SREr|#wz+*sdL+7C!bX$^?u-*XNE+5OV z8sy>es!@$ueb9RL1S=&^EBg3ym!}nR_Cz(aqhn7Lv9y|IC87^ zICNrZp@JP3-o{d02q@7O<2VbSihv`VD*0R>A-EA9t*vPU|5qZNRSo)<{5 z5BnEUTi|2A&*6)tcs!JD&)=pPMMTQya5$OfM|`T;A@{LEN%6YItq{z5bUY%1X9JK$ zxgH3o65)43f@N`{jY7`}sR3#HPDtE(RZd9W#U8dkIxr9sv6ZL7hm5w&fPfau!p#GY zy67*kj&9cQEtoH`Gy9{dj_7n<^2aFdHxSQoHUe2uAf8Rv1QP#2Ho1-(=dtoEDvnKl zM~(l&rjYAECFcty!oGlWxOOY^oe`+y^+zEQ?0UB#*aPwXLDt6Yh?gk>uRp4j#@`>* z9>??tO$ON?_9aeb-XvybpzP>RBHW|DrH>%?|0}xxujn8pRPLTG4*(JWu5rAga~75B zFqcBr8O6)nYvLjvfvqeX%2GM33RLxmvPAebo<#UH9uaXGPa^ypPa-^x=X$Tukc>VM zh$Xn*D@4GQ_l#=^V-@Xrq)UW``0k8+d^&Xl0K7Tl$vhG9 zGS9s_cXBrmG%@AFOPt5d(knD^IVZJ3d~$AhiY^)uxQh=k$p@)AW~pa7qEFHb+(zL# z-L1|4XpR{=#R8sA*XG&{&fe}OqUd64MqYJx7d|HH_8g!R20IBmLb2;~buvHb=Oioy z%6HA}0@T_yX`d-_ywRHlt?4V^mVl0qHV;;_et^+28-Tnnl!3+MasVkCvE9Xcmzw}& z@6M5z7)xC$Ubj2|z`Il=9tGc>ThEycpWsqa6UI4*^xY9Y(FwF?HzuP6-c?I9&AX1p zdD3lKXPnVWulh%Vp7p?l(G9pO>Ka)R;a52l;a53C#Hk#K@T(k&@Kg?+|0&26IusT5 zE&@nIy95qpdE3qG_M9g2b3io(GGI2o3lC&{0wKx9mz)m#3olU?!xx`GUX~%!Aso@O z;L*>3`T33N`#aHdu`y(}eaaLWj30)02F!0NsD~@yjt61*2=(*Z-61F6VTnRM@Fh>O(|i=8d*V}OF;sUP zC>}%I3gyurGZchL-HttI)QQLF}B}Izf}y_~g!+{Nm(8 ziyVx6x$GC@EziBaL%^-*OY7CMW!ST@>S1j^-~g(G?FuV<2ZjLvdPvG!fwKXmbT`$l zz~umVD-e4w&s4zId6=IXE;_P^3Cqp)VI__EEyTxpG~jk z+%ED9ZKrvrc-Mxku1O5ttVRnb_KXMcl^Kq9&JC_)RZcbJ_kuDGB&I&3Xc?XHnd2Sq zr_H`hliw4{n4pES{lu5x`jZ^Ae(LK78uE)n8Fy--TtD@)<59o%vXI{-%GjudTKK6S zmbccIInom-1zH#VSV-f zYQ_!6u<7y*xp`W_wc+`8ZR3B~1xZMa%_EX<+JnDMzf#GMJ zGFBR)8Gh|Eo)hR@+@Cz=;_Ik9XJlNU4q4-`#qNJvY2u6vp@hHej88OROk8=orjJIi z=nJZ%n%gF;+m8iVnihL=0KR93QCHB}c@nIaPm0dW!e&S-{IHr_G#A9Q$_WD&ssTjA zm1hJ(J$!JTLX8V>DLGIVo;==!1$J*1(^Orr^h?!wC_svaf6gkztwMVVzG=v!p&vv+ zKYUSSlv5NDSDsZ?G~qgJWYLo4{#kX_r2+9(0x}q>#kXaYR`q1s5E}ASlG?i@C9r~91DxI?2{>0-a=)&Tou*`-$j*3u+c-_f$Yoi z?i5hQ^KR3hc>D_ZYkHA`An`uo*rs zrpNF`J%!zq^XnVNciKtHeFD4N%Vf?mnVe+LtMT5|SHJlXH`$)s)8>EXwB}hYt=3`n zuzbP4)T8MmFayh(b^lVl$IbRXl*qy54Wad2lPNH}=OF6gu8BD8FRSb$rzDaMq~&6y z;E}pY+H!pLU;?Rb{7T~I^GziqZ^D&n;0g}PzJuQL1lN8?6OAyG3b@wd z1SKh`Qe1hz9M|mmL~cQKOg7$h)XqmS;URn~jug3|;Kg{E2W~u>7W6?7j_3#}=HY`}KT1U!vRx zlx0*fLJ!ZY0(*iiA1P;6J{K;P)Ox6P*tteW%2;&%pRg9sMiz2-bCgcM+ z(FYUkZ$QlwDW|edac@4KkF(2tK8osi?$h}T{p2+E6d=IVBx@#Y+5sr5piu89eIF(Q z=$wPa27Mo918`5Kmou!K5#(L_O-waGPqO1WYJy(>PjwU~c7DUU+z6`vs3TX`L2^CU zvhzVI#jYV%q_o}(Za7Bl=KsFf&DW13b|GqM@)jkCf;;sJAl4Zx0Dr$whAEVJ$QtZUif4DReri0si}kbrJiCXojAA|Jv722Q$8I9Z*gX~WaqRBx z^3MIpsfTdc?IB!t_i~e*9J?2yNKXf>2JpM=h9-{J0YscA6{7GGHHLf%S#hs3BVqV-jH;kh9wHiCj{97*Ay+?&3R zTL+|g5)=m@T#^Fwus1P}#CsTgDXQQZP~c5gHLG^_Q4IOUR20uc!=dM>c~C7;@PeM2 z_<;{GP2P)^_f29G;M7hJuYyl?^^6Ecm{;aSwP9L6;4DjeGOPV?8Sag}r4q2Za0Cv1 zM=VeURYxolq5eLET%>p;*byd4Baeg#wT`hkGwep5C?MDCoK%+RpT3FkFN6p?3n7`q zL6t)rFNefqb0ET>17RnJ@CdZany=~*`TzhKNVUpVqw_sSML&x=e2?$Yk$<~&o9tp5 z)It=zttTI!bwmFF)=mA(tXue(S-0A$!*N(Ah)(*UA)$!Xz9Dx$AUKMl6zaCw+1t zDa`1h037*aUQ<`^%!Gamdo z{N8vt;?yC&Q^9?V2e?qEMN?-~!|kyWe3B{lOm>W1xuLnZrl%(ydi!efB5T4{rQV2|Y;bClOMor2-4(Vh7}4=H@h`FedriFOD0le^udh2b zyVJ19l3X%iIc^+~HTizl3@yhR3Jy8vRY)TItdXL1{0%cJ>$*He2<)QQ1BOp>+|X>*8Me z*ft804vOiuw4_ACL8KDViK1=sZPI*p-3$0E#g?urOKD`~pVYgg_6<%NR8eIz4>mZf zK}2Sj9SIfr5b7%`p0G-e{M*RTsYxi+%|l7|~rdm@ysGS43pNC*b!> z4mXLA{GR9Vn@8ujmS zBG5OG9%|xHbRtEBPkiCynWs9)d?L#_ayHxc>EF?j%;Y3GGQJBwlU*bVne&GQ_RCyj6xOs3`NwZbi!OMDMjeh=nI@$G)AI+QH@#)#XCDK=#0-9_7jDi!{O&ybzuF4`tkGj0XllPoXMG}~Q4dkA+0?IGM1^qFpwlUqTT zqDXHAeE`6T*1~_&E*jZk6=NMH7J)av8fq6U6M(m*ZUVqvQg>(Aw~IEEslGLm(2;x! zt(-Oeb{)0BRT#wi^VO8YpDt8KUxhF7EWk6cA+W0VyKPq6wuSEn<9q+Z;P3YShr#1) ziFtddAF}rwhfccpr=o5D!@a){MS8u@M-u+&-UmCZ&FK9S_G9yq>iyjSyxuu=w)UW+$kw zfBAL-lF0FL5%${-r=T@O;m5($&{TsIVSDx8@P58meurzYvGN0A#oJ12C3d2~W@A2(ue2ARAtzvVR=w zL(tQ6V(+q9N8U{x;X`FIMcle;v=DO zLrjkANE;0`lL>bcs1V8uPeRNd0%@UK86#l+6lU;+Mxo<^etCT}WxbD9_05Ko;)ov?yO4=NGa)ThiS+UA};UJF>-d>ox=&(w_f z&N9UMttxF68hODMmH!*}YT`lC^iyvvcSF5hHa>>W=iz(PV)}xFTOBK~6{4pv3@7~T zn0PkfmKnh}5TA*@oPKjwa2LXP437v0lh4q^0ER*H4bl`bJSHi)1vIM}z9l`l9^q1k zuLuX1faZupzY_SI#lTOgnS2I#+nwR=VG;c5|FHKR@KqJr|8wts<-Yrp5FkJ(frLj1 zEtEinfEo)LKoM+U0fQ(+Y+R$PCawx%$YMYXYiqhzzJOwH!%UjDBvC7XI(=4(3~OY9RE^; zcTXk8A#tM$r$(|u_3G{`&NW{FVYm<=lB8%FDZUK0lL=BoO~moadL!VOC$&pFa~;Os z(flj$>BM%4!F3pw47bZp^+LEF;qEM{!wi9;b3EBW=+GXK%TU~WTrr{35v+#f(KfKApG`8NJi zNaI3;rI?B}p~KtZ%+iF9)%5k&EwE(6j|r!{ zsfWZw%bQjB_c&_&HHOyAwQ6d500L94C;vJpF5bbCcINu@yb2{ZF2}c--=-2bW6x^V z^$0_zEY#nyUm|9Hm!G~U41bhLKY+L#D(gAqLh_Ib*vyZcWR`?OGOL-6Z)BE)Lvk_3 z@0*c}C+j-g$2gy4r)$FSF{$)3dR|?q%Q!@TA3^wpuIan<_Y(cx)S*~@SJPfS+i#{l z6_#>yIl@YAraA4g=}>(*^(8s=5vEAj(_gwT<~8C{jB{eU^f_9xNVr{g^3)Kl=D2i5 zCjr4ZYo=eth+`HK?$|APUkFySCnAdU*@uLpm1QMQ3BmGs4hAoc$)DB|3cXo1XaRUnG-CWw)cJ8F0sc39&a0TFr#v;Da3%nZCu$JJW>$?ODxMFAy=P zbzr91E+mTQH1U;0g!rm6BZTHc3G2DA0RPt6Y%}R`g@+Pr{Vh?!Y2&1Itc|>c2j|vHc$KRo&NVsEm^7;@gFRCFPIR1u1q8wizf;Gn{@6@76$B=-MBYJoK!WokmIFP+!CZ55tQd1)Sho$C9 z#l2G7T&u!zgb8Ta|G!F2pL-PfT&||zJ&|IwAAl3EHzCDlB>-$Is$FV?wb)F)qQ!{h z6G$xZh4;{22{DN4iT50DpMBscQ!i-u{3b5;RtsA1FL3trH?@XUX5)h1Eub!N#ofoO zxGOuW`+L~i(JStm$X;$-a4#q@`#*aC8`=MnvoKcOX8)%LBgkz7c?h*&)uo;)YPczC z{v`Dx6t*>VQNzI0vM6qY1RHLBB)IjFdlRzVv9-@_k79wH~s9pcQy(SGmNT2Hi~;b5}keT%cv`%|++*nyMF6R6EiMod}?ysPJ_`<63tV$h|1 z!RrLWiZr8OHgUP?^rq~q3wy+IA87$ZtL3^gZgsq`4+6o^w3&Z!gj}`m1x`c1#2RLA zCj_I$1|)oka-fXG~Xo*>u$=uR)%FaRU@pr zNg8~X@sl?AtV5U@Z)zrH>cZ>r|75(RMt!(e186{kitQr6GzC$qUCA&^K~!kh<9}@m zqRLzdzNIOM>T(6cFa=Rnu0puU6tqQ3FGenxIbKb(^Yi~qVAd36oV;#e7o$gr=>mlT#@-yF0C7uDih#%ii`G0}< zS%xqLan7swuv&iD9#KWshdSXtOsM7!UVu>5yb+JrNm7-WY95AYvYPL#($yT~1jBVT zhcb^c98O5@q3SKwQcO?TyT+w1%Cm5>>k@9Uj z6jHN6A=$c+J(^l#x9T7}t@-xJ_tm!R%)`)~<3M(~na8Rc1Mj#?)T631rz3_v?!KR@ zmD_OJDxCpDzi=mZz|Z?=*+v&ZTY?+<6$)|cg;_V>t_Xlei&GbD;%es$9}2MoOnvGg zH+fGuavAo_uc1f{30M;UvYQJ1goD5%C2< zMA#QZXGSoOB#b``K-dpN0$+b|KM?BJ++8S24wLR|Aup`B~CK#If?D9^BN+wS=y)1%9Tt$7B3gkU*%c=^i`RnuSx-R zu-8B@h0uSr7xPgM+l&1GY_31-VTm8zi@9Xb7}{xi@n5$&V$@rB3-j=V9JdGJn`G&M z>|QFlOhE&P?A`}1P}D94B7@T}!EGAh1JUU&IFGv`j9BS46UnbHRA~xz6ud~IS%AVW zv($?RJwph|m99?17!vURSJ+7;x^+yUU)u5o!gKC=YC$h~3r8-Onl=`*gF2-#J!hWY5FAks6p|J0tjVyf!! z7RWn;T(YJe7(!gm*Mve;%{2bXeJ5G;GSlu$(QcpZ9y}Yhy))Eij{OKXN<@Skq3Ove zBDhJnc}KPxxugTl^(90!v<}W#t!O~F=qh+oyHjshNyPn5GyfqV#-I{yT|9<%3f60e zRq6A4#@G-%p#n1IW}RUg8MgJXw{}SgQFOo4HQ8^OO2ZgM`Ee-z?T$52L`DbS&lZcUQA8{f@k_V+;c&arglN0r0Y$a@SX4y{ zojbzq=2hCv!(PhgbWn|fz`^HpDwst811~T=L{{!}dZM`%;1Ut;A&Ch05D~VA{>^lf z%~~uA@e2_Vx>)^tf@NI z^iW=NkyqmNS1^SfhQexE`yND2?lef3Wo{}tTdUq!>4>5!PAiL`)>bslX&c{}Wt#Dgdyaz+xvS`Q7%a;hYhR_Ha4|!|;{zU^o$DoMr(j zX%UN^VoSWAP0f5Lx<8Ma{g{KHW+eeb%_;(hnzaBnOHIEsnp(%`W8t}w&K4U1wIC=9rYon>@l11F1+&fx-8y*$MFhUTxtJ+yg8u7x8n^KawYI zzReR{@n#kzzTXEb1t#;%MNQYhWjAi#HvtdBN6yub(zUdwsx87S_bkFJ_ePo|TejRA zj3P+~pNqFK0Ji=@A;D>{T2dmFHY?j*QO(R!$1ZF!;FWwe=f^F=wA3O@OD$r{S~@G- z()wSdr6O-?u~xIe5%R30oZ)lPI3tOv7F!wHj8uRsEMx5wibX~8Cn}GPXxgu&Jc7|h z2FjzXet06G<`bRuq3vuGi+Vyd7IXtSp02?_F$6mkbdigd+Y@b|C@d!WRPy_a_hJeY3Ze5g)w@&0i^7I3M^KC&9!ju=B zNm3W!37xmALx@x5+X*5tT77Sp&^OW2s`U~PR_i4KYW+{r(*rh(wc(05(xnm+S`SE= z>jC^p%2cv(W$;^RmIKuLBE*mg5KN(nEtbcN5dBw{$IDQpmB*_A{6g}0outHnQXcz9hgw<) zVC%P3sX1r1tp!ax!u)tlSldCjCiEe2*uJt3j*BZ$K}enhMj4@K&K0%y&_GNko`lM1<)@I6^NXBJ|>lB|j>4R2DDe?w^?CxIfh?~8$ghF4o8`B#>lDr^T&JYI!`H$5iZzN<;l~g#Dtrw9 ztHRd-2&?eSBcj4f#E+2g{*w!^N?>_=f=@fVs`!nQLYIMYSp1EKFISUc4WEdJhA(4i z4L_*Ye9DYSfn?_k71t3l_)RAtwza$o3e}%+W;^j98A34YAf|I+42k$uBYH5G4{@~2 zus=CxNasS!{)8jlNkpVOn-LLae5O z%j1v;2GRe(RJ!E_O>n;sslZ4HCg?;niV+hM5f&3fSThR3YQwP+0V$b=;f~Bg?2l$H zRikeux-V0&N8efkMp}vKpp%hS`2hZRr4?j2cb5w~9^xv|^r;qFFM@1ly6G|;=LCvD zpfyg?uqgUcWZuDCG4(0M{7-0vKNpC?TAY(Q$H_`u1`Vr%z-?uTCDk}5fiN|!7Z9Gs z@BrLl8#YFDIki7|Wvy=rVb{&UbFgQSQ+7bKnmG{b4~7s$+#;nF#l+y+KTS)DL16u# zF4AxjvY38lPWnQq-25)#s`9KSP%Q&P^Txq~KSDhuCW|TR+HTq&qkPUFhN0Ms-Cc1v zCH?zN6k`sV4?wYFG{p)H!n`==15r~4f|wWQh={y6ClPulPZo;Pcec>`&veC?ol(eI z$4Zhk%lIfHNiY{FNs>%ysYO+pQPf1f3Xq(vD3*PS<9c+H6~{{eY*HL2DUL}fR?&*& z)r@XL@_GPPB=54s{;#rO{zAnfKMhkO)4@JR$_^VHq5FlNukd znOwdIAr5#u3uEqvrWnWdY@XgD6k+nosnpY`M9BEFvju#IdMuxzk?CnS269&h#Uo0aN6(r*KB)|fv`NukpA{?RjADMlh(nfAvj3kK*QT%!~uyCD*~7z zxC9L`hE*aWt8P0%@O5~0D-pKSnB2%#j;ES!!S<$+lrLK>Tayd4h-UsZWteKX3Bdwc zrJ8M=JZmf?B7+SHy$;GlzzoN$HX6q-YVv_b^sv4j>1C8#AcI&_iuIa9or2VZ7vVGs8DgjA5bSE?8mVGa!u(d{j#^`<=B z1|#)&o5g$&!pWaEbzhJt?(n!MD_tpJ?uV!jG50uveRA77qCgUM}@N zL9_9esRE?-2cV{>(f$Z%sa%b)(f;Zf4r_lN@{34hBJAMy$ANr{m{&ja;FZs-;W!vk zik@`Zr?!0ohePpo+CZMjx$|Z98Dm0zwg&xCL_CE>lQHNMA?aoe`W9gf`WCTe2L08j zgv>BZ<{va7nGUy|LqsH%L>Sk~{w>g3*P*1M$8p)C1Uj}4-HN8-p$Ky{&~ihAXz*!u z2mynr-KUhYl-HcE3&~P@&AI8&S~ha3>4kCirXFZSNKtQvErni9Z%E0XBy5pbx+0ex z7gu61)=&*Dm+I0DYPHr6%dpIidbKu&fLX280I;jIc>sRN)tXP+(n6L9yOK}4(h>r& zktDdNUI_s95uf&?wFq-D?bDVdez(Cwn$jt_-5)Vv1&iN&p*}47Ne4%uOMa0TGf}jmf|wjLD!cV*KVz24ADm zn2Tc#N1x{^g?f=^&>mo5@IJJBJ5-l zhMkIki|phmndUWob19^De-Q0<#ZJq}L5-T7)`Zzf%m}elK7e16ouo|b#}bW9t0Z7# zS``2z(`pg6GOZ3k#5lMWWEyqmMaWl@g)(g!0qD(ArmY6BDVcUhhzYF-`#+h6!Nxy1 zvHlGKxxTpjaaXM`?o>>;js(6-GogPB03*{10a%$f7{D*dg#S%4?d}jeSrKN~$s&H! zGR;nr-yMdhoN~c6_b7H6Lk_xEvr~1Loo0pEss1;_PJj46c52$o<)SXKNfWxfX0501 zli4km~Fcs6>)A z;nIQ~k-67R1!te95aSKvr3=(zgEMJnCC-a32cq9e*nTsIo+}A##Y4}@z89(@p(%+@ ztG!Z@^cE;gAu%XdBs*!FT%N90P_mbb!UbvOd2HI7TQ)>UJ=EN?v52jBELt9WcmX9z z(!Q_}Y3~DR>osYwXAObyN!lt9FY_Y4lC10rs!eQSV6GOig}*j={azq%t*%<)gO#uo z0~q*ZD*f^is+y&!)r`gMA@72u&EYR1W-K0H55f`F zS3ztXu6JkrzK4xNSjX|%{VQ4FRaj%Q>(>HcxBKjNakAzC)8!nEk(2Ne5k8kM5#e+B zM1*CP>~cMt+=jO|>T;Yk_isR#=cDWl0d{vk0Q>ga zNH~AHB>xe?XA4v$_9wFqUPGBoMFh__1nGmD5QtG6Ju5j+*(U7RWZN>YhsGumk+EqJ zTf3vSLrHRMe!5XdJ%$^@vNLU*Z#Rnbq>0lGLJ9eJ4YlansQ7#e1nQ3yd?e6Xwv>o1 zbXHx9j{KF6@ztS7IY4NeTm&FuVGNmnfBOAPQBcrTA2wgkNse!*6};2UQM1?zOi!8h z7*voYnHK=O4go4>u~+q6b*kw!&Pu^1XQE}OxSfes6ZmbMn(2_g0@hMny^|44|`;l00usn%IT4dr{NHuvA$V4 z_c=9T?SzbGeBV4B({OXbeVSzr(~5(HyQM_V1Cw#cfQj)jp_M^yM*&V7H3Sv_F{7k| z)j|k|wGhG_G*%0d5kguBVWWkJ#9C+_^(^wA&4Yeg(;>Y|+qn7m`WdDcQF=cPF8SLc zN+Y6|wsWHw@k;MCQU$1Bj4Y?s7F0Q4m6@h9tAJ`pE)=rbcB76R9%%;=|E3-5Z99@r zU8Jx((`UWJ&l|NbNLQaPSK*38lDLZ^T9aFL9E20LJ3mN?a79 zX_+<95C6NCeS1J;ROqTDwu3HP1z_L{DS2UM7Q*%_(?SB_t4th_o4&mxFYGL1d~=m) zHGuF{CU$$|!j43kt4v&ea&YX;5^$Btu0hLyFl*3t$TFfFP$q@fpc0-?0k-&AYf!mP z4Xr_&)~S+4{w&lne5r{oiI7Di?4_nc#y6Lm1`{we8Ur9qBO0C}G?IwWrKW18HkX>_ z5ipmU76CAqnpPsrLl?Zix}ITksVVm~06*f;I|ymcU9caDwn=o7=Prto&nC`Y;Iln< zF@o{S;nl>PyC8z{B{1hMEW(_-u!t=?cTs^#NUe-(oACg){@NxgUEcYXrHgRsl}*YR zFuqbrc3!715?$d2H12WC9E6XVD{<%D82UI&e}tiLC5)nWd9{|nZ+m&AX}-eHJnt-R zg}vGhX!Rq_ZzqWxLNuq0puum`7C><#zW#Sw0P}U#)5Z<0*5}s%sC`0r&-L1wShXTvtl?=? zBFUPt$0(#S7h~&%F2;!1&LDmh?#2{fU1>=3%0{HA$60QAA*($dbRs~q)Diekdm~$f zN^If$^S|MZO!d_y)mLuA`y2ID1K5~O%E-oY>z0TJ8~?95EQ^pP*6`&dY zX^4oB=6}_vnIa7ihpQ>?pBs_p22g^o&d4>RDg1~qq>;2TZqJrs#My$^RZ+bVYN@0eRQoHZ7KPNOv8*0P2~Y~kMDI#BOd-uv@0RoeA&A%LyFJ{ASt zcY`~49$>kNbNgCHD@}(Q_M3RGKF)HY7jPaX(_y(TGACg>+|0>RXZ{V($x6|@%+Tzs zIeNW0)AKn&uZ6yrIb}n7nTc9}v+P8jPvAd2QTIb7ep?f@>cEMr1KoyBm+6yQXLtc; zZ8E)7Gv{pBiNE0)JVLWr!(C_T18sA?fYZ69*}M&D_8Xqs70r${g5t|o`rO}qFW@{+ zn(ag3diI7i+wwWT5`)*y`Ben|r|0|)mg$vuV7+=}CZXoEb2+Est+@@>tKD%FS{~ZO ziql48of_m<4wqiklzqN4=qYT@4}57br5Tk%`nS4nfbD!=cwbhV{I;;w816 z7rpk$<<~Zy*BbONoV@vTuTqbxJM)ScPtmu^5&+V#ia!Y_Kv(nAYA^2Z4PZTh-LJ)| z*Avl*{4)UD=M?%Uk8njl0{dc@au@(I2`Aj$YrQtf<&#y3648;K>qms6oahw(M;+ z;9GIwz?*sI1J7}9?*MuhEpWw~Zvyi%FeGej?5#0{`P_42$%8#{6#SZJ0Ek%rYZ^ji zQLx=^o}fqD%tTkYXM)*)%CXascY!O82Kh6wSnwx2HbL5C@G%pQ#eH^99V(vr$n#U| znnnP!TY{rNZpIzr;`7H|RzQ*y0UL-UdqA>V#E&FB`C<1k=_MjedLj(zgEw`>@er3J zf6xcyH)Vq!*#Y~*AUc)6MtxIN2toUq=@;(tM*4+}p-T#0(#(>@Rx{r(bjfh=BlsMT zzuo7KSV@w7;kA`sz}5n=7fQsO=!KHD$a|}LwW>w&Y-a&7j(7o+h+o#Ll|LRUgM74* zZQs&W!C=Jyl~)C0P^4WIR0G)htAgML-49p|NOB~H!8p&3Awu5f^67tdmZH|)cF%AZ zd}iJ3o}opUJwuBydxjRVWqXG8y7l(fbpl2HAO*OsEbC=%coPvxB@yPXw(u(<)f#o{ z{N|v>a#OCkLev8}{B~~H`sI*7Ye)j686oUxk4zMBFqBYHQ5Q)wh0B8+)o1l)LFeLeyM=BEJ1pSt^p7kgb8G(y;<1f z%s+PMB8$}T&x4Z_WS;q!?j>X2@8O9Hsail6DcEmgsVW5N_* zW>O+HmkOW6mg*Aqidw&>F43r4|10Pc%XRCdF0sax`y19J){`Jcm&lzL(j|%sU`Zo& zi3$M!ExH7^@Hr<))qxYS+0K^;Z085u&Swm(OK?lyB7V9qVYc{xwk|>I2ODH!2p5k`1fgb`jpQkSSfkyd!k1F$(U^s{w|g~(j# z5(Q^92to5u<^>og+?$|-$}@hk*8OARfj&vma{&!VYakV4SUk7lT<7Bf>F~Y35>Y=@ac%7*xJNBe|b9^s71Wyx~ zmv(qoRUXc_Hx)Y*b0|FinwyH0_Tf7MW;(EU1Z0HJnRCMC%z5+x{fW+2JV3wl5Y$Uv z1dvUijZ%%JuA#&ecd+U6HfZ{JKiu^5w^q~Tb%(XA##*?iqrHQT$OvnS?}7rt}6 zA$<}emraJmlDrmsqOU7%;nyo&pyYGs4;O>I`0z~L*D!pvhl#HAO7-5;5h3dFN@{}F zP#3cDSGP*NJPkHXg!9XjUF?B=3J2NC>CX;Si?c4klwMsH)DCZgIat$cbcBwG@Vi^$ z!89F#Fe7ALg~G_baYi`4d%E)&1t%4p+{lk)*5Hd(4CwCScPA9!7k}P70TWCB0b2ht%VRJTn z9)TZoHe0@YOM{)MU3_#xx*#sSKz`x^*L?c$B^X5eph}kjDIbK9N3eJg-9$O0J9pHQ^0?* z*4+}~X@1WGB-}|9bjMN9U9qz(1>L|S9B+4cQ#cHf20~a$KK0H&)01TkTn8y)4sRO?XxEC%5e6q&hqqZs6>+afmXEksB*MB^{O@(HEq&ImVN0_hK#hmN z98^B+vzBngXRSnRq0d?o_4k^DCqq6>N5Mfd*1)-L)Zgo5T>6T5n$3ar$yCi}k}dY) zEm@$g)5HR=Kktfn$RxWu(#5ej7};rQ0GQ|f>JW}R??;x7yyizOB=VXc5o`gxC+-ZZEHn67ulaGy%)URjh5*S!KlJMf znD^&$AE|^VU)UD_`;~v^+FdA3ClU2 z`T}bsBWy+)6p06L1+$t(j>xwCEx!DV&vk<*B_;D9TIg0Fs(RyYe^+bCOmTK^f zeVUwcutUQtF5yV4WQ0(w2pbhQaT?~^MmB1{)`{H@!wpr0G2&BKW5lmvcp_)qL?zU! z^^7(D7AMekw~_}s$3iuvL)%`wfaLLR=Ttx$>+mKeZuky@wB;) z8)J+I+eRmGUgQ*MKC8twamEP0q)3DnW5T=T z0yT5bxXE$pRKh#C2c~c61~V2r!aMuuxSYRdd;=~Q?t5+Ua}Dmo#-6z+E^7PY)>qOGo#LW1C^9YA4Px7?n)kx@Y0cf@^lrN-1a+nC$5O%4;R+^qcCK*J>1-WA zBL1Ap`bRjz;t`03^3Us>5Vt|4oL0((A2n#Hqj9n^wMYzBr~jvo#QOoLs*HdJ*a)Ln zxKjI^cC>IGLSC_&`{JTK#^kh8KrRLb9X5BMk{@EYFX z%muIvz(Mbo`0GXsu^Qot`$N*c2Vfn6cX8C=2>||70N**O#1a671R7I`*U-O%8Gf&= zfBi0aQWD|(L*2YYJ%DNe-Ofm*!(G|!zCK&jlWBj9>iBPF?GPiJSmALF!(Z0t znvcL%XoJKC*Njt1I|DauIJSw6pK>B7Bz*cQpM}~kh+URvqmADKOQ?SMbgYWDhS82gG~wQbth_;sT=5|; zU`@LU@@pwDQs&JyrTpW1Er6<(TOs*%3MNb=GWWv^G*Uucg&Y?a}^ zpX+#6!H@m@r3jzoc>UpIa2O`^=@T8V-2g`{7=Z9Tj(1R5OzcMdG{;;1T3kHG_>Vi@ zstF14D#Q0U-uU8#_$?@={`^e*%MTjrWY2Z`5=;o$CYI* z0pA)Jb0cD*cPb}1qV;7-QH1AV+*BDb!>beGN~m~6y>Yzhm4_U0NDe;3_h0PxwXPUM zfM3qw;a@{FB{S!phTQ2?GBmB4eA0Io)9E=U&J zwOdTQoDIxkP9>b53UUb~UgTVk zY+}2viHV#Zh|mU}-rY3F8Cws3h5xz%k?v<<7lJ`z!xzTHGkJ*heawlKc8rN3z!t5J zp-l_>xMIlxzO1>MAZc!W&l68wf%GT)j?3ruVk<6~}ld7&DVS(fsy3JW*PY?*P<17Q1DQD|&zhiY{Z3e`pyK*D?Z$bw$^hxcG7a51~nK zLR3rpiR8tWA&PwQTwGj_;d19Lw=(PQHH3sYIcL-6!_QzAVeY$hCase5~(` z^`?q|Udz`aOwHIlS46r-*7K}IWIa!WRfMheW(2U2r_qQg!jjZJjV2M{r_qSmx=*8J zGsg>>;}<)&1$r?#89>p&$(HFAM=81zQQa|~z5zrhoy!4F?UO4zp$_C|+s)}}J0XRS z;ZBe+J0ZD7XGf{iwmV-)6ainaVV1J3)yY=Dqk0WV1g#utzG7oyz|s-$B^$z=;Hfh;8C|! zlIug(m&70f|5%!gQrR}qgop@Dh}bMmmijbFZV?2*L_hk8q$BwZZWaq_@n~rK<0{>3Xo^IsYx4I zybm693RX^19YGm{^u@tHA!OMzM8vx#Qptur6@nZf_ojcZ5$sHL)Hd}da`7KmIrvZE zL|LH$_JDP4Fn~VCJ8k`Jc=8zoATtS5tplJMz`*@diG0`uW-)wZLE_I~^m>F#XB7Ed z6*VH9kC&z7vS>L0vn*Nz;HN6os5>apLN}Hx%swYNJ@pe=9O#Bh2a`%4Z%Czd)dp0$ zZ$m0Qxe=9;-{@SRKq^|ltk2$&k|chzldcaDq52>zTc1kS=gJN1^U8+3Hg?1MOx(CW zH*Z*klbFa@jM8CwcdQcTm}T z!a+NH0_=c6O-Kesu$B;|qBcKy<@IS{vgDL~O44@W3-}~|2&Gx=4>Il35 zKifCpp!XsG16su8v(C#9?q85f@WIyA2;(rf&$n9FBP@^mo9CQ4b(!<(BDhf3hSgSJMXTLZo4(+5j}H%+r8eg)agSS%u4aKl}+6~jgMxSqk$k&OVPr0MIYa#Xi4X{w zSxWA4n)}au0%P?PnhV}SZi4}o`~%MvW{}eu0E2G8Tl2x)V^uC3P9-U~dDcxKMEe)9 z8MilN4(HWe#>jFz2D^q3@{-His-_rH8g)fYn1tG@oOuUm1gK$%ofQJQ0K;p+obltN@$(!$LS%Evb$$i6|FksBb)k@Qwb z5;>AiMAMOU|9((!7VCDu)5?Erj4Kurc+TnK?~}$F8NkqM-FTuBz)AokJI52dR>B6r za9+yK056_YmxK~ufL!?iMz-!AysJq^?U6&*x-^xDu#}+E(kUz@BqGeo5)tNPA}l8- zw^^XtUZ9H->01tNqQ=NJndCs!k|g#KBc4d~52jS92pkeXv`t=kU=u>+oS1?{{n(oJ z%@aG0#><5acP{X&M#J!o@X!&lc+gdM9#`$dwvXp09|$1^-JnkXr|0P0n*otnjlPmA3Edrp< zmPdxsN~h(fDD^q4eN2s^6_gFf{iPA!0B!UDG};sM(m$w z!vgU())O@!zj@q3OL9VT`j(5eBVZIo0I?9-bC7WA^AMcO7V&X0|d$0SQ zSmpPwxSZh=9mi|^9$p|qL-8SWqRwVFY;Wb%Y_INk*@q|OWOep4rEU99W!Kybb#>d& z2r&`OlJ?!!XsaCQi;&q|$c#B16P)Z9J&a(do^q~Vj(BQ!Xttd16T71k^8n51 z)ZFLEgM|nW+uv#Xla3vvkJKcgE;XmHht+`MfFl|Z5n2Osuk555aR`uRBtEk%w$8dB zmu~3=*EZ34PWQZI>bfR)&{Q{DWQBF&IenmRyBC@~k3yc3xnG{=$tiEnjtO40U$P8& z@1*pXl?Y4yC4HS%H83>9oL%CLRq-13Xb~6h zg8k==NV6*BAu{ruk-63*1K~|nY0s@zrF5J5ikr(=@~Ae!waZjZ2+z%PnrDU8j5D)2 z7lE$Qe7P+qFF8SB+EKFXi6yS+1MIvNPSB`n22jj<9_E9k8qpC5Ni#!Li!fBR2t!pW zFcGRsjmF-Ym6gCKwp^3*wkHO$9`86ouPLfQIjqO0c$WJ0swRZAvOKLTmPQP@K6^zY zIBhDilH`#Rb`UL$%mx3rk0kWu9iBSMJE^lMXAMjUtci3C?y?w`-fyudH^a{wh8U$7 z0do3bn@x=8cTht5tep^Jc1*`848^D^a#bFq5#x`jr_2K}Z62?D9upNvau)WIo2=2) zu1zVyvudU|YYJjuT2py+55*V+?rvu@3I!cKEU9ly*jK{_#{? zPO|g&mV@kMGnsv}U0ja$`KKgC;X?e{WkSq9HD5Z35RZf}b^-`r?BqZWJBc71u`O~W zkU4?|y>LT`ihbrDqc$Q+bT4&r!-IEj#mu#<=`h=FHt13vA|6omN{Zoucg z4dSOihiiomh3}9aDJyKGFsAz#{^gWh1Ok94pjOs4=Qp)z{@I<=N9jkyDJ15fnV-J5 zS(6aiYiV{mf2oSk?|b%2MP$g>Hl$p7;=U>hY)fMP`SIYJ&lGtGOX*;48B)YXJQlFm zhjcEqJxi3l5tiLj~*!onQ|NtJg}ZcMxjKA*o>oq^*-U|4-`nD>?HCs}EcGDBkG z%K8K^{yVYxaPl;uK>oMT>Rre{o%Wt z9Z^mIAF8pId95`{8HOz1#m$D>mm$km0A4MQiBm5FFcrY~fv&h=yiPxQUp(S9PNiQp zBrZN?Ef7m?fgi0}D;ipS?+7O!IX~_MzsK5?%^i)8Xiw9NniTqx7d6@Q5w8W36%K># zPyV^rga6$8K4|Oq*`9b6gzEc8(g)iS!fk<%vG1|apdX;VIB5bLSIu%I5o>-jmH_;4 z9vb8x?}_mQt^jcKE-_Jq(be}#y{KM@!lVk2{0@uiQOJDo?)Z#*TZw(IgFOI3m+>@ zwz^Oi50Z(#4>@_l_lILFG1D`hX8u|T`YHgpuGA*k9snCh=FOj*Di;2+(_ouYpHm4Q z=Bfw49qP{zX4K}0D$n)Pt}Pj$TLK2E)_oE&kg!O8jXd^dkWjW_fYmy83waI6jN+RfSOWNNx?J^A9>9(hk|J# z0C~95>O9>Mx9G_%Gm!@dGknn^GU{QmqaXndiyFRC9vDY0%+Yz3w(>~iO z(_i0J(I&i_$};i>jlnI(!t{DAf4)|*e>ZN6uSA77_!E>kYXS6qeW(;TV%Lzs$tPe0 zPCozRKxs&dU&l49-#OVVj{W?2w!~?h;fbhO$@thZ+*Dgc2BUbJr&3T*L zur~|;A|AOB|#Q@=m z7_bN<1}wsefgMc}BL+CD$vnJ06;Bz2-vFj8L_4e)7z|)@1KRp8$Tj&HF+fBll|)!K zX6T*UF!;SwzH&sLfoR`9o!I0CM_kYg;T;|2{|Ma0Zo|IBhY%4E8hyJs{`i`}>O!V$dHGP`v#^kXIv<7vszl zkE5(4u(LjnvJQYbj*^QpYmTGzL)aWgsYE!kWMpwx*Y|lGr3z8{9_++@9!04IK*}b# zx~KzyBPfZM7l8c`#;U^Sd6#7fO9y5=@Uof!Rud^6J6Q+7=8lr2a@T0cbjgWA{G&HY zD{}%ijm@uP^S9B>^D!OR<`n}l&8tM%G_M+A)4V!_H{ZPIX&W^0*F0?_Z44>2&McW8 zy@+p0qk+R5`HekczTJ5gghwdL(JUC5dZ$aTErH7FH> zdBDYvcg?%XN$P;^j=Vs6mJ-xn!+ocEq9z-WS|>OzYo121b1QjDY#zh2X@Be}_sB$fVNrugSskI^lltEp@TE7NtZy%Zx($h-9`1BbhD2Nam3y ziIL3P7=)3`1|cQ0_>(F@da26?5RtJ7q}|X<9dWWwMl#Dt`#Y(u_l7G88A^q?nDopc zx-@_RU7AKUVP<7bBSeJH&=C%sMhHhtBN7odjSvwMXx_-@fXG3yrH)JQxlM}UVtkNu z_*>5_GvR>V>FPiUxmtW1(5JOk9l8@98qZqrj%p#eN(`v>?RTmc0}i9`5G{9u8HGy~ zBP#Z7;fcwxnG85nxD^~;=q>@ zVq`1jMA#dChDNku`R+Jm=5^dZCLUy@T-+!fx(hDn4?;dgj>~_&d$9>f^TNo^+OP90 zB$P8?Ha4gd<&|*D{31U0jQf2MUWc&s$}I5JUlrPsD+DmIS0{V=rUUYc?8r&PFT5jn z)xk|O@W|dRlXW3Dz7JeIX59~6i{lP@sTkQiWzWY@bdM~F+w(DmB@dhPF&42^_sfL4 zE3^Xl445?C0}=ABnk&SOU0|$f>v&lo3-L*S@GwW}lyj7*avE0r$r0Bx(gEr1uT|~o zi29B>xLNYu5IpEzs2mXv95bawq6;j>wO=6iF*(v+U5~JJYTO9mm$X;=6H)qdmY9Mr zwI0A40%1Ef8`xJOE!Eh zZiFF$$k}-T_HTg!WzrKSDY{}R0gQJL^$MJ@bj|wl7F(9Nxf8Z56OJ^9h)9E)5pk-M zm85=2ZY9DrDE(h%Sw_`D2MktqQyZas_Hewfmb>CP@b8|3pb7*KSZ*$UHk!L9O?5@F zFT~mX5raOMHi~g%Z*_NX&tZts8szdO;7~aO)di0C+SRy{$8diXvo|a;?pPG+U3m+f z4B*Ve?42C%X*eW18Bu2M>3AK!fi~0~;oa1z+Chz~c*A8d9aF~6E={EVh*{-N2o7xN z-}(d=iU>D*8Y*q)JE2_@c+YL0;6?6Q03BAemiM^p5Vkjf7ZETwfR_=_H-J|&tZx9X zL)cze@Sl+v7P1CGH8Ucr+ubegy>8TBgzt3|?!1{B`u1KoCbr1EZo*CXx-s*P*Y}$^ zLCqeNN*7$BO3xy^d&gi$kb<=#-0P3=>>xK3p;>#J59+&Nj1D10voWz$aLZ9mc{Hnp z*|K{BrF6KW|wu5WUoND*~>9ab^?a%vj7;fFGSdqeHj5m_B8}F*~PO6 zYqA$2Y{^~$0QW>TBzuC_>8tqdzCH;$MW{vi2gwcYi;$aegxtGLRHW#G53|e4g0m(l znB)< ziDw1UK_~DUx;F~(LJ!n@h#VqyAj#}J|jdX->wlB7P(-oDD z@C~;qBYa~KhHosw@J&mT#PE$lY@Tl*uA_WIM2K$^M{kSU66l55+h+R*BfK18XCWSP zIZ&%)T;4ek!fV7p$Y1j23L=(z%@R1%C)ObPc0<}Fu&fm88GbN7G46UHauI907dm8} zc7#fljYQj*G#80wPvG`1Kfc(~Kkre@;|MpK=;r$;0T@r`yce0ZUL$KbL3D#@TkuSf{1% zNx1x#>XT2ZRRUm1J}FiUfYeHmT8jXHQYlhuHNu)oKB?qCuT!ypg8{H^DN?5zfUZ}7 zCv9ZC&}g_8b-N|^*BwcOtdGcwp`%%Md|}maVPxn}-UFs^3t&v6d z^4f^t9-UivW`8^`w(W7S%8ROcY)6;}r|Ha^0U>v`z&gD&4wJ0dd0cCMKo!Og^URM0 zse2B9Jr008PV^A~R;?3a%Jr<@6>;-lkZ}uBSKxC$0E{bAgOTlcergkIC(^@pA!o6W z@hy{vU)f6c4&3^Xbhg8Lk8O%FU-+@iG5Jei)Wqs3Sr(67f;7W+L(4lNfRGYl)nKDiLn>F|=1sK~)6I z6jVz=3xOLGN(i#gB{wscp;5t8nCrxpQ_49TbOPv=QnjdD1|9&TQeXLk`}TSHjw)(CfJ=r!&{{K$6ZhKhLM z3nANi-U+hw(fB0IX4mI<;#x4@d6%Y-enio{4ByVXDl1}%IlnC#2j?H#r$ESJ-3IIx zs;(H131;j-^!a0Xk&N*|%6f|+9Px}mMA$O| zna+BP7`zI=ui`C&>V)=>2@3F{opaO@s0n#U!9a*O z=aBG(3a~64s&I}41Bklgp-mD|&-BN;P0l?i>BG)FB+T@w0+ijz=qI?nY-Vg{-5I!k zX>upS)g9wDm+qC9Gx||3x@8*FU;sRjWE>7++(sP^N<`Sh*_-cTh0jU6p@H<9VHAm(1FQO zBEoefeIiZ~iD;^$x>yQKU+2sbi(q?1aIxi-YwFm|3PapsauY97DI6w z<|hmgAwBlk6pS&cf14jpk@c1?lcbq6ps7r9^rXSGFs$0WKQUqPKzc58yeAyh(@PR@}cupDIDX47sK67G|F90$;MF-RsJRa zi0ZON%)Y9(gGm>E^6;w^KMT=OW>!A&6?NXF?tLYJa$iQB*W!gRc6vVoKSKhIVfrnS zKvu^5d!bX!42{s41t2`2Q)pzw%c(?!2ed@|fY7OD5uZ4vQs^|QBCODn8AzdH_GPEW6PbRln1%3eXXW@$;`IL_gv*zM7adf2C4o0?*^jI%b^h_-LBSy!zNWIS>f0t*mhDNygW3Yb@1TcoceQjLk21M_1_nO{YxHdtekV@`+2BbNfqa?%Ad*ABbiWO9cyWUql4CKl!a1m#h{X5E zXcoG%Y)(8e5}DK^%pvg^GH66t4v7GXmlNQS;E-Mep!a+61V{FIgfXgr+F^BF4R>lW zWXaHM4B0Vb65`7aDC-o*DJb~{qZsU3KHYKL+HLT;?7>*mGt32#KI@47NL7A3zQ=px z`>@eU6qQ#&Ig*~0s!@iSfNn&q{I1tx?7o9U2f-%^{X>igAa6$cw_`WImY=Gy5qm9w zdH|CDonG+1LEt{8&_8Pg4ge6~tH1jKAZ007<%7$s^n@r8^1& zL#Rdqzbv6f_J+u2F&h!;2)_F8Qwb&62imlyN;7nbe=%CS7KN49qUrMhi1$KG&nIA- z-j4v9?vqC<3E)BQ6#1iu0C~eFZ`2b4U-;yUMgri86nSDffKb;-jcQ=1Mx)}MNOVVK z7C8QUsLL9}FUP?i|78H{nbWlZ$h^7l1F#h%U@A6-fT>t50b8+!giOVj5HJ;62_RIl zf+H3=f_zn8jbZyKMk+^R`2_G*>~|Ntg5$e98*jb9Z>)&b?t}-`^HQSxL)_Ro1g9mB z{>oRt8?m^!Z{MT>MqTHKZa4zOXtL#(qvg^l^QXsLIoX%5a(uGtTGXceHMEp0D?R{V zShg5Ih-LZ7vMc~go;m`CJdFf?1(szoTbE@)pY}&O;=P3lQH~o>u~$H{LlYn&fiG}_ z^`1-gmvL`6;*1vRODD>&Sct7|DFdChv*&{NseJpmGAW@;RVN(vP)w}sf-ff}T7%mb zLAftK+4p&sayi00&EfMJ3%1V-SO)`drXENs(o=Lv-C6Q^nP9(NRJyi+ zS&%$BxCD*a%+bM!WvqN=N>Tqaq?RVNj{uQYoCEi^yCq4#FjeYx= zGM$vS*H;|RKwYIo`SZY-TvwDA;AlIJq0V|6wCIRw_PzzG+rahFmy(HSdMUXc@qgtr zsEsJnGSYGYn_(njZwDk$Ww|F2-rd+-D#TTfK(A4x7;7&+fRR-;=KhmKnB%n;VUE{Y z#FibeU9X!K+0@!xMQ!tFfQdAZh)61lu$Lc#4q7-+^C|Cw&gPT#9NR?518wHY*C>;< zX|hF_CR>DQvPEoJlXKUEdb1cnq~Zybzu}4EAKP3JZEyGgYg5z{=@?&z_`mWPUyUN|7+(kA2f2cr5*Y-Nb^gsc zbNSG_{|-n|0wb|ucspPX!&`)5c#AL$ZxLI@@P#OHi!1t*$2bhQ9MCsFg^|EV;}DRnJaF;@s`eHE^**3_ZxB=!18UMl^g|M=ivgE{7GX5%HJBu=M(w`_ zz-rX}2pNsKl7P{us{n*F>Yxf2*fry2Vsej6M1sZ1eJ!C zT|{XYtkQ@y5kqk^Xg8gSL?oQ14L&0D24Cu(DL7Yx>XbLfj>XcWRk2x!P~H*?-UT5< zdIl~q%nc*nK)m4T5T?A9(F}}< zfN_Ggl40!xYaPPYE|vQ_K7<@zwnKIiyOc!yB6g`FUDT$XU=^cc^ld4fU{wH+oxQOW zEa~WSJX@h1UDhzH9bL{tc*`AMCFtmKA(MB=mOgBkAS}fR5Ad(lfc0UUWc`m#;0#nq z<&~y|E!26DUId?mdB~<20MN5?gY8QdQ|1D}yQjgfyEh>aqfc%yrlmWx3<=rMwKhf2L-2rpdhMwYSb!h>!=| z{Sy#Hyn)ZJc<~e+zZL?Jj!67T82T0bwAzdNdjqHfAZ5Ubcc_9oBCV7GCu?s@|{#&5|QURc8 zfYkDn86b-QNP7wg$Z7(ZAbk#wbp(Foz#!{J28Kk02Zm&Bc!felT+m0EK2{BOU=#yD z)zrYK1i*oj;y9=Vz%h{AaFj432(Wz+hl8~{01%-#I9MY(10gx1%SaW&BJx2dCTW8h z5$9<{81K%3aaxO2yC{c~9_vTCqsiEK)wKxYRo5a+Ni8=li3n4YuvKO{S(K^rkISg= z+M>9qJHh4caUexq%Hy}# zg9mu>MqPOq;MI|(wri1he?W5mU3QTt9>$8MypJ0!*b)BA@E^pRDDUrf3;6tB9EkIX z=zJPonl0M4hi8Z7fFxPw;2;ovot6($WWjYzMV2y9fn+HI zB0`p3fQXQVh(hLW$T9_p5LwV2yrbOqeV|7pp4kGJ3!iziN49l?4y+}U<2AIMr1yC$ z-PDsHKp{G+e1zK}xe%=JEn@OGLiz6O_>LoxE04t?VZ7n5$9SRuBe48JH{f>ABzzpl zxb<$K+8Sa`c54VgXlsa{?A8zfYd&5=fZ|SW4G}Qr<5Q47XI-fW(DZK+QV*c{|0)xO zdH}ZoEP~>W+W-b(rf#)0#A1y3_y*)b5n#8548m>=Sp@I>a%;#SOr}Vkyk)Tvk0LAf zYx!+%e(+U+D_#LY_WbQQA9ndtVG-xFX_4m5&(9HoVt7I8Y^ggM*y@fJ!Ln($H3(aF z@?MnO!*j8bkCK<-xb;n_;toJ`AmS0Yr*A}64C0(V*$Gx9_s^(CdCI2> zTZ}NPAkD@V1ULn-`0)U2(HO0i-P@uZIp(@u;flp*Z~61C%YUU9ldDJ)!La6u2Wo-! ziW`hUpD_zr)zxnMQm+<9@u>#w_zp~s@-5VxvE z=g=JgXE(`vy4M*ReG1?4>ZE7vgzMsRhh^yBvBPp9tGo~7NvvuoAx_0M%kFo>_`h3S zT+Akb_W)xL+zng%l%)D{!D%?~eyy*7OFoN?miPS=m^RE7Ajk8>Z!Q%eG3}U z7H=w!I4>?9xho-d&j6SWPgZP zF%|$6?H*BzpZ&MdM^*G6W24hvdDec(S!dVd*1b!O#(?EB$Plx2^|86MzMsaVo(%( z3I-JosE7r{j!#r#0qhhD>Qlgq4Y4DN1}k=+6${F{`Ie) zwa7ht&z_k*d+*t^XU?3NCQee!(vgDHw@r4q$f{ogg^V+N_u$KSImB8l{ko_D?!5Mh zh$-zoc6Q7HM93EG;`A~L5JX70ZRT7w{5`6i9%jx(_n<#2cGnMtIIlecje)HWI?j*Y z?qR5l%>AE7dlEzp8ty0G+7I8sLidA4_**1-IZ-8nwBK58C*qD^eeT30JnM5Ocn!Qv zgqpe|D12;O)H{p7)1X#6|({W*MH@#m^A?CZ{)0)4FL36F}XXV z#`vt5Zg>`7!?R*43DDQD`f31{uaRw3lYkqP>*Jde5YSO%k(ENseDys^M2M5q$6pfh zm!9#Eti)(PgN%&uTSo^`1Ng%SQ7ifEfO^-~iqTgUzjlXG>ku*xy4QE)eR`=y!G(Y% zC;v;x1}6T=x1pMq1nfzFfGqK(Uy49HWGZ29vs}QjBO@mfQO@Gqj>T$Hf22?Mo#Gch z3sjdr0Pe(9pzcbq>o2&EpC5vg*cAcaXkjrW*jg>Q>3;c-5^M&t}za5)-Udw-S_@ zvFav>|H`VHuBz!(w;5o}th&tyAYE}It8Po!ig?v+C7{dfw==K*5Kmo=pm9(uFFgRdrx_#CfFtsP^!$e+yA}j? zd}fSJ!{zgIv7WdzcOFaFgj~g6e}GdBFxU)Q;70sxaAW)X;<$ty^D*d3Pp&>HVjHf; zeehffE{_`|E5RcGXq%kG=h!A^;@Q~bVkTHN$sU?vlY;mk*yIW@W^8f|fZwvo4Qxeh zlevT0?C8p)Zg}2wo0OH{N@kB&f~)aN@08?9@T3^{YgdBhnxh$Hlh+(2zsq*jd_vG@ zR{v`v>&k~tMzqTgU$NkUBXLcWoXAoK@)4!c%H%3Mo0ZA+0REdNvZQ$;3%djNT4kId zE(rT%md>E~Z=4|Rv)tlrbAq_Q)(PSq+H^n_ozjy0n@G#ZmZQmtj?Im135#sa`8dr; z(X*{NABS)g=i~G(%o>UFVzhf0(Le8xoI-9N7BiwENdNz{Vjyk&Gpm3l0MI$g{<7QT zB$6*hsX8L-f*aj0q{CnAh1ECJ_rO7S;Inw4j(xE^ZRNu4=*;XN`@0FDA`u#9qbeN8%eG2=7(vw9V>_Wg$9eBL2Qr zgDW8LnJBi<+c(RM7*?2-;fzQBe`gFC$-hiz{I=KcFLTCjGepudKjUhN_Q(?pJ=Lxx zr3Q8O{YMXs-kl8cIVpV(1HQQAYe6pSlAn)^7QO~8^Fz+9sd6qL4tm&co8(k_Eho-( zez8oc)er!BN?k<2o>G$s^B!HQX=`zHQF%gzCCJh*kskPPWLyQTsedBKej>IuB8GRu zl+s-SR;6Xrff80vh(9$R6rd$-Fh`Z-_(hUCZ>J-oujU6~bxgVULNMOmF|cEjc=wP#;BTLHxbp@R>0$3W z-u}aIwKJbTj%U#JD+}(pNe)9XGj0S0cG#r805Bhb?5+tZ)d&*C%xVfHCzf? z#!U4``(eO{`i@!`33${UkrR+Z7EJ2w^P;uwQIAHaFW5D^!?3Xd(jWD{^k_S2k6D3A zAo3fPi4z})4tE_@=44!cI;xw~MOH93?2f{EI2hOJ@7?T* z+**Sz#woeaYSaLDfVp7GACDuBzJ@Cp#g9Uyw)iclKQDQBLXl?F{!aRcIgyMmLt!8d z(ht-`8aNw>&P#$qsXliPq#odi2p6#Q@1fp~p?;8}a8PlRiyt-&#CJSS$< zAWylwq9mc%7rAAKn+q4k7bBx^n?wB&XOiE$F*+Z7)UinB!mH%|ht7REu8Nb~1+a$- zv`v!7>f{s8h=%%6Pb0}KLC19uNAGga#yXyRTpJZF+)lJwvh~3jb{0TBbI~zJFU~4# zb`gNZ0QP+X4J>|XX%t+HzC8;yo`&X#PV6G?|K61of<`aRO0zh+y+cvO=m)Y=QuGSD z=ry`%aD>smfxUnKROF^czm|o!XN>}YQ}JaNn?L$mzSdCgd$0|60W47NYt6CRb^HBF zUE_pm%!!g@zc5{Qlu}E-Pv|6DcSCk`)hWz1U2@q;&*H@A5zG}O*%ox!c2EkFu994K z(%3qD9>M~zirzW8l_lW#V>C>}h}Vn8rk*}L@_b_gCpB>ggzV^MV-n&ic~VcKuF(GQ z$Wq2+Iq7@;7ImCfC~r)*lNYi8>H)G+g*8d2Ki;iDq}`#iPmc_0Oumzz8fTJHS~M(W zfm#v}OH4S!f$1ro;eaQdhD!7mZzL=@sk4{n4Z zg5$g12tydHRc0fML2Tr3R#m*##oN6Sl-ZpO9jHz8Vw9r$YYQCKDJ1(i$rX^*1j@GB zX_*`~9A}RJD10N8O5_5V3*f-_`XqTA?PB~tU|+0VyoZMs1m4Bgw#V_XhJZe7a|40+ zuuT@B58Ld9XYdkPHtEal!!`-qhi#^*019pZ641_+QHCIF zW%MM)U#AS183!>j*4ZdpT;8%Nc(qxAdZs#tGqDOB-C#KTZ<`4?+XjXu{?Z-`AGj^L zKy%C`FdmLjjVN~CG8!$%Tm=d$SB9<}NBl%11?@jWcW^r!BpY_9m%|X@i ziKu{kKye17CmfgphCUiIxD3f_ohBGuiEr0=2k4l`LBRp9Q4`jE9`pDdC|+$!3^!p% zos@ykJ6-I|Yh1?h$Hxu9J%IH?kKK^@hsPA#f&u|k<1)7D9`msiD9qigb{UsrKc?`3 z_p|kPvl?Mc$cdY}Hk<}Ax0Cwa;l@Q?2Rn_1IPaW;qqw&Dgkub8aoc)wZ?Sfv~(F%EVp9#Pdpo4 z&@`rN5M3GIuO1pjlVf^l%y+j%(JL{iUb)TiBi&;hVg%_P2b~kU;Io5tCp3T^mq)dZ znHFp*#aFkN|s_P?y00cZvDeE8$fg_dDDI3PI zO4)nG!eR~_9E87V3XwdtXCYbX?J^Fzl}1UV{Q9vAW@3PwZP zNb(XU?--=a)Sxp<91`Rt4?;s$GIiIWG(iRwCbKw;Hp#lX;hFWOsK^lj;yT0Xv!dq0 z0jn{41O*1M4G|-P0;zQpv+owd-1y^&=o++6kBljf1|rxyC`eC? zDfS^nHyqe~XiTviDR}JV&o@Lo5CJ83NPl4=_B$<|O0qd~!NY#%B#Wgzi|zKTFzrdU zxDg`@3C~Ryq)tYz4Fo2qOHj1@OTLM*D|b&+G&(4iy{ps{Vpml-E>)O18-1=DQVS1B zrBp@;FlK+W_Pd)SPQL`bAl6xk@#luAHj||$nOVd^Z8y7!L$WiAn9yNUiqPk9d1%|%!}84;VeCp{ z4{rb;+03LjWBO5P{7pXs5waniH;%i_%}sZ_#X=nDrosy`mTC%U3Ib!k+v9w2Bx?Np zWZN`P=_eTxD;&=K}>V2G7fhezl+!BFFM?f>?pH?r6YhbW6)Xj4i+NhMFn@T z;NH>*;O>=@7?6tASsoOGf+ZU>EWIydZsa?2JDJ>6rOJo2-gh9YnyFrMp=0Ay4Bo z+E;8ujoUo=_z{Re!PdB|oYtvX6L7RMfHVR)m44x+W7hRYMhN=4Lwo1S zS!k<3-nz`GKTVNVXrDwU@R&+O#%tp8qziV%7cEL^U(ed_b$UqcNvJET{jE!)${+wW z?mnlTxrKlT-eh2IAt0ju76Rpd-vffgUPQ@kHmI0kKn)XzAxF{^EM0Yy*| zr8IFrH$28JV1HTuF|#2%&)qu*axUz|Biyji&T}O4G-C0U^BlFs0Mu}_8+Nj(CpAUA z{EO{2{sqB^pD!a8Q z>ItVMA|>3@KneG5suJoCjkR0YbGau+5l?)if!rT$ii_@p6Or7XXdw3|o1%U_iO$#+ z(tE)T540t|64a{x6iJ((V2~SW>6HdrdR6kYY!Q1P*pTV;x9uM-e@$HHig)s@v;k9M z4gT0TE%*j6Pt)MXQ$ZAV9PpBK)X6ZLu2ttKv!1xGUnwd*=|Ty%u*M9exO%=sTXWb9PWqL z+0-Nag2rVZ@w%^`>ksNX{BW^NeJ9H9@&vrx&b^WPI%iv46BXuqvj2Xj+<9%biq=FY zF7eZ+O^$j!wJ>q1-!XhJE=~|{$UO`)4KAT?uqANS$b@>lHF7=cD|Z-JZzO?(j}KH1 zVu*?F`Qh_6m+yniM$|QVo=TBA2*NjP>O?>rn}eXLk=wuRWVroLZQ>h2+^Fc5JGiO@ zgUrN4BHUn8hd6VoxE%BNi43MM4A;+5F(vsi5{kML9lYL z`W#k%#e88O#958H`Nulq`K4sEw-WPn*5%K;2Ht-r6gBaMWIBzt zVAjQvbmGcnW%kGM3ppZ+Hy}vq@Q;Wae9=XU;`F*WZg>Y_#>AJC+3B@kM`aMfxFN~& z*Ge$x=O2O9;)eiK5cnol60UhTA_b+&-_>c22<0c_9-)al-iU=f0^j30g1!LA+jXGc zZ&6Mv_4@T#*+c4nPv^7^2{1JeMeX+j5QAfKjGSt}mvizmDW1tGNiRC6zV`iq2p3og zx&97WIs`faTcY z@>c`#)3v?hcho4^Sm2&h&{@XUMRI0BZO5iUsRKxMtW8$d6xk6ZJIyBR0W$fzfSo{x zag#x2trFY(Y;#Q%DAYD{(&UX6BW&^d;qi9KVe~**TM6y{mG`aVR-B4{El3T+0i<{dX64SC?R+dn2Ay%*b&`nq7MhsyPQneqs zsVrV%P7bjFL!G&EDt+{r2+jrUbilj`7&sm#YG+>&cLs`q#z5UlEB9j zesPQBtTfg=klWSww#)}$?rm8DAgqh8##sr#+}o111Q}WImZ-_SKR@jvRx~go{j3+_ znn{o>ZkN0T8P>9<9o&lK)d18(03N}$I6Hx-A^_2~I0wWW{*4?yhIcG`#t2lP{PS=E zY~J{&DvSWpJvnD#3}D?H3b=rU8J<4Xi{8<{z-i(JnDpau3$6l*`zXF`rz}`ZJ`ud- z=C8e$iQHveibMpZYp!J?B9?GkE9$tI8PQZZMW!`XMUm+nc4`0^O-%-1G^N7!vAj5g zr1bHl(x>1L8+#jmozH@tEUpg{fho9hpKNa|Mc_r{QvXc5{)Kk^b$0!$?E16biN%VE zfpS;mq_u)EN5UM~DNjsc6-8*1f-NaZC+o1#jPCSOD?NsO+}nxIvB$0MS)U_4TO ze?KSfOsGesA9RYc-p4W|TT6=6$2s9^7TmV0L}bYY2P##9B3VL`ciU6|2;Xt@le`9K z1OVxPToIZO18J@X>2jHx*55O+B0*@&BqC#FhKTx=ne>Rb4d_0~AAmOG#BCr#+VE@4 zGZAdVmlhniA-(9ph@XzS6n&o{5p0XOq?8N^@KNK_gB6F=wsrZ{haBbTJq7Jz~=x71>n@i_KdaE4Xe78IDJH0GmX*JyiB zZ68p)1XB~)SAq{n)0tQEP#_bq+6q5xy)cp{gZkR7_4LD#p1TeWN4KsWgALXq2b!Mqj;; z%@MU@6X6Ow&p6D(K_ zJmzg6hcj)g51kXeFRy()5q=uiL%&t~MgqgFJ6eZYHg8jhxN2`IWkVwT)#mL7w4_nH z*Y4)YN3FHZ!Z3|djb2z})jVusE%S^Sh^$-LWW7PwsL-cc;n3#hU}3K?>}XT(9cHWI zQFsxWWNObanqu1A_xdJKH_;_c4%4j7@N<6Hs&UP+m_ctuR^7@~$J1UP55wXItp+_A z2CDfkIM>5AuQSgaFX6|iM^G@m=i>Nr6?jDyYuCINv!QM8!|F_n!?Pi_V z!d36kV+>EKF3*;FsxTWsI_bE>wfh*0Mu@AOvQykC%Ft(i1XlW_nH<)99If-#{u6y> zxz25pQv;* z2&E>U1hAWvN*sI>;syZI@>1zrXGYagv3r-grQtja(e)?nc{U^*|M%|f_A(?y2nl|p zWtmBM(2S4=skg$exB4%xS9*jQJ3oMOUO`u#{tqWjX;KC>py{Vz*URrqRuz|BLzXq@881>Wfvq>E{9{`O#NB$^n$~y#RNI$wJfwtHozxDLj2Qd)9~)V%4}Bc%gKu6B}az+`G`9xg{=L*^1dNl7+h zF#$9n!3M0L9xdj@er)E6_*2ZIznG0~<4~Apc=ZLatL0#B4f$CJ=AHm^8wi{i8+Yys zFxR@3v0Ra?ZQMj`hH+;~7FDX^(>`$2R}6rRWU2jhnoHr)T7+z zd&eErc-M(D(K~;RDa9$QcUoq8*AB=j9pnxagb~7@cfw^s)a$d|baHvrz7ttX4ptB{ z8rb&ROE?(dw}!$7#Zw5xSHcRmTjOP}j4EHm_b(Wqc+?4A zHB}O`=rQ63Cd&zs(9T|K{P(}cb(!V z7prJ|*oKSCeB;t=zTiuW>4&)CuCd9AiyhA#?qql$378pgXy-6|zNb30N1nOZEQ*&L5d~KeG)3ut z(T>&W^Fd+WOICwIV)CobjAHWXcGt>ej)~5?_)lh)AdJ3oe5ByeDfZTdYzST=g8*C zHLv1%D2B04w}8y9X6F*5?B%2%LlsP;5N7R-D(P0>b&QjP#XvwbJxw`+lqWjr*`Q<^&1e?x zFUcGnMoY?*T3W0UJE@*;MuyfO`N&w^l=+Yo2{4;DH)` zzPS>_2q0M7&|6zd3-&c|N?M>{(*lE#7O3=3D0Lz-wPPVmocyftN>?2V1Z6vPb-vU> zSZcW(*z{nuY7Q`b$uo2*zOU$oEH!8*j?&BtO8_)OKc*QB-P+GiZwkM4=R|e%1VS z2~_w?oTkV_h~(rGQNdqE>U!3*zj0+|04?G=eH zcY360ir)btB7X#TveFhc!f4VUggv>x@z?rHIbjP(b_*Dz6#F2$6aJO$0>sYbE1ry< zho!+;=R4_}(Jh!Z7-_R+IXPKbi(P}5U6!AHJeV8}0*oc9YD)X;zk{XIZq47SZLwDbH7qkSnX+UntkX#r0)eO4V{UruGx=>5F6M1=yf16`cdT;AlLm!eU{OW z*bi!vLCk&{tekbc0~)F0wzv)=GU{+XZ%{|IT}L;h3c2*v>kw6>=1Vg8xZ+lU1Cqh{Iz-y5{85BI|U3%h&Ud!~XBXGNfMlAN4r@Kt3N61T_ z9rmn8@Fh=w3yxp%sMIu+JA-_!L#=ZFEJT?cyoP@4(OCWDzXG+Iid_PgO<967Y^lGy z09^VoPA{eYdO?3Lc0dcLzjElW-+D)lLF2XlX1u@u8}ER0@#f!oEyA7` z;R{9}L|6}d164Q#B=dmDBO5(9z1f?;|g0(c1|8DC*?ZIZ?T)&)E5C!KBx*1*ebks9!#&BOaxD-c8v z7H8+(<)|UlOPe5^1_$&7(mB=+?GogsZ$gpYSGXg9h_aw{);&Pv0U-`=Rgny+27WB1 zve_ZpfIw8T3g54A2<`$z4;Ilg=qp+J0>SV^kHLd99FM`f02c9J3|9X29|h_MO7?A7 z%lFM)^*Vuf0sI1|GK8*bD;QNRmaf|qXogRX#vOudA=#{@u9H*rwWDUEKWJ^tz;@sh zX?_>_QHMpkbl4mG$SJ%7gtS0A1?QUv9d-!?t(`(QqzZX7xKai;p#b!Z%I$#dXl1E}b+qyd z5F)xbT6xF7QM96AGsYQ26s;twux@1O1HWZ6227O%;_9=pKqHEa6;-5RR3Bc5mK_8{ zFY>?6Z5w5U*U^Ox|*+lBCE~ULcqp=lqh)vlq5=iB33dH8A@&gQS~G5I)bWW4O+>Ak!mTK zjyQKi?1=w`7>tg17a+tDzZi#IL}WPPVL)U!VuR3*SR;%h)(Gv0HEcRQ9q}r%svYqZ zR8sGV{VwNwYEPQ`!RRG#zUZlK=@iwT899ZvljD@Y@?WGI$Le zgExrC;6qLVh9grJS?cTLC-1%nD-Q^rhW2wXpkur^2C2f|q4A(|9uQ&+9CXB?FV?kA z@LGvOHwf*}HNrS_jnEEV!&khjyn;n` zayp3AhrSg{eJ2D6j2MOiA@n=PQa1=Kb&W7m*9a|j4eN%;EafGXEAD)>*E0D$*x>Yg z=z;i9knUsxfmh?0E_-zY;pPF6AzXvd!qo^PT#eAe)v)1-uB02vZArCick<)gj^cD9 zj_Z;PC})s0g-gO1OwK2ON|OvEmjGae2?miX0id!J1IV>_))l4SL|acrMO|60iz5;^ zW4#E7JR+V(02!_Y$&J8>&3R6#Xy#2I#Kdx)VqrvW1^PSyWTc3IW~3Z|VWbLxW~2ts z8H^}2un+5P=@bYft$>hmij1VGmyy8CB}p;bOx^G@bfcTYkeXrmM*)$c8-vig(Fmg( zjnKN$u;w(RZq7luA|b7t8-b|TjmT^$P$IJer%N{H{;gnSg7~g&@*A{eCRrbgw>_M0 z-?1j<^f)J)Zfk^@ZX1M5w`F2K$P&YsKuEW9y(mOTy&Lyq&x=9?gFuKNS@J<4p4^A8reiAx zLJAGMo11VOB7AJ`T6w zNS0dxKnEz@2*kxa+n|_LRxuL%oCt(?C>{J51X`xVBQJh0_Q>V2MM40VyPk37HX&>!KqG;SnG&E08VpCMf8&h#Mb&24%V~7 z>9v5RA8MnYLE_V$95G$>Ndwb02pzXCCb{kwE3Aq}A*)@{IKaB1Xzn=o9Y^(~Y7WDT zT~0@C1VZ|A%j=03HKq?~K-YpVD-fJU^u++l1PMS6k7-4K@x3eHV)g*hlTM6QL%szzTNZek<72P@@q|nKHJLUEH zIFQwXDx82>vyU&Tth&tc)*X$l(@<;GKj<9(f&ae3sawi-rgcjp`rN5&N)5gkpH~9n zzp8AgFAvu4@ilQFFxmvywZ#_lw(ez6qyNTGoI3#`XD_&n8$CB;za1%@(!?&vtCO5E zI+hh^fUnB2DyVCpirQ~N?X5aSwb!tAvo!48ijwIYGz;%ti{)8F%+8MfG9;nvn54P$ zamprQ45uo<2d?T#By;uA8JerS=K#lYnr}Xh3}?s1rY-Uc2mKEaATg@8e8MBvO86Q*YYGRc|rv z+(fD+(rl4E3o}S`2GTCoB>E#Q%WA}W6ye806ssRLQz&5*`T$lA%OKT^( zcq06`K}io?i)NN0?Ww4wFLX&y(;(bh$TIO2aGW0NCY^nar*`d+JTD{?&4bLkDlWlM zepJA!M4~0qY*GA-_xe2Y(RnM8XxAWZ%PkX8Pg{eXv>de(ok2m_>soI?hd2jYft-` z>Sa-U`+f8Ue_~%yl=a4+U+|(*c1UH<{>oFA!*{#$e2Cgz07u}?;UAt?l3j)!;3e-S zmAAm5BHU?kXzrDrQp&v<#?3W1q}kcXQP=T(y^X5$c%zcf5{9?RldUj`!nso*Is#@&W)?BI2J( zU^Rl#NA^sp*G7gaZ*Sx&#VvlLP^JKjZuV3wG&OH#((&%cH$gj&h{>)v4d;e}87wg& znr)d-cME{h!e)UQz@ks_z-KEe=>@Dq^PznYCqhh`8J+*uzBd`)7X3pc;O~RHr5`3$ z2QVIq|D=h&YDG+IT2EvP2gAmrqgq8qtzfa|-Nd!z>@cud2FL2JYLift&J0yqiQ_MP-@_N9(epmv1?ti08P)uRRVZnwdlNja z|1%i4>Z63}jDS?RKKpy8i?J<-D1`74S06S@sO7|T76I%9DlrZ3?44b8$FNYPkA%?o z@8PO3y91aDAQx}hmw%R&l-LeC!Vlg{Vl3W!HTX8-38n*xj?3|0!1w3ln12A3#&3=M ztL9>S#jGOzD8z9R_Ac>x8B(7DBmRI^p26UgT8zqWZ~6-wVZay-w@h-Ulr!&|e|l=z zr3vNil(-GS{lXl~rgu(-2-H*^o`XTyMKl7yDge2Mrjpx0&n#dFegTIkp}O@*b2lW~ zhlc}5Hp3!WDv=+K0Z>9_~;V3SnFe;nTqEWKK;#F3clw8NEA67TM`pNxHu;K7YJ9xgy9cl2TR7d*qu|3eSIIF>>#T!-$Zd}K%|W=~UZ2riK%L!? z%*-mqvYC537B|r8w29?cZnXR~%V&w4xJVuNRpE4Ct63|w6t=`XW-iQ~!AR2Y z;gpC%=aO_!r$eMr01#zj8&GVBo<*5Oxt20V05Hm&K|m|Bj(}F?1^`rMNM)A8-BFQQ zROAQ%mJ%c7OahWxq;eMHnH-C9)&rmxMLFg9k#a&RrHba_i+AS!QFoQbkm;qmB(swIjU;k3!x1waXa z^plviX5}L4tz^N z5`?uhQ!4;5*VQa{U#BQ}xrJ!aD?gj@F9{ekX7|s}AzTfvvbSy_&y)B(xJ&XPq?3;A z$*$~>9BskPE@_`V25Qpj&Bj!M=#IE#1_arCFvJ>W4h9Cylo@7-ATzoWSS(_aX2QUX zhylZ>FtBxtOt?QBK-Mn^XBJYR`$r$<#Gd}dS@?{M&Z~kw(H+8(XE3^mdno>R%f@@^ zn3t2P;~5wpr)}e@iYF7QEpG&bUPW0N8ER7M6p9T{_YQH`loyys0X)9s;+nkL}5#qd8H0By>?hZXPD{ZyD0CepRgAJk&V9? zLzoqedRu=K1*1655-L#$W)|FuO?_9#KsQ8yIoYA4fO;?@Sbx7e z1C{k_QYGGl=lcM|q<`*{N?rI1Fhd;w5uER*pRaob*Ud+Ggo zDzzR_z+pIMXZkg9%F|!F>S081l5*WhPxZeRz^~Zx_w5Df(~xxPWrU5_?g`>zNNQ(quupMx>V|ALfekl&)c6RLv-{Ey&^J(SiNWG7?H{tV|prn-Xz=MJTw zCV+!}yoHA-_02jIK;C}&r?19e0RUTqyeHw#@({;K6TF4K`f2~D05sUlQM{in4^+uk z@S0B{%i?PsbuJ7m%*QUG>pS~uJ#-kJ3hBe(l~*~?Q>A&4><|- zR4IVjV7BaAPpu`;4P;|?cGN#e_7;S4%FYS-q$IqDkvhJ>Q{FQ(lzJ78ux)QfP|Kha zZ%&}YU|_fTm^~2q5qXY(#x;DR<*#8d zc8@H;ABp>0jdavU<@TRzWIS9JyOHh>>Ka@EZ+yCmip%G>XBH!Axe zaC`41f!ccy8-+MK+zTmet!iJ zfb6<%xZ38jIAsV9Iw-)6Mp8h{u}ZypFp375l9K?u74P}#sGmTL+t$2;_DQHAtbo7` z*JJrlr>w`P)NoGkPvV(a`N5Y3b?0(CsP za{e@seQ*SVD&`^Z?z5h%L*L0C0A^+uVC?|Yn|vBgtK%GXI?4J#oL!FdRX-NZJc}{U zyO>2ENPF!C&*m?~`Q7s#NviD5j=xAb>a-phN%I_kyD3WT&u0uR(F}|x=VxQfCs&7B zbay1;XK1U}8}9wlRf7>#wJ1++fzg|881|rA^y`#72EPVAwk#X{-oWme81QpG;8=|5 zc8h+1+(nR|Uw|>8Ezm6{fdx*M{X|V%`?_!K6$T~(%I(t`2KX(6G!#N=u`i72wpzT+fwyTfjFY2l=`QA6idPa$ ze~PZwokLH15yD?@uQf`Y2+0*55JVRu;SG)v!RZJNQmYcGa6%By0)8!`i^AiAPFcMG zr~>#jIj{EVSUjAa6iyBDB9X|eS9M$2!=K3 zquut|7eUCR5X8ffmkOuCIaRT^%Ys&ki;++Rpmk{~+#Ao6Su|e2n4-D)AbmNCz7eS` ziM*z-bW5|(h>I4)<1AXGzW_Oj;DuD-%>kCb-p42R#}5kGXh;vshsv9ZgBFkJ1_E&l z%OOzt;%*Ysw6*+w7bTi2%=g0`Q1mMD+s-dcbO5jcK)b=IFdxrFt?)d_X&!EX<0vPv ztCO9ibjb$#mdby#d71*&un0N(Rg3xjk03_W&FHoYMMy=AY-<46fh5I@K+*(@EM7;s zlR>Ma+?jkH+@*<_^=K49Mqn_iu#?{>{fvc3?u9@;db4|LC!fpND zsU0mu5xyHq_p=ct9{dJ2Hvc_PM|VYzA@uijSz>s3uxu<$xbsT#;`A$=@M@S$9XZ5- z(pf(s_j&-rO?ViJE`e()yw52McLiM~fRYj?mBY2Z8US8C>XRa-k`AXrOA&JcND-;# zF?Vp5ET&zmH##K^gNP!Y3fGZ} zKipM?b49R;8@ zUYs4V1prxV<#~&K{yu@apjT40t91N1?R@oR*XX&~+c*QeZ}gmaAMa%`27)GT(r1vc zRNP~w#asLBAy-x zrK}u2`-D;-A|7kkj_u;O=XY{^bs7Ss=jf>*mk5J5kDn-|pzL5PhlIzJILusvpm?nG4T z-hnBQx3-0^{{3iDwK-Mn=3v-TX4Q3jxa!|0pz7*ms&!FR)2^(#I=OwSUyRt2hz_Y# z$PP3UgG!q-+*W2Og3jGuiV&Df5&Y+V)&q@Pk9{Ujzk^z?ar~pNSE@gsp{{75`pmAL zoN(W~E{cY>haN>Pl@q-v+hfTkF)LWiQq3PvCCA0X!2_tH`L#tUY=jai5l+r=dzkTp z>Pk*cz!;OuV$tp-c~UvWFs+4XO~KkW*{{asgH9EEhVe35iaj0=!pe{}nAnl)71@u) zqzJcF^QTe~;qCymwRL&dQ>T%(&Qv*=w9BI^>l#!^*DO`~+ny7svoNb`{unJ;*7jxI zOpEb;!XcH%fa9X$86QaJA6}zWpOZpW^aN3OQ=q(xdxCl@MLf!6sbVR{nP@*8FEn1%S(|I4H*!DXAk1*O2P!6f8b%=5dQ z3fI^HdlqiKF#$Q6r0U)ZQS-RT-j&Rj>uQo_B_^*2~&1*?%s z<#!(&b;IC*DBC_r5k0auDfeyqnS-8nRrxKU3Ql(X)rfPa9E3M*b0G#gCU-?&ko5k> zSC8Eck|~q|UzvzM^6M^-dH>4spM4+W2sz(?7>FJ9dPqR(`sUx!x81>)iQQ4{gbr9E z`znq0I*g91ztuw9$MP#@df$3^Y`yqz7{mGlqu~;A)u7byUrvGWdVRyHUNsXs~jg9Z_PE+8JdzkogplRHky1&_LatZ$xd}FiHbrzpn@BL_@DOOfb z%cmscGF4}kxf&;1u*@O?C{J`yPQcayO(jDIM8rBseHVK$T1@aR6t&Jmh_gw*5_3=- zlcdI>O=PKth_{^r(=PUm;5l?V&9oqd=~Qm)q99Ebyn~B|JPRS7(NqM#E+mFIakp!b zM>9u6CUcU9By(eRaYPFmAy{z+1=v?!->rQ0BX#%z6#C+mf%=ueYq3Ia*9xsg2S}Ac zt8Dz~zy_be)Tv=2#Q%MW*PYZzRjiRs(6A`2CRQ4nMYEYqa2-xqXW=sm*yaOwDC#za zYcZQ%MuceCXo3zfGM}_o-*}>^KCK#|u~kEasK#hQh9p}PW=t~L6Tc4sl-v;xeT`HzGe{Fhpb;j94@B#6!t^62zxW{PL=& z-Y7>2>z!2Jl1RG)ksf@B)i7#z75RqGGYXLUY&S=QC_vh|!L&1deax~Km#4ggKKEf& zu(wC!(<)C#nr5ZsCe+4(Ez33X+>=?e-L|IN!CR`$btfEVBYQ|)3-3<@9!yk@TWHEH zBjPcq&@@x~AY*4lWZD_0zEQa$%Pr~xNi}ynh}g;rpgdW7t0DlA$r5c1fO>IFj+4;a zbVvrLq=HE+0m)&IwTNA$5CD1FHXK3XJD`F z`awZ*WLzTQvXWNmyLv?QggXw-;tBx%g}Z_O^%Qd_w>WVIfLyG?ae4d%JeTvibG$rW zMZo*R%i~;!$E~I+=L0Lm|S_lNyCWsa`0IQW16R z?i8ENTB47!xIj;D*2+*wW>=tvX7mj>4CRf-3QPh$BlsBu=;|FkwHUr5xCFq!Gn5*D zRjlAs0EeC9s~ebdHGuB;;Qcm;I*|9eTyAvf>AbJ;Qb?xxr7rX#FMM4_Ti&Io#Pjwk zNN~663e@K#<3)loSYdb<2R6&R`dAO?SHLZJXOD3e_FSuA5#GYNH3{WosvTSopzUH$ zO+cLiw%K~U?}{$X4P^Cto8HK|;iY(a;Zu}+^#x9}F!3KRe)oh?2@?-z-jc(j&6UAY zFXbWvpnNAl1;GPeX?m;Jsfe$gf)i)>9(Hm$^b8>NY;1JffIJJUug1d=0g5v5nKMal zhl;dO`c315iKzFT3rR1Y1!%+49?bNh*WR!sBPO{ZOJsT|DQvbXfyiKs2*Xz0X0o-a zNw)g1$Yr=hS92ig>e#zgqU;uj!k2UY zS;5pj-S#s7904F>{wdwlnt$58GsW!GAIHNM2O%iXPM3&HE=Faw0{w)TW7Aw2%wM*e z%R)sW(!!~vf5j`67A|BP(87={TuDH;Zao3ry4?Oz>k_iL5C8@O*;`nJXFUjrP-=i+ zi$o}s?QAoxYzwVy^?H&eqgQdvgI1-)tr@D6ro3j6n6{bb!(ZZCK&$y^Sp$P8A!apB zHqaH-lPnk+X=V{g-uCiLXOxLTp4Zh_y&!C>CnCe@V~WTn)S<~4E`dHj!zGwOz*sy6 zye2GOLYEd6_eMcf8`ZfZbnw@-V}|D7ONN)*mBwqsTp!2 z!pLbo$v4dz%ETnu)smAesU3piWMn&aD!v+eETMuk+|(DbF)%O+reP89R9FtZ4iTxc zL@GT4c0vRQRkt&6u*W4af`-@aOui&ezY`C57&}!k9eXVHgdb+6PBB7x%e!MQ8D3Nc zH@MM2yAXr7urmOQS^pGR-#v2W)Ki-GZRp0<8M!65s5@AE_yyboCte9E>l!{K2F4+Un=1{MXrpf^zpGq z#N+#JI96&|D!JIrPX8QR6A`JAZW@~n zV{?+3?OeBQ)-|x6C18W5q|#pjVhQ*`@aE=4i@$e7rs2-p7WYqmIR{1)o5re`e=&{q z1hi=+y8-xbn?^TQqD`Zc!2dg@QO)N3PfVkly4R*L32a2B@t@d&W$1_y|Bh+o!gc>&U>e=PMr0bFHfb6+U=YTD;?8^g zb4*O%!+^5bO}~RdnGQz0_7Yr|xEK>rBE;&JyCtb>EkyDi%)Ty-5j4Ey?aqMIvKYZ7 zvE*W>cY0Fn_ZW;NFTuUcJz48l9dSyN7k>KqmjMt4~9OM4Q z+rNUNiZw~S`|lCUMP{6@xy{qX79!*YI;Iq<=smPhmr@^DX7KV(QzYpRw~llsla@6g z`8q~mhNObG+=6J>cu+?abqLI-JOkhGu^VzxzlsL@IhHCJL`)!{7xSkQu%jxflwH@% z!HKA!gU=JHD#&jCb-6ce^N$PD>cLqkU!IxHNAR-D;v;j)F z-?=%BD++621-U(--tXO3;aC9O0LU)Uj&Xd$U|2R2KaN!T7luHxnRu(XQwTyf6PsQk zle8Z!lQ-d*A!$#(f3=u09Y=XbRXNei%2VJQJ{+A;`!R~nju*1N03#A#Z*gj%zU4?6 z_l8O~1ky6$@84JldW2bckr;5(dWA9E`nL|!GpbpM?irH^{J+vOX0S1Oq@Pbfx@)G9 zZ`%Ce|B9X=KGg0RL_|Gf>z%59lyj@c}YTM(b&_&H8*mrw>+^pIKYN&=kX zat(AX0M2N|?<$;6!P%^_GMRDPR>nS*;d_b5bdU8`MkaO7m44LpVuv5kNTg?Rv7qk{$38?f85_wS{pY}Ob%9^v^E3*ZTw}+P*rTYtr@tIOwACHsTr+2 zBv>-uEX_o#Cr={3UOnMLn`xCS8`+C%@j6oddOHyrD=0BVw76E&uvLf`Gh0PO{a8Pl z^wPJ1-V|GFw6GTKWI}G;p7X!Q2~GHf6i(VS3q44>&mUbgoVl6JTDZB*%8tE&M5*jT zvdCqt>4CpeO?8{uo>iOMo_4WIkRY4w@z%eOFW<0#-Ne;rL}RBrui`{c4Qik;87^%* z6okE!M?{7l#uW9w@6U~}wmr6^`PjZsn#JXrur(C7p3*@hL+)@X!Y4h!e7{tJ;&KA^ zE*I%6b{NoTb!`*k*LnvnVL%lt(P2Oh0XqzkitJ<)G0OU09g`RM zy-aSCoX%M1CdqC)M`O7t;Tpd*)5BeBv0w^O${YNF6Tjz;mvO%Y`v^1Ld9~*%#W%M> zThFXMikY|bQl@Na9uS7X#=*Qqyf#UFFyFT%VtFSDsXb1v?Fhsww%OjXv+=SFaI}4WUM=)$#)Ra`S59cus>oZ&PdA%*qyI4S+F~wbR@fP zY(nS5qI+zHQRibNrt=Z_FLb{BS?8uLZU3px*NgR-&d0`>&PU*{>wHj=QL?d4>0Jw1 zQK{F~B%6+r*}Fgz^+wWn^x7GE=pUXko&y?>J) zk@2Ee8Zy{=(QEpxSs@Z(?d)|l#Y)R|^g0`XnLL>!JN-UMmBpMXC5wKwgzX*b6=xQ? zTa%pX#Vv7-!?0OIdnMs?_onhl9Tlu&?}l~QLN+=xMV7D=)in8nSJx^sJ;*W+(=tpNQ*iH-eoHM&ar({c1WAqOs51bVIqLi4x6?lVpcszumXErk-^P=WlF@Ke`P9d<115R z-qH~vKjR_HC}2p$c5M>V)gr@8qs0h{oO$6(zT&2{V45f2SFECNrpJ-XdIEOj@;e5W zYj#>0MoK6plxKJ~y*1tA(5TNyhdw8E#N{mFTx{Ra>+pQZA=`dT%(ewF7g#Zy)B%La zW9mp903EPjif;Y`S2ZM_D-uEbu9vEmGONk%u3e9i%>PXi5&U((>7AsMn}4$u5y@@8 zS&CG&_%}=6&~@jERuGvPkOH zt`#Pw*fpDOkXg|+O_d_N*O2!)*uALjaU+2NNHUAOw5f41lf*8zF=L{=D=fz9RilR= z$>ihuCq4XN+))9CpUjHv{%0z}tGm;cS&{dS=@+Q2mtcwELafyfD{rt?zXx`Vh`$)< z1d4l$f*fB)kP>cOYKD8W^gt%B!1O>?!BoB2S`EMqDU+gpfxhYtsoGMhx#L{KQhD(X9e~U_dnVdw1&;u%&i}?4b#pea4w$HUbVCQUc5Xh78`;&(h2Kz$ElA zCY<)Q%*ZIikjV1P78Z#aEuw&rM{LO|*mmm!#qSe>ZF~v%O4x=$@SI$#sw7|sd>fCw z#n04`KJqh~R|!s0o{@=R#PBL2uu1AgpmzoC3KI{u^Xu2;z?>jVvGqMk*DNH9{oh&v z6RX}6_f%??n^MFur?NSt{FX8unoB^BU5f!2TU-&P)GwC*xur0)EG$Djccu(=q|dY2DZF zM#r4;`;4FV`x2VeBv-5`7pHgxUF@PHC9TRJa5gF=i4#e>dOtZv3qQ z+#*kDSj-&yl!lc6^eGMN`5d3pkh?XW|JaA7{Aj5gvv2BGqV?gO*aO;aY_74gWvsJF zHsYxswG6xQh$)k*$1D;-Fqk!44`m(sVZU#*kz+x~e zHi0}iKPelx07qL?qpulD?BJ?M6c&zUO67RiYxvF~WU3O4Z`tztZco_~a zV>>bSI)_{zU(CkbkB`aAVT3CI@Ie2!5lOGdvmEH(2jOZGr@`<*|C}Q*XDA_XDLscW z+ods`Qh~i)nuv_;(hSc3N86>Pr*XS9G&2zsMDO~yaCll@aLm(Zy+=OAl`UL^Jr>6& zcb}uwU3~y_aa{iTKfNA*=exb*-?cjq8^TmR*b$!@^Ni~Pst;Ms4xaCEZxoLq4Di}q z4hPHs_2}q$v4WSPb9GJtwM+$gdSBxc`{d*>e_tFQe?3ljEBFW%O$PtIH_ub!y5f|p zLmZdC{u~_W!;hs)$Ag5&ZbrwAP3|0hLtToqHsy%1OQAlgZ_bs`5o4u?Cwb+8HoVe_ zMX6mZIOA|rDw*3>p*np{!7`vqk8WWu1|V#o=gKTR`AFX_K;h$V0du}9x|BKJbtSrl zJ_%_ppK%h>MMx)auv*??kO^17&*of=7O6InD!7;erIH#8WQ5JBNrdrAKOm8?JvhO99xRt_OmQ(!k$p_y2r8u2uB;f5eL%!#khP`t$!f0`}+sbO|;Ogg45Aw0RZl zIle&JydkcKZ7ynyqH&&qX)jg8_BPd;#0!UFdjfKlo-{a_7q^TGDIFiA&cF!9mJ-h2 z2J^>p7NT$~e0y+9>;p+rcqiPZKD3pHyi1bxhqe-tacCWL_KPaWqvJWr zVmSt^1^_!mQ`dG(Mw&MGnS6%9>y84ekdAT@e#to%ijD*)`*~a^oqfl1lLe_Y&;dyV zu`bopbORzv$M-kgfN+!DK<>d=2o9P)JPg^Gvwf^z$WoP_nrqZaSoEvaNkoP^;W0AR zNkoP^iO}jyP@8q&ru4Md(hXMO+14Vb_!(N{Xu|H$$VAintP85K9nQMIkFisVxU{yV zu~Whsc1lEsoeILXQ}&GvJ0&8cVMOSLDQVeyw(N{<(y}BDueDpom^GtitTCgb(-GSC zNqD0j-MHzqK!rMunMT90ROB<`2rpoP#1|*yo_ofw!~IK_S8fT*->KAG{B2 z>0RAZ_rz`uXq7)5e(o9zQMlYKNcD_!kfLy!Ta|HpQ2s7npTFq#AQYeaA+G#6&CQz@ zqVP*MC%GaPSk3hyXmNgXV>JR>xBkRFsY%~9)v}_w8?z#m zj}e&NeKD1O?#@wnkCZN>o+?HMu^slG=nx^DK?w`AmCX*6p==_IvJ*Q)XBEf;=CUq= z;HvRVC9A|fC~Y!R&TE^v1kZC>^59f@2rQi96qj==&Tiw0hD(?Tz?{s)SvlrRNgY*4 zyKc>G5oxOxwA_1=zPJ4=gReRyojEXyv7adv@G0`3o+2?JKL%3;=V|oK4P2x!&%bi^dEg0 zoyh0vfo3!j`Pg^S5s`5h9TE0jbcA)kO!7SyyXDhBmZDgk(rsWyyXJm44h)QV|IkQL z1BvQ*V=|wciZ@a}#Zj-%su1<2zmKC{K_Kb{KKq<_{zv(h-q>B{IWwueyF1D}XJM>7 zJ+~_dojJR$j*0f!ZIs2PIX)1|D7K1q-BT=vvOca$Pdzf6Y_db-WE;7AV*(Nh+T+x3 zyHKgV1f`Zvielyp)?m$i`mm|m$B&4sHwWo%x{aEMnlVuvQNv^|@8QcrNol`$q2!B? zq7&Ilu{eU83sAj(*MZSuM8PjLi?iVjux#PY`|$2)L8f58}cVbH4wgtk!GYE>pHbaBw!QK{XV*z*5pWTf{1!nlB*W1}Sv_Sa8V8WmW-Tp*g%* zW<3C1py8Zv3Q7kxH=GmB;GBpI&KVYFa85)9=S1j=#0w<11LxbN#lTDOtPQ+^&)UF8 z5U>rL(W-6Wgqt>SBuG6ISkIPGJyWB4OhhSbWT?xmv&fX)u5Z&l4(cWP!ud5`b903&5gEfK5%#c2*bJM;z?j%K zdIHH}ua7$z;TCyLDurur3;|yxBw|FZ=<6(UH!&<%o4DveauQe5B^K8o;7P&7!g$I zu$=$H-FF5^RV8hod%JJKyrRp?e(%nYo>O&FRh_Cj;hx~HVG+(* z!y<8f<`=)_l3wEIOu%@7XxucRH2$o{eyhXCorVvk{Tw*@(#T zY((UEwmGQO*)AiVtq$SMS$^D1sA-b)aQGMD{9!pWcWx2os`M&^#i7%?ZvenKgLrqh zU%>;M*8(u4DbE`M<8<|Cn}+a~(&kH0KGk(=;Y*Nkjs%IwksuK{5+ou= zfffVp*@`Tz7R7sx} zTfeEt!fQxUp7B^U&@q;u>#-ukfL=o$hUVw-*1(Mn?;cahR{$_Q%4MWKuw^&q?AxaP z1wB$!stVcn%Sch>4A(1azl`7a3};dMxA6NO!lrMnLT0~j9YG-2*U@%@eJkP3_pSc$ zpDsFQ1}N$rT$2oTIcOj=Mds9}XhzbXA`=!hqN-CuMC4471reMg6Op4=MC9ld5k{}@ z;H~amhM=*EW^{1PY?S&_wAAstRl+$hqZ5(Str8LJRtfvvDxDn}zy<>;_Ui!bkCUfB z_Wn3|4uFQd`Vzz$@3?~Dz}T3BL4Kq(UY0$t_w5DG+6oPmfst=7*K6Jdfw6M(4vp9y zDT*F!hhO~390nWwy*bR<_O@D3f#{o)yTCn>C#reTEqDrU8S%u>Z<&iA9vcyshggg5 z@?Oc3;+{kv`I5T}K9%w#bJ4eP^T1di7N@Kt|HZMvMEq71pQ_D-bQLApY0A^u#hccc z8mY@H!RO?$Fe0JpK;)7tzx~efs=U;DPfTLzYz)QE|E%-B2jox8rY=NB9k$LckEv#= z3eOx&joYda5dZ3`QBC_Uphh0;<4b%Yk_5Ny7rE^Ch??^*UWFe9G4WZyuzA+c;=JjYfqV+IsD2t`pml480k>bT=Q@q|wV<|s^=@UR2M1%~^NI>gjN*H798H=a5zZjk3nNcQBog*j;kQuC06>QD zl7nn{?GLe$%OR0f5WJU?`GPHYY1onH3=!+xf|QKs?8HmmB4R6_-LD@CtIFSmglG@w zZ4Dy#&`G1qkk=rhjT5oxYd{P^iXE8(PXoHALVg=T2QHW`jx7XmGGb|R;mcaYV^9Sj z9$f`2{-l-ZAq`vo4pj24A&9G|H=nk0vU=mc{g^OsKZfoHJ@%{kNtzcJExf>peHKuo zxho`IwCh*p+O*i8v=3uOXTv8tciJ z%G(c*T^@7Y5+O?eSQ29NNMpNDRS@wE}&HK}46ivDnZ+iu~c3=s*p(W{r_(%pHYL3M)9# zF35fefOV*lL)>JUm2@sfhzJm^l80C@2<04sBEm5|-OVE0Xy0ftLNOqihzN&GY7mhQ zp^S3+p`0X=(A^^m)sTPk0%YRU2W?L}XehD!WYF%DI~c|%&?8u0YCdp@OXU?$rGd3I_h1f9Bw7LeTP;+%9bOn z#9b4VIvjY0hkSuIG1nr^K~`c9JXEj-B@q9>hmPv>PcQFVA6V)srrEOOX?qb4ACq&1dYmyL4N zAP~YBnD=uq6#g|+5Reo`IV4F{0$fERFlrU~N9$<&aO0PiKpUjD< zJs`=_CE$4RC`)RUn3}d;trBxbG9tA~OrND;^*u;n44UA?YP>glW0X}|$y*#tjmG?2 zfL3EI^#UwVfLr0lFZ@*lm0w`GfG0EKBxvKPkQxc<;unOiWd87w`u-Q4Z2fFoRq8y- zehkC1{OiCl$8*MY)Z7(TZ5qdv+bx!S18)YkM?vl`u9cjOr!NLV8{Las$ovIZioJ$? zT7Rg0qdPV!<%w8W^})J%Y%Lo@TpxF-C2#vdsj{8mv7P~G2kvI6lXn2{j$l6?Y|4Dbp*<(D&RmRpPQxB8?e0cE+L@c22}EfwzjI>4ye6> z!rPuC?J@i$Z`w1gEGpuZ^a#oT!qg-lZXVdz8oJJqP}HQAl<8F{08PDV=?RPj=fOqRM}as`N0l z$#Za6CvVii;~zL`^lwP);68R6+m}^x)F3FtMxZJo>M`x`9`g?xm<16&tz%GIb2vHA zF2*l*)G)McVLPgg=XvCf<^ClA55`Y&W+tNkHPcnid&I2d^LsmLpM9dL`P(qy(v^v_kK$(b>BFkN5)YBuvQs<@)1t_?Rd;Hrbkta zj+Xs>OCUzH3aKm31OgXsAkpq%s!FYH52XO+4k-~Ds}x{u4*+E;_BZWrRH}JsY~_*W*BnVQ#q{S1E>kB zI->fchV9UCDEs^hQ^F0e<7wvcuIkjuvga~28BFvZ8&=Z~1hy+2=5W~R^-+cqQ+qES zDZCC4E(XLWgdX^j@>iCHRLOc*b-|V1B-CjIIn9oT)a@|KHh5z;S&4%Xmk{Vp)x5}e z8DrW&zrj}fJS3Vi#8#^@ifBJDWF>lbg=2*>w|@m0I%Bmmu|KZyod1}s+P1Y4w<}AX z-U+Xbrme&-rz$my;e?f#xPM4}!8C)dL`{c?I-K}YlpsA2eR(3e)RvbN+jX=OJ3L{j zGhyfLa0E_#Xd*IB$DRj_xX?*QDb)dTX}1qBw}aM1(Yuz6{@YEV7(}@+U{p!-x^@Q} z#%f;I?$8>|Cu91=B~!e2x;s=^iL0iE<^67iy%BrTJpbJR&wnS)^WPot{CCnk|J{Lo z6#6Y1v6zQ>)VwPnH3#xdeEYOlcg2rznm^Z4f4|pNokuX+;YA?vfHQ1$NYj|Am=LkN zKHv#E>|ut$_NPvWs8bou$IO%WUgoIYP>YH)=n0^IJL0DdO(72pr)C{s%bdfmwbC4n z-h?zVeB!7V&-{=MYJ$CiLjY2gVKROmG;VdxjhIJ4p&P>{lzkI&$V_T%Aj#QpJL&{9 zQIlQJUE3+Nr}r-Ldgz8EMvM66eR*t1Ssj&XikmxhLaB4NK$^Yr^+F~!XL*8`1P3C4 z(0=tIZ>C`HjQk&v;kk%P4y}bedPG&UG=cWo0DN*e#v4EH090qF?(K!PdY6?w+Bp-d72^Fy196s znR#AEvITgA_y^W=IO?grEUZps%;f-*_d047V;(_&&<+Eui3Gky0h3;VTv^Xi06zR) zsXhb_0BtLO!^nsQEJ6XZe+sK*tn^a=tp;1_MZ6Xt-3}$$tLTTop-NoVJfc2DqWqzd zsXSqye5WF!EOY#Fll0sVmo?X#(n_}D|Z*pG>z4wETTSw7mAiR z5j-`ZHo{v)OC4y7-3}c>ZsHT?hrGm9UgFYyk+{Dke#Ml0rdM)k{)6AyUgA@{#Fb2Z zswDoQeAANqta7}>S4M@55lnnll;Z~*eTYgrZ5;J4jI*Mvd2U@YP6 z0TESI2KeEG%csGovW!RYg4!%pH;2G(08Rl=2cQ_YvABl-SWe()D^@%Tz$yYuV#Oze z_YDlMZR{>=gQX~Vr|2ZRu=q*YJeCk?DJq?GI_($AIzWlkR_9_N&8#QVdBuf5tT}bUp)ILzopAS(A+NBbU zVJpK=M6>q;398B$Nm$>JEoOuLpwMtyd zX98?nK=fBZ0c~WQ7ElWIVg$r=K>?v1Ir$@c0QgSy!(#S0)aoP5 zEPNC5YKhgmV|OefDok9oZs= z)dA0JS3<0biP~(}5in-!q969nww!=5+Zy)J+OJXSL9?CAIBmAm5dI&`7ArquVjQI; zCgIHiyg2J4%J3+9466e^qUC{U=kEcy^d6hT5qBL%P4iF@O2`!N6N9?}(D{I(;!9E5 z3WU3q$6_Dql1V97*3d~v!2*x2!l%a;P#y9DwPg+!{~UHg1kI)Mm^>+Z4U3-C%uh@s zX7Q|wX<6JBRfpzzNs~~9Jc%Q0C;C_b!TGg|lUZsbY7`*a9*a>J788iffIXB0NWN>e zkM4^YLum3nt2o}hLl%+w7H*w?q6K9Lm|pPFK}wB8XOUQJN3NrNqP)bdc>YLI%Ca@x z{Cl@5wFs7-NQR@gBN=O2iDD9Y;h6hy8>Pk}U-SsQLgv%aRj-f{L8*v;iJqW+=n`VO z;g#scTFB^yRq|}BnR9Ibk;ivmov>~gTPKMQ(FnGF@;p4i&J{4$LqzJIVaMqnM3nK_ zEk6@=EqQ(*6A?L?1RJubB8l+3oGjj;`Ca7!oA7(%ru^QpDZeNTbg1wLSd_s$-5c&-iRGu- z4&d+Pu$u?V*?__mr-U0teuf3R_J6hR zrbQt8=nBYfC{X<!=>vvdWc#mLQ0^}t=V1&E<<2^MB7D=(qlu2d38iN7 zxI!mlUo4awM0PZ>J(AFVjKfckc)?N^wglz*5pT>kk+J$&?_=?>?6+v0#1cn3+{qO6 zKOAqhds>iSs#6ZZL<9-`P%AA7PTcEwqGckqI1xRBV1p2XqqC8i7?a02BY+T>?(C^u z0Gkk{{s?Ij1grvj7t4n@ddVO$|`=0 zNF43mi2PhMsZ^hiN*t*7<0kY8srR@_RT1^pKqLj-iphNs7MM7PPGFKJ({V{bUuRN` z+Q*wmC;A`-=aEGfm<=2sNO49D-udlDX2|lbmCKq#m0| zj)7&81H5jlF$fsWHw;v&cNzGqiMj`ZuPLY_u{%E990y5ax3y2h{YOku=lz=4{kB zYtF=QTw%-^L2m`>%%zUvH;Kf{T;N>?BNN@lw9c2uqNB0K1}#lkuJbo6U9l`ErApXt z%y|axlL!i)2$VY!ot+dS14iv3t{8&lg)*dZDR)EUKaX z52_rICjl}|GqGpLE2VinIu#@_elSbHXU%8~67~^mBSq0)bc--W^fTPS|8*NL#g0VW z0mR1|u^kY}1Fh2N`1W23LEMS4gc%2MRGn#VrTuY`ATSPcrsyn!Xm7zqI;yQ#3Y`s# zg;4lse~;0Iuyh3=!_r=FYr*UgcaH>NrH7aR5rzR>*?F zRD_H7$0UXe3UdgU1%)~SWFgkQ}itW0&Zx zanngs4&6?Isq@d~ctzyV1_7hCyJ6|Fup`L($rH&6((*H`@UMtm*>@Tpz^bKR$83Dv z>IGDQIc@O7&^wlM!c>OM;~A;XKT#72DJ=304jhLzZWZ}nU%PmZ#ZS3hdY zdU&z|Lj7WuE$iXQy#TbuRUkvKww;^@pmBkv7PF{20EPH;$W`y;I4E#(U_V>k3*}3G zf)8%|fMq`fDBK~Jl)9T0Sj$!9Gm+P6LC@jwXeui=^x zt|%J>Isp|q4`pm*VS9*8{&$wfXdqucBpKxCAaiL;kv3c9q+bL=D+p@4zFa9Bbj zRN>Qr_67v=Rr5c+TFK_IWY~82Y2bZC(g7tM+tFW&_rKQr$dG(TKC8*st$9$#ME6

&tQe|EfQ_;Ay-~JQxHCS5k^Kdm_ZMmJ_FAzx>#o8$3KHkExE801T z4wzKak$ECFPi-=J^ROG#ThRfR`$>PmATb=>W?O=YY_*2>DucgmB&K^v)~xA_X$M^vlVF+r}Xi+KmZ^Ag(zB79Djj`22Jt&e|GA!VFuIp z7||ekKoOSwu)F*q->ZZOGoWR2Mk!<@cnJR*ksTFBgnEW&2`;g{_!w|bfO@D0+S($_ zCEi{W*kg;-wk`g_0vXL=?DN-~6=N8N%n`Lh3Lymrs5X8Zr+f3+z-f>4%k!eZ`#$Py zzD!cZh+L49gQ+FnNxoa6?YtOD={jSoitV(l=}F?Cff?S`%}G}^KqDaaq!XfP7aSKj z49UeZuaIU=OAR4LG2Hs*p}PVh_Pzcv2gR_HntvWkT1Q08YW!u>jYj6hk9V38>JpC9 zQ$Ytd{Y}YJ9g6uglW_u`73j!wuc zW-#odN#=d;Y~ktaA21=Im?}W3;FQF7Mo+8|kN>3wRLHAwtC8_&@G;^;_^Njjr>y$< zUU1mqAX@_Z0-fO$5^8jyOO5t%iDWb^o!JH>s|$ zjBEiu8`g;|6@31-dP8&|-qhWmvK{^68jNU2sE&z*4utY(_GPGuZ6hZ>QAA&2&bG~p z-yi+vSb3@-0PD~_W7o2{M!(2+AHfuI<^Vw(Ri+%K03#Bip`n!)6?9iya;~(~XsZARMUEh&+(94I=pixv6yv6*-=h(fP@& zAZH&d!H(aZmi+kGCMMRg9kw#x6|^Yc6sc0w!k{i4uZl6-R+L|XnUF*!>2untwsc(B zQqb~D2xph8{=FDWjdm7-yUjK0G`B$am+rIZ;Yvw`pR{si(QlX-6(msusKT=I`kKvz z2c^H@*IxaRu0l6$7L|%Bix&?3=cMRiQvyP<=5xjo1JP|5k!V~+qBn1h9LnE8M;ViM zaS0QL(!(-h>HzTeV*-8uyR-v4fu`u0hc2w;IaNXW;qnh1rd1joCZ!L*a!KBIOU z)_sd7+ALQ<7{hC4`!0UAKxFP8S1TYJj~UdspHLvKuy#xs#ei0U|ukFh6H^JPeu65?CXVh9D;J z-G}i;FkVg5fa0~&@)*!;4++L(K+Bbg*bWLF%H%kQ5hm1`@5+q!q(=B84@vI8wu_0NQPzmKRjNE@9ydgDcQV)U5W1VfH3%Y*c({U-BGXTXvcm5P=t4z%#( zZDP0fEV!TLX2B#yJOBSjbP`T@B&+0hIVSq>{8iZIs=_E`tLtNG@;hVy^c zt)<|c3mb2rfSOfFwgp8~zcxgkcJI_xk6f*PzxybBr<1j&Pn-CcyEUPwjvrW>rb}|< ztA?(mc)Q@~I4oeu1Rb|z$Nwvn0tFW|ETom;A!UM+r8Fu8%;Lc<#!iWKgM+*iM~aEy zw2y|@9F_KqZBBv}hI5*(^Ey1iUsj)w3Hh#oK?AuyJ}*VmbRJ^AUKz-WB72a3#3W4C zkr!Y1Ds9vQE|7oEj`>lw9J|{zd$3 zX;2Gc^coLs1!1Uo%YD{TCT2^QjRY0(tj>JNmK3ajr)0wE-w%VkrEVTNbl#8=S>n$A zvmZ+>it@OBK$bh(+~LUE&&Cwuj;KxFvLREmmYQo#T(gVCF+K-T32_g>T0oABP$=>SNLz{(_Jj8cDd4CoCYA=F71qL*IMOt`!KYgTHu5aAY6L6WXV zcqtieM@Q?alS%4vQu0a7LX;wLjW9U>sa@jMu`fvg`7O@)jyv%v0=v5hXQwU5Tq6Mk zStlY!KGf2!w(qNvxB9DP0o`By?r*1{I3GOL|Z3pb*voID^3#>qnyN7J2Oj06Bmg)3ZzEo5_-rFa*}G$mJ!LKW6bnL~O6 zqLxzU=+~H$8AVdbY15|(-UTLsE?iLg3LD%TevpUsjz31qOT#Y={?EevpZOog3h+a!>@%s9EQ^4MwX&dQ*Ll&EEKkCG^DW_kD6JiGgqnaud80}X)A9@Ke6g23p zgA9N{GTG~s)XAE(M3q-aBf{qqU&Qetlbk8bdt%Y;8(9KKxg$}v?7YoK^H~K37b6ip zVfq!zpLYPwd-^0=ASv;VgR9@{r@#-LqIUQBQ-|ZzZV#450uBoQ*@fbKwTUE~NeTRmCEP`71bF~{w4wO|W?ETXT)#tUJlWTp3P4qF3U`SlZ(Y1o;D zbzo~izVwfzNIYfK-YAcPDd4U^M7rx|ZBF_;*+e8PIU8ZT_Z!A=E@^o=N!~IQ3{^IW zu0*tAHXP_aZj%t<&d==L`%TUUwhrg2nO{DFp9&)CC_1`IHt^5nan91Ms!u$IJlEwP z+5TkCdPsO)_@f;#0sL*agOjz+?<)r!rfYJl*{87=thCB+r;m2B?ApPU?G`3!|FDa7ZS zyN#z1ml9IVAj;ejju=NBHI?AsvkX|Mg7l zhMoIfKSl4|GLX>NQ9KlungZ7r0Q_Z7p$`^&T1E1ec;0qfFHJh+jl~60U7$Fvev4~L zFx&3x`r<*BfD^dGHHP+_4kH{Y8)Zy-_yRf;w-S?nUS%CC&U;c&OhmYa%<8Uek}oC| z2P-$|C39-5oRS4#I=K4%@pSD>?QRBAhD;WoHu66$no{ZIMuVI!-hF<2>TlGe-1Jal zK3V~l!vyss2+Dy#K)JKK=lB??pKl3nOs0Y`0J3B1WGiGD!UgWajlIilLvQ7Zh8wim z(IQPgSaK6dF$-X$?RKRiB!A@OnuNUIL#06O+69 zf;pk(7{Ms)Z6eWS4JnoS(vo2guo9$P$2>;9gk#K<_29*b*QcNe!L`({1jzi`_~Us8 z(#d3K0h1fzX%%T+3_|+s3hiE$S0|#E^#)wXQ_O1BD%aHtyI}VY$qc|IdmLf5JX)<$Hr+&{MKhx6`y)s*|Qio6+V}( z{d&aL1Ct{7Q@9NH0;S~XN9zq!SwS?|J)t+GKUB%U7+dd;XHg*W@YsIKnk_bqo`3;a zia1KFshsbu^>A-zC1^Adi|8CBtAgSNJl2mlvZ_0kDf^^M=z^Uto%RhL7D1g~H|AK{ zJJPSNt!hdSa;TeXg?~XFsxlNr%Ou%nI=Q@>tlgr`SRyh*`7h3y{Ew6x6eE4F?Aq4A z+REX#)THGzz&`O2ULKY}IMGn8hBgMFoj8s*vq@V03@xUo z(jVjZQsV{TAFWr=0AOrw_y46EV4wLNkEK{=bb~J;vV-l{p6Q%aXe|K3#k#xi)>lsw zmE&`Xz7;-Ak|SdDi!-Z_JBJj%0`yH>xfd^hrde*`on$+}{2WJd%kAmJbE6<+W;)uT zLEb@01b3;uoH+moj>JNN4@TGp0A#bEo@Qo1kH9~VyOK;#WxPsREzkv4>Nob0d4yRb z*u!oADYQQM)MVREo>DDlPQugVQ8YD&^0W|VLV<M()z(af5A z^TyR6cAnGz(QMW=2uXZ1Fa+`J?*97#BRL6u9=doF_Mm>bfcyjARGb|&AH#dReDk1} zP9=pd!%Z!T;>mnW15_AbZK;eH_?>nN6lB+K38HWdaa?>L?ZTAgct=VT89^@TIfZc= zmbbMCpVJ3O4UrDM+ecDulHPgbc(bG~#|Abe7ab0b#o^kZfijaB8J5O@Pomu27QBM~ z&}-5H=&*P?;1)<-KzGz^*joN>Rl;37#!_9~0@MGH-ozG$erd=~@4*r&8F7lOId*79 ziuahOW8KfJ`oghwb?_x>szNQ9;ao_2!miyW;l58d6H&o`M4AFC)4^&GFRy)H`d4BmK<1I^(4XkO z75N|KB3&&0YnCV-Bh=^@E0DJ(LoME}(HCT}XuF)$E%Sb&3kpr7rmwbWutMop(j2^i zS+1=)Y|;TL7ql-ODvhIMNi;42diwUH`s*3+EM?vB&q(xC@#!kw*iL4 zl%fVDJzDjH;%dMu4HB00FbxfneCE`@fg(v&oV9B&oYKeY$##HSH5S^fsc!wm&-O$+A&}!wJ!D|v z^MVZp8ptJFe+Z+DX4wcJ0$^-d*lseC>{6QR9Ofr*M?g{jfKPSQ+AliQgjRSMep&cSsDH>dc%=rcgXbsN>lH7;I|PalyXfnj)cWZ+4u`2KV!i znVTl>%1IrboyJdaZNSuWfRHeF+wgWOR7Qr@k~XA8?dfwQN}EjJesRihTi?>#E14VM zP50tnMQT#PnTQVwX#aSsB^kXlc`zk>RKwf`lnl~kpZ=Gh67byTR5(QGCk58v1Y@UCp zx#|=J?Eg^vpV&O$R5WW-e-arlDnj;FwEP@#e2AJ~BY}4w4}zka2emBnY~Vzw=s-L| zkIEXVDtopRWi>XOtcuX z!=Ll)0G--R4c3V+9AND}ye~N%*`cjw4(J58U`y%%DxiugUAS~0mK}b`n(wcnieX>L z>-36IUtbg91n7+;koC6^!;5=3hsa`1E(#e-A88*YR zec%OWsatp<*{wLRU zG`e1hr=M?xah_F}MIR-(@QeNVg8}$i3T6@m6YDdaU~paOj{%fERa`Kif=VQu3&Lfn z1%G&y7#hsrr?cF07$Pum5H$*^&R_(#FEpQE(AELDsL@dtfE z7)VcIb(`ibp>hZ1z+j*KDvC>0j@$}VKf*mT1WbGvT= zt@^!_9I(mujYlo>TLLc#T0#2m2c$ITP*6}VLxXeTzND*QX_F@d%NR zg5j!ML0OS592_Ano`92^I5g%ZnUD(YKqHUk%B0VB#(oKLF}hfuX2TTs2DQ#rY0>-1%Pd_K@5pmF+247^Rcqv4xq4757JR2Ou{)JN?Ppo7~F8jb?JAGF=HlVMhn`K!oD3FGQ^KzFgt4Qk!7mZWU zacJ*sd|FJ;Y75!DqHg7*ljdDb9_Wv3NylST;(ObnJwUmu6w1w#&5BXZTSpLIvI&<)L?-+{4XlA$Qan%j5A|<^|T1f z{dzUEQA-I-+VpXB__;h-d?YiCDG;3&GgZ(ood5O*{rnEPnzsSy+_F0Rn|q=qGDq-> zfhpf`41?;ApXtl@OeLT%$Oq)+dJ2+0cfo-j2>I?G?$-Sy>)$A$-W`Pg?mSIxEO$1+ zjl{-p1Y);P@IW*GaeBNL**`HnMYf052c#I*B>%B6+Ryv*akenxU= z1cLtxqLQb_np`BzvEs(Qc$AaObF~|q7mK1Jd~N8TNw)m~*KW~W-(O;>pRU$BaRqo( zNp9P=UbWi4PM}45MSr=GqPc9-H6Y0g5%nt#Iz@dF53& zLO>W{mg#9;qOoGTbhhz^^?x%24EytZkk1*;X`r_tVm8W@hdcavK%cLJsLO+B`LiP%J`qeLP)Q*xL0xUQW%=^MiY7BOgVu1? zP|k;))IPO&$MX4i3OdNZu*^-8LUf$#(}_x&JGO|oL)(r24sZMJ7(8^uBYGP6En%#M zE*-@nh@KYl+Aq#((7L#VyjfgcoTTX!9oV7iB9P^w1%$?gzCx!DW>|lt&~V~DloKi{ zPxvTYEe1|?v>%2X*rTEAGY@CMdm{Gr~CgbDPGv`3+Qkj&t*5NHTw zyw-?CLtbV{T>>0so(|&Ph&uY`#kCG+_>QIZ!hiEzUd4_RD@ngyV@tx#=M=r2nHR%l zR%k1+Hq6nFMtSlDgvv2B4K^&>z@CVz7d7?p98pkxHc@LQ1ZJNSr~BxfSo%5x1wVby z7%>{4SG-;vvV2X&pXxwHk%|@s6rqNZw4j2&XnB#s9f%=lu{5ekL&Ah-sJC9-1g>U6 zT0>-RD?CNAUI<{2BTPR&Tl^tg20W)?{RGE}qCnQb(o5(~OaAC8g2e$DLXB&qC|x~t z4QC0|XX(8TS&0$(O;K@(p!G?}M32?lw@5aDGS=7q z`)>U?L+BSKL@MK#^z>_g(QL`J4fK~ABumr%#ph4Z)(b;h(?jyC!VVQ6QaI3^gUEu) z$S?CKcOJuwr%(IjQ&x13`qO6G>2=^Ztibz&AK#z@l{|pw({6hBGB%I7oAu$-E4tKL z%<`cGNqZ7c20=UuKo&v*NetsnoQFu7XrB>yK)~4Py#O~A8%j897!TREyQ4rTi>!J# z09?(xYd6o-tDz<0QktO%b(lnG7q#Vgw%&Z`9U?KyXDwx|vBJAox7pIuLX`@U9ggpK(JSJT zP%7|Ii>xL!1@8^QCdfqj_Zbpf!w<{fU{(F@^7-~dR$lkpr<*(W;rjB*QuFPKHbcC6 zC>hIPj4#w`kJ6z@P_u-~p~dg4YkVgxRRaxT;CH*-QWWoIIx*`a@L(aLum8t2Zc9rM3tNYN;X5gej22qWq`jALe*Alk69xie4Sn{Y7wrBZ>R`<4fdzuu+{ zjUFf@O)oD&$j-*T=wxmipCjYx{DGO^SVpl;CR-J_kagm73T(MG-^nPF8x#Z%|TC-jz>lV z>PzyzVG93eI-CYd3QAh0n0zuJ32_Fr1PxVRXt>~?u?@03x>8@$o^>#bkT;O6g3M-f z7Anyt8Q~5sHyuoC^zDH9iC=PtTS`Xh>>dO_XqPK!(23m;B}UyMj%>cf zAs1PJw4*VpzmYAbrI3`C=%14r!by)XxJb3|?G>ep&5!p>W7xaD`=q)pTn%uDQ9Qy? zm++?#@$yUq^w&8Ip!AWz=`@TZ^Y0tNwFDjL6zN(L%wiShXC{Pr|`sybW{HN zq`i@LJ_*8c2Wma>HY4`YsiCLWRX6;oQ~fI-Lz{wBV+UgouK$|k=Xee)%Mnj{+bft4 zD)hA|DB??vF2Nl?n_I5F+iodP@*P`5e5(zchxQ6|0@G*U8%||aTdAssg^4&4t+yqx zRFv2vki-{Qn z9$*+e{bD^|W$Ue;N}3+G;$QM#c^K9}LHycfl)H*eco@%_C(ajOLKtcx_*l`O42aU! z*GQPH%6W11BF3)p7_B zNj8AABmDEnI~Z-Zx8299_qdEr^;7rXpMUDR?XMlUgcrr#-+$&~4UxBu>B1O62~12c zLfxZVs?@87$PTx3_YqT7E;gH~Lz2fR@(yR6kOlm{ya%`& zRwTWG^pGw_qv%kKNB;7D%iD*FWF085DgFE#5uo3Ywch<1^|N zRMH{*xA9{*Xcm0>1=6AI7l?-kz>%^T){G)M5&vr}Iq!`Wasu=osf>Abduy;KDC}8T zSZjaw0{eC_R>yb zZ8Ytjx1y2c4VRDiP&5)5({Jg-$u)AbxDkHz<*9YdG=Q%Ab4GmuEhQ67b?(qW^75#CcuVO*0 zqybRLayGjujZ=dIgP2d*slpfUW}7obWwp_}Xrrkti061%q|L;oS})c>LFsw-m-Wol zSZTr6#>n=*qk&mpf#i}4kJ14Yx;Gda-aiVJP@m9|PpsiXr*;uq3=={->R;@go}lsQ zqeMucg`*}8YcG73^9Me|v{7~Xnc?C|!8?QahX<>t4RAE1N@sO;8uV)=k%;+C3L`c- z$Uam1rNmDYE{*DOk~N`eX%2oA(2!tDRzx*OciE>n7%Uhl_=FI33nQ&bQS*+x;i~RH zn6EKZarAT638@r)%z6n-kDv@GA@Y?IoJ^bx(ttGB{Al zGQna_BjE+r2-O$bY#^%gS2+m6JSgPlp1^UVRNPt#g1Q&f!EH|k4}y`oJ6b@Ex{jV5 z?1)U%&$ri~_f6sW7lV#F5AoE$|EyPT=_~^+;VX&8%9>OsO!37!-Zm()dSP`hfe;O| zNc%X>#lrViKbs@^T&)O6BaX}`m{iiv=?R#Y1u2>eWDq>^Kvcr(`kD8-)W2ja2wcbx zF9_7bfMPG1kz>g$_PwH=?!Vy-hE|bu{Y_rbT48Aw&UmZRse}yy7(U$I7oSZT!5af~6`CT-Z~%zY-F}EzA`=#3 z#0rEv4#Es1Obf;-4iZ#rH=n(+$j|rg_Vb%J-`v^)=Io;Dh*l`oSwuOB6io&04rn4m zgK?NpV+)t78}-eb>+UlJ0XPEe&;6}4`=%7Lw#fBB#N2P7n+tF1ZWU9yKZ^NP%8${` zDN<=1H-ePz(~tVe_JsNmdb;VvtOg{ES76n$@#_vDFVG#M)gvncAX8xc{TKz+u3N1m zx=G;zT~o-R(1iPWhG(1=##txoZ*5`*q0=O%z{`e2gP=NVkUtgq#_~XQi_Fe~-p%+t zO^R(AxvN;awa8)s)bqlN*(bXtnG9LI@Hu*kRr3bc!H;xocbbt?6dqj${CLr@8RRUgcqN3)Dz^o zh7CsN2>uTeju~AtEVi9{w-2esJGehjnVBOIA}H9+0d>IYnT)EC{Y6pXu7of4Q-rh$ zmZ)9DK|{BO$fJ{W@0NXJ0geT+@Oq-+iNj2em43zaaq*a@bx{75eQjbmknjc5GF-|bXk{YhuXLG=S4dP6t@8#Cft zegG`e?2Lca9ct7wyL5^w)xOb8d<94ml1h@E-OvaiQK)ps^4v51>y6a@u55>PD0kC% z$!@1HBVN0&JF|mK5L|Ad}FIx7_oquf25wsLR@6-xN4K-P9N z-T6q-F3gaC)Z(nTy64IzoXZGx0*(h3M!wIM^N>3mewa(54Xib>F;@hnv{Nj%(50)@ zXm^tGr0UZ{|7^csuSIY7;_0$idrL_lcMBye%=74MhY{!kIAV8Sv>o44UzMj_$HmLzzgQp^NAg| zI(Mq>I5sEIn#YiJpCW9)aU%vps-dVh72CEx`G(uVJBypGN1|i~Y_(maj4-YLn#mE0VhLBkga3(C@aq?QVwD zDJ}LCw^ud#&~%25o(9)++HQBH22mXpJCPXgT|{D;^b(w6w6?Z!nB%GTuN!)c;5TVH ztLuVP)~299*=@8ZAX0?UnD_-gu8ktSc@$J?^WX+mVtC8IS zPS$a{@`2#ZuqV)g76JARLFx_eS4FAollB72U{GP@(CLy5h*$WH`A%Ah1-GpN@#>uB za)4Xt14LhB=s^pS7)BhXKOT0~fS3r670kz6d+=`$pK%){k^3^B#}bAwbZ-#{>~L+9 z*Oy>M2$o}$cBY<$3*K*Kfl0TLPENl7{xAAppSj@!%rVr2!;-{5;=+)YBCd(dqF;EF zZiS4J3RV`-C{u8t^>o%U<2Y`Sfr9a_ERZMly9Krd+ZcwB`R3vM01_g^OQ-&Z2tRl0z&xQ=plS<7lfN3sUO-5Bx8MS~yo3 zsBtP&EdpifOGK2wu)BV7im0K11)V~H>9}jQj8}d!*NW^fJmfSr>Z#KAIWLA(*9^v9 zF(g4`htHyR16ZF9+A9u`b5usRTPoh{heZW_Qys<&9MQHonXia4zT>AKZa?m?(wD^X zi<%B%ay#2~nX@vJq|BLq+6DZwo&%f7FNQW+SEoDUNbX*o7J`=S94K2;&-}GSwCEo-y~}88jc1DHWa2 zcb?JWn1w0U8~YBjGC)?mrP8R#%RuE>iO4M}lv}}3odQM#)3k4v9PzM5gki!_`L}O> zA^Qmds?FR?xM$`aLRf(>U5c z$JV%%K^v;LptHiDjABL-b@R!L1xV$Nnl`M0KqnFH^0jCS2Y)eCVS@)XSvhB>Ef~f; zKTB|EEunA-c|${G25|J~j;f;U>nxjLQT2!rd@I#s%Gw9%?}uOJ2VL_H!cOmq;|o|I zDw+@uR|HTfKjM^4pWqd3m?Xwg%cvmzM^k{XEty0nY0^p^IIrd=a|={f)D9FJZUg$y zcH!RM1X^nU&K!%@$i?_qOzwJ%7-iqCq}51LJb986$Y05Sh_Ll`PMP=h1`j$%=-Im}I4nmP;9woArGk2Pk`0^`$&#d3{PDSfat zm@p8F$rH??!Klh9qfx5#B7mBS$jXZtZ4ahhFS2HXb3WR4aOu#nL3F1G35#am&ExKY0CfpyB=9l<5Aew1e?xdySOTIi&2$#qPY&G>{a$3VUdaVeluXd1nGtl6U>@aF8KGz2P z5F2^8@Z}FceUwf=2C4aAH0#@h1TI&fUFQAG8+TXU-6Q9q$^8Q9yqJQL7F zC`K&De>QK49?;FTMuwvfOh1`H=<@PDj2x()%`Ok*qLE*9g6#5HpACzkCdsI%pi&8x zcO9SFgH{_`_)}78KTr^xfe6lyS*)f03SlX3O$AZJ?mHYemTC32T_Yla8u6kbz8sGs zrm^M(3z?{IW9Ee}8Cqm=<_?KTpmoUx^=;ZBKzFeP<;+~uqzVguwys6-NVUy=d7our zMb7z3)LY;B4`xF4b2U>oXLaSTdaz~IdKpF^oaW&N_nzx@beFfvwS!9InU)Y*g*R|_ z`8k_OvRD==N>m-gGSJ2i`i`_U$n*@dP=8&orueGSKgZcn^jv1(6SFI!r}E5(paE

-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

r+*06~BhX~FeclO$0 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

_BE7OQ2fMqxO&WW1m%SWWE-Pk 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 literal 0 HcmV?d00001 From 5229477939004736d68f047e453f73a701b50c3a Mon Sep 17 00:00:00 2001 From: Itzik Date: Wed, 14 Sep 2022 20:31:33 +0300 Subject: [PATCH 34/67] Added standard deviation and mean instead of just average --- go.mod | 7 +++++ go.sum | 14 +++++++++ x/compute/internal/keeper/bench_test.go | 42 ++++++++++++++++--------- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 2a9731491..73296a488 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/cosmos/ibc-go/v3 v3.0.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 + github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b github.com/google/gofuzz v1.2.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 @@ -33,6 +34,12 @@ require github.com/cosmos/gorocksdb v1.2.0 // indirect require ( github.com/dgraph-io/badger/v2 v2.2007.3 // indirect github.com/go-playground/validator/v10 v10.4.1 // indirect + github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect + github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect + github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 // indirect + github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 // indirect + github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect + github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect github.com/stretchr/objx v0.3.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index 927167f9a..213bf3e10 100644 --- a/go.sum +++ b/go.sum @@ -400,6 +400,20 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 h1:GUSkTcIe1SlregbHNUKbYDhBsS8lNgYfIp4S4cToUyU= +github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b h1:fbskpz/cPqWH8VqkQ7LJghFkl2KPAiIFUHrTJ2O3RGk= +github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index bf0a8c63b..885b90b3e 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -4,6 +4,7 @@ import ( "fmt" crypto "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/gonum/stat" "github.com/stretchr/testify/require" "math" "os" @@ -32,25 +33,30 @@ func buildBenchMessage(bench Bench) []byte { type BenchTime struct { Name string Case Bench - Avg time.Duration + Mean float64 iterations uint64 Min time.Duration Max time.Duration - // StdEv int64 + datapoints []float64 + StdEv float64 } func NewBenchTimer(name string, bench Bench) BenchTime { return BenchTime{ - Name: name, - Case: bench, - Avg: 0, - Min: math.MaxInt64, - Max: 0, - // StdEv: 0, + Name: name, + Case: bench, + Mean: 0, + Min: math.MaxInt64, + Max: 0, + datapoints: []float64{}, + StdEv: 0, } } func (b *BenchTime) AppendTime(singleRunTime time.Duration) { + b.iterations += 1 + b.datapoints = append(b.datapoints, float64(singleRunTime)) + if singleRunTime > b.Max { b.Max = singleRunTime } @@ -58,21 +64,27 @@ func (b *BenchTime) AppendTime(singleRunTime time.Duration) { b.Min = singleRunTime } - currentAvgSum := uint64(b.Avg) * b.iterations - newAvgSum := currentAvgSum + uint64(singleRunTime) - b.iterations += 1 + //currentAvgSum := uint64(b.Mean) * b.iterations + //newAvgSum := currentAvgSum + uint64(singleRunTime) - b.Avg = time.Duration(newAvgSum / b.iterations) + //b.Mean = time.Duration(newAvgSum / b.iterations) + // + b.Mean, b.StdEv = stat.MeanStdDev(b.datapoints, nil) } func (b *BenchTime) PrintReport() { - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Average: %s \n\t Min: %s \n\t Max: %s \n\t", + + stdevTime := time.Duration(math.Floor(b.StdEv)) + stdevMean := time.Duration(math.Floor(b.Mean)) + + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s", b.Name, b.Case, b.iterations, - b.Avg, + stdevMean, b.Min, - b.Max) + b.Max, + stdevTime) // todo: log this properly println(s) From 892df6e32b606058e1c8da2069e3925f4f248018 Mon Sep 17 00:00:00 2001 From: Itzik Date: Thu, 15 Sep 2022 02:42:18 +0300 Subject: [PATCH 35/67] Merged CW1 Todo: * Complete last couple of host functions * Tell walrus to shut the fuck up * Test and stuff --- .../src/contract_operations.rs | 16 +- .../shared/contract-engine/src/message.rs | 2 +- .../contract-engine/src/wasm/contract.rs | 2 +- .../shared/contract-engine/src/wasm/engine.rs | 3 + .../shared/contract-engine/src/wasm/mod.rs | 2 +- .../shared/contract-engine/src/wasm3/mod.rs | 281 ++++++++++++++++-- .../enclaves/shared/cosmos-types/src/types.rs | 2 +- .../shared/cosmwasm-types/generic/src/lib.rs | 4 + 8 files changed, 278 insertions(+), 34 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 4c7b48824..78ae1c726 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -98,12 +98,11 @@ pub fn init( secret_msg.user_public_key, )?; - let mut versioned_env = - base_env.into_versioned_env(&engine.contract_instance.cosmwasm_api_version); + let mut versioned_env = base_env.into_versioned_env(&engine.get_api_version()); versioned_env.set_contract_hash(&contract_hash); - let result = engine.init(versioned_env, validated_msg); + let result = engine.init(&versioned_env, validated_msg); *used_gas = engine.gas_used(); let output = result?; @@ -231,11 +230,11 @@ pub fn handle( let mut versioned_env = base_env .clone() - .into_versioned_env(&engine.contract_instance.cosmwasm_api_version); + .into_versioned_env(&engine.get_api_version()); versioned_env.set_contract_hash(&contract_hash); - let result = engine.handle(versioned_env, validated_msg); + let result = engine.handle(&versioned_env, validated_msg, &parsed_handle_type); *used_gas = engine.gas_used(); let mut output = result?; @@ -328,8 +327,11 @@ pub fn query( secret_msg.user_public_key, )?; - //let vec_ptr = engine.query(env_ptr, msg_ptr)?; - let result = engine.query(validated_msg); + let mut versioned_env = base_env + .clone() + .into_versioned_env(&engine.get_api_version()); + + let result = engine.query(&versioned_env, validated_msg); *used_gas = engine.gas_used(); let output = result?; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/message.rs b/cosmwasm/enclaves/shared/contract-engine/src/message.rs index d8e640398..9ea93f6bf 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/message.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/message.rs @@ -426,7 +426,7 @@ pub fn parse_message( | HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => { trace!( "parsing {} msg (Should always be plaintext): {:?}", - HandleType::to_export_name(&handle_type), + HandleType::get_export_name(&handle_type), base64::encode(&message) ); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index e398b0cb3..5a2dd9acd 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -26,7 +26,7 @@ use crate::wasm::traits::WasmiApi; /// api_marker is based on this compatibility chart: /// https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/README.md#compatibility -mod api_marker { +pub mod api_marker { pub const V0_10: &str = "cosmwasm_vm_version_3"; pub const V1: &str = "interface_version_8"; } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs index 773ea982a..e78b18f69 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs @@ -59,6 +59,7 @@ impl Engine { RuntimeValue::I32(msg_ptr as i32), ], ), + _ => return Err(EnclaveError::InvalidWasm), }; match self @@ -191,6 +192,7 @@ impl Engine { ], ), }, + _ => return Err(EnclaveError::InvalidWasm), }; info!("Invoking {}() in wasm", func_name); @@ -225,6 +227,7 @@ impl Engine { RuntimeValue::I32(env_ptr as i32), RuntimeValue::I32(msg_ptr as i32), ], + _ => return Err(EnclaveError::InvalidWasm), }; match self diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs index 43ed153d9..52f1f4795 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs @@ -1,4 +1,4 @@ -mod contract; +pub(crate) mod contract; mod engine; mod externals; mod import_resolver; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 57fe2dcba..9f9af1559 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -3,12 +3,13 @@ use std::convert::{TryFrom, TryInto}; use log::*; use bech32::{FromBase32, ToBase32}; +use cw_types_generic::{CosmWasmApiVersion, CwEnv}; use rand_chacha::ChaChaRng; use rand_core::SeedableRng; use wasm3::{Instance, Memory, Trap}; -use enclave_cosmos_types::types::ContractCode; -use enclave_cosmwasm_types::consts::BECH32_PREFIX_ACC_ADDR; +use cw_types_v010::consts::BECH32_PREFIX_ACC_ADDR; +use enclave_cosmos_types::types::{ContractCode, HandleType}; use enclave_crypto::{sha_256, Ed25519PublicKey, WasmApiCryptoError}; use enclave_ffi_types::{Ctx, EnclaveError}; @@ -20,8 +21,11 @@ use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngine use crate::gas::WasmCosts; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; +use crate::wasm::contract::api_marker; use crate::wasm::ContractOperation; -use crate::wasm3::gas::{get_exhausted_amount, get_remaining_gas, use_gas}; +use crate::wasm3::gas::{ + get_exhausted_amount, get_remaining_gas, use_gas, EXPORT_GAS_LIMIT_EXHAUSTED, +}; mod gas; mod validation; @@ -165,6 +169,7 @@ pub struct Engine { used_gas: u64, environment: wasm3::Environment, code: Vec, + api_version: CosmWasmApiVersion, } impl Engine { @@ -186,6 +191,27 @@ impl Engine { for import in module.imports.iter() { eprintln!("import {:?}", import) } + for export in module.exports.iter() { + eprintln!("export {:?}", export) + } + + let cosmwasm_api_version = if let Some(export) = module + .exports + .iter() + .find(|&exp| exp.name == api_marker::V0_10 || exp.name == api_marker::V1) + { + if export.name == api_marker::V0_10 { + CosmWasmApiVersion::V010 + } else if export.name == api_marker::V1 { + CosmWasmApiVersion::V1 + } else { + error!("Invalid cosmwasm api version"); + return Err(EnclaveError::InvalidWasm); + } + } else { + error!("Invalid cosmwasm api version2"); + return Err(EnclaveError::InvalidWasm); + }; validation::validate_memory(&mut module)?; @@ -221,6 +247,7 @@ impl Engine { used_gas: 0, environment, code, + api_version: cosmwasm_api_version, }) } @@ -265,7 +292,15 @@ impl Engine { link_fn(instance, "canonicalize_address", host_canonicalize_address)?; link_fn(instance, "humanize_address", host_humanize_address)?; link_fn(instance, "query_chain", host_query_chain)?; + + link_fn(instance, "addr_canonicalize", host_canonicalize_address)?; + link_fn(instance, "addr_humanize", host_humanize_address)?; + link_fn(instance, "addr_validate", host_addr_validate)?; link_fn(instance, "debug_print", host_debug_print)?; + + link_fn(instance, "debug", host_debug_print)?; + link_fn(instance, "gas", host_gas)?; + link_fn(instance, "secp256k1_verify", host_secp256k1_verify)?; #[rustfmt::skip] link_fn(instance, "secp256k1_recover_pubkey", host_secp256k1_recover_pubkey)?; @@ -274,6 +309,26 @@ impl Engine { link_fn(instance, "secp256k1_sign", host_secp256k1_sign)?; link_fn(instance, "ed25519_sign", host_ed25519_sign)?; + // DbReadIndex = 0, + // DbWriteIndex = 1, + // DbRemoveIndex = 2, + // CanonicalizeAddressIndex = 3, + // HumanizeAddressIndex = 4, + // GasIndex = 5, + // QueryChainIndex = 6, + // AddrValidateIndex = 7, + // AddrCanonicalizeIndex = 8, + // AddrHumanizeIndex = 9, + // Secp256k1VerifyIndex = 10, + // Secp256k1RecoverPubkeyIndex = 11, + // Ed25519VerifyIndex = 12, + // Ed25519BatchVerifyIndex = 13, + // Secp256k1SignIndex = 14, + // Ed25519SignIndex = 15, + // DebugIndex = 16, + // DebugPrintIndex = 254, + // Unknown, + Ok(()) } @@ -282,17 +337,51 @@ impl Engine { self.used_gas } - pub fn init(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { + pub fn get_api_version(&self) -> CosmWasmApiVersion { + self.api_version + } + + pub fn init(&mut self, env: &CwEnv, msg: Vec) -> Result, EnclaveError> { + let api_version = self.get_api_version(); + self.with_instance(|instance, context| { - debug!("starting init"); - let env_ptr = write_to_memory(instance, &env)?; + debug!("starting init, api version: {:?}", api_version); + + let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; + + let env_ptr = write_to_memory(instance, &env_bytes)?; let msg_ptr = write_to_memory(instance, &msg)?; - let init = instance - .find_function::<(u32, u32), u32>("init") - .to_enclave_result()?; + let result = match api_version { + CosmWasmApiVersion::V010 => { + ({ + let (init, args) = ( + instance + .find_function::<(u32, u32), u32>("init") + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + init.call_with_context(context, args) + }) + } + CosmWasmApiVersion::V1 => { + ({ + let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; + + let (init, args) = ( + instance + .find_function::<(u32, u32, u32), u32>("instantiate") + .to_enclave_result()?, + (env_ptr, msg_info_ptr, msg_ptr), + ); + init.call_with_context(context, args) + }) + } + CosmWasmApiVersion::Invalid => { + return Err(EnclaveError::InvalidWasm); + } + }; - let result = init.call_with_context(context, (env_ptr, msg_ptr)); let output_ptr = check_execution_result(instance, context, result)?; let output = read_from_memory(instance, output_ptr)?; @@ -301,21 +390,66 @@ impl Engine { }) } - pub fn handle(&mut self, env: Vec, msg: Vec) -> Result, EnclaveError> { + pub fn handle( + &mut self, + env: &CwEnv, + msg: Vec, + handle_type: &HandleType, + ) -> Result, EnclaveError> { + let api_version = self.get_api_version(); + self.with_instance(|instance, context| { debug!("starting handle"); - let env_ptr = write_to_memory(instance, &env)?; + let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; + + let env_ptr = write_to_memory(instance, &env_bytes)?; debug!("handle written env"); let msg_ptr = write_to_memory(instance, &msg)?; debug!("handle written msg"); - let handle = instance - .find_function::<(u32, u32), u32>("handle") - .map_err(debug_err!(err => "couldn't find handle: {err:?}")) - .to_enclave_result()?; + let result = match api_version { + CosmWasmApiVersion::V010 => { + ({ + let (handle, args) = ( + instance + .find_function::<(u32, u32), u32>("handle") + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + handle.call_with_context(context, args) + }) + } + CosmWasmApiVersion::V1 => { + ({ + let export_name = HandleType::get_export_name(&handle_type); + + if handle_type == &HandleType::HANDLE_TYPE_EXECUTE { + let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; + let (handle, args) = ( + instance + .find_function::<(u32, u32, u32), u32>(&export_name) + .to_enclave_result()?, + (env_ptr, msg_info_ptr, msg_ptr), + ); + handle.call_with_context(context, args) + } else { + let (handle, args) = ( + instance + .find_function::<(u32, u32), u32>(&export_name) + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + handle.call_with_context(context, args) + } + }) + } + CosmWasmApiVersion::Invalid => { + return Err(EnclaveError::InvalidWasm); + } + }; + debug!("found handle"); - let result = handle.call_with_context(context, (env_ptr, msg_ptr)); let output_ptr = check_execution_result(instance, context, result)?; debug!("called handle"); @@ -326,16 +460,43 @@ impl Engine { }) } - pub fn query(&mut self, msg: Vec) -> Result, EnclaveError> { + pub fn query(&mut self, env: &CwEnv, msg: Vec) -> Result, EnclaveError> { + let api_version = self.get_api_version(); + self.with_instance(|instance, context| { - debug!("starting query"); let msg_ptr = write_to_memory(instance, &msg)?; - let query = instance - .find_function::("query") - .to_enclave_result()?; + let result = match api_version { + CosmWasmApiVersion::V010 => { + let (query, args) = ( + instance + .find_function::("query") + .to_enclave_result()?, + (msg_ptr), + ); + + query.call_with_context(context, args) + } + + CosmWasmApiVersion::V1 => { + let (env_bytes, _) = env.get_wasm_ptrs()?; + let env_ptr = write_to_memory(instance, &env_bytes)?; + let (query, args) = ( + instance + .find_function::<(u32, u32), u32>("query") + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + + query.call_with_context(context, args) + } + CosmWasmApiVersion::Invalid => { + return Err(EnclaveError::InvalidWasm); + } + }; + + debug!("starting query"); - let result = query.call_with_context(context, msg_ptr); let output_ptr = check_execution_result(instance, context, result)?; let output = read_from_memory(instance, output_ptr)?; @@ -716,6 +877,80 @@ fn host_canonicalize_address( Ok(0) } +fn host_addr_validate( + context: &mut Context, + instance: &wasm3::Instance, + (addr_to_validate,): (i32,), +) -> WasmEngineResult { + let used_gas = context.gas_costs.external_addr_validate as u64; + use_gas(instance, used_gas)?; + + let human = read_from_memory(instance, addr_to_validate as u32) + .map_err(debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"))?; + use_gas(instance, used_gas)?; + + trace!( + "addr_validate() was called from WASM code with {:?}", + String::from_utf8_lossy(&human) + ); + + if human.is_empty() { + return write_to_memory(instance, b"Input is empty").map(|n| n as i32); + } + + // Turn Vec to str + let source_human_address = match std::str::from_utf8(&human) { + Err(err) => { + debug!( + "addr_validate() error while trying to parse human address from bytes to string: {:?}", + err + ); + return write_to_memory(instance, b"Input is not valid UTF-8").map(|n| n as i32); + } + Ok(x) => x, + }; + + let canonical_address = match bech32::decode(&source_human_address) { + Err(err) => { + debug!( + "addr_validate() error while trying to decode human address {:?} as bech32: {:?}", + source_human_address, err + ); + return write_to_memory(instance, err.to_string().as_bytes()).map(|n| n as i32); + } + Ok((_prefix, canonical_address)) => canonical_address, + }; + + let normalized_human_address = match bech32::encode( + BECH32_PREFIX_ACC_ADDR, // like we do in human_address() + canonical_address.clone(), + ) { + Err(err) => { + // Assaf: IMO This can never fail. From looking at bech32::encode, it only fails + // because input prefix issues. For us the prefix is always "secert" which is valid. + debug!("addr_validate() error while trying to encode canonical address {:?} to human: {:?}", &canonical_address, err); + return write_to_memory(instance, err.to_string().as_bytes()).map(|n| n as i32); + } + Ok(normalized_human_address) => normalized_human_address, + }; + + if source_human_address != normalized_human_address { + return write_to_memory(instance, b"Address is not normalized").map(|n| n as i32); + } + + Ok(0) +} + +fn host_gas( + context: &mut Context, + instance: &wasm3::Instance, + gas_amount: i32, +) -> WasmEngineResult<()> { + use_gas(instance, gas_amount as u64)?; + + Ok(()) +} + fn host_humanize_address( context: &mut Context, instance: &wasm3::Instance, diff --git a/cosmwasm/enclaves/shared/cosmos-types/src/types.rs b/cosmwasm/enclaves/shared/cosmos-types/src/types.rs index 531f1c22b..e6df1ef92 100644 --- a/cosmwasm/enclaves/shared/cosmos-types/src/types.rs +++ b/cosmwasm/enclaves/shared/cosmos-types/src/types.rs @@ -179,7 +179,7 @@ impl HandleType { } } - pub fn to_export_name(h: &HandleType) -> String { + pub fn get_export_name(h: &HandleType) -> String { match h { HandleType::HANDLE_TYPE_EXECUTE => "execute".to_string(), HandleType::HANDLE_TYPE_REPLY => "reply".to_string(), diff --git a/cosmwasm/enclaves/shared/cosmwasm-types/generic/src/lib.rs b/cosmwasm/enclaves/shared/cosmwasm-types/generic/src/lib.rs index 6ac22a8e3..e8d479e5c 100644 --- a/cosmwasm/enclaves/shared/cosmwasm-types/generic/src/lib.rs +++ b/cosmwasm/enclaves/shared/cosmwasm-types/generic/src/lib.rs @@ -13,11 +13,14 @@ use enclave_ffi_types::EnclaveError; pub const CONTRACT_KEY_LENGTH: usize = 64; /// CosmwasmApiVersion is used to decide how to handle contract inputs and outputs +#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)] pub enum CosmWasmApiVersion { /// CosmWasm v0.10 API V010, /// CosmWasm v1 API V1, + /// CosmWasm version invalid + Invalid, } pub type BaseAddr = HumanAddr; @@ -67,6 +70,7 @@ impl BaseEnv { match api_version { CosmWasmApiVersion::V010 => self.into_v010(), CosmWasmApiVersion::V1 => self.into_v1(), + CosmWasmApiVersion::Invalid => panic!("Can't parse invalid env"), } } From aebdf9f919fd134ab520780ad872ebe667cc8e65 Mon Sep 17 00:00:00 2001 From: Itzik Date: Thu, 15 Sep 2022 09:25:06 +0300 Subject: [PATCH 36/67] Fixed CI from master --- .github/workflows/ci.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 58b11db0e..1466d5312 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,7 +30,10 @@ jobs: with: path: ~/.cache/sccache key: ${{ runner.os }}-sccache - - run: rustup component add rust-src clippy + - run: | + rustup component add rust-src clippy + cd cosmwasm/enclaves/execute/ + rustup component add rust-src clippy - name: Install xargo run: | cargo --version From 750e5d0a4856d10ae79557f8ebb016db919cbe5f Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 10:49:05 +0300 Subject: [PATCH 37/67] Update ci.yaml --- .github/workflows/ci.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1466d5312..dceefb714 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,7 +83,10 @@ jobs: with: path: ~/.cache/sccache key: ${{ runner.os }}-sccache - - run: rustup component add rust-src clippy + - run: | + rustup component add rust-src clippy + cd cosmwasm/enclaves/execute/ + rustup component add rust-src clippy - name: Install xargo run: | cargo --version From ca262208e747a7021b81813085d49d078f74d80f Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 11:27:17 +0300 Subject: [PATCH 38/67] Changed walrus to log-disabled revision --- cosmwasm/enclaves/shared/contract-engine/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 64b01ddd0..08699fb52 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -43,7 +43,7 @@ bech32 = "0.7.2" pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } wasm3 = { git = "https://github.com/scrtlabs/wasm3-rs", rev = "ad1c868" } -walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "81c459c" } +walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "4736703" } lru = { version = "0.6", default-features = false } hex = "0.4.2" From 40a98f017a904407c693b4225a841ae3c3cdfeba Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 12:51:33 +0300 Subject: [PATCH 39/67] Changed walrus to log-disabled revision --- cosmwasm/enclaves/shared/contract-engine/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 08699fb52..91ac6ce3a 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -43,7 +43,7 @@ bech32 = "0.7.2" pwasm-utils = { version = "0.12.0", default-features = false } parity-wasm = { version = "0.41.0", default-features = false } wasm3 = { git = "https://github.com/scrtlabs/wasm3-rs", rev = "ad1c868" } -walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "4736703" } +walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "c5777d4" } lru = { version = "0.6", default-features = false } hex = "0.4.2" From ef18bd5132e8071776d38db57a590ec7a72b0a7d Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 14:45:18 +0300 Subject: [PATCH 40/67] * Changed default enclave LRU cache to 15 * Clippy stuff and the CI --- .github/workflows/ci.yaml | 120 +++-- .github/workflows/release.yaml | 2 +- cosmwasm/enclaves/Cargo.lock | 198 ++++++-- .../src/contract_operations.rs | 64 +-- .../shared/contract-engine/src/errors.rs | 2 + .../shared/contract-engine/src/gas.rs | 1 + .../shared/contract-engine/src/memory.rs | 1 + .../contract-engine/src/module_cache.rs | 6 +- .../contract-engine/src/wasm/contract.rs | 1 + .../shared/contract-engine/src/wasm/engine.rs | 470 +++++++++--------- .../src/wasm/import_resolver.rs | 5 +- .../shared/contract-engine/src/wasm3/mod.rs | 103 ++-- x/compute/internal/types/types.go | 2 +- 13 files changed, 569 insertions(+), 406 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dceefb714..5e1245dee 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,17 +16,17 @@ jobs: chmod +x "$SDK_BIN" echo yes | ./"$SDK_BIN" - name: Cache cargo registry - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache xargo sysroot - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.xargo key: ${{ runner.os }}-xargo-sysroot - name: Cache build artifacts - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cache/sccache key: ${{ runner.os }}-sccache @@ -52,14 +52,13 @@ jobs: export SGX_MODE=SW RUSTC_WRAPPER="$HOME/sccache" make enclave-tests make clean-enclave - Build: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: - go-version: "^1.18" # The Go version to download (if necessary) and use. + go-version: 1.19 # The Go version to download (if necessary) and use. - name: Install Intel's SGX SDK run: | mkdir -p "$HOME/.sgxsdk" @@ -69,17 +68,17 @@ jobs: chmod +x "$SDK_BIN" echo yes | ./"$SDK_BIN" - name: Cache cargo registry - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache xargo sysroot - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.xargo key: ${{ runner.os }}-xargo-sysroot - name: Cache build artifacts - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cache/sccache key: ${{ runner.os }}-sccache @@ -122,47 +121,55 @@ jobs: run: | make build-test-contract cp x/compute/internal/keeper/testdata/erc20.wasm . - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: erc20.wasm path: erc20.wasm - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: secretd path: secretd - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: contract.wasm - path: ./x/compute/internal/keeper/testdata/test-contract/contract.wasm - - uses: actions/upload-artifact@v2 + path: cosmwasm/contracts/v010/compute-tests/test-compute-contract/contract.wasm + - uses: actions/upload-artifact@v3 + with: + name: v1-contract.wasm + path: cosmwasm/contracts/v1/compute-tests/test-compute-contract/v1-contract.wasm + - uses: actions/upload-artifact@v3 + with: + name: ibc.wasm + path: cosmwasm/contracts/v1/compute-tests/ibc-test-contract/ibc.wasm + - uses: actions/upload-artifact@v3 with: name: enclave path: ./go-cosmwasm/librust_cosmwasm_enclave.signed.so - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: libgo_cosmwasm path: ./go-cosmwasm/api/libgo_cosmwasm.so - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: contract_with_floats.wasm - path: ./x/compute/internal/keeper/testdata/test-contract/contract_with_floats.wasm - - uses: actions/upload-artifact@v2 + path: cosmwasm/contracts/v010/compute-tests/test-compute-contract/contract_with_floats.wasm + - uses: actions/upload-artifact@v3 with: name: too-high-initial-memory.wasm - path: ./x/compute/internal/keeper/testdata/test-contract/too-high-initial-memory.wasm - - uses: actions/upload-artifact@v2 + path: cosmwasm/contracts/v010/compute-tests/test-compute-contract/too-high-initial-memory.wasm + - uses: actions/upload-artifact@v3 with: name: static-too-high-initial-memory.wasm - path: ./x/compute/internal/keeper/testdata/test-contract/static-too-high-initial-memory.wasm + path: cosmwasm/contracts/v010/compute-tests/test-compute-contract/static-too-high-initial-memory.wasm Go-Tests: runs-on: ubuntu-20.04 needs: Build steps: - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: - go-version: "^1.18" # The Go version to download (if necessary) and use. + go-version: 1.19 # The Go version to download (if necessary) and use. - name: Install Intel's SGX SDK run: | mkdir -p "$HOME/.sgxsdk" @@ -171,32 +178,42 @@ jobs: wget https://download.01.org/intel-sgx/sgx-linux/2.9.1/distro/ubuntu18.04-server/"$SDK_BIN" chmod +x "$SDK_BIN" echo yes | ./"$SDK_BIN" - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: libgo_cosmwasm - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: enclave - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: contract.wasm - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 + with: + name: v1-contract.wasm + path: ./x/compute/internal/keeper/testdata/ + - uses: actions/download-artifact@v3 + with: + name: ibc.wasm + path: ./x/compute/internal/keeper/testdata/ + - uses: actions/download-artifact@v3 with: name: contract_with_floats.wasm - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: too-high-initial-memory.wasm - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: static-too-high-initial-memory.wasm - name: Setup Files run: | + find "$(pwd)" -name \*.wasm cp libgo_cosmwasm.so ./go-cosmwasm/api/libgo_cosmwasm.so cp librust_cosmwasm_enclave.signed.so ./go-cosmwasm/librust_cosmwasm_enclave.signed.so - cp contract.wasm ./x/compute/internal/keeper/testdata/test-contract/contract.wasm - cp too-high-initial-memory.wasm ./x/compute/internal/keeper/testdata/test-contract/too-high-initial-memory.wasm - cp contract_with_floats.wasm ./x/compute/internal/keeper/testdata/test-contract/contract_with_floats.wasm - cp static-too-high-initial-memory.wasm ./x/compute/internal/keeper/testdata/test-contract/static-too-high-initial-memory.wasm + cp contract.wasm ./x/compute/internal/keeper/testdata/contract.wasm + cp too-high-initial-memory.wasm ./x/compute/internal/keeper/testdata/too-high-initial-memory.wasm + cp contract_with_floats.wasm ./x/compute/internal/keeper/testdata/contract_with_floats.wasm + cp static-too-high-initial-memory.wasm ./x/compute/internal/keeper/testdata/static-too-high-initial-memory.wasm + find "$(pwd)" -name \*.wasm - name: Test x/registration run: | source "$HOME/.sgxsdk/sgxsdk/environment" @@ -211,8 +228,7 @@ jobs: echo "not_a_key" > ias_keys/develop/spid.txt echo "not_a_key" > ias_keys/develop/api_key.txt LOG_LEVEL=ERROR go test -v ./x/compute/client/... - LOG_LEVEL=ERROR go test -p 1 -timeout 20m -v ./x/compute/internal/... - + LOG_LEVEL=ERROR go test -p 1 -timeout 90m -v ./x/compute/internal/... Clippy: runs-on: ubuntu-20.04 steps: @@ -226,23 +242,27 @@ jobs: chmod +x "$SDK_BIN" echo yes | ./"$SDK_BIN" - name: Cache cargo registry - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache xargo sysroot - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.xargo key: ${{ runner.os }}-xargo-sysroot - name: Cache build artifacts - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.cache/sccache key: ${{ runner.os }}-sccache - - run: rustup component add rust-src clippy + - run: | + rustup component add rust-src clippy + cd cosmwasm/enclaves/execute/ + rustup component add rust-src clippy - name: Install xargo run: | + cd cosmwasm/enclaves/execute/ cargo --version rustc --version cargo +stable install xargo --version 0.3.25 @@ -259,14 +279,13 @@ jobs: cd cosmwasm/enclaves/execute/ SGX_MODE=SW make clippy SGX_MODE=HW make clippy - MacOS-ARM64-CLI: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: - go-version: "^1.18" # The Go version to download (if necessary) and use. + go-version: 1.19 # The Go version to download (if necessary) and use. - name: Install xgo run: | go install github.com/crazy-max/xgo@v0.17.0 @@ -278,15 +297,26 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - - name: Build docker testnet + - name: Build LocalSecret run: | echo not_a_key | tee {api_key,spid}.txt DOCKER_TAG=v0.0.0 make build-localsecret + - name: Build Hermes + run: | + DOCKER_TAG=v0.0.0 make build-ibc-hermes + - name: Run integration tests + run: | + cd integration-tests + yarn + docker compose -f ../deployment/dockerfiles/ibc/docker-compose.yml up -d + # docker compose -f ../deployment/dockerfiles/ibc/docker-compose.yml logs -f & + yarn test + make kill-localsecret # next step needs the localsecret ports - name: Run secret.js tests run: | - git clone --depth 1 --branch reuven-fix-for-wasm3 https://github.com/scrtlabs/secret.js + git clone --depth 1 --branch cosmwasm-v1 https://github.com/scrtlabs/secret.js cd secret.js # Use the docker images that we built just a few steps above perl -i -pe 's/localsecret:.+?"/localsecret:v0.0.0"/' ./test/* yarn - yarn test + yarn test \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e6a025471..bb2b0e74d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -240,4 +240,4 @@ jobs: secretcli-macOS secretcli-Windows secretcli-Linux - secretcli-MacOS-arm64 + secretcli-MacOS-arm64 \ No newline at end of file diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index 486e2a0bf..335e1fa66 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -92,6 +92,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "base64" version = "0.13.0" @@ -306,7 +312,7 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cosmos_proto" -version = "1.2.4" +version = "1.4.0" dependencies = [ "dirs", "protobuf", @@ -322,6 +328,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-mac" version = "0.11.1" @@ -371,6 +383,51 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw_types_generic" +version = "0.1.0" +dependencies = [ + "base64 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cw_types_v010", + "cw_types_v1", + "enclave-ffi-types", + "hex", + "log", + "serde 1.0.118", + "serde_json 1.0.60", +] + +[[package]] +name = "cw_types_v010" +version = "1.4.0" +dependencies = [ + "base64 0.13.0 (git+https://github.com/mesalock-linux/rust-base64-sgx?rev=dc7389e10817b078f289386b3b6a852ab6c4c021)", + "bech32", + "derive_more", + "enclave-ffi-types", + "log", + "serde 1.0.118", + "serde_json 1.0.60", + "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", +] + +[[package]] +name = "cw_types_v1" +version = "1.4.0" +dependencies = [ + "base64 0.13.0 (git+https://github.com/mesalock-linux/rust-base64-sgx?rev=dc7389e10817b078f289386b3b6a852ab6c4c021)", + "bech32", + "cw_types_v010", + "derive_more", + "enclave-ffi-types", + "log", + "serde 1.0.118", + "serde_json 1.0.60", + "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", + "thiserror", + "uint", +] + [[package]] name = "dbl" version = "0.3.2" @@ -467,16 +524,18 @@ dependencies = [ [[package]] name = "enclave_contract_engine" -version = "1.2.4" +version = "1.4.0" dependencies = [ "base64 0.13.0 (git+https://github.com/mesalock-linux/rust-base64-sgx?rev=dc7389e10817b078f289386b3b6a852ab6c4c021)", "bech32", "cosmos_proto", + "cw_types_generic", + "cw_types_v010", + "cw_types_v1", "derive_more", "ed25519-zebra", "enclave-ffi-types", "enclave_cosmos_types", - "enclave_cosmwasm_types", "enclave_crypto", "enclave_utils", "hex", @@ -501,14 +560,15 @@ dependencies = [ [[package]] name = "enclave_cosmos_types" -version = "1.2.4" +version = "1.4.0" dependencies = [ "cosmos_proto", + "cw_types_v010", "derive_more", "enclave-ffi-types", - "enclave_cosmwasm_types", "enclave_crypto", "log", + "num_enum", "prost", "protobuf", "serde 1.0.118", @@ -516,25 +576,12 @@ dependencies = [ "sha2 0.8.2", ] -[[package]] -name = "enclave_cosmwasm_types" -version = "1.2.4" -dependencies = [ - "base64 0.13.0 (git+https://github.com/mesalock-linux/rust-base64-sgx?rev=dc7389e10817b078f289386b3b6a852ab6c4c021)", - "bech32", - "derive_more", - "enclave-ffi-types", - "log", - "serde 1.0.118", - "serde_json 1.0.60", - "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", -] - [[package]] name = "enclave_crypto" -version = "1.2.4" +version = "1.4.0" dependencies = [ "aes-siv", + "cosmos_proto", "derive_more", "enclave-ffi-types", "hex", @@ -547,12 +594,13 @@ dependencies = [ "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sha2 0.8.2", + "sha3", "x25519-dalek", ] [[package]] name = "enclave_utils" -version = "1.2.4" +version = "1.4.0" dependencies = [ "enclave-ffi-types", "lazy_static", @@ -731,6 +779,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +[[package]] +name = "keccak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" + [[package]] name = "lazy_static" version = "1.4.0" @@ -773,9 +827,9 @@ checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -868,6 +922,33 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "once_cell" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" + [[package]] name = "opaque-debug" version = "0.2.3" @@ -898,6 +979,17 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + [[package]] name = "proc-macro2" version = "1.0.36" @@ -1134,7 +1226,7 @@ dependencies = [ [[package]] name = "secret-enclave" -version = "1.2.4" +version = "1.4.0" dependencies = [ "base64 0.13.0 (git+https://github.com/mesalock-linux/rust-base64-sgx?rev=dc7389e10817b078f289386b3b6a852ab6c4c021)", "bit-vec", @@ -1163,6 +1255,7 @@ dependencies = [ "sgx_tse", "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", + "simple_logger", "uuid", "webpki", "webpki-roots", @@ -1171,7 +1264,7 @@ dependencies = [ [[package]] name = "secret-query-enclave" -version = "1.2.4" +version = "1.4.0" dependencies = [ "ctor", "enclave_contract_engine", @@ -1181,6 +1274,7 @@ dependencies = [ "sgx_edl", "sgx_tstd 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", "sgx_types 1.1.3 (git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269)", + "simple_logger", ] [[package]] @@ -1466,6 +1560,19 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "sha3" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" +dependencies = [ + "block-buffer 0.7.3", + "byte-tools", + "digest 0.8.1", + "keccak", + "opaque-debug 0.2.3", +] + [[package]] name = "shlex" version = "0.1.1" @@ -1478,12 +1585,29 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "simple_logger" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48047e77b528151aaf841a10a9025f9459da80ba820e425ff7eb005708a76dc7" +dependencies = [ + "atty", + "log", + "winapi", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.8.0" @@ -1586,6 +1710,18 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "uint" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6470ab50f482bde894a037a57064480a246dbfdd5960bd65a44824693f08da5f" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unicode-segmentation" version = "1.9.0" @@ -1631,7 +1767,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walrus" version = "0.19.0" -source = "git+https://github.com/scrtlabs/walrus?rev=81c459c#81c459ca288eff97af05a8c4001e9bc760b8cb3a" +source = "git+https://github.com/scrtlabs/walrus?rev=c5777d4#c5777d43d78b437cef94aaa939d3be115dfeee6a" dependencies = [ "anyhow 1.0.60", "id-arena", @@ -1644,7 +1780,7 @@ dependencies = [ [[package]] name = "walrus-macro" version = "0.19.0" -source = "git+https://github.com/scrtlabs/walrus?rev=81c459c#81c459ca288eff97af05a8c4001e9bc760b8cb3a" +source = "git+https://github.com/scrtlabs/walrus?rev=c5777d4#c5777d43d78b437cef94aaa939d3be115dfeee6a" dependencies = [ "heck", "proc-macro2", @@ -1803,15 +1939,17 @@ dependencies = [ [[package]] name = "zeroize" version = "1.3.0" -source = "git+https://github.com/enigmampc/zeroize?rev=b8488228e3fdacbfdb3ea8a6117919871637d111#b8488228e3fdacbfdb3ea8a6117919871637d111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.0.1" -source = "git+https://github.com/enigmampc/zeroize?tag=zeroize_derive/v1.0.1#c64dca0efef76cb858605581d261d3223b237231" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", "quote", diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 78ae1c726..362c6a4b0 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -6,7 +6,6 @@ use cw_types_v010::types::CanonicalAddr; use enclave_cosmos_types::types::{ContractCode, HandleType, SigInfo}; use enclave_crypto::Ed25519PublicKey; use enclave_ffi_types::{Ctx, EnclaveError}; -use enclave_utils::coalesce; use log::*; use crate::contract_validation::{ReplyParams, ValidatedMessage}; @@ -21,9 +20,10 @@ use super::io::{ encrypt_output, finalize_raw_output, manipulate_callback_sig_for_plaintext, set_all_logs_to_plaintext, }; -use super::module_cache::create_module_instance; +//use super::module_cache::create_module_instance; use super::types::{IoNonce, SecretMessage}; -use super::wasm::{ContractInstance, ContractOperation, Engine}; +use super::wasm::ContractOperation; +// use super::wasm::{ContractInstance, Engine}; /* Each contract is compiled with these functions already implemented in wasm: @@ -251,7 +251,7 @@ pub fn handle( reply_params, &canonical_sender_address, false, - is_ibc_msg(parsed_handle_type.clone()), + is_ibc_msg(parsed_handle_type), )?; } else { let mut raw_output = @@ -327,7 +327,7 @@ pub fn query( secret_msg.user_public_key, )?; - let mut versioned_env = base_env + let versioned_env = base_env .clone() .into_versioned_env(&engine.get_api_version()); @@ -371,33 +371,33 @@ fn start_engine( } // TODO remove once the new engine works well -fn _start_engine( - context: Ctx, - gas_limit: u64, - contract_code: ContractCode, - contract_key: &ContractKey, - operation: ContractOperation, - nonce: IoNonce, - user_public_key: Ed25519PublicKey, -) -> Result { - let module = create_module_instance(contract_code, operation)?; - - // Set the gas costs for wasm op-codes (there is an inline stack_height limit in WasmCosts) - let wasm_costs = WasmCosts::default(); - - let contract_instance = ContractInstance::new( - context, - module.clone(), - gas_limit, - wasm_costs, - *contract_key, - operation, - nonce, - user_public_key, - )?; - - Ok(Engine::new(contract_instance, module)) -} +// fn _start_engine( +// context: Ctx, +// gas_limit: u64, +// contract_code: ContractCode, +// contract_key: &ContractKey, +// operation: ContractOperation, +// nonce: IoNonce, +// user_public_key: Ed25519PublicKey, +// ) -> Result { +// let module = create_module_instance(contract_code, operation)?; +// +// // Set the gas costs for wasm op-codes (there is an inline stack_height limit in WasmCosts) +// let wasm_costs = WasmCosts::default(); +// +// let contract_instance = ContractInstance::new( +// context, +// module.clone(), +// gas_limit, +// wasm_costs, +// *contract_key, +// operation, +// nonce, +// user_public_key, +// )?; +// +// Ok(Engine::new(contract_instance, module)) +// } fn extract_base_env(env: &[u8]) -> Result { serde_json::from_slice(env) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index 6a1c3620e..aed6d3ec6 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -140,6 +140,7 @@ where } } +#[allow(dead_code)] pub fn wasmi_error_to_enclave_error(wasmi_error: InterpreterError) -> EnclaveError { wasmi_error .try_into_host_error() @@ -157,6 +158,7 @@ pub fn wasmi_error_to_enclave_error(wasmi_error: InterpreterError) -> EnclaveErr }) } +#[allow(dead_code)] fn trap_kind_to_enclave_error(kind: TrapKind) -> EnclaveError { match kind { TrapKind::Unreachable => EnclaveError::ContractPanicUnreachable, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs index e9027d711..bf62f8bdc 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs @@ -79,6 +79,7 @@ impl Default for WasmCosts { } } +#[allow(dead_code)] pub fn gas_rules(wasm_costs: &WasmCosts) -> rules::Set { rules::Set::new(wasm_costs.regular, { let mut vals = ::std::collections::BTreeMap::new(); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/memory.rs b/cosmwasm/enclaves/shared/contract-engine/src/memory.rs index 4136e3a6f..01359a963 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/memory.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/memory.rs @@ -4,6 +4,7 @@ use log::*; use enclave_ffi_types::EnclaveError; +#[allow(dead_code)] pub fn validate_memory(p_modlue: &mut Module) -> Result<(), EnclaveError> { let memory_section = p_modlue .memory_section_mut() diff --git a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs index 332c4dfbd..c37663a9d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs @@ -15,7 +15,8 @@ use enclave_crypto::HASH_SIZE; use super::gas::{gas_rules, WasmCosts}; use super::memory::validate_memory; -use super::wasm::{create_builder, ContractOperation, WasmiImportResolver}; +use super::wasm::create_builder; +use super::wasm::{ContractOperation, WasmiImportResolver}; lazy_static! { static ref MODULE_CACHE: SgxRwLock> = @@ -27,6 +28,7 @@ pub fn configure_module_cache(cap: usize) { MODULE_CACHE.write().unwrap().resize(cap) } +#[allow(dead_code)] pub fn create_module_instance( contract_code: ContractCode, operation: ContractOperation, @@ -88,6 +90,7 @@ pub fn create_module_instance( // The compilation steps in this section are very expensive, and generate a // static object that can be reused without leaking memories between contracts. // This is why we separate the compilation step and cache its result in memory. +#[allow(dead_code)] fn compile_module( code: &[u8], operation: ContractOperation, @@ -135,6 +138,7 @@ fn compile_module( Ok(module) } +#[allow(dead_code)] fn create_instance(module: &wasmi::Module) -> Result { // Create new imports resolver. // These are the signatures of rust functions available to invoke from wasm code. diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 5a2dd9acd..74e6a13ff 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -79,6 +79,7 @@ pub struct ContractInstance { impl ContractInstance { #[allow(clippy::too_many_arguments)] + #[allow(dead_code)] pub fn new( context: Ctx, module: ModuleRef, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs index e78b18f69..f2c76eb29 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/engine.rs @@ -1,245 +1,247 @@ -use log::*; +//use log::*; -use wasmi::{ModuleRef, RuntimeValue}; +use wasmi::ModuleRef; +//use wasmi::RuntimeValue; -use enclave_ffi_types::EnclaveError; +//use enclave_ffi_types::EnclaveError; -use cw_types_generic::CosmWasmApiVersion; +//use cw_types_generic::CosmWasmApiVersion; use super::contract::ContractInstance; -use crate::errors::{wasmi_error_to_enclave_error, WasmEngineError}; -use enclave_cosmos_types::types::HandleType; +// use crate::errors::{wasmi_error_to_enclave_error, WasmEngineError}; +// use enclave_cosmos_types::types::HandleType; +#[allow(dead_code)] pub struct Engine { pub contract_instance: ContractInstance, pub module: ModuleRef, } -impl Engine { - pub fn new(contract_instance: ContractInstance, module: ModuleRef) -> Self { - Self { - contract_instance, - module, - } - } - - pub fn gas_used(&self) -> u64 { - self.contract_instance.gas_used - } - - pub fn write_to_memory(&mut self, buffer: &[u8]) -> Result { - self.contract_instance.write_to_memory(buffer) - } - - pub fn extract_vector(&self, vec_ptr_ptr: u32) -> Result, WasmEngineError> { - self.contract_instance.extract_vector(vec_ptr_ptr) - } - - pub fn init( - &mut self, - env_ptr: u32, - msg_info_ptr: u32, - msg_ptr: u32, - ) -> Result { - info!("Invoking init() in wasm"); - - let (func_name, args) = match self.contract_instance.cosmwasm_api_version { - CosmWasmApiVersion::V010 => ( - "init", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - CosmWasmApiVersion::V1 => ( - "instantiate", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_info_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - _ => return Err(EnclaveError::InvalidWasm), - }; - - match self - .module - .invoke_export(func_name, &args, &mut self.contract_instance) - .map_err(wasmi_error_to_enclave_error)? - { - Some(RuntimeValue::I32(offset)) => Ok(offset as u32), - other => { - warn!("init method returned value which wasn't u32: {:?}", other); - Err(EnclaveError::FailedFunctionCall) - } - } - - // Itzik: leaving this here as an example in case we will want to do something like this in the future - - // if result.is_ok() { - // write_encrypted_key( - // b"key", - // contract_key, - // &self.contract_instance.context, - // &self.contract_instance.contract_key, - // ) - // .map_err(|_| { - // error!("Failed to write contract key to database"); - // EnclaveError::InternalError - // })?; - // } - - //result - } - - pub fn handle( - &mut self, - env_ptr: u32, - msg_info_ptr: u32, - msg_ptr: u32, - handle_type: HandleType, - ) -> Result { - // Itzik: leaving this here as an example in case we will want to do something like this in the future - - // let stored_address = read_encrypted_key( - // b"key", - // &self.contract_instance.context, - // &self.contract_instance.contract_key, - // ) - // .map_err(|_| { - // error!("WTF wrong contract key are you crazy???"); - // EnclaveError::InternalError - // })?; - // - // match stored_address.0 { - // Some(addr) => { - // if addr != contract_key.to_vec() { - // error!("WTF wrong contract key are you crazy???"); - // return Err(EnclaveError::FailedUnseal); - // } - // Ok(()) - // } - // None => { - // error!("WTF no contract address found you must be trippin' dawg"); - // Err(EnclaveError::InternalError) - // } - // }?; - - let (func_name, args) = match self.contract_instance.cosmwasm_api_version { - CosmWasmApiVersion::V010 => ( - "handle", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - CosmWasmApiVersion::V1 => match handle_type { - HandleType::HANDLE_TYPE_EXECUTE => ( - "execute", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_info_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_REPLY => ( - "reply", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_CHANNEL_OPEN => ( - "ibc_channel_open", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_CHANNEL_CONNECT => ( - "ibc_channel_connect", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_CHANNEL_CLOSE => ( - "ibc_channel_close", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_PACKET_RECEIVE => ( - "ibc_packet_receive", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_PACKET_ACK => ( - "ibc_packet_ack", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => ( - "ibc_packet_timeout", - vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - ), - }, - _ => return Err(EnclaveError::InvalidWasm), - }; - - info!("Invoking {}() in wasm", func_name); - - match self - .module - .invoke_export(func_name, &args, &mut self.contract_instance) - .map_err(wasmi_error_to_enclave_error)? - { - Some(RuntimeValue::I32(offset)) => Ok(offset as u32), - other => { - warn!( - "{} method returned value which wasn't u32: {:?}", - func_name, other - ); - Err(EnclaveError::FailedFunctionCall) - } - } - } - - pub fn query(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { - info!("Invoking query() in wasm"); - - let args = match self.contract_instance.cosmwasm_api_version { - CosmWasmApiVersion::V010 => { - vec![ - RuntimeValue::I32(msg_ptr as i32), - /* no env in v0.10 */ - ] - } - CosmWasmApiVersion::V1 => vec![ - RuntimeValue::I32(env_ptr as i32), - RuntimeValue::I32(msg_ptr as i32), - ], - _ => return Err(EnclaveError::InvalidWasm), - }; - - match self - .module - .invoke_export("query", &args, &mut self.contract_instance) - .map_err(wasmi_error_to_enclave_error)? - { - Some(RuntimeValue::I32(offset)) => Ok(offset as u32), - other => { - warn!("query method returned value which wasn't u32: {:?}", other); - Err(EnclaveError::FailedFunctionCall) - } - } - } -} +// impl Engine { +// pub fn new(contract_instance: ContractInstance, module: ModuleRef) -> Self { +// Self { +// contract_instance, +// module, +// } +// } +// +// pub fn gas_used(&self) -> u64 { +// self.contract_instance.gas_used +// } +// +// pub fn write_to_memory(&mut self, buffer: &[u8]) -> Result { +// self.contract_instance.write_to_memory(buffer) +// } +// +// pub fn extract_vector(&self, vec_ptr_ptr: u32) -> Result, WasmEngineError> { +// self.contract_instance.extract_vector(vec_ptr_ptr) +// } +// +// pub fn init( +// &mut self, +// env_ptr: u32, +// msg_info_ptr: u32, +// msg_ptr: u32, +// ) -> Result { +// info!("Invoking init() in wasm"); +// +// let (func_name, args) = match self.contract_instance.cosmwasm_api_version { +// CosmWasmApiVersion::V010 => ( +// "init", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// CosmWasmApiVersion::V1 => ( +// "instantiate", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_info_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// _ => return Err(EnclaveError::InvalidWasm), +// }; +// +// match self +// .module +// .invoke_export(func_name, &args, &mut self.contract_instance) +// .map_err(wasmi_error_to_enclave_error)? +// { +// Some(RuntimeValue::I32(offset)) => Ok(offset as u32), +// other => { +// warn!("init method returned value which wasn't u32: {:?}", other); +// Err(EnclaveError::FailedFunctionCall) +// } +// } +// +// // Itzik: leaving this here as an example in case we will want to do something like this in the future +// +// // if result.is_ok() { +// // write_encrypted_key( +// // b"key", +// // contract_key, +// // &self.contract_instance.context, +// // &self.contract_instance.contract_key, +// // ) +// // .map_err(|_| { +// // error!("Failed to write contract key to database"); +// // EnclaveError::InternalError +// // })?; +// // } +// +// //result +// } +// +// pub fn handle( +// &mut self, +// env_ptr: u32, +// msg_info_ptr: u32, +// msg_ptr: u32, +// handle_type: HandleType, +// ) -> Result { +// // Itzik: leaving this here as an example in case we will want to do something like this in the future +// +// // let stored_address = read_encrypted_key( +// // b"key", +// // &self.contract_instance.context, +// // &self.contract_instance.contract_key, +// // ) +// // .map_err(|_| { +// // error!("WTF wrong contract key are you crazy???"); +// // EnclaveError::InternalError +// // })?; +// // +// // match stored_address.0 { +// // Some(addr) => { +// // if addr != contract_key.to_vec() { +// // error!("WTF wrong contract key are you crazy???"); +// // return Err(EnclaveError::FailedUnseal); +// // } +// // Ok(()) +// // } +// // None => { +// // error!("WTF no contract address found you must be trippin' dawg"); +// // Err(EnclaveError::InternalError) +// // } +// // }?; +// +// let (func_name, args) = match self.contract_instance.cosmwasm_api_version { +// CosmWasmApiVersion::V010 => ( +// "handle", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// CosmWasmApiVersion::V1 => match handle_type { +// HandleType::HANDLE_TYPE_EXECUTE => ( +// "execute", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_info_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_REPLY => ( +// "reply", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_CHANNEL_OPEN => ( +// "ibc_channel_open", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_CHANNEL_CONNECT => ( +// "ibc_channel_connect", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_CHANNEL_CLOSE => ( +// "ibc_channel_close", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_PACKET_RECEIVE => ( +// "ibc_packet_receive", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_PACKET_ACK => ( +// "ibc_packet_ack", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => ( +// "ibc_packet_timeout", +// vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// ), +// }, +// _ => return Err(EnclaveError::InvalidWasm), +// }; +// +// info!("Invoking {}() in wasm", func_name); +// +// match self +// .module +// .invoke_export(func_name, &args, &mut self.contract_instance) +// .map_err(wasmi_error_to_enclave_error)? +// { +// Some(RuntimeValue::I32(offset)) => Ok(offset as u32), +// other => { +// warn!( +// "{} method returned value which wasn't u32: {:?}", +// func_name, other +// ); +// Err(EnclaveError::FailedFunctionCall) +// } +// } +// } +// +// pub fn query(&mut self, env_ptr: u32, msg_ptr: u32) -> Result { +// info!("Invoking query() in wasm"); +// +// let args = match self.contract_instance.cosmwasm_api_version { +// CosmWasmApiVersion::V010 => { +// vec![ +// RuntimeValue::I32(msg_ptr as i32), +// /* no env in v0.10 */ +// ] +// } +// CosmWasmApiVersion::V1 => vec![ +// RuntimeValue::I32(env_ptr as i32), +// RuntimeValue::I32(msg_ptr as i32), +// ], +// _ => return Err(EnclaveError::InvalidWasm), +// }; +// +// match self +// .module +// .invoke_export("query", &args, &mut self.contract_instance) +// .map_err(wasmi_error_to_enclave_error)? +// { +// Some(RuntimeValue::I32(offset)) => Ok(offset as u32), +// other => { +// warn!("query method returned value which wasn't u32: {:?}", other); +// Err(EnclaveError::FailedFunctionCall) +// } +// } +// } +// } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/import_resolver.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/import_resolver.rs index e4d5daf49..dc546a1b0 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/import_resolver.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/import_resolver.rs @@ -1,10 +1,11 @@ +use wasmi::ImportsBuilder; use wasmi::{ - Error as InterpreterError, FuncInstance, FuncRef, ImportsBuilder, ModuleImportResolver, - Signature, ValueType, + Error as InterpreterError, FuncInstance, FuncRef, ModuleImportResolver, Signature, ValueType, }; use super::externals::HostFunctions; +#[allow(dead_code)] pub fn create_builder(resolver: &dyn ModuleImportResolver) -> ImportsBuilder { ImportsBuilder::new().with_resolver("env", resolver) } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 9f9af1559..d02f5721f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -23,9 +23,7 @@ use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::contract::api_marker; use crate::wasm::ContractOperation; -use crate::wasm3::gas::{ - get_exhausted_amount, get_remaining_gas, use_gas, EXPORT_GAS_LIMIT_EXHAUSTED, -}; +use crate::wasm3::gas::{get_exhausted_amount, get_remaining_gas, use_gas}; mod gas; mod validation; @@ -173,6 +171,7 @@ pub struct Engine { } impl Engine { + #[allow(clippy::too_many_arguments)] pub fn new( context: Ctx, gas_limit: u64, @@ -299,7 +298,6 @@ impl Engine { link_fn(instance, "debug_print", host_debug_print)?; link_fn(instance, "debug", host_debug_print)?; - link_fn(instance, "gas", host_gas)?; link_fn(instance, "secp256k1_verify", host_secp256k1_verify)?; #[rustfmt::skip] @@ -354,28 +352,24 @@ impl Engine { let result = match api_version { CosmWasmApiVersion::V010 => { - ({ - let (init, args) = ( - instance - .find_function::<(u32, u32), u32>("init") - .to_enclave_result()?, - (env_ptr, msg_ptr), - ); - init.call_with_context(context, args) - }) + let (init, args) = ( + instance + .find_function::<(u32, u32), u32>("init") + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + init.call_with_context(context, args) } CosmWasmApiVersion::V1 => { - ({ - let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; + let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; - let (init, args) = ( - instance - .find_function::<(u32, u32, u32), u32>("instantiate") - .to_enclave_result()?, - (env_ptr, msg_info_ptr, msg_ptr), - ); - init.call_with_context(context, args) - }) + let (init, args) = ( + instance + .find_function::<(u32, u32, u32), u32>("instantiate") + .to_enclave_result()?, + (env_ptr, msg_info_ptr, msg_ptr), + ); + init.call_with_context(context, args) } CosmWasmApiVersion::Invalid => { return Err(EnclaveError::InvalidWasm); @@ -409,39 +403,35 @@ impl Engine { let result = match api_version { CosmWasmApiVersion::V010 => { - ({ + let (handle, args) = ( + instance + .find_function::<(u32, u32), u32>("handle") + .to_enclave_result()?, + (env_ptr, msg_ptr), + ); + handle.call_with_context(context, args) + } + CosmWasmApiVersion::V1 => { + let export_name = HandleType::get_export_name(&handle_type); + + if handle_type == &HandleType::HANDLE_TYPE_EXECUTE { + let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; + let (handle, args) = ( + instance + .find_function::<(u32, u32, u32), u32>(&export_name) + .to_enclave_result()?, + (env_ptr, msg_info_ptr, msg_ptr), + ); + handle.call_with_context(context, args) + } else { let (handle, args) = ( instance - .find_function::<(u32, u32), u32>("handle") + .find_function::<(u32, u32), u32>(&export_name) .to_enclave_result()?, (env_ptr, msg_ptr), ); handle.call_with_context(context, args) - }) - } - CosmWasmApiVersion::V1 => { - ({ - let export_name = HandleType::get_export_name(&handle_type); - - if handle_type == &HandleType::HANDLE_TYPE_EXECUTE { - let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; - let (handle, args) = ( - instance - .find_function::<(u32, u32, u32), u32>(&export_name) - .to_enclave_result()?, - (env_ptr, msg_info_ptr, msg_ptr), - ); - handle.call_with_context(context, args) - } else { - let (handle, args) = ( - instance - .find_function::<(u32, u32), u32>(&export_name) - .to_enclave_result()?, - (env_ptr, msg_ptr), - ); - handle.call_with_context(context, args) - } - }) + } } CosmWasmApiVersion::Invalid => { return Err(EnclaveError::InvalidWasm); @@ -941,16 +931,6 @@ fn host_addr_validate( Ok(0) } -fn host_gas( - context: &mut Context, - instance: &wasm3::Instance, - gas_amount: i32, -) -> WasmEngineResult<()> { - use_gas(instance, gas_amount as u64)?; - - Ok(()) -} - fn host_humanize_address( context: &mut Context, instance: &wasm3::Instance, @@ -1327,6 +1307,9 @@ fn host_ed25519_batch_verify( let pubkeys_len = pubkeys_data.len(); let lengths = (messages_len, signatures_len, pubkeys_len); + + //todo: fix this + #[allow(clippy::type_complexity)] let (messages, signatures, pubkeys): (Vec<&[u8]>, Vec<&[u8]>, Vec<&[u8]>) = match lengths { (ml, sl, pl) if ml == sl && sl == pl => { let messages = messages_data.iter().map(Vec::as_slice).collect(); diff --git a/x/compute/internal/types/types.go b/x/compute/internal/types/types.go index 26dd46676..8f8fc2f18 100644 --- a/x/compute/internal/types/types.go +++ b/x/compute/internal/types/types.go @@ -17,7 +17,7 @@ import ( const ( defaultLRUCacheSize = uint64(0) - defaultEnclaveLRUCacheSize = uint8(0) // can safely go up to 15 + defaultEnclaveLRUCacheSize = uint8(15) defaultQueryGasLimit = uint64(10_000_000) ) From 54f4c61cf3fe070b90253515a228625aa169be51 Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 14:56:01 +0300 Subject: [PATCH 41/67] Added average gas used to benches --- x/compute/internal/keeper/bench_test.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 885b90b3e..21bf22116 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -39,6 +39,7 @@ type BenchTime struct { Max time.Duration datapoints []float64 StdEv float64 + AvgGas uint64 } func NewBenchTimer(name string, bench Bench) BenchTime { @@ -50,10 +51,18 @@ func NewBenchTimer(name string, bench Bench) BenchTime { Max: 0, datapoints: []float64{}, StdEv: 0, + AvgGas: 0, } } -func (b *BenchTime) AppendTime(singleRunTime time.Duration) { +func (b *BenchTime) appendGas(gasUsed uint64) { + currentAvgGas := b.AvgGas * b.iterations + newAvgSum := currentAvgGas + gasUsed + + b.AvgGas = newAvgSum / b.iterations +} + +func (b *BenchTime) AppendResult(singleRunTime time.Duration, gasUsed uint64) { b.iterations += 1 b.datapoints = append(b.datapoints, float64(singleRunTime)) @@ -70,6 +79,8 @@ func (b *BenchTime) AppendTime(singleRunTime time.Duration) { //b.Mean = time.Duration(newAvgSum / b.iterations) // b.Mean, b.StdEv = stat.MeanStdDev(b.datapoints, nil) + + b.appendGas(gasUsed) } func (b *BenchTime) PrintReport() { @@ -77,14 +88,16 @@ func (b *BenchTime) PrintReport() { stdevTime := time.Duration(math.Floor(b.StdEv)) stdevMean := time.Duration(math.Floor(b.Mean)) - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s", + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d", b.Name, b.Case, b.iterations, stdevMean, b.Min, b.Max, - stdevTime) + stdevTime, + b.AvgGas, + ) // todo: log this properly println(s) @@ -165,7 +178,7 @@ func TestRunBenchmarks(t *testing.T) { for i := uint64(1); i < tc.loops+1; i++ { start := time.Now() // call bench - _, _, qErr, _, _, _ := execHelper( + _, _, qErr, _, gasUsed, _ := execHelper( t, keeper, ctx, @@ -182,7 +195,7 @@ func TestRunBenchmarks(t *testing.T) { elapsed := time.Since(start) require.Empty(t, qErr) - timer.AppendTime(elapsed) + timer.AppendResult(elapsed, gasUsed) } timers[name] = timer }) From 002e5a575e3957658f3b01aee008c63649129503 Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 14:58:59 +0300 Subject: [PATCH 42/67] Added gas/time measurement as well --- x/compute/internal/keeper/bench_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 21bf22116..1d45b3569 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -88,7 +88,7 @@ func (b *BenchTime) PrintReport() { stdevTime := time.Duration(math.Floor(b.StdEv)) stdevMean := time.Duration(math.Floor(b.Mean)) - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d", + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Value: %f", b.Name, b.Case, b.iterations, @@ -97,6 +97,7 @@ func (b *BenchTime) PrintReport() { b.Max, stdevTime, b.AvgGas, + float64(b.AvgGas)/b.Mean, ) // todo: log this properly From 32aef53f90bb3bfe68ed975c2bd47312524fc312 Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 16:26:23 +0300 Subject: [PATCH 43/67] Make gas value easier to parse --- x/compute/internal/keeper/bench_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 1d45b3569..57e958fd0 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -88,7 +88,7 @@ func (b *BenchTime) PrintReport() { stdevTime := time.Duration(math.Floor(b.StdEv)) stdevMean := time.Duration(math.Floor(b.Mean)) - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Value: %f", + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Value: %f [Kgas/ms]", b.Name, b.Case, b.iterations, @@ -97,7 +97,7 @@ func (b *BenchTime) PrintReport() { b.Max, stdevTime, b.AvgGas, - float64(b.AvgGas)/b.Mean, + float64(b.AvgGas)/b.Mean*1000, ) // todo: log this properly From 4844057d6f44139f7bdcf85abd1ad5d323547fc8 Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Thu, 15 Sep 2022 16:44:58 +0300 Subject: [PATCH 44/67] Fixed gas usage calculation --- x/compute/internal/keeper/bench_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 57e958fd0..143b5f795 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -59,11 +59,14 @@ func (b *BenchTime) appendGas(gasUsed uint64) { currentAvgGas := b.AvgGas * b.iterations newAvgSum := currentAvgGas + gasUsed - b.AvgGas = newAvgSum / b.iterations + b.AvgGas = newAvgSum / (b.iterations + 1) } func (b *BenchTime) AppendResult(singleRunTime time.Duration, gasUsed uint64) { + + b.appendGas(gasUsed) b.iterations += 1 + b.datapoints = append(b.datapoints, float64(singleRunTime)) if singleRunTime > b.Max { @@ -80,7 +83,6 @@ func (b *BenchTime) AppendResult(singleRunTime time.Duration, gasUsed uint64) { // b.Mean, b.StdEv = stat.MeanStdDev(b.datapoints, nil) - b.appendGas(gasUsed) } func (b *BenchTime) PrintReport() { @@ -195,7 +197,7 @@ func TestRunBenchmarks(t *testing.T) { ) elapsed := time.Since(start) require.Empty(t, qErr) - + println("Gas used by execute: %d", gasUsed) timer.AppendResult(elapsed, gasUsed) } timers[name] = timer From 9526f808f25aec056ed42e70ee2f172c3e46a6f5 Mon Sep 17 00:00:00 2001 From: Itzik Date: Fri, 16 Sep 2022 03:00:42 +0300 Subject: [PATCH 45/67] More work on timings and optimizations --- Makefile | 2 + cosmwasm/contracts/v010/hackatom/Cargo.lock | 60 +------ .../v1/compute-tests/bench-contract/Makefile | 2 +- .../bench-contract/src/benches/allocate.rs | 2 +- .../test-compute-contract/src/contract.rs | 18 +- cosmwasm/enclaves/Cargo.lock | 8 +- cosmwasm/enclaves/Xargo.toml | 1 + cosmwasm/enclaves/execute/Cargo.toml | 3 +- cosmwasm/enclaves/query/Cargo.toml | 5 +- .../shared/contract-engine/Cargo.toml | 5 +- .../src/contract_operations.rs | 33 +++- .../src/contract_validation.rs | 26 ++- .../shared/contract-engine/src/wasm3/mod.rs | 166 ++++++++++++++---- cosmwasm/enclaves/shared/crypto/Cargo.toml | 3 +- .../enclaves/shared/crypto/src/secp256k1.rs | 45 ++++- x/compute/internal/keeper/bench_test.go | 104 ++++++++--- .../internal/keeper/secret_contracts_test.go | 2 +- .../keeper/testdata/bench_contract.wasm | Bin 1867743 -> 172243 bytes 18 files changed, 346 insertions(+), 139 deletions(-) diff --git a/Makefile b/Makefile index ff07943df..683733538 100644 --- a/Makefile +++ b/Makefile @@ -359,6 +359,8 @@ build-test-contract: cp $(TEST_CONTRACT_V1_PATH)/test-compute-contract/*.wasm $(TEST_COMPUTE_MODULE_PATH)/ $(MAKE) -C $(TEST_CONTRACT_V1_PATH)/ibc-test-contract cp $(TEST_CONTRACT_V1_PATH)/ibc-test-contract/*.wasm $(TEST_COMPUTE_MODULE_PATH)/ + $(MAKE) -C $(TEST_CONTRACT_V1_PATH)/bench-contract + cp $(TEST_CONTRACT_V1_PATH)/bench-contract/*.wasm $(TEST_COMPUTE_MODULE_PATH)/ prep-go-tests: build-test-contract # empty BUILD_PROFILE means debug mode which compiles faster diff --git a/cosmwasm/contracts/v010/hackatom/Cargo.lock b/cosmwasm/contracts/v010/hackatom/Cargo.lock index 0764ab88d..219ddedd8 100644 --- a/cosmwasm/contracts/v010/hackatom/Cargo.lock +++ b/cosmwasm/contracts/v010/hackatom/Cargo.lock @@ -137,26 +137,12 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cosmwasm-schema" -version = "1.1.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c742fc698a88cf02ea304cc2b5bc18ef975c5bb9eff93c3e44d2cd565e1d458" +checksum = "2196586ea197eaa21129d09c84a19e2eb80bdce239eec8e6a4f108cb644c295f" dependencies = [ - "cosmwasm-schema-derive", - "schemars 0.8.3", - "serde", + "schemars", "serde_json", - "thiserror", -] - -[[package]] -name = "cosmwasm-schema-derive" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a7c4c07be11add09dd3af3064c4f4cbc2dc99c6859129bdaf820131730e996" -dependencies = [ - "proc-macro2", - "quote", - "syn", ] [[package]] @@ -172,7 +158,7 @@ dependencies = [ "num_cpus", "parity-wasm", "parking_lot", - "schemars 0.7.6", + "schemars", "secret-cosmwasm-std", "serde", "serde_json", @@ -188,7 +174,7 @@ version = "0.10.0" source = "git+https://github.com/enigmampc/SecretNetwork?tag=v1.0.4-debug-print#004c6bca6f2b7f31a6594abe4f44f2e41b1456b3" dependencies = [ "base64 0.11.0", - "schemars 0.7.6", + "schemars", "serde", "serde-json-wasm", "snafu", @@ -240,12 +226,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dyn-clone" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" - [[package]] name = "enclave-ffi-types" version = "0.1.0" @@ -290,7 +270,7 @@ dependencies = [ "cosmwasm-sgx-vm", "cosmwasm-std", "cosmwasm-storage", - "schemars 0.7.6", + "schemars", "serde", "sha2", ] @@ -556,19 +536,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be77ed66abed6954aabf6a3e31a84706bedbf93750d267e92ef4a6d90bbd6a61" dependencies = [ - "schemars_derive 0.7.6", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6ab463ae35acccb5cba66c0084c985257b797d288b6050cc2f6ac1b266cb78" -dependencies = [ - "dyn-clone", - "schemars_derive 0.8.3", + "schemars_derive", "serde", "serde_json", ] @@ -585,18 +553,6 @@ dependencies = [ "syn", ] -[[package]] -name = "schemars_derive" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "902fdfbcf871ae8f653bddf4b2c05905ddaabc08f69d32a915787e3be0d31356" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn", -] - [[package]] name = "scopeguard" version = "1.1.0" @@ -610,7 +566,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4b8fed972d924458d9c3c0e6c9fbf6c4c5e30655571e3d2b78be056d316e9" dependencies = [ "base64 0.11.0", - "schemars 0.7.6", + "schemars", "serde", "serde-json-wasm", "snafu", diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile index 95e0c87f7..e0e188335 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/Makefile @@ -1,7 +1,7 @@ all: src/contract.rs src src src Cargo.toml Cargo.lock rustup target add wasm32-unknown-unknown RUSTFLAGS='-C link-arg=-s' cargo build --release --target wasm32-unknown-unknown - cp ./target/wasm32-unknown-unknown/release/v1_sanity_contract.wasm ./v1-contract.wasm + cp ./target/wasm32-unknown-unknown/release/bench_contract.wasm ./bench_contract.wasm clean: cargo clean diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs index c05f363f6..6dbdf0b0f 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/allocate.rs @@ -1,7 +1,7 @@ use cosmwasm_std::{StdError, StdResult}; pub fn do_allocate_large_memory() -> StdResult<()> { - // We create memory pages explicitely since Rust's default allocator seems to be clever enough + // We create memory pages explicitly since Rust's default allocator seems to be clever enough // to not grow memory for unused capacity like `Vec::::with_capacity(100 * 1024 * 1024)`. // Even with std::alloc::alloc the memory did now grow beyond 1.5 MiB. diff --git a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs index 7f49d4316..d717a67a0 100644 --- a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs +++ b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs @@ -2414,26 +2414,26 @@ fn pass_null_pointer_to_imports_should_throw(deps: DepsMut, pass_type: String) - fn test_canonicalize_address_errors(deps: DepsMut) -> StdResult { match deps.api.addr_canonicalize("") { Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: Input is empty") { - return Err(StdError::generic_err( - "empty address should have failed with 'addr_canonicalize errored: Input is empty'", - )); + if !msg.to_lowercase().contains("input is empty") { + return Err(StdError::generic_err(format!( + "empty address should have failed with 'addr_canonicalize errored: Input is empty; got {:?}'", + msg))); } // all is good, continue } _ => { return Err(StdError::generic_err( - "empty address should have failed with 'addr_canonicalize errored: Input is empty'", + "empty address should have failed, but returned success'", )) } } match deps.api.addr_canonicalize(" ") { Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: invalid length") { - return Err(StdError::generic_err( - "empty trimmed address should have failed with 'addr_canonicalize errored: invalid length'", - )); + if !msg.to_lowercase().contains("input is empty") { + return Err(StdError::generic_err(format!( + "empty trimmed address should have failed with 'addr_canonicalize errored: Input is empty; got {:?}'", + msg))); } // all is good, continue } diff --git a/cosmwasm/enclaves/Cargo.lock b/cosmwasm/enclaves/Cargo.lock index 335e1fa66..ca141ce60 100644 --- a/cosmwasm/enclaves/Cargo.lock +++ b/cosmwasm/enclaves/Cargo.lock @@ -1208,18 +1208,18 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.21.3" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260" +checksum = "b7649a0b3ffb32636e60c7ce0d70511eda9c52c658cd0634e194d5a19943aeff" dependencies = [ "secp256k1-sys", ] [[package]] name = "secp256k1-sys" -version = "0.4.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" +checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b" dependencies = [ "cc", ] diff --git a/cosmwasm/enclaves/Xargo.toml b/cosmwasm/enclaves/Xargo.toml index 559df97b4..4589e0ec8 100644 --- a/cosmwasm/enclaves/Xargo.toml +++ b/cosmwasm/enclaves/Xargo.toml @@ -19,6 +19,7 @@ std = { git = "https://github.com/apache/teaclave-sgx-sdk.git", rev = "a37ffb944 "net", "backtrace", "untrusted_fs", + "untrusted_time" ] } sgx_no_tstd = { git = "https://github.com/apache/teaclave-sgx-sdk.git", rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", stage = 5 } sgx_rand = { git = "https://github.com/apache/teaclave-sgx-sdk.git", rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", stage = 6 } diff --git a/cosmwasm/enclaves/execute/Cargo.toml b/cosmwasm/enclaves/execute/Cargo.toml index ea0c04650..2ac752517 100644 --- a/cosmwasm/enclaves/execute/Cargo.toml +++ b/cosmwasm/enclaves/execute/Cargo.toml @@ -22,7 +22,8 @@ test = ["enclave_contract_engine/test", "enclave_crypto/test", "enclave_cosmos_t # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_tstd = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git", features = [ - "backtrace" + "backtrace", + "untrusted_time" ] } sgx_types = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git" } diff --git a/cosmwasm/enclaves/query/Cargo.toml b/cosmwasm/enclaves/query/Cargo.toml index 5f4858d30..b2918a71c 100644 --- a/cosmwasm/enclaves/query/Cargo.toml +++ b/cosmwasm/enclaves/query/Cargo.toml @@ -21,7 +21,8 @@ debug-print = ["enclave_contract_engine/debug-print"] # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_tstd = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git", features = [ - "backtrace" + "backtrace", + "untrusted_time" ] } sgx_types = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git" } @@ -29,7 +30,7 @@ sgx_types = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://g enclave_contract_engine = { path = "../shared/contract-engine", features = ["query-only"] } enclave_utils = { path = "../shared/utils", features = ["query-only"] } -log = "0.4.17" +log = "0.4.14" simple_logger = { version = "2.3.0", default-features = false, features = ["stderr"] } ctor = "0.1.13" diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 91ac6ce3a..edb397c74 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -14,7 +14,8 @@ test = [] # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_tstd = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git", features = [ - "backtrace" + "backtrace", + "untrusted_time" ] } sgx_types = { rev = "a37ffb9449ba6d5b6e4a9d586bbab864ae732269", git = "https://github.com/apache/teaclave-sgx-sdk.git" } @@ -47,7 +48,7 @@ walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = lru = { version = "0.6", default-features = false } hex = "0.4.2" -secp256k1 = { version = "0.21.3", features = ["recovery"] } +secp256k1 = { version = "0.24.0", features = ["recovery", "alloc"] } ed25519-zebra = { version = "=2.2.0", default-features = false } rand_core = "0.5.0" rand_chacha = { version = "0.2.1", default-features = false } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 362c6a4b0..38c53fd6c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -7,6 +7,7 @@ use enclave_cosmos_types::types::{ContractCode, HandleType, SigInfo}; use enclave_crypto::Ed25519PublicKey; use enclave_ffi_types::{Ctx, EnclaveError}; use log::*; +use std::time::Instant; use crate::contract_validation::{ReplyParams, ValidatedMessage}; use crate::external::results::{HandleSuccess, InitSuccess, QuerySuccess}; @@ -51,12 +52,21 @@ pub fn init( ) -> Result { trace!("Starting init"); + let mut start = Instant::now(); let contract_code = ContractCode::new(contract); let contract_hash = contract_code.hash(); + let mut duration = start.elapsed(); + println!("Time elapsed in ContractCode::new is: {:?}", duration); + let mut start = Instant::now(); let base_env: BaseEnv = extract_base_env(env)?; + let mut duration = start.elapsed(); + println!("Time elapsed in extract_base_env is: {:?}", duration); + let mut start = Instant::now(); let (sender, contract_address, block_height, sent_funds) = base_env.get_verification_params(); + let mut duration = start.elapsed(); + println!("Time elapsed in get_verification_paramsis: {:?}", duration); let canonical_contract_address = to_canonical(contract_address)?; @@ -73,6 +83,7 @@ pub fn init( let secret_msg = SecretMessage::from_slice(msg)?; + let mut start = Instant::now(); verify_params( &parsed_sig_info, &sent_funds, @@ -80,14 +91,23 @@ pub fn init( &contract_address, &secret_msg, )?; + let mut duration = start.elapsed(); + println!("Time elapsed in verify_params: {:?}", duration); + let mut start = Instant::now(); let decrypted_msg = secret_msg.decrypt()?; + let mut duration = start.elapsed(); + println!("Time elapsed in decrypt: {:?}", duration); + let mut start = Instant::now(); let ValidatedMessage { validated_msg, reply_params, } = validate_msg(&decrypted_msg, &contract_hash, None, None)?; + let mut duration = start.elapsed(); + println!("Time elapsed in validate_msg: {:?}", duration); + let mut start = Instant::now(); let mut engine = start_engine( context, gas_limit, @@ -97,18 +117,25 @@ pub fn init( secret_msg.nonce, secret_msg.user_public_key, )?; + let mut duration = start.elapsed(); + println!("Time elapsed in start_engine: {:?}", duration); let mut versioned_env = base_env.into_versioned_env(&engine.get_api_version()); versioned_env.set_contract_hash(&contract_hash); + let mut start = Instant::now(); let result = engine.init(&versioned_env, validated_msg); + let mut duration = start.elapsed(); + println!("Time elapsed in engine.init: {:?}", duration); + *used_gas = engine.gas_used(); let output = result?; // TODO: copy cosmwasm's structures to enclave // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/init_handle.rs#L129 // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/query.rs#L13 + let mut start = Instant::now(); let output = encrypt_output( output, &secret_msg, @@ -119,6 +146,8 @@ pub fn init( false, false, )?; + let mut duration = start.elapsed(); + println!("Time elapsed in encrypt_output: {:?}", duration); // todo: can move the key to somewhere in the output message if we want @@ -327,10 +356,12 @@ pub fn query( secret_msg.user_public_key, )?; - let versioned_env = base_env + let mut versioned_env = base_env .clone() .into_versioned_env(&engine.get_api_version()); + versioned_env.set_contract_hash(&contract_hash); + let result = engine.query(&versioned_env, validated_msg); *used_gas = engine.gas_used(); let output = result?; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs index 6a3b3dcb1..7ad2fbdfc 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs @@ -1,6 +1,7 @@ use cw_types_v1::ibc::IbcPacketReceiveMsg; use cw_types_v1::results::REPLY_ENCRYPTION_MAGIC_BYTES; use log::*; +use std::time::{Duration, Instant}; use cw_types_v010::types::{CanonicalAddr, Coin, HumanAddr}; use enclave_cosmos_types::traits::CosmosAminoPubkey; @@ -249,17 +250,29 @@ pub fn verify_params( ) -> Result<(), EnclaveError> { debug!("Verifying message signatures for: {:?}", sig_info); + let mut start = Instant::now(); // If there's no callback signature - it's not a callback and there has to be a tx signer + signature if let Some(callback_sig) = &sig_info.callback_sig { return verify_callback_sig(callback_sig.as_slice(), sender, msg, sent_funds); } + let mut duration = start.elapsed(); + println!( + "verify_params: Time elapsed in verify_callback_sig: {:?}", + duration + ); trace!( "Sign bytes are: {:?}", String::from_utf8_lossy(sig_info.sign_bytes.as_slice()) ); + let mut start = Instant::now(); let (sender_public_key, messages) = get_signer_and_messages(sig_info, sender)?; + let mut duration = start.elapsed(); + println!( + "verify_params: Time elapsed in get_signer_and_messages: {:?}", + duration + ); trace!( "sender canonical address is: {:?}", @@ -268,6 +281,7 @@ pub fn verify_params( trace!("sender signature is: {:?}", sig_info.signature); trace!("sign bytes are: {:?}", sig_info.sign_bytes); + let mut start = Instant::now(); sender_public_key .verify_bytes( sig_info.sign_bytes.as_slice(), @@ -278,7 +292,13 @@ pub fn verify_params( warn!("Signature verification failed: {:?}", err); EnclaveError::FailedTxVerification })?; + let mut duration = start.elapsed(); + println!( + "verify_params: Time elapsed in verify_bytes: {:?}", + duration + ); + let mut start = Instant::now(); if verify_message_params( &messages, sender, @@ -290,7 +310,11 @@ pub fn verify_params( info!("Parameters verified successfully"); return Ok(()); } - + let mut duration = start.elapsed(); + println!( + "verify_params: Time elapsed in verify_message_params: {:?}", + duration + ); warn!("Parameter verification failed"); Err(EnclaveError::FailedTxVerification) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index d02f5721f..ede343bdd 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -25,12 +25,23 @@ use crate::wasm::contract::api_marker; use crate::wasm::ContractOperation; use crate::wasm3::gas::{get_exhausted_amount, get_remaining_gas, use_gas}; +use std::sync::SgxRwLock; + mod gas; mod validation; +use lazy_static::lazy_static; +use std::time::{Duration, Instant}; type Wasm3RsError = wasm3::Error; type Wasm3RsResult = Result; +use std::collections::HashMap; + +lazy_static! { + static ref W3_MODULE_CACHE: SgxRwLock, CosmWasmApiVersion)>> = + SgxRwLock::new(HashMap::new()); +} + macro_rules! debug_err { ($message: literal) => { |err| { debug!($message); err } @@ -182,48 +193,85 @@ impl Engine { user_nonce: IoNonce, user_public_key: Ed25519PublicKey, ) -> Result { - let mut module = walrus::ModuleConfig::new() - .generate_producers_section(false) - .parse(contract_code.code()) - .map_err(|_| EnclaveError::InvalidWasm)?; - - for import in module.imports.iter() { - eprintln!("import {:?}", import) - } - for export in module.exports.iter() { - eprintln!("export {:?}", export) - } + let found = W3_MODULE_CACHE + .read() + .unwrap() + .contains_key(&contract_code.hash()); + + let (code, cosmwasm_api_version) = if !found { + let mut start = Instant::now(); + let mut module = walrus::ModuleConfig::new() + .generate_producers_section(false) + .parse(contract_code.code()) + .map_err(|_| EnclaveError::InvalidWasm)?; + let mut duration = start.elapsed(); + println!( + "Time elapsed in walrus::ModuleConfig::new() is: {:?}", + duration + ); + // for import in module.imports.iter() { + // eprintln!("import {:?}", import) + // } + // for export in module.exports.iter() { + // eprintln!("export {:?}", export) + // } - let cosmwasm_api_version = if let Some(export) = module - .exports - .iter() - .find(|&exp| exp.name == api_marker::V0_10 || exp.name == api_marker::V1) - { - if export.name == api_marker::V0_10 { - CosmWasmApiVersion::V010 - } else if export.name == api_marker::V1 { - CosmWasmApiVersion::V1 + let cosmwasm_api_version = if let Some(export) = module + .exports + .iter() + .find(|&exp| exp.name == api_marker::V0_10 || exp.name == api_marker::V1) + { + if export.name == api_marker::V0_10 { + CosmWasmApiVersion::V010 + } else if export.name == api_marker::V1 { + CosmWasmApiVersion::V1 + } else { + error!("Invalid cosmwasm api version"); + return Err(EnclaveError::InvalidWasm); + } } else { - error!("Invalid cosmwasm api version"); + error!("Invalid cosmwasm api version2"); return Err(EnclaveError::InvalidWasm); - } - } else { - error!("Invalid cosmwasm api version2"); - return Err(EnclaveError::InvalidWasm); - }; + }; - validation::validate_memory(&mut module)?; + let mut start = Instant::now(); + validation::validate_memory(&mut module)?; + let mut duration = start.elapsed(); + println!("Time elapsed in validate_memory is: {:?}", duration); - if let ContractOperation::Init = operation { - if module.has_floats() { - debug!("contract was found to contain floating point operations"); - return Err(EnclaveError::WasmModuleWithFP); + if let ContractOperation::Init = operation { + if module.has_floats() { + debug!("contract was found to contain floating point operations"); + return Err(EnclaveError::WasmModuleWithFP); + } } - } - gas::add_metering(&mut module, &gas_costs); + let mut start = Instant::now(); + gas::add_metering(&mut module, &gas_costs); + let mut duration = start.elapsed(); + println!("Time elapsed in add_metering() is: {:?}", duration); + + let mut start = Instant::now(); + let code = module.emit_wasm(); + let mut duration = start.elapsed(); + println!("Time elapsed in module.emit_wasm() is: {:?}", duration); - let code = module.emit_wasm(); + let mut write_cache = W3_MODULE_CACHE.write().unwrap(); + + write_cache.insert( + contract_code.hash(), + (code.clone(), cosmwasm_api_version.clone()), + ); + + (code, cosmwasm_api_version) + } else { + W3_MODULE_CACHE + .read() + .unwrap() + .get(&contract_code.hash()) + .unwrap() + .clone() + }; let context = Context { context, @@ -237,7 +285,11 @@ impl Engine { }; debug!("setting up runtime"); + let mut start = Instant::now(); + let environment = wasm3::Environment::new().to_enclave_result()?; + let mut duration = start.elapsed(); + println!("Time elapsed in Environment::new() is: {:?}", duration); debug!("initialized environment"); Ok(Self { @@ -254,28 +306,49 @@ impl Engine { where F: FnOnce(&mut wasm3::Instance, &mut Context) -> Result, EnclaveError>, { + let mut start = Instant::now(); let runtime = self .environment .new_runtime::(1024 * 60, Some(192 /* 12 MiB */)) .to_enclave_result()?; + let mut duration = start.elapsed(); + println!("Time elapsed in environment.new_runtime is: {:?}", duration); debug!("initialized runtime"); + let mut start = Instant::now(); let module = self .environment .parse_module(&self.code) .to_enclave_result()?; + let mut duration = start.elapsed(); + println!( + "Time elapsed in environment.parse_module is: {:?}", + duration + ); debug!("parsed module"); + let mut start = Instant::now(); let mut instance = runtime.load_module(module).to_enclave_result()?; + let mut duration = start.elapsed(); + println!("Time elapsed in runtime.load_module is: {:?}", duration); debug!("created instance"); + let mut start = Instant::now(); gas::set_gas_limit(&instance, self.gas_limit)?; + let mut duration = start.elapsed(); + println!("Time elapsed in set_gas_limit is: {:?}", duration); debug!("set gas limit"); + let mut start = Instant::now(); Self::link_host_functions(&mut instance).to_enclave_result()?; + let mut duration = start.elapsed(); + println!("Time elapsed in link_host_functions is: {:?}", duration); debug!("linked functions"); + let mut start = Instant::now(); let result = func(&mut instance, &mut self.context); + let mut duration = start.elapsed(); + println!("Instance: elapsed time for running func is: {:?}", duration); debug!("function returned {:?}", result); self.used_gas = @@ -347,8 +420,18 @@ impl Engine { let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; + let mut start = Instant::now(); let env_ptr = write_to_memory(instance, &env_bytes)?; + let mut duration = start.elapsed(); + println!( + "Time elapsed in env_bytes write_to_memory is: {:?}", + duration + ); + + let mut start = Instant::now(); let msg_ptr = write_to_memory(instance, &msg)?; + let mut duration = start.elapsed(); + println!("Time elapsed in msg write_to_memory is: {:?}", duration); let result = match api_version { CosmWasmApiVersion::V010 => { @@ -369,16 +452,25 @@ impl Engine { .to_enclave_result()?, (env_ptr, msg_info_ptr, msg_ptr), ); - init.call_with_context(context, args) + let mut start = Instant::now(); + let res = init.call_with_context(context, args); + let mut duration = start.elapsed(); + println!("Time elapsed in call_with_context is: {:?}", duration); + res } CosmWasmApiVersion::Invalid => { return Err(EnclaveError::InvalidWasm); } }; - + let mut start = Instant::now(); let output_ptr = check_execution_result(instance, context, result)?; + let mut duration = start.elapsed(); + println!("Time elapsed in check_execution_result is: {:?}", duration); + let mut start = Instant::now(); let output = read_from_memory(instance, output_ptr)?; + let mut duration = start.elapsed(); + println!("Time elapsed in read_from_memory is: {:?}", duration); Ok(output) }) @@ -824,7 +916,7 @@ fn host_canonicalize_address( .map_err(debug_err!("failed to write error message to contract")); } - debug!("canonicalize_address was called with {:?}", human_addr_str); + //debug!("canonicalize_address was called with {:?}", human_addr_str); let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { Ok(ret) => ret, diff --git a/cosmwasm/enclaves/shared/crypto/Cargo.toml b/cosmwasm/enclaves/shared/crypto/Cargo.toml index 8730879cf..3a7800850 100644 --- a/cosmwasm/enclaves/shared/crypto/Cargo.toml +++ b/cosmwasm/enclaves/shared/crypto/Cargo.toml @@ -28,7 +28,8 @@ ring = { git = "https://github.com/mesalock-linux/ring-sgx", tag = "v0.16.5" } sha2 = "0.8.1" sha3 = "0.8.1" ripemd160 = "0.9.1" -secp256k1 = "0.21.3" +secp256k1 = { version = "0.24.0", features = ["recovery", "alloc"] } +# k256 aes-siv = "=0.6.2" x25519-dalek = { version = "=1.2.0", default-features = false, features = [ "u64_backend" diff --git a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs index 074e26b85..8b638e24d 100644 --- a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs +++ b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs @@ -3,9 +3,15 @@ use log::*; use crate::traits::VerifyingKey; use crate::CryptoError; use cosmos_proto::tx::signing::SignMode; +// use k256::ecdsa::{ +// signature::{DigestSigner, DigestVerifier}, +// Signature, SigningKey, +// }; use secp256k1::Secp256k1; + use sha2::{Digest as Sha2Digest, Sha256}; use sha3::Keccak256; +use std::time::Instant; pub const SECP256K1_PREFIX: [u8; 4] = [235, 90, 233, 135]; @@ -26,29 +32,65 @@ impl VerifyingKey for Secp256k1PubKey { sign_mode: SignMode, ) -> Result<(), CryptoError> { // Signing ref: https://docs.cosmos.network/master/spec/_ics/ics-030-signed-messages.html#preliminary + + let mut start = Instant::now(); let sign_bytes_hash = if sign_mode == SignMode::SIGN_MODE_EIP_191 { Keccak256::digest(bytes) } else { Sha256::digest(bytes) }; + let mut duration = start.elapsed(); + println!( + "verify_bytes: Time elapsed in Sha256::digest: {:?}", + duration + ); + + let mut start = Instant::now(); + //let verifying_key = VerifyingKey let msg = secp256k1::Message::from_slice(sign_bytes_hash.as_slice()).map_err(|err| { warn!("Failed to create a secp256k1 message from tx: {:?}", err); CryptoError::VerificationError })?; + let mut duration = start.elapsed(); + println!( + "verify_bytes: Time elapsed in Message::from_slice: {:?}", + duration + ); + + let mut start = Instant::now(); let verifier = Secp256k1::verification_only(); + let mut duration = start.elapsed(); + println!( + "verify_bytes: Time elapsed in Secp256k1::verification_only: {:?}", + duration + ); + let mut start = Instant::now(); // Create `secp256k1`'s types let sec_signature = secp256k1::ecdsa::Signature::from_compact(sig).map_err(|err| { warn!("Malformed signature: {:?}", err); CryptoError::VerificationError })?; + let mut duration = start.elapsed(); + println!( + "verify_bytes: Time elapsed in Signature::from_compact: {:?}", + duration + ); + + let mut start = Instant::now(); let sec_public_key = secp256k1::PublicKey::from_slice(self.0.as_slice()).map_err(|err| { warn!("Malformed public key: {:?}", err); CryptoError::VerificationError })?; + let mut duration = start.elapsed(); + println!( + "verify_bytes: Time elapsed in PublicKey from_slice: {:?}", + duration + ); + let mut start = Instant::now(); verifier .verify_ecdsa(&msg, &sec_signature, &sec_public_key) .map_err(|err| { @@ -58,7 +100,8 @@ impl VerifyingKey for Secp256k1PubKey { ); CryptoError::VerificationError })?; - + let mut duration = start.elapsed(); + println!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); trace!("successfully verified this signature: {:?}", sig); Ok(()) } diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 143b5f795..cd5668035 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -31,30 +31,39 @@ func buildBenchMessage(bench Bench) []byte { } type BenchTime struct { - Name string - Case Bench - Mean float64 - iterations uint64 - Min time.Duration - Max time.Duration - datapoints []float64 - StdEv float64 - AvgGas uint64 + Name string + Case Bench + Mean float64 + iterations uint64 + Min time.Duration + Max time.Duration + datapoints []float64 + StdEv float64 + AvgGas uint64 + BaseAvgGas uint64 + BaseAvgTime time.Duration } func NewBenchTimer(name string, bench Bench) BenchTime { return BenchTime{ - Name: name, - Case: bench, - Mean: 0, - Min: math.MaxInt64, - Max: 0, - datapoints: []float64{}, - StdEv: 0, - AvgGas: 0, + Name: name, + Case: bench, + Mean: 0, + Min: math.MaxInt64, + Max: 0, + datapoints: []float64{}, + StdEv: 0, + AvgGas: 0, + BaseAvgGas: 0, + BaseAvgTime: 0, } } +func (b *BenchTime) SetBaselineValues(gas uint64, time time.Duration) { + b.BaseAvgGas = gas + b.BaseAvgTime = time +} + func (b *BenchTime) appendGas(gasUsed uint64) { currentAvgGas := b.AvgGas * b.iterations newAvgSum := currentAvgGas + gasUsed @@ -90,7 +99,7 @@ func (b *BenchTime) PrintReport() { stdevTime := time.Duration(math.Floor(b.StdEv)) stdevMean := time.Duration(math.Floor(b.Mean)) - s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Value: %f [Kgas/ms]", + s := fmt.Sprintf("*** Timer for test %s *** \n Ran benchmark: %s for %d runs \n ** Results ** \n\t Mean: %s \n\t Min: %s \n\t Max: %s \n\t StdDev: %s \n\t Gas Used (average): %d \n\t Gas Efficiency: %f [s/Mgas]", b.Name, b.Case, b.iterations, @@ -99,11 +108,18 @@ func (b *BenchTime) PrintReport() { b.Max, stdevTime, b.AvgGas, - float64(b.AvgGas)/b.Mean*1000, + (stdevMean.Seconds())*1e6/float64(b.AvgGas), + ) + + ns := fmt.Sprintf("**** Normalized efficiency: \n\t Mean: %s \n\t Gas Used (average): %d \n\t Gas Efficiency: %f [s/Mgas]", + stdevMean-b.BaseAvgTime, + b.AvgGas-b.BaseAvgGas, + (stdevMean.Seconds()-b.BaseAvgTime.Seconds())*1e6/float64(b.AvgGas-b.BaseAvgGas), ) // todo: log this properly println(s) + println(ns) } func initBenchContract(t *testing.T) (contract sdk.AccAddress, creator sdk.AccAddress, creatorPriv crypto.PrivKey, ctx sdk.Context, keeper Keeper) { @@ -137,11 +153,11 @@ func TestRunBenchmarks(t *testing.T) { loops uint64 callbackfn func() uint64 }{ - "warmup": { - gasLimit: 1_000_000, - bench: Noop, - loops: 10, - }, + //"warmup": { + // gasLimit: 1_000_000, + // bench: Noop, + // loops: 1, + //}, "Empty execution (contract startup time)": { gasLimit: 1_000_000, bench: Noop, @@ -162,16 +178,55 @@ func TestRunBenchmarks(t *testing.T) { bench: BenchReadStorage, loops: 10, }, + "Allocate a lot of memory inside the contract": { + gasLimit: 1_000_000, + bench: BenchAllocate, + loops: 10, + }, } contractAddr, creator, creatorPriv, ctx, keeper := initBenchContract(t) + // *** Measure baseline + timer := NewBenchTimer("base contract execution", Noop) + // make sure we set a limit before calling + ctx = ctx.WithGasMeter(sdk.NewGasMeter(1_000_000)) + require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) + + msg := buildBenchMessage(Noop) + + for i := uint64(1); i < 10; i++ { + start := time.Now() + // call bench + _, _, qErr, _, gasUsed, _ := execHelper( + t, + keeper, + ctx, + contractAddr, + creator, + creatorPriv, + string(msg), + false, + true, + 1_000_000, + 0, + false, + ) + elapsed := time.Since(start) + require.Empty(t, qErr) + timer.AppendResult(elapsed, gasUsed) + } + + // + AvgGasBase, AvgTimeBase := timer.AvgGas, timer.Mean + timers := make(map[string]BenchTime) for name, tc := range cases { t.Run(name, func(t *testing.T) { timer := NewBenchTimer(name, tc.bench) + timer.SetBaselineValues(AvgGasBase, time.Duration(math.Floor(AvgTimeBase))) // make sure we set a limit before calling ctx = ctx.WithGasMeter(sdk.NewGasMeter(tc.gasLimit)) require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) @@ -197,7 +252,6 @@ func TestRunBenchmarks(t *testing.T) { ) elapsed := time.Since(start) require.Empty(t, qErr) - println("Gas used by execute: %d", gasUsed) timer.AppendResult(elapsed, gasUsed) } timers[name] = timer diff --git a/x/compute/internal/keeper/secret_contracts_test.go b/x/compute/internal/keeper/secret_contracts_test.go index f9160f9ea..7f040c425 100644 --- a/x/compute/internal/keeper/secret_contracts_test.go +++ b/x/compute/internal/keeper/secret_contracts_test.go @@ -6353,7 +6353,7 @@ func TestEnv(t *testing.T) { queryRes, qErr := queryHelper(t, keeper, ctx, contractAddress, `{"get_env":{}}`, true, false, math.MaxUint64) require.Empty(t, qErr) - require.Equal(t, queryRes, expectedV1Env) + require.Equal(t, expectedV1Env, queryRes) } else { // no env or msg info in v0.10 query } diff --git a/x/compute/internal/keeper/testdata/bench_contract.wasm b/x/compute/internal/keeper/testdata/bench_contract.wasm index 31d0d5c299a0d35327b7115f08c5e35d8e14227b..2e1be8bd8624b602e2e36e275d9e5e73c9fae585 100644 GIT binary patch delta 13 Vcmccrzwq)wu7(!IElige001{X2OIzZ literal 1867743 zcmeFa4YXxfRp-0+KIh!ebMHO(qwYu5t*U)aDsT%@8hc<8(;02;YC__$-xF=$8}xg= zP9jM+To6-98Kv7!3KBvAQ7Ra;prceEm_i5^8YF16D@bcpd={8)3qiVU(-^uV6cU@D zDDU^5bFIDixnFfF6xfdOZjCx;pS{;wbFR7O*P3gtwUg^^{-HEUlJo=V!nLj2^p{-Q z^sh|U4X)GMuH~A~)IY-ATkY_>j+x>uF=Iyc|&(i{KLw_oy#Z@cD}8*X~}zj}4jP|^A7_Dwgu6lgbHbK{Tv;45x; zbuy^O<2PLYkG}oezwJBv>deHOKX~1Nm%gm;QS15}e(*>BwPQS9HGT8T|MjbqAvM^J zb*o#W`+wwyn_hj*OJ8=~%U?ymUe~z2kz~WkFn?K=4X64V<|`ZEVxZX^7~rGXXrvUe z0*$1>jp31IHat2o+~#_nKWYx>abq}Z&}@=5hch+qAI-7h)&PyR({y-zVtjnK(@C4H ztm$nIq$5p*rPg*v>$#=GHy5YuGzB<`Eblodo`NJ<&p*z!&>u)H3y*{0O`Ku1xaMQoK z?xi<~t8RYz55MY~%aS*xBiCF5(_eSZ4X?Vsk&a$-&C71M?#63=@Vc9CXk^2`k)}zJ zj_%+6o7pGQiw>o4NZ**=mHtHflj)n&!|C1WThgCO?@8a9{&c$MAARfdzU^BseqCef z?dkvX126ra>u!0;zr5!E`oaJEhJ)#C|LVq9T>nGMul%L#|G4VAU;MxQv+w^u|M&0v z-lOR|()-e%Pv4#X`}EQDquE!o|2O^p^bgXHrzg|jNuNspbNZR|Q|X_if0X`V`gnRO z{ZjgL`d8`yOz+Q*W$(@&$lj41&3-O>Jo~-u%h?CBPiBu~zn|UN_;mK?*^}Ap8=uSm zd-gxFLyeKwe0ccw#)FNld0Tqx1qb;{iu@J5)-Jou)1@rw4rF_?y?MGPX}o zRW0NVM~M~!_B2wY-|dYQ+1ia1?|eG>#{q?GSv_hMon_i<3X5hjBrm*va=V-4!0=JePK7WuM| z%IK%kv~gQCSef4zF+`X~o_-hINPJLwv~r-A=G@I2-@UDu7DE&p`tEJr)KIiB&FBTl z6{!GadGnHNhOY!9FUdMWJu7s@w?Oc#v)uV*Q5l#SrNkGR_rAvuN-Sl~Jn6jmwUl9` z^|RYBlyZZSRQ z2Z`vMikF>hgw8eUo#SS`bNbnZTF^UoE>q_kYjo~UMzU5VXou7PU(z-$X%aDbs8yU! z5E2H88$-Rp&Tm9%gBOvvYhlG!@no{RCrP?Z-MQX5oyUXX)4`&3fZ=KuUrYC2*&Xl( zi{?$;;l^Id(DHtYafN0X>J7jXrE*L2fuNZ5OtQ%xL{5sp^w2<5ZH{GHJo%av2Vo5K z$$yAwmPqEUJ;}>1Pp*&(0Lx3V%R=W`#bwLIQ&zL(?D&&G)?)vbvdg5E)xs4uo!lsO zax-c**Qd?8K5a@TqZR5px#@_vGij-%W$7X7f@>;MKhjgzUz%OirhcnN#5F*UfOuE(}vHJ$#QY>b%5$TCFO;ZHL7)P*I#Q5_lEEj|#xvKL}tU5o|@Ijsrj9?65`jV!_2NzwMEy63s zlj?hMDNP+pmy5gJs9#Ur$!F(NLG!nYU6GZVH}wYUEHhv%vnYnah6)?+T+J>n_C_vk z453;pyEwAiE*?&!Vf<{LA9L|5dck_QAJfbv;L(qf`slXYkI^-v-mF9&0SYo>ivSe|1D{9k05#=B$cmam3j>XxA(?5&0U9hFAiIm6_JKy*&?&d4 z7sqk_>q~|wF{8|@?SE$97a%zB-|4Ix_C|3g6_00~UkIIelHYc>^GmuTju4uAk|(kK z`|;J9-PC!4d!I{XB#OUDUc`fOdk`wWH#B#;Z0SudpzBd04 z&Y^F;(c&UHmyZ^IOD8j+a&s&#hUx6Ql#ty(3l$x^lQ%oD>nG`8=$hzvQr)?7Y*yDF zrvs|&AhMz-`q2Qb{Vk?ou9&8=Iq}0|{f#{4jcoBD`5h;})fV-sQGtgR{Q7`XeTlhF zw=H_#n{{b-DLayhcuUzmkXPS_v#~j0WPSa&%j1LD^z`8LbaNU!p4sjs+4pCk`S80Qc>k#nJe_frDQ?JHSB@<( za(Qd4VwmFfuRVca40YCS#n{SbE;W*k(GG@dETY(6SWOP*0|Qr%4Fqf>soq+m3Xkq? z7^+5^6*LCAQ9HH5PddUuPwm_~7;;#ok!?k5=jpgQvLZq^HmU3PfQTxu6ntw>qMu0gM>TMb;%I+6N4=en)9$_% zvQLc)0}an;pX_%;Fl66!KwT)*nxtP0(e6$HS?K9U@#V7aIb#azo|r?@w@m|q5OjXtoFwFfC zODR}Tj#3NW7*+dWu-2k4sv*z1<1!&p$-Lhz*c7}rv8_9mPrzDS7(Y8!FB%)K8pQ!y zHE57;T*K1J$4idm-jwcj>?5BlALPw$r#%LEqs+9vq0Ch1*+iYbeWMd`kph%Qfp>ISHmtre#noCqb7^)5ZRA@n$z(ToV?DcgDyHY%8?<3?Myz+$O;~p(&?ln=mXU~D zWf>(FtLQK4PmB6|RMc;yN9#b}x6;6f`)z=+o97c~Qhbzo=!AwTu_@`4UtY1Ccl_$I z<$ThwnAwl})y2%p{OY3Re9o_!5zM=%zPOx^`8}qQ9<(fGmh+i?`JsPeaA1*H$#9Y{ zXwH-$y9*y^@b)Cd3XfeAx6*Ra z$z~^5TZK@>64beZW_qKSCy(eip}U9qF6ew#x4suUEcdum&5x=1ZC&~91N3A*AMLjJ zo?YMY#%|TWF$VI&7u*;xm@#hP7*<~R)=^BAeqxNujxgB|$O(%jGr;q@-0cP`krS*i z%p;lT;y~J^AI`0|dE&tw<1aRRu4j`XHI!SMvrg2m5w-NgDPEx>b(!_q;;lisYzfL` zAqdY(KYUB^0Pjod`qPj&Ho;l6tU)COo`bSqaz2#MxYBF zWd2pW&9Eqa=&1MUY*hI4*9yBUUG`d@bJ(PC`UBgi^^9syp&Dvw|lYq}@u zJiLy(k9O-*1oN&46ek!AN@t;8K5)t_`H&T?$;YXzYgBkV_^KxZHL!dpACF~YOywoB zk+k_j-tN3j<69Z$g?x+Oa)*-=B`Zr}qr)2r0G@#*W?+fgJ}(7|?A9cC#x1GFD)Q(W zLs_zfT3lNM%%50r7@}*lvyN#EZc?4o!iX*8u*C#6b~^S-T)Yj#@&Lq}d7!&B-}V4Z zwD=%uce*>K`EDs;k)by!VZ)&#at*}GV3oJ+QdaATECLHw_n=xJ=Ftq$E?h{aEL}io z!JHOzsTNfb=`+^~!VX9+`9PFxU(y=RI3HeC*4fa@5{XZ`mu0*MuPwBRC^i(*3%rdP zWA3yknG_rDNjk>l?qZpfl)pWkYbiQrV39Y!*n|PTu5%lBB>-y2kSD;1ww9kLQ z=$a%UdnQRyd~9xyeVZ`-*oJ4aqIDIkEThFEX2n|WBCwVLQgCA0ZG-xV3Ms<5x)6F= z7R+LDTt{t#$Hmlcu}H5nGpXqg4nVAKYEi7ZScbl8PovsdF-Nkc4)lv_Tbm=r@j(M+pySlu+>2|&wI7d&k3Nd0I6&F2XZ$Vt&jjXms>wNl(tS4JW`yx&&5 zOP=uQYGj@1uVrlEq9#;kDQQep_J88m>w3m3#XnyjZw@9&s@4DEdzOs@hQA9>ZJcU& z<$(iW={X@^F~lhY_sb@QS@B}4*_~64VRfu-jj z+&6M-Z&n%_Pigjnp0Mz?mV0yg=y#d_#PS_A92AYd*xEP!_r3M@Q`)~AFr#8A)~j$< zDw5Cv?(9jv%O|NseH+v&|a`FM#NX`!?lGh+IuAxi*bG$53b>M;W7^F`8=jGVpF^?3^7*sd}R)dJ?;Fl)|+M9;*vDLSS?>`Ng5jL zZd}ajB7L6`L)-FlgQN=rtIqb=!}HMFyWaEkNuhb5p!!t~H;v_F=kP&iQqRtj$D5(F0O|oVQ1Kw#fUw$a&d#Us zkLw-JRos1l#}UA}itnO7onH~}8ZHbLj@OVQOO*%Z35n+585bb~nxH|Q-Pu2LWd@IX z56hT5qN47!g)YI*8oHMm5rMKN`3^((Z$NjL6282jDgL<%-HTQH1w!|OE6^P&(T%hH zHP8i(O`(euk`!_^v|JLpiuV&Zf`GosV4|>wsqU=6XAHXAjd#zH^Fe{ouZ@rMGvRQSao&UxrNAk?FPES8qjMy-_wL<+(4} zH?lA3{DcxM)al&~3&c9IAb>kz#yQ{$bI=t^bu2|Q!2j_cSz6!Eti=pZL=S?<2a}u0 zp3MD&%>08^-9N}m|G+%$9D@O2Z9f1upecHi)+c`xy`j-;uJkqS zcITM1v5kPVt!U|tU{^Nk#xQx)(brQiL>M{j58$_x2KQ5w*II75ept3~Bvlek4q>E< zec#Xe35Q&~IRF|Xep^tKzuG=9DQCxR;%YTScs;~}^1kfeH;jd{_Yq%X{t#V{Mru!Y&C3A4340?DMN zG~?8Jnd!A@@zb89FU)3W&9=AHLo1Ml%4N>niL^T*!Su8vB^-50HCW0XO1s0(p~p>j zGuG)tKh>c63EO5$mLrP=X3SJx|43iZ%`^$=Gvmd5uSLNWVexKTm)&iiJ~LiCU{6BK zjwfo@6ogHI$7w%}T4K0LpBab7F@1&#L((mS7R>Q6FPn{lIK~~5s*VFI#eoxECnF@}H z$NBm|U+tiqY=FZzrI&>L#L|P@u#S81)0>~RoAf~8i@s*|R?S3m*+i{OHCAgiJn-G8 zV&Ve%3gTNi=#cEPUf<&6#ojO-LnsFWX}%5hNNUi2)1O=RCEZziI>-MB{?AurT3-hm z%|yb!M1_p~3Q-FVvdm2>yWt8@cQ7bX`{OjMN?EX|?rs--Q=JTvWf^p&q8X-`GB`Nu zYkbvOtZ45O!H}cSw+1_?;uUP^z1kWqdXFVB(|fighu*WrV)UNC8m~*QY(;A<5PBXa zW6P4E2f4Xm8ZK*^+6#t+lm)51BxVf`$K5+IH&ELpEo*SNu&pYULbN4h%SRX%$YI(q z)!txT?G2V{FDHj#hzted9I!!9QL)+eRg^_$Ybt&)--g}Fx8&O*L?u|SKwWwYaGLuH zP}r1IW(%y=Q*#oa6}?0ydD4NTSb#$w8B*l0qJfZr6CkTP|(msbCu)4>s{+;E|8PBSP)5bj%`Q7#}%p;xL4) zbFVyXb56po3BToWY!ky^)FPv)I!iIBFIK>9V|b3eMO#~*XXOG}UwoiDK{$5SmH><@ zgC26OQNygS;U$VFj|``WEXq{VleXq6MC;Ay;eJ*K)^a9f>rD$w45a@n%W0xg@=s+Q zrs^vZ*oOeQw6rz*WwmK}TwK@b<2sDZ_6O;mGWCo-SWb(Kwjn!5+Ze6*pyD=$x2L)p z9-hqB$cM@6g8y>%AwQ%f-i_#E%!ihU-ci+cDSe~Hc6}pF+XA0%snfJ?J+Dp|xu`b3 zkrb3s8e0{7h>`l3A!eQ|oLR2pIhVgk3nXz6&7V2xPK;p(UyeHkH7yNJJ07$21hpWJkqHL$V(1LIlo`_#|GM9@~H;R6f*ZrmS$ez6b|z$oip>Orlx!M7lVs>tYi# z#7on^ioH63a}gmxjFclXk`617VR!W-gm!8?)`5lc<(~8h;yVXP2D?f+TFUNEB`LHO z*lifoS+N_D-YLw)0D0Jac9E5;WT=mK6v)yJem}1+SwOh``XvObAO(`sAwEuSxwUA zQ8cYz$rckrXLKzdsq+t72R1n7gUmClQJ#dsdXCoDxoNWXbszI_=-Zpa1SD(6&ge9Z za@n)Y`WG1t-K0zj(cHlt^Lu;Xz~*qvf?0m zAuH~Fo!C8#+nJ#|H4c)0>sOm={PMNi{*Tr+rxN)252580EP!!G+GCCAVu2AV5SI0H z(HI>$gyFFrSGv}Q>uPH{vKo45<)l+t#eh=~P_r}mEa5l@^`yHC9$qPMJ-dTyKLu@WK-e$=5ps9<_XdX_PC_}5c0l&zGyDiWCJ=anCnPZ zj2{T(y)p}cG6|dDIgcfxPF+>Xo3AJawFzF2hQg^2E9&n1i{JhIfB!R2ee##Slw6vG zlHPwB38YdxcFu#^iF@8xv=jHdTM=+LzZs!d+h29#?*u`xJjf4>lC49&{Tj35| zVdqtsH|>RgGI`}PzG|zuXqi}`t&m@-(l!=4a)e8Q!WOn}!08mRRdud7@<^Q5ceGOE zY&{caD|YU@%pJ%OPakpY2a3<=P=JCaYNw9`-gf>2m!abO87x$7S3V`{V}~r}YlLcJ z*MyW%@nKzmP<jK0PB<|8SkukiU3&cxR5OO<3g?{-;DMZo`+*}ID&IbyUsC0 zAV7dgY{@YsyD#?yiMn>8Lc1L4cK=A%>VEFAROcl$m<(s5(-J0D9(R@EYb>|6;wiswoQ7ZUy=aeFL|d~0>C#MsJn zC9LY#Nw_d*k`iRXl+1X8sF@vivSI(MOC@i?3PG8h3U3tu{dO^W(^Yt&cM~9Ir}wIc zrN~{3sXxR#58gAgCu7klK5vj%h$_C~Fk!e8;(!1(m1>s|U7q|v)bd(Cb$+o-h2n3m z<_N7{zud8-eL`ibT8F$?h>}t4#^ui4QQu;iq(HQk1Ygncp5zBQzak858W0E)(M*fK z3TUQ%Xlf>YHZ&{vplR@-NU1*7!(b%HHaq32wNo6#; zJIS-C8)%~4FS_y@))HMyD02-HdzuzMY50y7E$?Z?mQk@tpS}bji+m>^3UyT}AA3bHAn#a@27`BOgILw=O%%ye@-}gg&P1Cia16O|Z@ghu zeXMJ(ny;)!(N|v4YV?(@i22IS@$J<04$FYu0BeMtA*(DBATOqQ=*Mh+n+!L-7mQP&b-HqtF@dJ~L#= zdoh{S>@1w&Dt<)MHB`Luhs%?G zDaGPuMlq)TwyLRtNl)1YlKQT`G}GK5`ldFMIKS@jkk2sN#c+Lw+3ybTPChG6(hPG9 zUq;8QeO@=BZ$A8Wy2CbuK>|njX`_0Of=1^NbLMQ`WELUs_#6YSu($-9MWo`06>QSj zN^RgWpZ_^Un5MJ5xHb{@{pIgI`e#4=g+Kbx=fgBz3z6qMb6Yw0s@#NpY`n?zp@piNLu`cD~eFWysrKtS@9ZcWiS+}2BnCA8pT)Ztpt%h zXp`tom?D_mN-?#Fhc`0H*RqN=qzx>jyRmzK7_S{^ip8)U393U%h^GJKUsPu|Qu8w6 z>QS9uOx%@_P3Nfm6!^^8$76W;h8A*{WRKDpYqy8o%NNw5QklAF>gd@) zp0Ajaog}J2PdrIfec&uiS2BuN$w)q~!Iaf(;Vo%Kd`dSwazNGd7Gzpn5oFpWFTL09 z3o^;_9ZF5mnXf5c==s$W0N?oE!kd^U#H2H}mBU1)qYb_SN<$4RRtA(%!{+f+USP9S z$a+?5I7QoJno_gZYWpPP?i(u) zSYE!lS*>t%Xs9f1xv@uEOWBWAGsgpda;S2!(<(KFGEs$|O;wreo+~y}Q=s{nx=kya zi{864Q!WjNH^g+rFXD2CZ7Ik8<+JOBX(W&rt(V}q=3Uz7A!|`d(Aw~>aCoucnvGpi2WKVg z(5?WQ3dHpW!>e9k7pn~_;H1@>4Kvqz0XC@K=)>0ZTnYv-iDx5gvs}okaJp&LuvWWq zBfE`L#syF9%psI^@uvw8P+Xn+WB_GIZNq^PP^s-#p3Fv#ZrS%S?lR0 zTTgrqc6BFABs53RY7iebsu~X4reP^dGrg8C*&+#c7pqxqHMOu+UyjI#mW#G}W+duovoN z6*$YXJrv7YwDqk4cRsX4qza|;LF?pIKYK=(O%*E$)3kW6NfPP*)oK=~L{ya_aJ5d; zhc%b77y6ziRkW>854jYU{)g34+F4oRLso**&EAB}%!7j7rII=QwJT!5fVVin`1TdNNF*?J zoJX&y+Zz#MKO*9av9%_kdGtqhL-T00$~-zSc5KyRQF;_(Q7c-Feu@<_-RmRSWW6EG zh(4@opN0umw%N<3D6=Gyh<*fBIYl44p`+hBAej#a?~y|@P&`nQw6c_keX}sC&65IT zl%5a6X~PQ1WP5Bh?F4<(kerVn#im#75R(IE!)oV^SWb+!MH^b@53MZ97a4M2#O`tw zihL1Ju4U|;EcYEgko|q{pZk!81(xxRyXuGxcGyX`=KeVncU1^VSJd%wO_YQJC0yD( z1x?1V^b?-_mbtgQq&0@kkzcT_+;G?|T?1h1q>!}pHg$(zIx;0Ie?7@BxZp7y%BAdN z*7+%)fJ=3*{-@NZCo>NLHHu>mc|^ur_xq((^}T+n3I7qlR08ZBeyPL)AVQ(uu{kd+>Uig827!(~%p8xQ%= znUdmE{Sh^JdGZ85G`6StE{;>7FGK%$fXlfvBqfh3W=Yi#WL+ud;{>fSBx772VJ6O{ zHoZLDSSA-f>2|2lZmdDgmGs4KAe_CvW9|*ZCmObUZ&W+vfXYu;r`)Y_tin}Kj|o#9 z=F0VZz|Vaf6xb7Cv$SBOaqo&qn3j82Mn`?;-qHRhk9w1nPVW1h++k~i)u@o6|DaZG zO*q!{6N&HVoHH@l(Wa+G-^=*v_mSq<6s?ZZp|rS_BQ~?Kv9TtH?m%NF4|&A8pYXai zZCOc*Tl1-JO_G8fi5G2SAi`#qsp1P3+A4SNS+<5nwmj#V_DfkCtv0K$B2aEt0g;Xl z)MSKp96}t-vgMfIe}B_X5`x0TQ8S)ZpL{ExGePl$VU)$A?29$(X?Zku=PKFB&n zP3}af5&WV7Kn#adEvrHkGOFKR2A^Hv;H8z9ix0i!_Xd^ z^t^8$yE1Jx(BDQ0rey1ivP_%X#h{+v75scOKxtA_9&ksoL7)16A9a0;k(< z1329dFa#KR4Dm2|@R<<@NhEEAp}L#a;v&SZ|CFrZA5=FHh#PU3wTuvZXtvoq0jP3!+n| zUB5N?SzL-e$vfD8e&D7W=_(jC+1Qhqyc_Y%E0lml={OsIda8IOJFY}r$GebVKqW3k_f`AGR85G_Zugs7$-V3#lm}UiU6DuUZrRC zvE{*i^S3_WGyYlFpc&`+bJ~8LIrwc)aj78UxnjSBxj(C@s- zq__5I{JfI7Db&rNZWgGk{Wc6oD(a@|QP-wyvv@~!>ZYP@+DF|qYz?rHsZm!$X1lFN zG-O(yh^n6lmfvoBj`hy3+5^ix4%=v|0AHT$gDnmow9RRLF1R~+`7+0l1b5GhoCrTV z%ln%CV91LA6p8zE7F@uk>{R9sV1}<45m1qjSrI$JpVQo+!X%-}vWRc)IJ8=U9103V za5&sxr8lGqXsJ#QTJ>@>^Bs1ce({X*#Ry~aYJuo%RZ8|5ET^Aouz<3dHTMU~1L`X} z6qNJ&_jf1lNzz?VwaxfC-hBTjI!C_AilaeoBV_P@c4%bn1_R5%1*7d9^_|*h=tev@ z2=vYf@hitT<#tcHDXq`@I2KD{54G#U;_T zQwwVDkL`TJD3CyE7D&i&b;P)Cj!nL8H0^dn5uTmXx#ErHd^X?j3h6F6h&V!e<43!& zC7^1DuDL@vQUuX)ku1P2CrPcMpQvCTv|e&u%@yLP$FMT8C6wp@m6oDZ zusXJPl`q7e>J=D{;lLuS!M`cnjV2&yYXl%RW_zDyubozqTaA{TyK2nd|H3}x;GBT( zADh=zof5vuM%|E?+or^s4zqH7PE~B-tZ*twh9)B#I=}l#XAnQRcLi&#KDpP`J%?x^ zK^i{#esU$8lQlRq#yEO!mCfW!FPv!g3Rrz!xUn6+i7A&gyl^|h#QboZ&g4`1War(o zhmI069B#G!mT%gjM8!sM^6`eol?|s2-?9F1!$<9*hTMq-q73#%i8Y49_AIein1XUd zZPP8fo=wploV~5GrtG!Ss|&VyLoRCN_UcGSMLK*BRonsxsKQ&j z;=vDkP^01r8;4R?el&IJok;CK0@RA)(Px;Uq3;_{YTC#F82Mb-dxgSrAP<+LH*3Dk zp5((?Xbi%=6r8AKkX~7+ShRY5+oG#0^>n8S(vfJh2&6OIREm9Gt6y0%G zR!l(cT}w)f=fnr=8H4jwqq_q{P=13SCURMNRa~;<+VxFbF!6l5*qCe^~{jEl+-*T<>YvnllLD!2K zN3&)-B}RFBr+Q|0-K3Sb^VxEUS^wdeAK%BY+EL+Gj8jXLPHX*Ys%%zAE@hzX8hHhe^EOB>A!sRy#pAu zZk+Wm7Pbt*N`<}jjwhl8j0cn22T)2=*R5v#lXbKqdkANaJXx1GXEr z?Jp8>o+(xI@kVblp33tKs~v%*82~si9GumJUCm$N)~n6JMdhsfHGX7amS3f;A8>ZO zvD*b{)bc^>fYkCcB9IQE>PE*_z+UDaE#?p#vr_>FZoVA#PD;uC?gh|%7mE49O5EM) z>@CJqc@|AAC;0`gmNRNxAhkTbkByCAd-Juo+l(N;gF||_+bt#e^h!*wjhHM3+i;z2 zB1UB|IvxBRka$RsZqgy;boX`WB~>$#djG&U&Ti0gLW@qX9mwu;^*{wGnysZ2>-Svi^_JYwEupUzs@YL0$VE6F z-mn`mBksQL;FrXxuGYf>sv5t&AbRB(Y`!NcIQpEbrdF|}<|I+wT8roOERMFfiI!xZ z)f&;EM7&Otk~H&eM#A7?Evk40T)aKmrw^B;_0WgAgFZC9h`^bOjrwqR_j$A<+z_wb z#lMpZoNP``PTC87B6;#9dy?>GPd^cJM-f&9Yi|}>6l?7$!eU@}fL4c0O!;;cwva{6 zsJ{<1VUQN3H$h17cT2uaQ|l_m3R&%__8^}bBz*&McbV_H1CH=%~%K3 z7I9diE^Dgoc~CkiBJ&ahU7imTS@-!eHP6YPAJMQ|HWLf&$Ih>4ABsoSS!=(fyK?7O z5)KECe%X;6XwBH}3eBc=1G3Lkq<7?3)dV-MupuWa;=m2W%oe)yTq z8?|Mx?%b$=y+HL4bN0#V6kB0(s3}4zmd>#{yR*A2o-?7vzeaJ7g%pVaRWqZ>>O2j3 zJ(l7o2A6sXRz4~R_|%-G9X>?o9X969SYcz>$nJ9)@2>S z0*sWx&zBmhiSB5Ak)m|%{Guq#kjac;XCFS+wtNpK_Dn0JoOYj&oVRW1!SrS%&GSR^ z&yjwkH>lJ-`o_h)C_J)RO$s~Ne7TR$S9bs!d!B-XwLeecp~j^QuD9YtQ66LzS->Fp zn0LjnhdrWf$llfL?(jf#UP=>Oju`4xAd5TYCRXxp7wI&}O=~3qo5VE0S8JyCE%9om z#eDjKF3bPo4D{ZB>0s3k~lri+=AZs{gYiAvq(s>c5lDoRJ5ioxv zuv6)ns`p~2N$(izCXCV}H-8mvkttsi$+&5FI6qNeb_#0HR`NVn z5q8oFQTaJYJpMg85;LBf#^SP4S<(AhL%Z!jYb}MX=!m11#QS)bsMt4m0~)O@3{sqf zE}g9ogbk@WA=6L>x8t$(u@Rhkxa+V|~WNz!uF@%sJ#=z9e)iE$*!4LzhmJZJv z1EXm>xGt<3ns%v0!Ng}4mnYgu%)g3s!i}smOYIa-B86opO7zK|^xzG+?nyr9p&QMf zbQ0cq#LgC==g{++5Iv6#tJ4cw&ReK=8i_Pzw~`pp!B13OJuFg<9-GwbN7ouS<1G!G zgn*bvIPS`VQK`DsC%xYci?gx40V9h>5lKq&S|n*S-${Ilx58VGpKN$ifponByijg5 z{}!}Dk7Na!IF~Rj1bnI?{V}MenL#NLt#JE|ni4_Ec9_oDYV-f4j1VB^zF#xT8wyc+ zoQVZZL>I}2*umk&=1A3o_Rh=wg6AF@14+3RuG+o$;7D=l@YT*pLqS=dhdm1hK#s^t z17Jy8mgyei!1k85O&)Twt2(A@qzRp2L zHdYLr=c^ZE`M`QAhPplj#kWAuS>>dVczwXvGj)3Wq@9O3W8O6w$Ak?cGEOtsd}VS^ zzseiS$1Q==H;=NtJ|3#%b>-33&iL%3H$*Peim=;LwwPlxrKRjNd{u?5SG{6v)Es=9 zL!;|4F4mON^xadmOj6Gl1VnY;reV4tk6lB@;~|~NE^Qp=O5wl5cwl-#!XbHL>bje* zlS<|7JoQ@qX-3O^Glf#`tQ7E69u&%j92o=f6{rYCpiQ{dI{nF_DebP8$; zW$%#SopzVHr;A-RPgg@hs`OXygt!IKFY{mR#cWO}S@JbUcli7dt3wPp_@I(Pajt_3 zZO<`(B%Grqt=%H|w>B$b=r^7E0iyOQX>$~6sUI4H6V2saFxt6X#N;-nYAKzF_~6UXYfzq$c@p zDyg%X3=gLmj8yrYU--}Ii^hg!TB^Oy9=RMu1UaH86rK;Z3w!DJf-D6D?`^ zl}$846DakTzgCC_5q74PdRba{JyUg$gC-LxG6Sq~Qbn39nKJO~b^53raBoFNQrcU7 z)MT#E-A6<6=R+DYY@zn~2s};D3v@Y*Vw(z-4#A9-kBV<(H$zL!{+75cG^LllA^);n z<>fA#VsH`T+X>+2hz*yC^Ip=oU(l~j;ixsvaj9j7pG7X!4hdpIpTN|0;KDVsS z=-R(s!YGfT6F=EDk}ywaY?yvSAx&ihbXic*xTx}AKRH4XPeCB z@P>vkDR-K;zd+7AtO}5R5+gJXx@fdFpqjR(2Mzb|AI3xjNz$A8P zAnna@6+jvUKg1a>w9?Aj`VtCCA-iIsAU~>t%&}_a2I}Sbv0gdp#IikptXEF&H!I8W zqh2nP1}QO=NPEdO6kg~gJ(gK;twTrn@pU&SlU+8*kFUEyaeCPxKk5zgXpIij6KS|| z>?TG>XSl)8>4W{jo&PEKcXWTHLo0P4sa0q&qh;XI3NE$|>5+h$a^V*GCfv$XyV41h z7}BS86tk7<{H{QBQ+`CL%+t~TGLjA&XBsxb5`2Q`@mOtXdh9GxY)_uD%}hs&q|VLS zggC@IoAj==X5ie`m0ZSCzHjPgnY;_5nN7(u01aq6U==5B7P~4_(*#BFbx8cp`U_rM zFL=?~1p#NT;|-us*dcbIJv-MJGH`HzW~NlT2IFbuesKS)RAi$XInpg1+~1Owq}P|p z5pVii`_wku`}NV%vE=@f>u{7m-UCE<)*T0o^)&S71+`wEx9(g-cWj`Xz(#x<{n#NG zsp?SGbIQm~GJ31uyb}>}MKz@!y1Qc&XvYb+1$ zdoqcuCX)8@T@pcSS%0F5vHl2#9LuIlL(tOxs1%JA@+v2x6w%Bl8ZJZif`GSm9i6Og zj-@&bH$oLHLwwJxPrblAt84T1y#^E%ecfZ451KV=xg#muZX*UOCDz zae$|YTG{^^yrrmLr07fi0x3Z&aCOb5T5Hj=Ibtp{&d zjE+v30_Ild7v;uoEt1hMXVr_HJ2fBCl`rk498sayKxT5{+WOh~E@Y7JgU#=ePU7-A z_fzPm%M;#;$FKG+WYhDjZNCO?DIbrKh!Wo43W7TNBy^17%kj{|_HI23XJO!{YV}Ip z$q7i=G>8@AI?S;M<%Gdx)zvn6)r+u70$NkI6lc~%tHe5XV~iMFV1J{jSzSB-xz~6_ zo_>#G3l$HGindGM@C{gsU3qxd?IN+cyy^uEDyDWH9Ks)1&luCnH_RTt#2iJVr#yUd zB3}NGA8y@CUXf?&oZODX>;eYO-(;yn;%TqbZbq(ij+Obsa~gw(h?j*!;*}ey@uYljcb>2;0XIzCtIN2$*sk6DGu~Q| zlskBV_OSEE^68)}2$fS&UY!dgh{apV9)$MX&@3!a{WEG2E(8ANpI{k)e3ekE*UN!vcaT4TsVgpJFtZJei1Y!_$5bnFpV1KHjNK1`_5RGJ8{ zD&sx%ygVgjNZS4`OCfK1N{QXT(2yaiJ3x&Yk_27@3IeWmQ%hUZN~)g$V(kyb1WBDQ zru4`Gvc{Vp$k!yG3gK&sgqac}M01{*8nPp;cm?<}RV#Oazfc=6Np9(qcej*X;YX6_ z{68eVbY=A}8V(Q4qTN#rtf_nn6Y8rGHsXBY4ePdv)L@hg8p27hn6xVJXg&~DG<0}7 z8~x083EZiZN5HSl^;z;-@NI(wOW@)zFbUx3$}qo(7xSS$q#YwU5O^Nxg=NGs;!C@; zHYp_-45budd`#o;+9oN-5HyrEaG{|o#naU)?CmT$`iZRKri<%GI8-Ak?Nu>USPK{G z8dZFh@T_G+iz_eIXS;3!M;Q{*SZ8E?z6ekoVD8irr|8fRrzVlLFQYulTBn z%B$I=i6E+8lci=Zjx_zrY;&>jbB=(Un@$J}zjyQDZ?M)3#utf_j)jMVX#(lK+Y%1m zjYH`)#9^>Ycu9271H=}lt_%`f?^IAUv!sWL%iV}G@zKxxFGUZrD?POL;iTH+@wrdG z`(1Z>eL6}GC%)|C!QajjAHDh~9bx0o&eov)C4++vF4D|@hR=bf3|#SP8`sg0+pa(( zsHA*pg@_qbTKu_{mt%1HOB73euJ#7UCo$)CqV%ua;>qq=nS4W=` zvsHW43DiCNJ?ieSm%G%v>3QBLosW+^9H-&bK1WmB<45q{4RECyc3l z^3`Fk1eMg4Z6eIo47r#M=kPFHRdCAyX!v4mf!5<&{p?v5s+jYvQH;o1L7!8HfRN4PxUm$JYg z^-E>?(YX40DD9C3yp$bIJO5tV$oikLlfs}1i+j8d({Qz|m-5~PnjQVHWTQhFEJF+7 z;DQqnonJ@No}FuRH0}HXvmr_-Z`l^`LaI;Gy)`8++x8Dqnax3(vEyknjsn4vO^Xq{ zBC=;74v8H2Tt=mmsJba#7iiUYzcviT|5R$G>S72y*}SE z!2Yxovlkl0$J9$J8@*T`Ofp`w7xDy;axY(?7jjbUbP=PuW_018orgtn6|{pM{Dq)w z^vG=co5(C8b7oC($S-F+Jx2{h=Ws=ny)B*oM#*oMDfaQ+67zxs#4`DL4Nzf7=X6?# z<8$$HzNMOY__i$b0)11~-!M%XqC~`ONyW?kY!~Sa9@LAPU5eX&Q_3)8R}@sCZzGT%>bH+&kVJ0!106u z4;gya7G=KBlau38I2)(ZrW>4&h;u}XD#8m8J_-McdN5$Vf#WjEi* zP8Ruq(ITn{CG{+4=bI|qk^x0{;0u3{wOEYj@t z5%sC$kno68Nu{tRB%Nl0QVngzbaqOPP>JxQTGrquf8)4Qp|<@g)=KjEd?CyZ=cOeV z_yA{|6rc1;Hf!n2kEQC}Rod4RM}gTNBqdG8)k`=$Bgm+!c<wLs7vEh2Jd<1?G=d${*lRRMb8wB3;@Ugz1!uerv z7G34VAJ#W{^{4dBO#7I=L+uk>yIJEKBJg=CTkiat8T#;yP+?d+cDk4~mGYg5_vLTs z2JeaTRc6shH+IDvUUMn%EWw1>BFOSudLb*HNyGh^qPw2QLx;T`jug*`I|TXnhr19W z%thb5Mcte4zsHU#xto3EnDQt9P~KxefUOsxk(Bd7`TTCW&6^N!ls)tNkYG+_jW6U6 zz}Vi!idO2`9e5JvIRM}YM3*OVSj2bnJq*+LdlIzePgi*oM{M_zjkgB)FuUMtZUps0 z3Xv1>UeuqKv8L%~8YTk%BF_HC*3) zqlWH#np5;+k2WrCJSK+`YV`S4&Um6@KQ(|sX`TjZsP1Nz9QB+UblGMH;W$ZDenksg zXS0_Wr}>0tL7BV<^I?4gqnRyAt{2{!T~&re%!0He#ViPJ#ej^<3Xf~Ht1k!yVR5@2Riv#^5LcL9}GNxxRat9 zd7?C8iO4EkG6`5!sN@=jD(cJ>6p5VBpR4FMf6WZ}os;@&r6 zW{T&B<{z_P$8YCe=Tll{Nk-qXFgVCeGv)u_ZA}jMy#Vy6aw01ik@_cw)h}k$_=Mww z%_Pkl%_dP>g}{qnuy9AG^8o?S+l$*>md}-Rpv5b_wTIL_mLrnl(WLXn+bPr~yFxcv ze!>ZPQg11jmTD1N)r~XN4c0EW@l1JR9|h+r$j#G!Gxw&3^lo8*4t0l3N9)vMtui*d zBhr*jmWO*IdGotDB^3Qp4BXNid{9jd<-_@4=eKN#MyT`MygH~^?A_m0G)T{|bH2#h zrMvma<;g)Ie+Z$sE}Ti?5-f{XFksux>Cjmnjob6~_W`cGZ{W_nr9L*0__xLx=W(+cOiC-8Zl6uMXaR2iHqn|D8bWyX?>%cW^8) z7kBFZohr}YiLWJAa6a5P{hca2>-p9mca`agM5hC0Ofc=*a@~U zj$3i7aM{hpkk;yX?+&L^p_lZ2J}03_UHeHBLjQ;$Njq=zDE=CDaIe}Ipn1BK|l|0Z4EQb6zhdUVT8H(in}QfyGg25ZH* z4#jw6#pWr-xt|C4s9NJX6yuQ}%2n_^Qc zHdQOebtuLoD>g*2X%(BU72`S-_SE$wnU1^2Ri|hRQcr_occmd(=#7^aBGZeDUNBNt!M&y*m=d?H?o$S9`YD&5& zKUbZ=#+;3H!VquBL=_DFJ*WaRpo6Xo(oz*XTlwGW_d3~u7xef||N3H-64r$VlNR#H+T@EF_ zZMnzM(lWp06UF{)r^iU~tL8Wi6(6y06eVf9N`UH2%77&_B41)~-=8Hq{Rv5v)h(;# zgOj*f6hrYakl0=et85sEjT^@*8NOhe0OSCmu z(aj06Skhx&c1_0>m+QUKKu_p>n>hZX#fkRbq_~avs*RFcLTJhIot!k@T=Gs0kltLP z{Ab;GdvyZ`kQ;BQZt&}k@mF*q_8rxTa%x%vby>Z;OFdv^?~uOfeB4=59*IoBuY0-4 z*nw$*ne`Rj=XTo;?T*V$R=BCa?`3owSvCf6bkxs)2f0H{X`ZfBW(JU zY`#|M%6y4%u^2IxkdK*yUL{fb9plIGdXF+iOKPS`eGQ9sJvPXJI$|ZG3*S#s`rnaVzrZDKH2cquv3k5Sq-Zu zJ=K*W8mF3Zg^VL6|lIyuvJDPRQELeukFLsc?Ro_gM$NckQ>%SeTD34 z%b8>r#ga)&Okpczclo7O$PW9ZR>k+ zf(oSIQx3JZLiU8;;iUy^xweHaww&5gzs11;qwbkT&yIb3rcths5ig=Ko`(gpq)ViX zvqf1=($PK~on}u_EnGl|GAKh82+2)Rv^MqC{TiiX`AE`(A`|NLRLetGC;2XpYVeDb zt(CzVLt9U4!5UsM6UxS5y~b#F<0S8KyH}${)KqaX>yvNI-YV&(Q+M0DXM5BBDhlpR z`%=pYCsA>DOvFRPuoq2qJ}ir+nnxi$Yh=?UJ<2s5N4>1loAF9EtM!W3z}?(lPdJ4M&LAYJP~BF2uoa&V7Vd(*QO=AFFmcAE?0B;~>|>+$XX;C5 zbw*%NHH^|1@PsZ6xOl>ABaF3?^@T*HV|u9zi;1=rC<>3Vh&F9pRC4#++RV59LYSSM z$Jj!RGEeeILri;>m_VW)Pr9~MV`V}b8ooF=Wtoswu<{t%VU1uV4M}g%FW0kTZQWqd zs%0+S09@ZPm$dZeRf^Pr+U1i0s4a83QaNR6xQvHypi$;3)5{pG*Qaky-i^K3lRV&W zM_D1SVQAr}J&E|qk2B}+i#WDXha5tu!S3>$Df$L~fwrVKp=6ZagI2E;-#Z#6l+P&k z&pK%%O0c)_Oy(`By{}~FQHt&LLw!=rmeJ~9ZY@RBgz$``fkoiO44@$uu#O-PnjjP9 zYZRyZ8#(QbU`F;Ne`+h}S_W^{pnl_IIhS^^MeS!R&s7Ug(yf|MKk40?D+XMgKIdJN zQe#;>8mm&AHLk?ZN^7#NKpQ~W5xtcSBCQf?aVhI{ahy;e#-X1Sn?T}Ij+Yi=)d+$U zRTYafrK-9Y_S51mm9$tP%W0?BaLP$AUBh-x%~nnrne`(uPgebpjDON$1;+olQ(z_I zYoW4cw?0O80(jvtiy*u{CGeXw{)y0{dh+Nuk@4})BS8iFVMoIl|HGSRe1fy}Mvi$S z#`y2~CNuum$MjzNxDA|bj1WzZdv|7wmNVK1Du%aLfw^~f?hLOW_lC?)pgWQ^GW&gj z*^fF-=at#*tkok`-y^dhaae)b{jF){qt&%M;rBYT-{Z_qBwoyZcm=Z`3N4DdZ}=uM z`@xE!0)5cYFlK+vrkVW=!K1pVAU1>zG-m%|cuB!GOUs`RW+(nr*Y5T%r7Op_klkWh z^(*o4KHiJxnO<(RjuSJ3BQ~ww&&upiR%DIL{yD{18K-cV;CW?sOF%qb^*u8CX&=tO z?0@RLU#ZzoS-sMw`E+WUoirga`>C{Fv)j9I6gQ(MA6Jjg*Tm#3F3n>VK?RyMUGb?g z`|p6p=3JVG`x~)0#RO*m@IOFiKVbt`YW5ROlbNF7jP_{7>~_%8H%zl1ugDsi{R4s7 z!|QR*E3;dgz_F_Dk=c*+F?;#yntuQNsMRZ(odprOF-N#7zitJy+xuz)v%l?|$n1wJ zf{NM03uuhl@7^@Cv+=U7*$+B(OtZh{A0V?653g(XL*AX~BDfH5sF;1oPpJI{X?E>9 zSTPfSwaeR&nMyjZtWH`pS!+P7%~)=%EcAX0K}esoWK~X4_4<{Xr~XRg@YCFc!(SG) zx%lc@Yl#@%p5(gosL4lHg_xMaRFl(F6#)hLC5D70SO1F*_4tTQP4(^=dvi+7X}Q{( zAOg%wQj8)@Ob2Tazi|`O%7=JXK_-83b~U_3(3&r{4%s`!zPF4rh1bUSv9&3!vrk5~ z3vFHBTrphoy;d@H;Y_{PP-$AKb;V*r!Xv+yBVPJVZ1?lG7_5x3lAyn44)FVkMb~nG z@8@SN2bg$$ao1~D8?jiCMZh`RKr?4wXNW;>dqNKIOw0lHSh?o_`vRNC&&dInx<6-cOT-?bKA7W5OaW8d5Af{tVhHgU{)z&4zLia za)6KVz~Win=Fz^N3bG$2+;&QfBIE!+sqg8_lgCiq%0xb{Z*qYT>N~V@glh|WGs@N& z@VIlF>*>y~TXbDrV%X{#!9vQG7IeQaBUm@eyjf99H)(5h>}wIAFjHpaYH@<#qYqbqM((F+*_JV2hiB-p?d?&=J<@oFnze;u@ua}| z^Hnj(XZmB1XI8FiP%~`q=}Q7#HwLLNk4D%@vNGve4|l;htchBlvIax-pY>G%nixX**at;nk5@42*{-PlP8cQ->e7`%0iFYw(5;#j`#5bzb65 z7P&hwEyds#+Y^8Y`ioFG|MTUlr-v91!-8O=YcQXYmNW>BvU74 zGPPdkQzlc35zl8DbmVo|p5@k%f6&)4oT3X%2$GGdC;G3_F%yp&&51w?n6&{+G4Qoms+zg4_XC7D*w@DEe~2XJP-Ql?HJgY2mLFf*+{kH_B2Q6WDzS{H3}PU zGim>rVvuR`C;La|vCMqs{TT&XN4m_@12P@zqS!Txt9aTkMfRusl0$lQ_@D|5aQV1j z>WC8Zo&E3!9et>I4PcgfslF}_E9@MGr6=X~(_yjvo+L5%#X~#sm}QcQ{WX0fEd7mW z6+@NP2W!EXq(9_CVXv6YijNvD5;ThL&aNQi)=#>!8ooC4ESg}upN<;D4b+wvjbK(V zndYK50vUR?tw<07*Rw1vqXpI=JYk2?WuV02x>q>%#oeakw)5+<<)GrcO?b)rSFw%X zhn@U>$u=Y5M!5sTFyM{sV8J8w%`v`ZeUIw55sqnf-S~1_K>B%S|A*Il{I{43U6X(_6Nk!Zb?Xv2;2}O2t0qu*P?@Wcr_v5%Fv~X5@zGiN(O2=8I0fkSTq>sBHz{$ zwApa%qZBMp7hTOIITPfVi{%u3SV2zfsN=&YOxL`r^A7R4*S<^!!ifSCs++4>|6uB6 zA4#s)xA@7b>=e{6%s%>0bA1>WAmaPw$_o_Zl zzM4(+DenAmW_OKuqOS1(>I31>oiTeh9WZQN@&c#x)MpBkxdx&qDf4|TMidd$IJ=}w zdriWej)!99Y3+D<7?a+uv20&@1?!f0W0q;}$_0=PQtIflQg7#wzw^#OQweKn(WHEQ zyonC1Cbe#^A~ok^*csT?^*Y5(fP%`nwnlapce0;cLH4pCXR#iNg@H8v+GD%fwGIM` zhX>s2qd0|w^)!YJb}AX2<_tLN^ykI!Y&c?L(FB>3Iqcl|g6>U>&V@3-Yjn<7ITCs& zs=8mS>LL*$;ro@eH!=E&?@V{myw0C&=xe^qAs9>9Ot+=44yKDQ@^key)E&|n*(mx- zx+B?M_roMu0|%D7qm8}VYqOs%H6#0b?VI^Avj1j`(vBbHWBNyRIr5`7Gp!(Df9sF( zv4wjB#h~u7wS#LmUvRC{c-Uu2I&xM^N9H=DBlC!KYI1C5*a=WT1;PNCmat1!tpTY`GyImduezeW9Vp*wEqjvKng-Ea7lH&AF&FN2%d zPlDWp^)>TP;gT6HnfJJb0z;HQpsjATYu(~Hbc;vo)-+pmb5zMBcnE<35SSDKy#JVf zO*#U9@a5az|8EHr5CagjEe36i^?VC_FhRvBDh>dc18p}2c$TSaKDQ4#q zlmVV{!0-OhAN~HV>`>N=;kNAW&6Bv4G0GS`eF~Sh;nMb=kAnb7uOM*N4JN$>;x_q+ zNDm4iFbM*yN&l%kKJ~ke<=$30FK9CcZN_>&0~%YXI8Vitxu?L+iQscJf^!`R&La_g zTRyp*Z_Ov1ar@S@aC^#BVspHnJLzG%jk*0d-t=4d z!5A>zy4>z#PWCusJ|U9xve|MI2iJk*JQB&fPIBZ|3TAz7|INSo0Fk|O;C7BY+!VL> zHp%Tz|LRxXii)M@XW@1-;5WtX7nIySUsEvi(s1*p;pSb#{oSAa^_@S4UX^Z#+jpIn z+sVfVfpL+Zw_lZ{=Q@y{M>4|bBxP{lC29( z&M!1MzYw7lx9>7Jzrp~Yo!i?Y`D6~a??TbdQ(qc#mjLfFz`Gpq)Bp7gcl|gbA>O!f zKM`oaA>qVW^eJ2>4VOvR?VV!$N7+fSfK}=gjazQc$CmS*QrQ!-mSfx=FGg;;Sz&5i zUu-0!nS())*431M^bh~yeryZy#{`TsY-nT5Iz9##7gBKs#HR&!+TczbTx@nu_*!t= z1{dQaxD)wS!G+gF@Lhp!s|kMRo4@k6ZqugnvHiX0us3g#9-|ucDO9Eml_~G{tl-ZY z{8@uP&3kScS;608@G-=KKa&$Dos(kUnC`#zYj^%#Vm7rSU>yV2v3_^JVhqHeL%$aU zcfsH;7+frNkGQ_zP8eKVAHmH;@45WKWlpxL=sm6RCI=UqPWyO&>^FbuD9BN6F7K${ zK%>WV{wY*yHfEXhXy9)%_}dIV2Kxe>2Em^(_?ThApBLRPgxh(EEEoj3&k8;VIRSsx z;eX-O{a*k+rhGxb7OdY3)^EMtu@m~eD7cFTchTVTCSnX%Cb*fw#my32Uj8dfKDLZa z2Qt;CA=@^=-DYsNIow}(!zca_w{e&FVqrgL4d{f8g`&wdD%O1WM6qQ)C& z^cWV=r%>5tsO<87?-cx<27jl)-vP5Ru!4V~!AB_x{#ee4bR=gR)BO|g{K}&!HsEg; zu5E9qKpG==ZFD3YA$yW!A_0 z0>Qt);9p?yQ7%}lX~Ca1_|p!5L27;*!Uo;J0QfoZSJVAVKXdRy*c0G)1*~hpy4LS5 zSnLS>9v9qkgF9|;Q7RWA$b!4o;3A0X_b#dVZTWWi2YQQL7J<86{oZc<-X8k>&Yyb_ zcaa6sZFzTpua^Uje#4yl6e`;cm2KYdw&1r7e%s)qTrijmg1=z!(Mf_o4#^=n{JRJX ztxxxl|JHjhF*eTyD>qoVbvp-%E_nCAdyBwsF|b<hC*R@Z z7Po9)liYv)iTm%vS*2Vj&(&?98JpXuQ0Zgy3BjK*_!9;n-7>ef`9|^VfY;AL_Se1j z)4z^7UysejC+hc%;LaFa(z|dQ&?(bvn{UWHi)lRzxgY+>Q)hrnIb-wQS=c-i{LJ8I z1|Qvmy;{qBL-#JSW^BGb-M{*&4}1=DvJsoB-}8byZ*b=gE;K$~xwI zbA0}~Pd@fjn9t4f`JCX-8T>hek8)YZd~c4=@B8@I-ijGL8=tRo&rvGtnD5Q;`R{$~ zb0>hiSw7#Yes8sYZ?%4-T-Gt)o8$8{KmGoe^a{u(}> z{I%_Ph`@z^JH&{io4A_ZAN(l#p zAOEla6Mu<*Pcp>x8))=Eua+oy^j6fDY!cg?oNl>lbW9ppG^_PD^5IAEmxyRiDBQv{ z%mPdk{<(_J*RtQte-;IQ(clv@5Z%W_cUwQ0AzGv;*@bKJ`R8Bv8~5Wk!Rqq@#y)qZ zii9ro3H}1h;2!dk%M2YCaR6%|Y)N&zuvz=ZxNSPVX=L)?5E0a0xRJ znA*>r3}_qh`C9fHL0)V6jYnl+CSrUW(EXk>_x(Kn+IsO+F^b|PYuRsR;Ir!Yto56D zvgpmqkHV?=1EROWv2$zE`_LWte%Ad&3#V>7OE`5c`;8#4o_;IRB3&Uqs^~r;x=$G0 zC!Fqo{k6Y&9sc4pDe#quDRhf~$>wd^+rWA*fVt323gm>oX%J>WC<#&fAnz+pBfyrO%@=uRjUx{K<&@Z{hk;6wEZ?q%vV zCv3yRnfLn3zx~-S|67Je({sE^*(}^!s`ltuvhPh#{P|n|^5HlC(Zjcm&a>XnYP~*eX@98mJIbC&M*ng3ayeet z*a!&+V4;Rd22jH~siAoMEhosrAU}Z=oG&YpU}fDTCMy*8AEl^aRO~T~il^UUcYxn{ z%;El1N2r@*d&xuiqVf>zl!CPLmwrt@(#}UcKf$hFdpl+H@)GWURrg09O8bzH*&&ve z0HRRx@rQt0jCH=G^4!sTMAfmZ_)~i_%vF22cuGGyA6KERD&C@KYWQDW?`l8)d>fkDL0w85zlz`IFH?B#Z zY;U&Lc%dgckq43%_q<GlD zAvLH)LW7)yAO#(@q@$D&uz&)B1S~K}A%WcQZ;UzDTKk-R>XC=WzD<#{*IM&6 z<``p+G3J((;o=nYGnN-OE-Uv5)6hA9XHYdB4@UzWT^vGiiCJ<=jwxREQy;9}g$krA-wl zB>l4+_;w6l80`BR1OG-n_m^SaqSGc|{iBBUKU{SfIMyBCE#cdcy&Q#xt>q~E$HJCk zyqtyp$~yCl zv8BE1r!RPTm4dM1=?m@`pG{~Hc0GN;hwhkM5F(wv;K5Zug^;H&c;6~5TJ$Yg^{C2- z%9~>Dto(HmY!vn>YAHzkM-i2hGcqP|hvv`h^S zxB5uS9hE#2p0m=9J`doW6)a+g3Y2uUG57b&B%NvO{!(MijkBo%8&%KgF@KZP(h4RC zG3s?!0~0?^%o{ly-K_`SaT|E=X~^#J9%;bEAs3~{={vR>_n(o8SL6PtHWP0MGR$nx zbl@EG{sxCEC6y$rd70aa?Lt6Zpg{~@`DK>}WkblW$w>N!J_~_H;Q<8#O|sNF*P|c{FtUdnXP@T0msG zak9B7AU06^-h&1bZI%bcSaB%&Ez1H#z-=+HFo>df*-+eFH(S)0v(Bs680$Em6mJ=J zAlfHId6N`BaW-1Up_Gyg?3%e%I>Cw#K5W8YEymkEi?q+xi{DM7Vsp1~LO?$K^r&!| zk!c9c@4v1!@uKZGNM@#{rqXOm)=jsE$`$og5yAgVVid3GwQ5FF)jGprV6x^yMnaJT zAY7=yOPx_hL!FPv8tqkRv<%aSoVH6%W>iEF zDc(tX%oGbkg&y-#XM2nliodH0d3oFwrp*d@X;w&5MUuM1cE`zBzWz-Lr>t+m*81ctL~NuJqTL&teY)zo!GuHzFc zVLjG&AO)rajYQnrNznPOBGs)TfC?7BY<*FJ^+l+q2a?q!-lRFnMQmLlCq0CrGe)4} z7sT%wBX+<$(7Td&k_7gPY`9q)BQ7_VfPnz9bIGnEQ|C0mvS#Oio$aIantqW|^^9!l z8NK;O$bC6}Z9n3kPmcg55pO zFWyN}H*$mSdXC)i|B4$#%kh7CV>e4l(VwS7vyG3vfJ?(_lxwtwf0-O!ruLSBNUn24Xno9u)tUA3DLVRL_ z+gPCgP+E`4lNg_Yi&dwDA0(BaGR}-5IiF`rrF-NS-?$`^%t_f%Bwt2>oQQu}je3&H zX$!yPy0XZ%r*s={*p2+<+M@^MNF6*RjuQ(*a!(z6OrK!qa`E-#D6il%TZetVUhcbD zrNYfl^pyiOwz-b58w_RBlAjRtuy0vuzsh4Dn& zwgx7&HBr!pc;K%@j=Q#PJF(m4{jvM)n%He|(=)|^qHmk3ob-Cq)M1-_b0*;Ws_og; ze)|KrPLxMs0#4+Is^eTBa6EY>7jOZ@s$9TLR6CY)L0d-&1vY4-xg#4a4dHpVK$QodZBSZ9yb@mtCicaKwb9!|oR7^9aa zR}gf(uptd0Lt(v`0M}ZGHX1SxX>~T&_|U3={uL%l806fSn<5#qN@|l5Z*@XE=wJ>g z5Y(~>M``IX0if~Y(jnEkTDGVnbBm1Qk^=c*;z+_$n>g8&E;$0R!i5f2t!i(XAS)>z zo;Y!*B}wH?d7)7G7(BYy-ozZ8h*vX!-5}49f|Z`?UqIWSjJgb4^wHH@75po<@1Nmq&}4u{aQNy$*hX2;RQUKoChV6@nkoIr_E7gRgSEP?my{-gK_MB z7u`r@lwz|FWJdt14HUUPX_sA!>%8BrQsSzp(W|mbVF#*aGTkw z=`FCq!7`cYaIF%;-jTP**iQmbZ6cXA0}Iae&va`e=s4U|3ks>QF?MpMn)Fw~VTUuC zaS^YjSY(u!zj6J-+%w=>$te?PUwCYbXeYh*k z{?M7op4lc1_E~vH`-Z^fBTNZ?g^5cxBX2(q`_;Ha2hZ-)FeKREo-!PUGED#H^ zFBg$_fC(57;L_~5u8m-^Mt{K`sS?4um0O$Yn@GIUz@?R~NqxD*R0E6K zlzkbv+m!usf&2Ak;7(WI{`TtN0>)W^tM&I%=aT3``OwuVJsC%sOG+oJnG%uquwyuU zkdsN;&-*U55K(}F3gu0hSb5ex&IFHY(v4c7tTan$WldF_9`!0K#2>E)`A4!^W#G=P z4B!TXqh%42HhP2L<`OB%CyDNMZYi0J8V&1~>xY&Nwv^A6LO@38H1{q7NsEz{UZ|xy zxv5j57%?uvMLs^P9k$h6z(z>7O3a)Ve3IQcv$iPf{J<6 zJlW}k4U)FnGi{IKmDwX0iDJ}-lhxE3uPK1(oT!StJ{wMPj@^GtHrcdZPWdN@-jGh(3DF{Z(h9X$mi+`5sF*p;FVr=wtY(zg2=J(rk=AwQ;SoAP7W? zJ`y<~%6@%%emXm$-&rzS<(O*W-AnO%-6{ntTjiYt4)5Q9I5RW4!S0 zte&IG#H`eh=IC&$PuE;R+f`ef)c*(b+i)b)_Ur|E+@8IN#BHh)n|JUoIcEHs`H`gz4ux-cUv@ZP zm;0I+8fcqtT}PtVV@x9uk4>1X2h14A)DPG?qKlDZJs<$%^CFMnKVB*9?_l)UG<`N1 zd_njiJt^<>u0-3S|DSNjSuW-b%$LD~L1*CT&dnh$lr49s30xG7dW$r0r|60raUX`( ztYDa+e&T!D9lKS$%kAR9rO@!BHOG1L8F66OW$!LBEfQn|f}yMPpB%R9Tm{DwBE37J zUmFp1w@@+SNHmk?GUMsh)tcgO7cmtF30`254+<%x-aF?z*Nvv;i~YCFrld^WX4f&Q ze&%CZWH6OfF$aRN_IU1)seo-eL}PLO8UdV?YL%ImCZXy@1xGGmU@QjX>jjM%C zQ3_%rJfWPXTvyW+Drj&-kTv^g&=97I*)-Ql+N^@L@qG5Md@z)z`QdohK0kDM#wN+M zjq`Zdh~u2hkv^jfC})eA=K)x6I7d5c(9!%1^qA9G03RTGNBv?T=ox*_gV-8``~K?^ zj>LFd;{l86ytsV$*Yq`B>qrdoLeafu*62bv(}E!97PiW0dg1%|J2n4k`XjO`gaW!; zr>rG~%SLG&M99M(@??!X>#982Sf0F*XML52nAk==twx>=RUX1;8+qD|Jm*z;pi?7H zr;+FUDo@ArSg*Q`92Zy)uuu}fi?@FIom{V840H|AK5k`Wme5fcHV1pmU;gT1YW}KM z?<>~Le=mR6b4~lcV#EB1zvs(jqn1hqU#Lv`CE&A#Fn=EmGsWkak`p zEmGtBkam6}EmGrxkaj^M?M&1_*FD9ku`%>wW1|;N3HF4CvXn)!(`a2<%*&lB}?pZQ=jkLzd8 z6ZLbyL_as`asBLhqJHj!5z7NHq={>YqkhKCM2>#Zw+jM|QKX--&!nH9dZS@ZY__qO z6JKl`&K0d8wgp3iMUdy?nQ0D%eYZ9ZGP%y5Q*HN`KBsl$x_WazHpzm5Di(4d>y#4?RW&00nZqXs1IOz_6 zs?1Hl+8AMF&c9pjOXLJ*s-aA;Ds#tJnO4~Fb@E10~QdgYheXeOW_KR9;sW&sf_z#JM^T1Uk zG}8Jpnvm+4sVZuSEhHz$ z)|_*q$vG9K9-jDh->*0Lfi0fXILi?w%!W;J1Wn2pL{HUlYKB3DM-IY{BKU1%)vcvM z`Z81g^iPyOxci;V0>K4+>{(yyexd>-;lQ<|;R*>DG48*`%-q!41b0GW8^;D;knbev z&-bVRhqwqfGuxjZgx8eUng0C7`juRLeJaL3@!909lD14pN{1Vn1J7@poJ8q?RIqf` z{f6m33bIvSZXWxB$S&`+FHsNSrY;|7j@=5OcZ~6Oh31L0eE4+@T2|)e%}tVk9W2kF zS&Szk?NqV$)qc-|1+PsP-JS5|G>EefafGKaTu*!<6^0U!F3-&VfEON3Z)EzuZ$1;J z{6RkepQiQzih)_+7AX3s_+$n8RjZJ`8X zRVDh(5+Prvd|N_3tTp9ZGa(-Vt@4{W1PprR+c+T~T0)Ko&xh5fe1i%3+R8Tw`6SG7 zi{V`Jj_ll|6}K^4Smv{_XG#3LLL;JH+{AddH5H%M7QrB%Wua*(OJafsbdyuF}_@-MUVn^a3{Ikv7%-0 z^76|@7W4g%rmo2G{>nwXakN&uGN^EyrV*EBmk-w!39h_i%43g+Kv?Tfc-z;hoW(79 zQ&eZ`YkZTFS#4EufDKtR&VGcvl!uHVgKGHY$*UH+@IXNlc$RJH3E%BvHu!+B6yy&p zj|yO{-&%wT5CEElsI4{=q8Mvy&hdNAyQ{GUsPOb6l}o}7?p3Xb2h0Jzo|44S!X_)4 zAe6q@<`BcHEj5uft~BAY{;&%^Ya+}F0o&uZ6o5;4ZTjJ7h96MZEB`_})JtB4!h5wH zraYlfG30VagiHq~1W3OHdi!j}>@JIarF6cBXjD0w<-P>~4J6)hEDyVAOYA&wq`6*4 zb3FwHLFN|eUCj}@7JAZjlcRsBHQPg)R5fu=`bTa6DDMXbc+c*eegacpVlg!{`SD8zGa=Zbn6drVMwP@{F&A4w$($V6elNCisJaMh>p=1JQSw<_rAID6@1qIgQ!aG zZ|3N~d@RzL0cHe9i~tHrt_T2cG!|HJ;a3YTU_6DG$N{2V3VtB1FLiO712xtls7zqo zKO2upPd7u`#l)CEV@)0AjCa*66neZPrA-26I}|mNQw zuD1t<28}h5B1+bP3;KI0xKQASFlo3D1KEn9RU(g3oz!Ze#6Cx%(W=nXs?pPO^t8&V zlbW`aW1W03gkqsg zk8cVPo`peLeXk#j7){!F2yx) z444LA8S&yc6)xj*i>82_M`-J~dhFHK3H0jR5_XLRsb|uuLFjwOYxSXiYz-Z%KUVx@8 z$&!)XxZK(Pus$@|{!sk^V#DaS*B^L07~hQT-v;PQTxu$UuVj1pR5qgc6uIR+YKkqG z_l$gcTc)&yutI7Z^33J zUK(6v^JQ@v&7lvxj)qWSq#2hn;n0B7jIWZ0+OCD1K)2i;xGb-wp*DB9G_)9@f>%X6 zttt(f&ehUTc_&Ci26)RtRD7trNe5BWC=DAOlg?O88XD3ka2Z7+f8@0|th!l=L&L(D zIDG6S@6E@IpWbFjyJ(cob~LzQN*u%`>9P*&hgrSJz(yVf1wzoKX#OKPDY7;4z$$XS zGq;hYXj2?!7J;`S=lZYO!5Db8@mhDTkFQLwGXB?PvRsAr@u65Z72oki!L7Z@r0PWsbKsksRK0S^8L3A$q~{U6RW`IWBdKrAcyPC?Q~RKRI{{+- z6(9rz@#7z5s%Tc!RZ!~~cN=Pav`jUgd+@GPVwoasD%HmG4Xvg+#E9)S>6kSs8LqN4 zN@D40SYoECU-j5um6GEWLK?_c?8x;q_<5s~MRSeXbKNx2c>&r4LNuq3efbAyM`R$> z3r>Iqg36roq0dhP2}WY~q?pQtlop`et!Rh?GR}j#PQz|Z!>(v}Y#9xaKNhluixt42 zi|_l=-a^8<_$o39N=B6M;iTy`p1Ws38m6exa-Rg^9hzck1Q>|pQ?=8VtY$G*a!dq# z>8U=D_x~df>}WwcErDhP{cTC)jq-? zxJ`0tx;gkc^UC#fC1hUk(;MOh(!a(y4|ajc0-K_0rpm#T3Dw}cMC;ep6qp!Pvk@2B z3PE9pg~@t}d>cMJG%Zu(Ze77Pq#+e-8Tw?W@_S)WxIVBSO?+0-2SAAJ@tP-?jqW3; z*Q}CCAzbYW;h7*I@X?h#vfuLdWqfqnqJfb@(ObrfK2}C*7*~?Lx{6o+3BT98)3ihy z(#vyREIS_2W`7WFlWZ2xIWsc02pT`DbN1?uhi9ji9;>_IwIXp-0QcXLFVkl#f=5Lk9SR-W>Z17vA z-&*BS-tB9(&pM~R*4E@GqH8zXAPW|V_5SC!&2iK#zscTWwb}E1?9=Qq9Ljlhgw;~7 z={D6p_y-e1lswYH6GZ4ERfP<`X?R5uj%Bby!kC(*AXDV6$%k4540!HvaDyh!M_K@5 z8`gQbuQi-T7@*Hf53zn|<(p*=e=PRSsD z*6c=Q1v~K^h-9e68-eAR0l70X8v}MeC z6_K0~OT^6BQuJKWzm4q|0NW~$v)_9*p0^;Zyf|)Zote2HAm#tDMQ!63>*WQ+y;i+s z3leW{cQ)LTy@=Q>Xty=_57aYSdsVVerp#b_wrCV3^Pt(<3%s>txDKkXXY>Ee%m%>P zn*4}}S{~3;^4j4B9uMdCcpi^SEC8NgtQ{(zXFdO|%VD(B|06;{dw$pWp5HaLu|DTY zDL$ghrfBvVed1g6%1)4~bJ|26;1y6;1MRbBhkD#;K@K#&7J!&m@3X)jZzb@|U^qjw zIvIlN<7mOi!49oPh1;ycOPn9S-_SgQ=7wdm*MQJ_-h5B3#!Rlz%PrZxxk4|uWJ|fw zwI#bNr%iqj=d(j9ouM;p%AZ-7%d?r*jLue=2^=_QUz04w*?JwJkkjSKusP7S({2J> zX71OOM2?i-vXrndkrZ*onrBhG#FYxWr&nEvt4y|o%-pJM_l|}06V}cumh|{59na@I4pWx zIQ#UOOElKtW{7x5Lq%jzy9ZhXRM{{;zt|9t-Z)?8)CM24SU~a(dS3>EZ`J*fJDLha zai!Pz8|R9dr-#xNfzJVSi&9;^YRMgw!c3AblC9P%AE1jD`lG}%fvD5Py80dW`o{W= zZeCz-#ro|?c8X*D9nr7YeRdE}L!g_7^N1&>gCE2rv`a3y7HD8zPz@dwvSywpAdis= zSQwAOF`j<^1l-dVp2N2qL=_qX@d0TaKs=`3rKaE%F}Ef=Y&28(RzEq!#(vt6mA8A1 zi0Qb*)GB5SqT8wR()@TnYD#FNi$vV?%(~DA?-HNb5y=QO(gJ1ZDGTzBj@GpmvCnRJ zQP4Sws@Eg-^@?cWfIu4|7l!0@O;#LZ+i-WnLB6iiw`Vcr3**LPlvG}bP z&S4_p7JoE~-i%2wbDsLPrIMY(jL>|khM6B9qG(&GkM+t48~SXvT2DI$TgmP>Hap>- zCu23S>6ih3=HkI|RTUp|U73|ut&vb!(<~`k-f zXQOUezFMhQ9Ab7svmkbv)VeXtQr1xG&YepQb0-a&{cbaN+}JUt10ibFe%LChRQusf z*cR}2sjAW7s^k&aR*`C_G$Ia>eL9$*+3 zgThN>y-1xuVuyE_L4e>foje#`K*Lh!J=FOHI^CBQ=x1 zM#6Nh(GRvxFrT|h%_$WVpqYwZRz0S`*HFIF-D_F4SWjK9r&{GH1WTni545CFw`724(g5(* z=^gOa%adIdgn;E|e`jeC-_D>CKF}4h>a?Dbk*=9PoOCJWH6*ni)tjAOO+9iAdMJ01 z`)b-ybDpLPp{T_rx$1MDV&ZO8NV*NKelZvmCYV0r5Ler*hqJ9bL1`E&B z%`&BQkv<=&hXrE_F}^iA1==a1oFUa>HkxbBbWY(iv+V-l;v4C3T0?JlQvyozh>}RawYAhMCQMv1%GMJX zGg0jWS4q8-fD-@_8BRJF1aNLmz5*Ch1m48@DCTCkxJ&Gy^Xz7{eUVw> zcqPZZl9r?FQ{fPxIB}sw-8?p%lRlZNC7)YX8q*A~ntDKHhSOh(17U$< z-X}R=4kuYX$9I;9&YvYJP zC>ZZkRV%EGC9Yir}~v^m!P5v+~FHGJyCVMnwf{XM`U>37c7#_i*E-tKh< zYvb)>!|+MBHa>Oab+7NPYHh^Se*|meA#+ds&uMMMzCC_xgSC_=)!Lwbvo;RdDE=My zaftB`Ig~Ga1v1ME|i9lbTVSyioYx9%tVn7egj1fGhfUd zz=ooT2i5ZutJ0=bTa(@6URUxz9>V=%!Jzadfu4t75Xjry)wmp zY`#~`jmLZZ?`CaGG@P#y^a&o!8s3H%P(~$M|H9dUoBJ}6o5y{ z3DB?RI(8wrs%w|%yC>NH%5we_?SD1VcZ~i&LH<`jG)2Y<^U*xln0|$g>C}zSpRzGM zW}1VkbN9Zotrbl)Zmnx}6(?#HO)F2w#K9C-F_2vp1sBVdm}FGL|0-|9Q_cTsv%m*y zF&gI)|JkPzKMwYz1J(ivZLVW;%V#kK;kYMfL}cpoqs;`BhEgfTxwg0Vy8j^+H6AMESPj5_oUbpa4{iEr9pj`6uqj2ev-U_Cpvz z?Eq6p3=#_mSbzF8Z^2`Rh_)HE6wcRkuZ(zvqhPQtLZC!A4&A*N>otAvRZbN3qZhpx za#zXkuGJ^pReD6}2uwYizQm1>#iDNL00xB8dWBlp(;DA}xyC}MW}CY(wT^nXRz^m% z0E^it|3}<V_+(Z6Kt+U6F|@Hwn!@4Q8Q<5+1I)XksT zv0`ihlK7rCzc&ydDOk*^9(p&&5`#>}RTn5ks0K1@O~ck!)xWSXqKNe1IgX?cOPi;| zsNv7CDz^qskOmS&Po0FXamJ$se}t8RX}XWp#--Gj3z0vtL>Qh128k=agEt>Rk=p8Y z;0Q@SdI@WXiH<|I6(@WJK%D42o89=5Ikb*{-Tu_A<2(icOGG*d^af})f~&FQ5~o;W zLUH=>H%YEF2Jt%9DgU5rt|{-`SJ5$-)HH8>@_+huTlti3D{2J8;qBr8y^J zXxu4`h*4)u08%$u_#z?y-D1;iBSJd6?5coSJZ!-=x_aNb)|EtLPkc160nFhtrXgH| z++8nGiQE-4Slp4sG0{od_JUaMd9vAQhrnF$(6eA>NTolwgE3|}^=3D=j+8g+;v~L@ zot08`XvX9GvVxgc(|9u_nz!Yz%G}eY9v}PG$C*YY9=)rLOZg&b>~w_k=o69jf~NrgN{8dBB7^ zk3X(DksKLfu>4I2hnQzk%-B#w(Un{r`=PtNM7zUvTcLo{ZZL^0j1e2K*5$?Z4*zeOTL{ht9CH- z|D;~4VW&V24p}ub6JWdRaW)_kNCUU5 z+JiCvJ*aGv2_@+$`iL?3B-qA^?r#>AK%?mWR&?EjZjBXvNZCTG6dZg~<7X&I81GL; zxXmW>zi{I7Z}{rrU;60b>-!rqE)hcdgWO^Z;^5b1sV4n@JvQj$Q3iIEh;DR6!fMwC z;^@}HG)k0q#!TVslgcJ8_2AB>C9;~FET86kv)=4qXn%04m%YRRl3;YeXhQ(T%NaL# zx&s_PvUU5P>D9SUi7S%dBGhL)?05>PrOa{e_dj!H1)Nc7I=vDZDx2KT+6ro zoik0ISK6@d+;<3LQs84Z$Q;sWa4!KCLGlFLAhWE-$v4Qfz+?Z9TJ@McyP4Uz+NM7m za&za6&D3V+)(qCJTff0(Y`^_S*1av|Xqd<)ot1BhUoPYe?ue}X#(P7ai}^ypZ&rRX ze%Ztqg4?q4eeugBe9?W~<*&vs-^mx&WwP=scZGVk@WpP6{Db)A3clcL%*xltFWifTBSUa=mDr3&wjYC|m`Et%OEHAhQ4`o_(_LQ&Z^e_CU6r%@f(iD*0 ze8ky==hde|^zYVPjAbf|-J7xl7C9BBYN}oHy)~+woD-#HY4ha^bDKH9q|5)8|F8Ke zC+3VsfF~C`*wQ$$ikzr6n1l1f>|RAaIDT>+bPMQ)OuO+G9=A01QFJh z8(aeTI+(#(jR}qzPaM|fkbTYs6x(r%C>`LCJ?hg%#A~!L$g!f@-I&1;9I3z&ssaP& zAIE{{9xG10;dElOpumF#IF=JH9^TesiV`g9L4R)iQS(bFR~eoWi)}mgx90r0|1C-K zoc}NX--J&g%jqyGx(XTAH^D5FG8$IF9R01?wEw5;(|$a~Vv<&ItgakmC8xCVAN%xm zAZkDX=ZxDZo3eObeBck*8Yu2=j!ji=$wPaaf;ovn)`nXSYSseT6f0{uy*X=8NiWq= z6;@1~WVB)YVNe+E8I68mtd7cHWid3*fMF?EC*tU|Sn}&;kPOji!(ZQb)o0@ttT~yx zmV?zcTs&N&8xt% z{IdoLeaqC4PSqt;o_Sxvt+|@?@e#*>elAu${3i^h{MY6`1P9=BVZzZ=S%|_A!H#tw z2Q9uawJ?O>JZGz^k>fcMxLzshliH@r7c7XkOD=&x6@h(UzIq?`PJd@&|68-_|3bQs z2jwJMjc1(OI=7ZnmS`r7thTm-aMAFV>|)@40Y}fq2BCUML-xuEzd5h}ExtaV#j>gL z?F>YnT(8;$oq&(s(=S=L^!kO#`o{mpUK-ygK6>Vqv@E3O{I=G&*Q^(MAPV=xDwbJ_ zl|{I>%9z&2ftFtQ?Tuh*?{eT+ER}O8S@v`!mGioj{ji+Epwatt=uth`f}Np%~^ zRJjxGQLR%fjS*G=@A;+3Vs<`HH@S~Z#ZB&G3xIK-U8_8;niQ}=O@qBCLTa+5eH%7> z?u^&e8Lz2hHQCYh9o2-HI>mX>UXPDAAkxZWV>HMBXp9EVn6X->BwXI)vuQq28zwFX z(C%Th&+NGts5P2fd#)X6#M>I-l#duPES?16i-$NQK2aj*XGAU@df)XgEf){mb^T7e zjw7VWWc@HAKKlCz0Ld$KDVkHe+Odxbu@r?Dk8+I_gI>*X zJ~_gmT!Wx#m(zQwbWu0GEA846BXGe0%7JI`E<}Mr#i}dW7Vkxwz->JL8|qB2y(-yc zZ|nA!C-tTaFs91R-YWSb`!G{~xDZNdJQuxibhZy_JiTudLM!&Fhc!oP9Sz!}k0w9qv9Lgn|BZd1p@T_sfp?$eWQ#9s$ z%5!u@9{&>a;8CYm=|EHtGE^;P)rtnTvTTg7R`FAs9dV?Qjb5{eqwR*s6R((A+|JRR z;HWt*8g(@dL2nn`Fb%=drA^(-R;-)`$q*|#cH48o_0maydzx$7Xl*W^{`sWO?tCa( zp$t}9*WJ=p2UZ$kS@jNTTJM-FhSL3e z($#!Fg?u_TX6q%U;8SWWF`X2L8OCgIM+bq+4icD~Xo<>w4=X(lxI##;|aKr!b{YL0=Q6unfGl)~T&0ec@w)sU)=BgYKtgneTz+GnQIxq)J zLQIJqexqzxiIFds$jWvQS4tSdvYNlO0gF_=z=5bBPH_IqdxVOFuK-;pTa%CJ10*uR z9vN`F4ZCJRZA3-UY(rhI+9)4B@fYvtP<^Cl|D9Q`L)s^JN)de*0D)l1=@I{*w*w+_ z{V-W6via#(-BxasqGLlr%P}!O{qO0p6)eRvri!M;Cvp_-Nt>J_^r*d*#p^VMUe==J$;)cdd=|7o`ecDhG zTC>T(liAwC&DQLMrzf+uFE?AW11O%%);`y4P5k|&vgB8rt<}~$t+vYot4PBG<6Xi- z#=8c-8Sg|A@)+kDgk1B6U2VoYJDGWF%r#~)-rMGjc~blGHS5c{56f+jZ8R@0MxWR0 z<`}%`op?!mh&b@lW1Akg95OrKkZK99~X)Y#eKPK=BbDe|%dA38u z+X{s+Dw{N(ja0Si)eO@slm5*tgxiCJIH6j>1{Ie?wwYyyWwJsdmn)l!wyR5~zrkLS zVrxiVbQSZ8c2t+-Lz2n>H?79Gi^y&B++jI3b>VVB9`!6ff`+k-WDg24#tig-)R%ig zWmJlB#f*u_r7%gB4H0#_5*nsBniLo+`v+_H%YXCk&zSwA>w20-e)e;upgiY+Xk83=PRec5%VR_Z^{mU?3RyBshH?8U; z*|KwQd*c=fv;QU)rkXur3M)@Q1N~E>S_TcF!42$4t?M{pt_I{mEHUz$M>@>bRrQLx zg#&85$_I}c8o585N%QK(mSZ3SxC{dkRGB~8iDV%ATII;*37pY?X|`cBt%z!y3)@$` zXlB9NTtX!)%Wh(5$BXNE4Iu=H0>-H{H{UHy5x1aCdG&)A-CMb5ahK(*GjNa{wG}*hds!$k*!jAR;|*N z7eOVgXe-#IFHGsU)RKW*a7!^`68=B*0W}wI;5;fgSsOiQU!&K6VQW{?0VmhhPF;$v zIX!>nt4IC$tM=cfB@>ZQo)V-ByG7==a2>1tZ|TwGMmC|%U%vk~G*O*1i#eM&3Qu!; zrjU)=!(vCMaS!`MMS%Ld}9xeNfTxR>kd~d(%JhkRVo;T|Gk?xKA1S8Mi z&h_=m{j@fH8%GD7FJD^?C6+&1=J1$~ePw~bdbw}@;$dPe7ga6M!HNvRZ|M)<%%d$U*C3&T~T0 zdMmX8LAt+c0tcP1&yS0PE>I0CIOsfUu9#klPyCWX(7II-bYUoZW)5QL8=KCb6M{Bb zsTBy)hNuY$dRlDbv2)PVRRtV0wS4ehq695hGzMRXX>S`r$wa!xf}N)PLCBQ{nqn-> zGE;$%rjjcG+8$+mzuK9{1B`MO5U}}jKq~_m0sh~Zl&Z} zOUY2y*(F1@+`jn7lVs@0X1%zXIugGq1If@fLKA_L?Tyl=Lz5)7nT0E<*X*?mRwBCh zke*sPSlCluy!YC%Y$jEyLEEQDe)?E)mkIe4&XsO4M+^tL1K&3IIo`xu8O8t6Cg_gM z<$sG=T;g+ClA&NhuNDhH1y#$PudXD;TmZH1r73w9-Jj2jxs;0axV5L;R!Q9{xgoGT zrtk|}wJ?G5<4st-+BvWSy#PY%zdWPZp3hb_;XE_}INjASr#2}bfDce*d&*}uIET%3!GHTqb<<35L-*W#7T`-6Lg8&+m=mSI6) zn^Q;C1I2IfgIWJlOuGJGXSEf$G6to&FW5BckGCg;?-5T<=@M)T_h_g|B4(o)pC8zbH?Ah~GhA3rgjC`xX}n zmv4L-%upVTjNU&}X!(D4VxM(r`C-+J0iLlSaE8$Gn?4?p!TIDqGyK-a>`PK4gAaSV z6XzEfl7T@w(jPrB@f`fU#(?fm{f;DKIzY-;jPHE{%NbNNnkOK}cUg^-V|-8M49Vd5 zUO5N=RM3xd211sn{lR_SX^;oM1Fp~*+JTWZYtpX06W$lCCDU_0#Ql^g8x33=`?zfo zG(t?jbxCGiK!xAA~K9xj6Jz z?)pS}YF0W#Vn|q^Kji!nga{Y)$=1h(0h@bHYUo3CL+YO)%A0JW!`4uMmrXaJfbdDZ zE>k2$gw6xbbPCa0R_`d(EO2emPHJOpRJJspK61mYpS=46kNoZJ*Do7gPl?$2IqWm5P zdo(PxAUB>^KKKBc8X4BPtf0^X>NsaX_rIRigOb&#Y%|;>l=wfO^r#OT95Z?y5E=td zYq5wlR_m#48s z1w@Xuw#MFS@1!7UIH~6>xe*W}?__EVTn&(`T*1@5tP**;Vpd|K}o2U90A1O~roOq8RK(5B)PFIjT^fIq>a)#I-6)T2MMP`-S3`Ll}n zZ?uG!#X>jMbAHXHBHdLa&tp`lrCgaXZB+x;rWDCFn_`8dX4*pe$^{40FPX~+|HWWS zLf44B0z?Hz!}LDh@zvAHuH7Lgqc7GhQ(*9@;UH5U4ZB?ejtB}(Sh8Ki9E2r-~pj1ARZYh zZNd*%S!ycJvp506u?IxLh1*@UzQOdbwoCL1=A-4)_Li;PlE=__lsspX5;oy#V(E!S zrIDpCJOa-*MRBIT*>NS4!aaj;3cLy(y9Kv+@DY9f@fBUl`#HcfUdB7XEb#d>4EQ(* zcJ3Z^HUT=11rMt2m(*Ep?PsFOP9q>viw9o?vPK|LohKXR@x+kDk)xEreF|_nA&3mq zc}-`PRJNa218Q-wUr*T%M1qmizI|3jB~O@D?`7Wrdwp&Z@v*#BpJCk_v z2tq;T|7!R&+olKnpL>NRQnCt<&%=!v?7)0yNKN6&_G%B zbLXgQG=&Fv5F^yYJuT@#ekJC1;u7n61F-4@0#@D96`wjEh%WaUbYuSu2N#KdhQt>| z^5I}CdV5Aa+s)Py`Fc!Ngv25#iL++-;s^tUkhnZ(9AKjcJ43&k=r~`DS_<9aT~tLm zI91_;E=ROxFW((l0m_OXdz{XZ%=l{*d;?#}LvzXQ5gBZhkvreBJ5U5Y1Q^{3V1U>N z23Kxsuo3CnU@qib>@m>fZBSBv>WNj-n8}vYj6~vVeQ-7Z)`$UoTd3TUy)6nUZL+~ZDy{*! zW`Cd)V64jEm}q;*GG?~mYHaXElT-40=x`EAcB1`jbSH2sP2>2h$BMxr4?yT$kekwB z`f448v$7RTh$FgU1C0{Vz;g2#@h|3fwy?Y|MuWHlHn0w?#P>PR9TG0|r8QzbfX3~E zr`>6ILLN{hrqcGzJ~(#O!8?==yOoFaFidjwG#UJg5Tf{Vvh<`O7_f$r`>a0GM&x6I zlC}ybgV!rROq&dDHdI<%uMG%mVDJV@$3tP?LM60B9RkWe@X}cTBLNbJ5qJOr=yh^v z1x%(;>y?daBVyI5W=*-t8mmXvL+GEPL1oQ`E>d)8TERMx45%1qG_|Yz&+@qlk5Ow7 z0pQ%j)(NmK4A7wj$Kf!G<~_FAx{M*UcLI8!$>oUJPu&XsTmT;M8dP0U}c z*)sI2dw)QSTwv|v@ zEbrAvphZO76&_)JE6UgD?OrN}$sQrMSJJ4FjgF8={q**$#1z+Z%)(pb|#8$y2e1`T7A7MOz6!gakFY z@T*i3U{;z*0|S;bO-eV#A-oe@EL>KUtppWHyBny@J;s4Xig^Zf7!3InP(oRrqiKaO zH}*r8FYJL}I?-tth15|_(RQ)bj;q6g_l)irf09M<4uLC^xHhAjo~? zaAEHq@MmG#Ox{KZXrrZxW5t_U#haP)=6GhaDP_k*t9SyJW_w0qWldbF=xO89tih#{ zaL%P+Yb~%jmzpUMBn$}7M9W7n*`6H@WAjWS*5QH}QofWm(+$doSF_pBZQ=EH{i1)y zGuv0n9`e+?#xvVjQV)CTy&*MZwy&fvdFp*3HDtE0q#p6q`$KBTY+p$|>ZuQe)R5V} zl6uTjPlVKv*}m4P$3v?9ZqFVXe|<2#+VA%4;qlj#;njY(XOE1(o(iw_yFJ^tc(>s> zye@`U``w=1H2%6jyxQ;f?B?;;1L4(vw`aGGzuppF?HBrn*Ms_nzT>I(6>Qw@sdtWN zwy&ff^3=ORYRGI~Nj>bT_lDGv*}jsxXVvwbD?sHZ*DPkQPjAvI*SucV&x)O~VG)S2xo zuZ#K&K|^ZDY+p&;@2NM3)R5V}l6t^XZw;v-vwf{oZ&7Nn2RP$3=$eMXL(pGs4`5|B zERjlI$?rAoVqJneS|ZYKOcGGbSR&I{B2ii+g@QajZOffT%W|dU-h}jyCi0Uk5#-h| zuOzip0q#P8e!`Rm=62aVhbvSUKFg5yg zAlVh>0d@vPemV``Lfg8Aw?jbKndJIGhhnVI@cEdA&vpRYqBk$FDp1iT)_q_KlMERT z_GXHc9*aWN^hw#gzpQCC`|fI#o?Gq}R)gnutAXaD!f#?$SgEF1)r<{?Xco*LCyap` z@su?!A+68I{y}>OJZ09Ih$rdMGvG<6i4(eU*eXKzjZmy%ncq$M&0dw`R_1Ec5J&~9 zsxfY0RtnmqAz%~3UT4S=aIjz3dBGlI!~)Pep-v$PFYv%7m}^=CUURbD63 z7U9U84dx-^aC47^-{eRM^JSSCgI_kjhM&CPD0gR)TEUKuFXoB^2AH?VH+ig&`FdH* z$C2vQvoRWZF_8I)$8R9#p7u%;PXp}cJk`pl5e=9xu3e(G?q;^HMlBolzz7Qm&n67f ztZ*jy@;PE1$|fh2$48C1ov~n5nJid)2l+4u@i0OL)yVBd84+GrJy8Q!UPb4xr_li= zV{%#YntuNiLM$Q*F#$wIUcA}zT10O)E0Vm)o1M8gJB!|IVU@j)>VRA}T5+%3+2+DE zf3||A{ zJ%Z%QYd80(qY;AR3UbNC4eMER4S%|hIZ$+E<}HiNTJAMrW2Pw+IrmE$>Ja`S^+ssG z6vSabBI%AXl~HCD?Y}xtXIZt5;HLlQZ{Yw~|nkH5)h+&_)B#DON+_)o7G8KsqCv>Ep#6%H$M-G#=yVk}Z0ag1pG z#nDxdxyG{b!q~#Ighe$Pk*+L(Y7ktr$<`n%4{4|#qb&~Tw61*Ea16_*8~re5my8fD zQX_KXV6AB>yA6cbzf>ORSMH`P-7unaKuG2M%y(o6DFjeqVdl|g$%}M?L??0%4B)a< zdknVVgN-KQ1o1^NAVHo)d6?4#hK74*>9(rn2!hJYRP!oiDB-BEUyXv$HjR54rl|V{ z$>_pFAM8mTGZfG<9=(s?TNDb?GmGeyV<#?-Ac2CR2iDLe%py?2%Z$7rV54F+B#pNO z7YZ>3bj1ZE)bffiT7#vBy8p+p>3%Ksnab&~JrqGu>NSoT~$bmC#`0x5cIQ=aALH_Jl7#^ zGB)zxa{Bx?rggklGk8_!Yn=KvP5ByMeZ&ZNG_WF9?o$Y!8R;=*d$Zf?m+_O;(b;-1V3ro@LX@j&*~lW{*`xuf|fvI3{`(^TVb? z+XlmIBVQ5jL(ENVK(q|j2F=m|cV@T4tlVt52)*?nhSo^_azqDfrj=CEQdhlr{cK__ zILis2(zSW}lo(2D6oa}P{9N>To5dIZOk8PF=vvZ8x4iBaYLlhP3R0UOSqK*7HtRUTqNs&0Iz6 zsLTeeB#$gnm;y1=AvzYkLY6Fz84S>dvq{lC;L<^Ym*EEA>Rv$)IGw;-?31bbp|9@h z?+#w2p3w&_c7^o;!D5aL^N7G??n_|9SMVipj;)ZvHsu)%e{!$%C5*4Cz)%hMoVcn2 z5w2?j)(Z$`&Atu=t2zm<<4N5G4moQMSP#!bE_*ddBGm%WT4?bq^0#}X?e&PU;B1i{+qvWLj z?ksE7k#V&M2Lv6G1MrMnc_}n}kwqqniHvmzMUk=LfFp}6SPn_eWlrogkjDdESq0r;5*Q*^>h5+3_9YbJ?WuVfE-DMll7nmEE*fkzJZ|K9os)s|zQUa)flwKMY$T za%#mAN`3PFVB~HO8LzC3% z=15vo<4g#ne(L4_j9}}_stA+sHDV_qY(hZu=@F*c{W65%g|B;JzMw`={w>yr(N{W6 z^o8DKk5%a!S$br?>O2o+dy9&M}2L?DVKkIM{JTMk7i>206hSmAD~r#Q%hQNeqg>;E(Ww7VAm z!P&DRBv$Qk9G10lJsq?bkcl?g!DQ<*0#)bWl#fOol~$XB*=8T-5JzGY>Ejj?8`Qp` z{1;KWmGH-p+*r`Q9xB_lyT3-1;NAuGF4=W0=8ioS$?pC-9?J`rymuFWFM0MR>L|Nr z5i!!sSM2VCIq=^qGxi7VtrAkNR+eR}ybj-?HnRAe9p>8ahhhX2^uLQ|Pb2Ity|$Ex z*7$_ELinyP{iiD*vxHTW-DdOT{`sEQ6roBHbq^o*pTXetWd#Gu>RXSJc>bzC7s~q$J)`pUe1pn` z=YP=m{;S64Es;^_3KI|zYqCT=qZz1^4jxu98qth8-{Gt*j<%gw$0SDvpHddosfM{a z$g~o-bzgp(Pb*0^AtS?>(1kY!+*_1Zy}fnp?E_}}_d(KH?=+D7rgDI>uQlWn0pXzw z5+eQ&u3WLlM^j)v#{*vL%|2(da|SC71b~wXyMNv(pe*e)yMM4^K;>yS7{RK|ERShd zkU{CwO^6XU!Q{J|JAB@5@R~Cjs6=P&Q96qqK2Og6o+X>4W&r#6_xCiqhHO6b{+??7 zj&jSLIU#e3J4ZWiWw(a8I~Kr`a}&;Qi5RpgSY=J-J^&SijjBevU`j?6u2yH<`|T`*|ItpjTw>D& z*DzDpXbRQBmmlH-A(p~oR}-FYY>*gTm0%Ati%HT&?1kwg8vUOZR13~j0d9KVR&gz` z>0_yr1htrl*Mi=lGBE#!=BA-OS*Miff~1uF0W9}od8=s^c<%^Hi0`RKdWmVs`IYrJ&vW1y-;})owYYMVt-ttJn;Sko{xokBb3L2Wcd7Cr!6wu^~(SXq-ENNd%r-FsBiU-9OIKsEwakX)fY-{UwQNV0oKu#~X#+(*BXd5O? z;O!f+O4K3`2bah_#e{KzKkU-s)MLYpw0KXozt7GGmO%49QJfMKHQAsugsUvqg)Bq` z$1K-j3pBI*?8+cp09Nq{Oh7WRT6hbCZ_njkCA# z1D7z4E<TaXV4MnVXe4{@i&r)Bp0>xuDK-8ezs&(s<2=gW!eb-sN?b~&}&`b8LY zd$x_oKla4u(j=GMC$zc49(Cy8kK2qvD1gm{JjTCpP<>gcD7^6PaDnhpGP@cUlJ&ozX7!?}lOlCDL3 z3;U~|Iuw?-PJPb0iDNX+@QVpwIhtv?bS04CufFzHJ zn<<+In(-up>4QjD@GF1cGSqy?Q4$Y5`AGW3vb69?t-Vol3g3|}24S?46x?LWtc6s)83DV*i zqvh?!U?VfMlh`RVGF6sxuw`1-j5dUQ>FQK!PP&usbX%flSj4&^qeXCvqx4`#zl{CW z=^$^JuYt*s0Qb1AXq)oc;7ekQ2vcSNd8{aL(Zg=Y&CE$#@c|96pen49m4wk~!Op&j zxJFSKY6N{kPgnc);xQou+LmmA7(3>`V=g% zS;#rxd1Sl2PiwLr=m{Lg#fbf}W&Z3<^kXj1l2lu5G>dZZndt1b8j0uTNw$f2km2b} z47R~%i?)T`hLFSkltT5W#m!wQ4UFI;|JS8t$H(tn!qyZyn=M|A1W%;0w&PK^fI z{k^fb!((rM;BW73r_*uHf`+Z6b-6jXq!2n+C5YO2fxFo9D^Y-~fSVBKLM^D%&p?C4 z2aH5%8z8ivsJUlHJR=9m(0&F(P0cHJgeC(mc^6=d=)15}D)5gLwiG6TwI$o!U?d$+ zPJOhD;152%z>GSyg0HlpsV^<6DUB{x!!>SwG2DDLN!i{b77wr>Q5gdm76vID9EZt@ z)G*QbI7|p9jYaK;W)Q(8hB$+c`TczH8X->yWUKlqwKA|fAT=;e($N2)W9ITS(OHgD zxNz96tL3g~0&_<*jLGt|VjKle^Cl#4&S;s+bHa^pVj??`Lg&`lNg$1?t>>|77Wnr7 z1y=yze;KQmH>;MVvUCW_tUe8szGyvdh^H{!Bx9fe6-4yQ=WTdr`waSe)Ugn3`hcNq zOGAFYov>FJs>1+Bq-4;CK}E(~ zxMT?2CpL!@(;(KEsz{#68&KcW6h;`M(4CH1dBBICVv>QG?zk&k;|hr#>(%l=Mi&D( zdH+OX8DlZ6;L)J)f5y!t){AsvM_v}X5HuMR6CBJEczc+DGlZq|9Y+K*``A`~Q~+@I zLyNl~HgPhK&MB2tHo?8-8h97@_6pNTWKtFxT1k0>LRCRQS|0q&(jvmkt0WPm6Jq%} zA&G|RjuC!B!&f|+?JBwyP>cEi)n%`lI#Lmx6Z^jW<P`Pj_OJ6|U9Q#F{A*jEnyy+Ajm3*ZHu~X)q;zz-CLNCyeo&7yF zede$mjc!0T%@9(;K+Vca)R&A}Y4ZJTwaMEh!VuGws-5%p(t$D=rk0GNLA0n~TUP_? z5}ProaHc1_gUL!YHMr+#w-w>p;txo$Ynam5`z5B{uY0rsRHM92LoFnNIlL@LuDt0R z>habjL5G^74w02fqh=Dj1^a8vNxR#;s6~13>twI4W(CM{Y3z%-S{`bCTFki$3^D~< z*cezX?2-M-IQ=&92EDzuKrqd_F6)Ac0W#GLW(IwcGF2GyJPV3=PDW`lWsFu#ap8I~ z%k4EY^q2cUQECh=vdtE{8Q$%d2{Djdu_MMP+JfIspWgVg(X6}Fr#)y7 z02IL-8oN-RKaoLFlbVOJI+{8Pp2sW|bt=%@5#eJ2xo#xRHPfIZ~!89;$EdW~6O}LI*1)4gn zfI-a$3y0`U8Os;&b2@9wKFbO{cNXz%FNpV$j zrJk@^}#AG18W7TltxQ z6<#i{@#afLbfaBh1YectwC<&3Ve=yYONzt-M1=0a|4^$*e>@1Ovd`sB!B3*;f@YEC z{W#_&2>eQo2lS^ErXz~A!73jMn%SBRIBc`IB3n;NHdKfCvJ5K|=zh0|BoRL?P;FzN zn%CS#afUW;!7}=QL$T2s44^c4fS7~kB7JNz+GnU<*=Ha?$cC`8Vyj3zUpkX|h@T41 zeX*D?)T5ONF$aRPGR%_x>(jcQjR6F;4Uf=5cpM8&gD&yp;Wmq*<>$QD5Z4bWRAoW z4qLTYGVQAQi3FQ@Yi^%KTi@lcq*-IViD5?!c*6L@FThciyX7^IZLH;7liy|mGV$kM z7o{UJa2oN)Jz-KXCFTH#;weJ;XsKa+7F3iB~ zVkS#h+p0iS({3%;D4FTwE~E|m5ef)90g4KbX@NR2JT72;xCMlcvwI<@eFh1VJ38$O zPS(P;jU*?7{3a#|E$Mk6w=-07r&?-iNdr=B7xPAba9sf~WYTmYlLX2rKmw~&rk6@N zVv^{Q&vu|1Q#!Gd&9WUN(mz=^{AiVn*$R29rm>9msu5hEsqm=j5HG9``=F1pnXBp{ z$wF>>GvjNKj`?CKMvRY0^BTi;Cfo;q?81ecfr*us-ZQ(42V3>Gb+I9~iCbgF>l#iY zSskVdO}dm{v|*%q>N0iXr?N@{m49P-(n)z_t|GwIar1X3&*{Hmg^CW6+7JeO7SsSN z>;?inyU)(wz^8%O5u8LlxW2{`srB{W3Y4NHP0hN=CT7*kz@7z62#707kD^sSuIu5Xdx(xi=Ez+|vstx0)lYEpO{ez_`Pm?0Y#vMh(xQbU>U z%ZaBSvz!81=v@oMG%Y9I{h!lA;qHXUh#pjqsbr>Ud{lX9`HkgQ1D~{45CzLXsI(yI zD!W@?G76W`&?jY9@7ZA8mgs3AV4Yt%$oUz7e7;v$2L`ip4Bf(d_l#JF5U0Vq&7xS6 zZW2l-C7_1fs3FRGj1D0n8k6R@MlUwb6^wj(nl>mPY%>lvmix>@k%|ZnYg3EOY5)FC zJ7ar9Y8N?I0~a=hLB(eL|F%^~C)Vc-ENFWR|e zQ%&p*t`MRGSCG#he#Zi~PTm+r&Dc>R(7rrk^{&j-jEPtB9 z^9TMkSzIl{E0ker-w&*sVXrbQ-t*D#TfD72k-TI=8+$Crk#`;Zj#aZQDSuHx}Uub7S8(R-<+V+T&cHTYlPK#{f56* zg+FycxZ{_CAofJ^lPq#gs=g(>bxQE|lcxhVS9}-{cS;aQ&Q*YACPFJevCCF6plNxX ziY%j5-=uN-HX!2f#+S8%UkYP8qT}VSmPb{NJ#DxlS0Ep-x_1YX8q$IU!w)w=nfQfJ?I#^mMEI zF1CoIhS79>aj|%z3CeBatz`c1e&^WTZ+g>v?|Z}b^BnqgBb5PI;b|ZF)Ng(4OSgUK z=l`CJRoYP<+rL^tM7kwTEJ>mRZY@-gglAZHMtE>9&5Ku#5LqvL=PR+Pc-`?zK6iLU zjI~PI4#gN7m*y{E0~$$niTNMgk1kC4DLV7ntM|E;kj$^&&&RE=-Z%f=x4i1D|K%O6 z#UVY=OkdlrpoV0~@k77=-+uqruO;)>$F5$QmS5iBd?shyojgc5$8BZ>xOGwIgnM14B z*R2-GZQLk)Rq`JJ08{KH#IdGZ<~YZA44o0IqwYfaU6{YYsmxx^@<8Rg&HDR#c$1uI zWOsZ|skK7axHuH-xNzb$3H|bgZu7jL-=#>?aw~R;mvuWSvC{|b3r2~X%6VAP?YIF% zXlUs=81`2jYsg)%=xW+zhwz`i#JNL zWZLZRDLOh{8!f0lvQ247PFXf27@hY1(O;eRo{~fJ3x@9C%i<9XJt;}3-)6WjvmkVq zQ~XD&FLP0=%~E6l_jb=hJ?iA+uF(`T6RN{dU`%l4b66?P)66dQS>CeENLOu{YLS1A zM?~aa>l$*ACmkH@osCP&Q|bf@e%6;THzELzeZ_L_O#>b)P!pDxwUSpaEw6@_F}uML zb}^Qy@MbgGG~1DbC#1a2215D=XSmTr^Ppvo13lhGnlhM_O;W$|n?r!^>Kjn0TA z8>m=DGcjO=^V}&^PQZMY_!>R-@kB&wX7xlPGHLMBIN~hjVgNV9X;?6HU}KYBO5n|;o5vyaMLl^B&Y$!XRw>24t4Zf1FGTX*QXR+~|$=0OB48HyqFHSO=NaZoQ^ z(kwXeHAmAT{E5CUlobD`?+y1?h#aS8?zFf?rWucMxzbv!ykKd)?&l$2xy)R zRnz~U=<%dnc626^T%I6Ch_EO$0nq=5B;}LblI(#I{fwBKQJM_5UJT7eam!b1D8Z^z=cnTZ@*fGTSV7cVGn*2Eg*I3WO!U0PMEVk?i2o=T`?L%}7TS(L)ILQL7=qHrN zD@1Z**24mfpJai5KP=dPp3Q>&=8*;a%kZ)Q#A_5SjcicDZKAh$R~MF>q#YQIWFy3r zIOu{%RzijT0`u&TW>Oev%*Y>I@`nf%i{u$XP-U}+@`efQP8PU!?)<5vZD6|~=0{smb&k(Des+LkuLs!TQSKk`NnZ@)+FLyT=G#$WXaiYi|F4x|#>1J# zlsF0}V4@ThKB~xC9tADSpf1!LbfoIH>Wq{CgvQ}ghjqrTP?%bl@o76={PlaVt3}$s zU-goJ7N-`?h;19T%_sNmi3D2k&5jiGMvehLWEr30R|lwsJ!n$fNI3#QbhfaM0F6U! zEIoZlK`1#|mJLB8csb_l8#eAkoXFqk^e3ds$&a9pfuni{tRVkO_>iVS26{Kmz-Eo*G9mJ6`T> zhm{P02i#TK52+3vrllDI+&eJ2=#$THnOKy7SeGE2b!kT|h<7^z!f6l_I?ydottEg~ zQjW800eNz590nOyzb1?;ZWK(NUJ+O$u6ish;b;=v5UJB0SU z!px3d3N;AlhUyhr+ydlH2SOiFjmMr98td#gORhVZrgS$Q}d5)A|wU#c6&Ss4?>o1F}cHZ3L^w1%j~Vc>j4TTnArGdzC? zU3I7d{jX{$0#I`!YFe5Q0%jf}7Kh`t7)AZi7#c#n_rlxQX)!Sj6@-d*BPPoH3=lv| z5-K_aWylT~O$5(C7@JYs?}x+$K?L?bF;sRg$yT{jVi*?2-%fN*aVR>PSWAv7+OlR+ zOwew1%bKY%GysrPKR?Y!3ZiNH@WXRQ71d3O!Lba|${T2vjzUPjC+sH^*uJ6;ip_2R z5NQqf8KZV3DTuib&yUnsCO}hH?9u{*YhNiD57&k z?~+~?VV+&$rUaykZWrIH&V*=bP>-z)dPm);Y3^^bdrnnLcQ4r}5^@0sJqR8#dd)-9 zM#n?aJmR0sbg+@DVlD;EqBuA~WUzpRfdCh+mA-`m2*(s2Sck?T9|*d6&P}5Qlq~|0 zD#Q(4&Ll_Q+Z|B*D0T;~KTrp#m(lItb;=v$lVJOtH|2w!IUxClBERj}cL(xM)J<-% z@@g|ljt9#rgf#-&fWr*NxB+;XBad0k!F1MiL8C0+qN6n13lm0n?Fc3%!=%#Uat4V| zSVhzMMtF$fJ&X)?fNAm#n=q!U{=o+O7$fR96ntkx z0@x~;4XY76vZutcFHf=4h41auH(+kd<5|EugKnZ|;r2_VS zS7JYNUOJQqXgUwW)8QSBUr;~4x@CxR2MyH$Y_E;#Stt*=hZgS%k0MlW=-Ijd^ZUAV22!{fx6Wbx#=Uf1dx>EuH z6nWUd-WrE%qq&=$4nN?(nM(EZoJ)q%{ASb*2h#I@h@hZ1Z9-~y>K7FKeq)dq*(4%y0ct$cyPaSpD5 zrNIQHY~VB<4?&RLaq;#RI3>+4h>$3^q>Hv7Gz>{Hm&^C91Y{9S8RJ^@*$`V}Twnv7 z3BKaU1qsH8o(Au>H}Q++SdP+xU5T&%ux>*q{ad}xV;uOux6|OQJb}4`Z=n?7;6=xP zo#!Kp^7TFsyq7*()N^{<8S}RFwA2S&ET=F|2&Eufd0Dn%?%RsJ2MYy&U|rD*2P(zW zhbTk;Ri{sc*E;FO@{p&-wK<$;`4%sd5z_kRJ#;DlT@s0}58+g3G9(YOC)eaSst^{= z1~bP1pj^01;j}F{ssx#Z#jhRgbdHN^GNf9xo9K%GbmW-ahh;y$JWvU_!A;afViKR* z?Nna2Uw+!0d0TQOxF7yu!9b4SpkNpqT-efd*u)LaXykn;YqBYDW{c#E{4SHjIDXgx z3#Xzlod#sFp9sXO&o`;_zhH~!{4Y2F6c}KevEmOu{p;n8!?GwubRbZO@SGu+EH1dQ zJ$SkV>onhL6gO~Gaqr%^>e06vt{36(hLpf+cw`2ju-aV>$822qL>yp}-WK9p zfz@=(X5WZZxPsvg>yO25j-Q8`AkFwS@UXu6*kkbuOw>apon>_|JA`kCk1YwrB2861U%lxnf;{!#?~X7)|XsTGrB?+q2scrT!OHt&YGfq zPel~IzG(a^7TQSdB?Xt39hkX=$s%6N!+k5RATARZ|1?|{E*~yGE^m4OFw2H;Md6CZ z6@x1lR~)W*TnV_mbvgk)xW2lsB2rghTUuM+Qr9eLLvQPv(BbO(y7Kxu+4rhQ^^&UQ z=IYu=c~xn3-QwzsrU>daR<_htG?i9VG)9`5%Ihm4i>peTs)%vrKKubo(#xwN<;&_@ znw!$g>zisM}IlRHUAkMOG~@t!arw>dG5eH8e*m zW=5JC>d_;#-5D2Ug5%!>S65u!aFvF~S2s1(l&%U_*EZBdYJt6!10QaTG=m$Fig0ON zSav7eQil|$I1KXGH|tO zu|iQ;2mvT8oY4|#T!oR`Z|3ASp*c{I3AXegyM5cgkz}_T9^}B2PxjO3_6<0^I?U$h zN5rRftDBlI?%~SnNDWYw%(LR9ep-S%^;<Xy~juc$){jn$Zyz%n%4Toq}IgiCSN)vFBZ(uWXk#X%nVaVR*eSUh47RPG?h9 zX_jqrhRaD;vbjVl+I7p7eCZ^?(jr6=69qZuSJMF49Gh=6*T4h~${p-i~?f&e} z`K2{Yk;axtOHB=gslG8>T^Fv6)YdnyN?X!czXBliM~gI3&fIHgS*%^^MRicFKyz>gGuMB&oU}n4T&%F#M6l zC|SF>va!CleR&&&rwFWy(+2v#!=dLb+-a{r!kzZ`2i&Eu4#Z1c*aPscs8Ta3+ zcsbH?$U$vmdTB)|>_cNydZezUHqwY*QARhT4a#2zF8UJQKac#vH0~q1|CW3Y0z&Em z>X^Z}hTs~COW7s(Ya$I7UOW1K!YG~; ztBHi^-V}y~csUd=$LNodH~5g%aQaHi%Uf!t$rk~%H8gie++lZoR^O|fPcGQwKX&~Yj#?OoMsi$QMCK|4ccR0|B82uNrq8bOcXh~rzeE0~9r8cxkpFdu{O>yC|I{IWZ-;yf&a0Q+0AMeD_;tW` z`3W8J>&R1F{PXCK{jaA`M)lhO9eEw#ejXUdkmT5@^2vZH2MQkCA)hdPU6r5KA)oL- zPyR5#oIk33HefIQBEa-hRsMLuw1Zxlx?I7NkRSBG^8i!FtNcp9ltl%v1nlMWI>6rc zPX%?8mbdR)0efk^1u*+M%~>XgS5!sn!tfZ& zTWYYdfaizhpCm%Af5Ub&ZGAZxb-9N9Bj+MKcW5=t#mSCCHD~t3e6-OTXU|K{efp-< zk4qwr?h=1r+U-SqxT*SRuBlXg$~eb|W2o%ga6I1*9m+q&Qsu`@i9diJ_q&(KO<0~` z@#d_NE6~nDv`<+kC0>~8(b-c*jGtK;KAdYtTVU$yAsvx0BOh20)`e%;J`vVl5oADg z=!Vr(XyB4Ig;&+L;HfU$(iCYc+6Xrd5=RdWZdF=%N<9Xhj?b#X@T3T02mtK{q;u93 zrt2gN!21eUH^G5Ns3lTUgTPAzSNvRqA`nvr8WD1-YfcN#!aZDH2~nbB=omHmP+5va zGif4{ifV>fP=o7s^s9LVmd4>yG*CAzvJ$}>WQE}=V$EVNb7i+BRcYaw40xdEilM5T zMA;a@jKV61)RaXqwW>)2Nb&Y4Ej+tE+|XE$ut2k{EPL48Sl>bmi)la^tHYFwu-gq` zE?wBE#>Q3QO8B}&Ud_-8*80^D-biwIZX{d*kKIDYDeV;k^yX6rv1t(bA5fdhVsE~Gvu-u+^Z2PM%Zj(ePb;I{oigvRH2O#o;D^rIPDb^ zbzV3N&K+iF1ymN~$d!*UJeA=GCLTEN1MVUZ?g<^}r_J*AC*r_=ybL+ZzQ(4R2(V)6 zH6UWi8AMHig~t)FCXd>LdSAl<$qZsyD`|H^+%D z$gme=?kAL^FRIK(BYZoUw^iYW(#F!-2#CS#b#;}k)e2#9sa7(vpy|>rUao^x{ifHIqCU)+R(K2Y$xBsET9ZnIwkz7~@smz_2Rmj$y6Ry%1+HrZbasG}jlYlb zslch2#0akR0kDK}BBG=4BY7ps5;|h45tlgG4k1;Ns&7Ax7_7i z71Akd&LD;xTFN*UE@NAfPhXY;DlI8_1|qjO^$rKNN(Rt8!*MtAxDIR^D8>CISg-PS za+HU1_Lz-ZbtFd2D`V7Ws-`!c^KF(hY7q>gjdd}{15r|lVG~m^3ztNiW$M)W=7}5< zn5YVeL35fb^PR`>43I+`E8ezSrxl_to7GNfo3RcX(Tu~m>5^}NQQk}I2-0fvPG)-Z zMk3G4KNj%jk7C`bnpsti)9Y6p)>4Bgeo;k*BSp3YE$95;9`SO2CKGq=)#Tw$eWZ8? zy!DOs4UD^Bl-ko5Mmd>PSCQ%5v-TY~iJ={BjI~M4;|jH$cWUB^KZ6GP?N8uNx%7^4 z8$ERu)wYX_z{F842&A=vb{M%1F{~C(9NbxQx74}5nyQI5_Mk1wvcIQ2=M$a#0NlBM zm4-WY8*OleJVAU!hOM2(oe}07Kuoy3PFjz;j7_(jKY+I)o&LqR(&q9id)kQYNMnr6 z!Dowxt-E9~^dGw`jg4QR9Cgc=xEr_+0R8=NCFAOYt0%4`T(pbI&mV{9gK>G&#skji zW&8ez%$hb8&H^0-xNWti;nGSPFS>X&Tz$zgqu&5Gy0o#;cFk%_8`9j0^j23?A#B%# z9kEE5p_CfVd<1N`D+$f(!70(D$;pKl;ab7*YXNJQK&ivwtf~f6;1NM@!Tn{kvKe~z zNTpvx?_VyLD(Fu_Cl1R`n^v}zo-FkcjV?+-{n^_$YKU6kbJ5?B|40j+rn0C8)H9-u zWw4eCj5L*(LT5Ko*5IC`O>nfS?Y6odl$)?L;%HaWYxlCPG`wvpnQ#QVu3&CyxCFuB z2txfOm5d|ff$n9vg!aGWms(-(T^s|34#19vtT^Df0iJqf?20zNh6j#6I3we|*0aV> zoH%jNuSE~C1}tokot}O>^!YaWasM@XVk;!JX%jixSZ*j2*`9U#$#zC`KQ-&Z^-==% zi?s%Vlm-ojBQL5u_q~I zNCw)b_l*~2n0x(kF+Sq`^TeN^ZraDMRXxT?sqgvcDZl@C)l|?^66TK7l|5J2g z1k-Io<#ZH#(AFZ*@ER`C>Mr4>5%}e}bWO4ym;Nuu2Y9`Ip7Q&Q|8F0gedE4vtO8rs`6D=o>5ePCSP_@LhPOPo(k*Q~nkFJ)Y?gEBGfo zGhXF|8T(T3zwpepgcnZsz@0UFk4EJa<`^otO9wcrLwUm9@-cwvBdGe(9rC$u_Lfg@ z;I>#NVluU*JaW>wl&NFPH4GfZNT+|&5x4RU_l-H) zHj^m{`I_0pb(`U?_HG9tC^Nu)jeo1Lrc}1kEdg-#7+J>VV+n1Z>6r78a zvRvg7yJTHG$~HB(EMKv5)zNLu3>li1{`)YbrMF@GEtq~wowgQ-E&hG=hotlT>FQawPXUL%DYt7{e0wi0<8s zF)bW1a_`^W|zDG~He{HhSzV|u9|3~(}t-B8S(H(l-)?d3o$6oKl!2dyP7`=Dzuay5Wd;kBD zfAoIum|xldz5lQGzc>}~8eC8Ij~5$o72^umn-0sHaIZMj%lg<-|mFi>$=P|Y(?a# zGZW4-0g*oheBe+uU|XhK3`CpsNj^izxaTkpm+4&7ai4)}CN6a@aasf8Y8}rdhD)$y zi#X>J?M;QSbEb>2Qt-ox{#GKu5~+am^Df%uI`SLbxi(UVSk-}KSsN?QE@@8u-tjLx zmXp2Ub{xu%L|OXV6Txhrtx)hJz>u~t*;h55TdCMFD z_()vyaVZ`x!1F>}TyuHT7dtR+a?BaySG3E%$yIh^>59e6BjunS!J1Nx3U&_>@8=nK zl<$&mpTXJV^owUk80#!`wh!cXuRQ+qUmh^tx9Q5-W-jcT&<58qbAVg&4jaad7b9d> z-zX0=wC`65%F3lA?%w{E0(QLV74OmWM*V#WM|}L4A02T$jivjD9Fsn%*@Qn%+Aco9G;n*nU|TL zS&)^Hm6?^5m7SH7H9RXfD=#ZQs~|fgJ2N{gJ3Bikdw6zkc3yUVc0o=?PG(M4PIgXC z&hQ+bWY5nj7@jdab9mP9?BO}XhY!yko;N&yctLJPZf0&)Zgy@??(p2)+`L@8t&o?I zmzkH9mz|fBH#{#lFE1}YuOL4oKQlioKRZ7se|UaweqMflenA09EI{)GKwW@p1xPAw zf+m#PHMZg@3=b|x$TmDWoLL~m3E*W<@ZtjuBIlKtM|FVfaW&w=D;qdHA-6gqr5rXj zz;+Hrya`HGDt!{+s_m!teakfAP=rsTcW( z@BEmYXXYL(%AMs zymNLf(y{A}*IsZqhfu&V$_tbjneY=H?A;z$%G%dr()U&i}^lSC&%%FBp;LbRDJ^}>f`yCUTYuW=XKuRomV54f?D40be&_uU_6jqh z)1b_pyuuNqCLgkJ{prZO{hoUtfBL!S-~T|EF|jhYaKwa(lMh)`5m|rcg%>~d-19LB zgOD_N?)(Ld7FR@0JM&spdF-io-~V8DOu~f86_M8Ux8C=_gRi`{`^)1`IOWQ#A9(Pw zC!Tx$jW>%o-~a66&pkhR>a@8>EL!}h)6cl&&buCb= zjqO`k->diH<5u5v^O}3_>z3H3@5D({r_DQZ!J^e`?s)9wSKiwF<+qJZXEe8*o0^t> z&CPc`_{8(Cy?epf^EPLk(f6+}Keu=4v?J&H199;K(m(&Au0C(nm~j&}o;hnt%ac#N z@ZyfwKl*vE2ro`q_pZ5ae4wZ4OIUkDZ0q$_-{9JwM)!bbrkgpYA3xaV^CyI+$93}0 z@f&8ZP|ye%enZEUi8d`G%BRJ4wWj)e`sey}U$>a)=E24=Lo*Y6anXfl@BWL!wdT_P ztxsC(wi!Kq>;7dN;qMkq3U-O^61~(H^7Zf?;U8j63=K7-P0h%R8fy0NMH#I(AS*rd zFr)R#z(^y`80pUs46)YjO-Kr)Ck!)^+_FKOe9_&NzX=dvKMo%LyM)>gRre^Av->(M( zK|N$e;cJ8OT7urm>YUI;>#8T}-D7%Ly#xKUrRFmIX5&8ndHqHG<>*&}uj;SqZ)iKM zUHV7n$NJ~t-R2%0f~rLi7%_V4v@N7UgFMjazFODqx=BK?ET$q+VVBnmKw_J9`mDg;&@t*r0^+iQ@?Oix#!i=l0 zdFI(I{_Z_e`i~y-(LcV}``F`V_@Mr&1GDoBiw~JHeHH?a5W14`NaeDomB+0)`O52V z-nRXPn{KYFKWkCSF_vKtGb#-&J*{_ta-yal zyf!b`Efh!^F`>XH4+Jy1S;TOJ#oM*%aLcRij zXl-uy*1NR0teE33tZa#Dee~ohn~>-y<^TXzj-1?tQHn9FMoEj2NRi`UpQ}QCzf{kIoDXq)c5q zJG!f38UA2zBg*oHLcRdBYU^M6ht~TJsGuE1y_hF&Y#rS)B3_=^<{Eb(E(LQ*a!BF+8L8KGspFD-0oyH^bsgt3)j9yhU_M z4EK!=m-PK&=$0XaGr~jbuiiOS-&!)P&yOW(;^%PgC3{P9|E2B9)k4X6{bF|IT_0Oo zke+l|K}N4#lfLegJZ1ONUDKx3Cr`ilzRRYI=SycqUc79Ecq4hH*tu&~#;(#iH@$b+ z;V*o=>+rCso4Z@vI~NX~UkroegO3zwT5(iH*LW=g#ir|;d63qp=lrO`U{FgkwIK9> zHN+Sh7@VYq@e@Rv8Gr)whxFbWKJ}{UCcdhzh4dbpt`|UIm^u`u)<-w+zBphD1+*@D zH>eYo25$V2g%Q&GXd_TJ8Z`$3J+NZ%G}Dh)w274@p;4W1FTDWtsaASx#TveOYG_(O zn}JVkMhD6?Js9OXMDGcFnwA%lf52P0a_Q^zOQ8#GCkbpYGGJ^J563x84W; zjny@O0KXj&)S$+-7Cl8biw~57qD zfM4k6M`fDFXt{BN(94jK35oB&gnk{8I07#L7X1U3Czj5?%2+lbao4Id-$$x-s@ zMjDtc{9uMQvl|EjmZN=W0Q`oeu_+DxfGrc+7;^@n)AU3*;n;Er1ayBN^K3)pnOOlX zR_kVIaln)yu~?8;ZImhewSH03x?4y;tv99;{WWzh!CLYVT>WtUjJ2s;pKg3OF)FPh zg448%tMOWDw{2t^|4i+~fkCYQuSunEif8~J{v~}WgkAwZO%LNRk$yos{wW`VfB5rN z#zXje=j>hqp+Bb?(dP+qR8Ksgr5S7A*TukOJH7TrQ&cehcFkC|%@E1)c)m_ETF)}Y zWlnh^wXNrxKS6=#^L!c&6qdH6eo|zbB1QthBPs)4=NuG zOf4U2;+aHLZa^CsoPy=!Ax;}FC!3;s5IK*d*n)f^R@4G`89>x!hDfhLG3MNXp3G_l zz#QvIL(Hjmax!khLAQD*XDQfF+8+QYHdnoFh+#tkurEhFZHjRLr=7VEY2xG>r=8)$ zOfhPigRS*7LmYaPgYBT>HF0V>ibaF!O|R;rdlvwmF|Yf)V2UZ-0DOvOR+{1lKKDYY zVR42it#Xk0NBP9CItN+I=Z2Wu1mJy8v-C1ctjlyTe+N!|+7-ZXU>=!hi5bN9o@N#d zH*K!10p?rtG;z_j$YA}qt~14_2LTzoHs&)+ELq~TnQ*)%dPDdnqaGjT6BCv?Ij!#q zF{;7I`EwCMReoS2bNeM3;=E-5$lUlGpE$c2#n?{ag+eTdMb0gzW`6Xs5HB5y9E!tp zZT`68BTWM~Yhud))F7FM{a}ds1MTYO%1d-H8X|6< zh@3T*kbyAjRH2{GzHf=09JT4lc^x5!K5UXe|0+$K*4IJ()iJvG6PY#vbq;>m5H%F9 z{t#~cu{20^;a@GW2U2am4UH;Zw(JS`FQ7?AI5UePJ{UQdf2E7(I0b8wbM8x;c$;(f z2H^DF3EF$1*k>sARoD_&f0;Pmr_LSS4H06mjz+Ob6~abv z5`d?EvPAbmDAo;ie#Y=$MIZ>EcSsjk^aIcf#cuh)6t9prm^pL8!e}B`;UauU^y;#&1y3-aA`jw zK1Qaw%XEM zZ$-o7`zD9(aB>;qGH*5GLet9Z;$4_9P7C^%M%f9t32UPPdlrNO5>K*Ex0$J-w*j~e z`Lj91kFjnWt|3OE2;OkI5Ib4^L9?#}_~tHwP>fR<5+Ka`fo%`s^~5Fd9Qyt@-WF&ww7t(HkN-y(*n(1gy_x#_qxP@ zUqWJ0#4w>9F-&lX5x(gd|0MKq{E(#3#W0j?S91SNtP{?;!jsTd>m>ZDi0ty4W`7aA z5C~W)9$3excaI`M!W@(FDM@Y(8D|F4j;-|Hw-ph!)Iq`k&-m2t{yR+@DT74jRI8JS z>V#gfnFN*?og7;3h=Oc}qOigd1@_h!g{UD;oksL?{Ftu3zJN2(_lX6aqgBUPe`0iJ zDR=Xj7vK57au-K(ymH3`yRid{nw*TTs5PJsSJXB-fGZieS5cu+j*I~_l<;ti-y_DZa2h4Xqk!e> zY(so`zEknluunXFu2c3b421sIgFyXhm{oMd@iVs|%bYOT5*HKw^*}%I2UA=~^aM8b z)kWQTHlVM=_{UIeZ^n?q*6Np@RAY(5;5V6zELWdM4OC$z`{6K1A(w`x(dro*j5*Be z-9d-hXeG3_lsEbM{DP&FGx{bUOwnBqTB!`1fHu!T%ix9C1hmS+NvS7VW#O36-ojDB zO`;7v3bZ9qYvu~8YhWQX|4IVSYMlbpt6*XQgznRlT#`APgQ?mOmt-bL+_(pB!93o| z`pc~Z|EFi$-R{J;?nYZ7EKwvQB&&|Gx`vjbJ#t1;{HE3^v=D8o1lg{)PqN*8`ULEu z2hc97$%%S2+Wy{YTPCpWz(r6!Pm;8CR-Zst349;|NoGiTI!V~Y=)cbB7W@Q$#aIHz z8>rMD<>moGxp0s!M+37^P6V$7z75PuG<%59J5JA}4Lt#4aj?@fnE-BvG^b}wV9%nI zN5zETr!g)=2`h&B3*Z2;W8By>iTCeLLy}`BB4K(*7RGd7VN^R7qM`k9&|l&-Bn5+b zRYOvW*IM1(hGYWAN;Sj;*(22u6WAlw5MkA$06Ddld~3D32gs%E1SoIh&<+5^W9prKwGgdrD@N}WXa=wqz_=&$VBmHDFA%8L`^1`OKynE@$Y~!~2Pxzm zsb-uW6QD5-6IhLX5Bh@B3BddX=z6sRpy>aJ1>*^dgo;ZAa`CCGs~TqCCq9!FXPDOJ3aF;+UaX1 zsBTDo{Uqz(-NX{$;C@Ut-TKGsK@kSdTO2)@L_q1m z3;?bkEC!(TUaOSyz_9`5 z)%O`<>v!<3cbS@WpBa{y2BG&jL*&!@Pq6|U60zoGwS%mn>q|>1``qj$gH`jGyT|M! zgHL(&;x#aO1aJN*kcZH-9BkvelTNPw@(WA z?>8?}>k}`%bP9yT`;(avqNnaAupxTuDxsYPV3l?jfC);4xQi8wo%|7q>B19_9D;wE zF|Hf$&U_i7+s<*=i$P(CZU+Gl3PW_e0mwn2zZ^()2SsUKsaAh?h^}o=4t7|>xdMuY zxTaVVEUXyUbCoT7Jy#}3oA0H~>$$Rk%PQp}OB+SJYB?htGGJWPaz-Y2morR|gQ6N@ zf*cfOewg64)NZM#1F>4)$fh+b#$DgI_OiVS_rWLrGbSbnQp%7Ia}73)N4|OHxN)Nd;%k76OXTF92}) z%r8B9_?!XIwH?I(Tt1foP<&p=N?zNsk=2y#*iOLavug)@6sg@NMA)<@Yog?H+nShZ zgH54f^T!-)*{0=S+q9UMeuaqrtJqdGv)k4h456C&aF70mmCbH8GYUiZDuDPQ0ESpW zX=gGBC_6KqfU+}H09-rM3gCb3jI>1m7wpVtj)Sr@+ti@Y&OE6Gg?46V+n^{F8|0|} zubuh-+|KNwNGSam9ty>#>`XBMrTUj6q1t111*4;lZWoylMUWoL>3xON7I$lC18N&tU| zo#97SO=V{`vT?=dy8*a--bq05c@F`_=lFC0ZG0XG(B*S60mbK)1QegQ0&w}f1AvFm zfefc0?Rgl0%jbLmiqF&W+>Xyxtfu(9nSirK5$;A_0=30Bt5bW^lV|l3=8HE9v6?33 z4eX2DIz$&=GnO^S!Y0j!rkKfXfXNm%Ain9LiQU{y*n$m&>0K?+gWDJc;;t}7+-3)u zKgJY`xZ80ib4*Jd&SC@>TxE)FECxX67M7;Q{Y!n~wG{yo=z^mweqAJ=Z9hjY)J1j^ zo})B9I|>EkXA5!lQAoh&5R5^qgt)(1mK6F4h!)BX9JvM?3UAr}nStJlOJDoU6sxfN zq>ZrxhcX3!+IXvH)EGR_b-WyR{p?QB_0w!PhVWlUMSbGrH%K@q@F4K{Tz4({_93Q|EvXL*G$I(4?v(-58o!- zxAVDouh566KuX5~*7s`N06k6xBPSWMB z=|XUlCE}1^@0yCx*G>zYSxe}#A$FF9xSy=wq9^>p+vVgj=YqR;&jhm1-MeRk!@`gn zi5iC(ITZ2es5=w`0l0H(EC6>X_)%eZC?Jn^w>S~d&x8DDl-dc5?~t`3_EZc)11bgj z(zYT3xkVR8<0O$*4Dr`nkz)=UrHhNOve&-xBWV*v&#Zw6pMm37S^>`D&puIzJFx+$ zt#o1nS+OYcnJ_OMhNE*lo1-0J1TKRAoe>RTTxi6Fa)6ioz7WJ`70OMRo~}yR(^bMwR|7>L_63r($n4~vGsAqw`U>aF zc(iOcbBl10i$}`>$dby3(Yi1ITLeQ(9EJs06NUevAexL!<)ayM90=fwVY(uKD~75z z0-7BHLL>l%|Db?T;80ksRuVAL>=rn>T8Pa64j!rnec1rE0SNX91`n>nT87W%8udkB zEvVVaS`*9!xgo!YfZE`RhZgzwmtAs$XCSJW<2{i)z|IB_zXMMJwwN**(LWWzk_p}j z787K~DtHW1k03%cQ5R2SxnzP7UnOpqkB-w8Sqzn~lBNxrSbFdMjc0QYtqh;g@s zWS@yn#pK)`bu5y&Z;|%9MrhHkBYV8T7v+D>9vqa9HP%y zrrhW$`Le^ymp#9mFZkMP8((m=oe6R(yf5@T_GqNqY)B;5o|@0^YN3m?n0D5&s{}{0zvU3~2P@VP_Z-+1mkm;3Q@g7KNenf-O0bEM+Bk`P zQ`$HKfUAv*0Vr);!e>Vte}XQoWG$tQHxf|Vcq@Qksg1X@{{FQwe{F?C%L(^?SsMrD z!C37iZO6k{omh>969CDcu>j)X+mJm=VXOx7*S}(;egYqz(MXmAn*Xukmwjs(a!LYedKRsZ9|%)MtQF z6Oy!(l%4@|q_(dlt7)dy-V_t0J#~wqw{#2=-6Bk|O|CliLS%QdQoB$jtEmtfzhR`dVw8Q93_F<~ z2_=^@-w7NtFF%mm-JQ8)%bWC{E&U^Rbv92Ruk0YqM(J>%2Cn;4@8^D6v zmD&sfN@|M{2! zgT5UAN&p0+t>}jxH-dx3(BrqrTgklMy?i~9xLKC#9#{cvciRZkeRLpq5cpev=|Aq_ zv*SO;BM9&x@E_5lFyTM;pJDe|PSz=KsikGZRY_n zPr_kW9vyBVKwpeUhc^JAFD8!;Zvmi=%-xM=IgQX(sGUo?0i>z()6z%v9u8pw@ww-x znczJfLRjIIYUTx!1DtZT`Y{0z>UuPoXTm($!wi|=WrnoZwiB@t{icqUI^j>~?h165 zpO=vvK;6;ZBmlCzw2K)4*j?JLVmvFd{Awtr=>i_q*^USsQ5OKAw#XP1>R-~9Q1mI@ zR8r0}EwemSi)JUjA;f!(;`YJ&C^zF{E zW7<*R91Tf)5851AX33YEwWAm-UW-+}eiHsM|8Wl9FGkq62(P9J{URoPzR->Y7kz>k zNv8QNaW7sPDZ)GM<}oFPxEayoqV+617vi8Vz$lol+w9jmihO*nL+E%L6cM!bK5;TB zeuyo83L=c_YfO=gS5LJYNdpIHcC;=!GwS>a3+1!kmK@zK^gNTk#6;2mItb}0hZ$lh zJH3S)32f%lEc|mkJ3K6?iO=%5>=7&ox@#Zijy^NimjUV7!gvjc!Z1zrToVv6Z{dCJTQzak zYWw;1%T4jkcRmsGux50{8h1egs^R(Z>ojrq1pB!ZbGhXcSw_fr%*}t|=)~vm0mG^6 zuH@Xwdmw86M3O~n`L?>b<9I_H!46pXSb@-o4#YoCky}5s8X^|#NlXF@^d9WlKVH;C zGGsY%NkEIEq(LtWwdd422G6zlhZz+3#Hs)URv!h7=0EY`_;^@}#2JvQ3;J1N`Tzh& zW83ZFET1?CL!G!94C=dF7mYoGBJpbgb5{7o`#H$r2N>o(tBKS50*IA-=Fq(OcTF5d zoHvGWR0Kb$xq@W#C7#DG(Zmxyk#k!p^aLmhqw|xHnRt6B7+AXr;Z~^C#AD33;2Z#V z0|?L3aT>T8&hqk`rsdgV#njV14sgXk$5cPq^Co{ zorVNRx=4D$7vq2SV0^O;37n!ykNXls_fHq%WCsfq{8xAq?3o?fj!L~>*5rpeK}V<1 z!)Qk(B;6MXM&0HqF=$Sw(A5r{!e;Pgp1|sfc!G*g8fFATrvMlNd>B8G8rGuy-=A(L z7)+?f?hl5Ilukk+Nol}8T2eX%2`rR^1WBn%kd*r0J{w<~L=g@(igdyadnp|JS$I%V z5jz&Fy2p`<$;e2&DTE*k+G9zXFcVa=lPbaOq)JeoB;2l(N#0H}w_PWh(6N(DYu8Ct z$nB&`XzL_XAO~%ov=!ez6X1?<9Vb8u-fb~ID;M^pSscJTx)CIrFMb8v7X~k0=hV83 zNsA6Q#7!lBkyy&4`$4z4?Fe1OVe%wi!KAmCbl)l;-rYme4a6mt+S3s zV~zROW1ZeDD!0}yPT}r;PM>H>E*T@?g=3M5KYceUo3}L?;>Y1=cqr!W-MjH#J*hDL z_^1Hp<;Gk9_hQ3v(}zNQ$DFgE1y1@v7mwrssDLpT^qDSlb_GPzE6@Vn*9uWVY~P^R zGcTE9$w1@`0k#)$RBQ)x9)uqLxSJu)P6tqrVly`2hk(-@prF4`9K&{sLC)Z1J~5cU zbpY0FGsS%*=OX~|P)f&;g13RKEEg{^64(ZEG9S=IZx-tX)Jd?h%d!A;MV&SG3h^$1 zzUWUux+QwD4k@_x2%o577q(Kl@5lsie#8J8Bl_s#Bj6e|i-Wb9YV6Y4LY%oA_1?la zC-nQlMspZc?~Clri9u+~Q!Vi`I|D%IhfoX_|7?jYn2x0Pkw4)sON?M)0%z6hVw002 z^xKFmFw-aQXZ>Nse-PR=|Net6P9^6q#7{8jZ}b5vv;}%k_yx8-ZCGrG1?Ws;J<1yw z=2$kglvHyY%)I9tNEfjt0IU7Y6?5t-rZ^?QM$N* z&mY3Lour9dAhanzXy(_K>*AFDc#Z?BjH?#;#Nm*ll%@DW$qG{xqYdIS9xF5izwDAS zPt!N|15sHUG?4;zkaD$Vyo9QP&$r{W##dM4dke5=tY&WdhaqCX5Q)P=uZoG|IDD@m z!zZ%%JQ}4Q1>0|MC^tXGw`F@_R9QvnFQbh98U8T`y`V|CPUV*~{I?2m7Ye0TfwnI{ zHbf8bGZi0-DKEFAB&Qy)8J{gN#OW-wTQeVdTN5#$D)kr&b-fVhgT1LWniezh6-~U! zk>cFE0Q-c`5Y-?paNk6{mzE7JJs7Y3^f^O_5|o6p5UD3>z5EHDgaLPIJ%s=GG9fBa z1Vbr{gl;`oh!!MJH>aMgbq=jRr!8T~r>5n<%2Q%U7%xT&S?MHHf^3S^Q=CdF!L8&b z$Vx%(3Qs4g8}ZiM&9DqrHqhDs6ms?g9i#B6XJR8P_-(Net#-G9!u)QWC01ZYrXB{q z6yxWYIagDQ0W6vA6Eg{H25>*5_TFG%4__|zLCxR$EFqW=r$wYbsde)Y2cZ*? zfGHvaVphTzbEL+&^oLIkQ3AD+ znq*7O7Lw3g>m{Y;RFs6FY?B(5&?YsTQKX&JT!VymQlk=F0dN!Aq~_14)J|$tf?LT= zXp@?|Nve{X7i_?mnoPKK?WN{pyIV}eC!IJk;Y>jn&9%fOmS2o)gz8>@yAT&d0yc2N zi9YeXY3B(2&{PyY7`F8qCcO+3^4{g}L|K@?#1d1iCmH}k$D8XA&dY>dKLQ1R$$d~@ zEKK0sk950D07CBtTI3gb-b2$+CBPYPC`wq?`?I#oDQH;WQ z9TE~@ncI~}y4+6S>T=|AU$p-wPr~qr{ghkG-!Ub2F{o5AvKU{%hNote@QXltAavhj8YK}I$P_J0sWa_Ml? zQCwPjq$PB66P9QbE&r{K~ky?tgr+V0z9y?HOm18V8U*90I8C80QeP$R659LmAz9s@^4W`{$2PV zZ6Ifn4irfpl4~~JLUs`rs<6-ZXR@_DLU=) zi%Ew-1+00<5Gk7iHc-Dx7v0{obA)~>w#D=ms2kf2;-?4lVfz=o2V?T{a?J*A){L@8 z@Ks@ETm=#s$T0H}Vi*fMx9B^Nc;*k9`1t*RSo98n!8clV**Jtk?6vzzI1>8h-;jR< zoYA2p@d+#}_ZO8hS|cM75B^gVc|-BB|Ht6QE{`A*K>$822s@)2{*gXu{CQBH7}v$1 z4r!^w@Xuw)HUG535;uS97sk^-|K%cloaBOl1oR78S>ujR~Ta2!%og$ zurPf79iLsN>{={*-vvO_zL!lg=~Ji9)gS8OI|9f7KU(qH&cIOB@cuoUJ*dF2aAP;$C#qk2Y_|neby3v z@fA2(?8grb(XiCXnX^NP5%?sW%*mPwet^}o&Pe!~WVOsmT4acgAX=iPsRoXQKn3Il}8~H9#zjHG_l7@Au1fKrD65snAU{i%57W$n! z6-SzqQxd_`jiyM%i1geE_bl#aEV4QUMbF2`!n^K*O@A9A1>J2vcCslpSAc~CzI?zG zBfs$3!1s+p9R0Hc#7@IR{ijoB^ey-tq2|=Nca|>BMl4Js=x-n@csKwIi22Ov_?c)7 zu*|vY4pYoH&nXr>(G-1F0HEw7!laM5-x<+t%>LSY>=89D(R`xkCa2i4Pb_iVnGWhj zn|$J&9u5$ONK7aNz%Gp2i`8kdgKg|-hKQT!VEbT;AuRpUl?M| zT(m>lj8jdq;VmbpB_3atL?lAyj4IH@VfZGV1m-nr;`^}@o<7e%bq=838w_w8QhPd_5GBdOp)|wUvi)h(i=+n=%_6h&^+)ls> zPvn27#YA;0)@2FAbVWf*ICOhj8$9Ai-3q-oxGkYDR`-RX9JeSAH44`t;`PI2cB@Pn zexpzNNl~kuQuKKW4vO(F@xa61)Zk-=p2D$wQp+OwAAy!f@3RpxA#*`6s`Hs`a7M3S z$mfCkmSgGk<>Iyiea}V!{)Cxr3GzcUz{EcpOhRp!YsKJHU(c&yd@F(WQN_FBNRz*bxe4^W5Rb% z0<6B>i+G14c`Cu^kPx^Oen*2Mnoh_D00(kHLSLW&2Mxy5Zh$pZ!hvd`EY4I-*Tr?z z=wQx1QhZ60E@m8WOYx$^ZH%rIfB(NyOb!ZDpNUU=O|;cV%v@-U!AMmaW57sV9RI!4 zI-$$vBAS7G<;TmD=-vb=s$0~kQ&jJE04b_30B}Wh6%cW_Q`PBnmEfK}H=7Zhy9w?Y z$5zfYI5{q1T#JR&`U?>%TW-|)%S}*ApkG{nN#rFS%1_}18cwS=gf+A9fmXwC%juDlC7a;XaVNCD_V~6IY=PCq{5;)YL~#p z+xaMwph|F@y$SMd114A~;g0u}NN6|SD#0CZVLn`juK^3sWQKR_4*0*Wg@?1lmc$`P z+LO7^p&^hu5dm>B~c%wp_Vz6O>%I z3BOS;ioG2u`GpSrR=L1rUxV)*9sw_0I$Xw^woflzmj`Cp-mT2}af2ycf0=_fg~Ti0 zKw#+M95c?8o~kT%`0cv*{A=XUed}Lmij(Mu5J-o|*1u8;nP#rVHh&*1(KtHh?br)E z6U#9Pd@)oLSJ)1TW>$ZviN8hc;Wz&>)Djq#!sCON5`CVwY~S#KCNb2(FFQMZR+1F1`l)BP_eoRTRDz3s3N3agtSygF? zL(X!5d2yDA!4|a48MVn0#~$qf2{ne8gcY33xo4UtURI;<^xKv=H{K!V5=^=oA34Bt zPa7gtIqQG@rztLG4hj87sSr8!KZ5s#T7L%HN@h8p4wXSD4%MD;(#Vv&6={xMgt)Wx}2d;9Oj3iX(SEOEgC0AFCd z&N6f{`4k6uq^l_=%yWSG1M#jO))M{})DfF4IiF;mwa;53xd=JLw)X}@oP?2-K=x!q zoD=0B2z`n7>adQKb)GE1=Q_`KfcR)jR71`s>hUXt)B>_t?Y9uQG01rnsArvNiq}G@ z0|1@4=?#3*9P6|GT=g&e(GpQug-KxQErxjM-hd6vzX?+XYb}|R_K+qnLrW6)`)ETH zPI8LP`oa=t9^wGuM@(@d`YMZcegsmB9!bDRGQ~?!BoY|A)f96fs0e~;=J#DR@h2z+ z3HYuu#9^4=61b;_F2;P|)ah>-q8lVb=2Rgb^9nSc#MX6+A#T9TwHw7(-B%JQ1nQo< zP4NNdn#{T98m!N5aDY3%g~GbjX>>r1PwZXg01thkizrM8S?BC?H4%Z-N?`diL)-_c zmB8^g8RAJr&Y^`qaT;V(=5+s)5U)X+B%xE5;fEZiI@sdQ)Wl7YO<62{haol*AfYd} z7-BcXQRdwExG5gOB8~`zeq(P4-^2LFylbpal#U4qYd6O9%uG}41ew;!sD3SCKQF@8 z$(*aPvwHvA0Qw;a|2`&4&09{+r(=b9>;<2lQ?m(Mj|7PApZ|g(JQ~;VVcZg5})0n|yj5pF>*AXNV5u1c()oYnU6mY2uu}11~%C7*wYZ_Q%?Q<_}ro6Zd}Ww3xL$lcd^b2iAx`yOiBOtkNCT|qi3G@ysVP1&?|pQe zho%;9^oh~1OtNzpwDPQr91652vCO*40Y1cT(xYsY>^5%~8mH zQivb@PMx$*5M8|&Iqbp|goKV$InN!2jYd_c^G8D5azBc(+s`2~x<>(jzR?hULr$Zo zKZXcE&}p>r8$;Xyg(%5+r%4xE36Pv!c)h>qYbWR4O@_!Jz?>)M8e->H0D@>|+XO?r z8*m7HY>Fi=RD@nM7w_wJs3>7MK##Wl*1Og=IqZ@T`;olt|9Q7WIIO~wt(=v6jg#f#dc)BTa z9&?KQe3&U_T?c@|x8!jlvY&B)lZP8(CdHB*{rj7`i2ncpvEBBrCi-8BMhV<{mJkbr zLA%%|*shHu1z8xZ4O4`;`5^~e{gFO#Qot#8*&a(+|3J=dX!Onb7_0}KVjH@fB5$|T zxvRTdVsQv{s6Zy&jEMn1M5>lKIAZWL0p>JM#fi#F2Y3UALsr8}lT)+!A|W373xJ_$ z=lBJfn)4mhxkvlN3<8|NYd=9x55kzTr``Uhi#2Lyy`FB05wJFr@i8w5(TxD7^P8tw z;`En*nsqL@zz`RYKn_*SF+NiS(t(XCV8>VR0%DLuLgTK17yXFS(}D(FypH32a^#+_ zH$>&b0H|GFsql&Gw%MqKjx$5TeBlsFq_6?}bddQIv|LZk0Y<&6i{r*Pz=f~l0L>H! z_2%(B10t$#yq!$&$LWu;8C_IQXQ4kwJ5kye|MFbUzs1zSd?AQ@h zu)|{k#qxf?Gxy%yCGd#t_x?Wb=gl9RIcLtaGiT16nK?68e(T2EhEY-sAI88i9I3wg zgejh&AOR3Ma5{q3y=ZDcT=yB0{05YBctV#Z9gdd5ST-yuQn9%m zen&If<89^!*eMUghh%J`DS{WOaG#o(i&v`f;b*Y7kG*Wt#Fm+Oa$klW-+;!g17c4A zl&xSr)p*Rwt~!7vBeAMvegvBIz>?t}hwM(A?a162(+e+t3?76m(*cZwt4aO6Aj7wj z%n=2K82%A}`T)K!FhyhNJ4rU-OHIr!abkXpnj-ya0Ib3O9Bh?ubI9PVFM1C})-0!A zW!R0(jlhLf46zT|M&@=s-dOw=?2;K69bu9XV4+Wb38s+@Y1HA4`OXxly~7c|yq%_6 zMPN6~Kv~_v0PbxTP!ke^R#*czJpzx3A6|sLnG2u?zPLp{Ec1z7_~0sQ4hJ|P zy`jym6@v<;(U?|eZ}qxjWc3T--VSPB|9MT^3ER}ZIuW09>xNH#LHg_&m~Bs=5flrN zn_UaQGMtvZ(FbWBMVhfMnc}H)9AK*jf8VAcV@#{&nn-Ep0E<5jh{k;#GCdpXS~sT6 z5mVgQ+lirnV_z583rDkl*@$@`Drn94fLMrOB7tuvX`(;cZudnwd+)(K%vyIqt)IRi zAZCGEvOPBx;e3HjI1jb1z6~F=Vg~SAHuq-)vEBqw2N`^SM?idmgC3dnm^58f!hBD_ zSi1_IiWm&`>*$mDLOjbPuj5>@Z9r@z9*i;y(o9i@5x0WTg*ao-+ropzSOKkG0Cd(Y z_^M$9eTEUn@W$^j<3W8g{L_knc(}3(R|bb7kX7K#8?j>e<#Bk<=iv0K7o4j14M*Z% zG^0ZReuR)zCSLv>Of^)S;b%XC62UEaR0uS{%y|2(V@OaNKb6c>FjL{0D` z>vRAwJQNV??{H#%tPvEq&OmySZMUINoD77%7%eh3;C%CaHl`mw)pjYqO@_uZT>2f< zKO2B>XE-^{LwLXd%_tcM;~n%2x54W5BlJ(!Xw8@gC!;G^f6#w@8eW4z{YmrlQmj0J zGA&$BspHR2(uBoSQi0UNWMSMlx{RY=W3TN~s6#e>Cx*Psh@CL;98N>`Cm>Y=yp!ux zUFZiO_~siSOjGxv;QQbWRi`#EwJ+AiP+}g!U~#-@^TrxtIdRv>wG4)_S$(4r>DQu` z_}m{n9XZU-dnF*LvTluMPAB^Z{hoh zNk8EU&G>!`_Tw1&u4dem8W7*XgdqN^#xUfW-@6Wz%z?0&CFNxh)B8I+(Ew0eUMi3m zG9t%T`N$<;LhpKpbfHeX6e>nf17GC6D^{o8Vy}1s!kQ%#`&yyP+p8_z48#L&uc(It zk~Yi!bWKdcW*kXBT%$;N`Xousb(t7VXb>QE3WN^wN*VNqE)J(OA1N*WW%;q@!F?X#(;v z)fJwsUv-fL^AOas9bS_&{)Jt5EH#-;%VV2t_JtW+4|0Uq@~rL*DWqk|q%U8pYT&Y3 zNHIzC)qoVT=;>|?hFCc9!8#l1?T^te3Ko3U3Aaz2IZYvY0#PA~0}9zBe}*^40^(u} zV35mvhr0O|d;r&FthiaPbccza^hi>k4!fL5NH#?^=tkD!5af=vU_5IP`t?Co3nDTq z^7?o=&OXo;Uv-254f=9%Q?Au9NdiJ$(vkJ< z4A8B2W(l0mF$aJ?d<&R08>5tI6_Y(VJ%YiK_p54NL!@UhIQ5aFCwaqQHF7@r8wTcv zT>&x5mK9Sn>+rPaCS9BF=PjiZPwSZl7ugc3s#OaA>y99K*stl$IXYftMjezN@ zC53fV>aU%egckr&0!r=sP}T4{)boG>kd5p`zq(4C7!Zx1kjawL7gR>>7_zrG2pkTH z2%gRf-LykdNJLMALS0VgmOg?fjg+=Ae}rAhwIp&^Ea73UD?tD1sf)8Zs-ovlQW?{& z5X9~6yS6EWE0Okm2SJHUNzg0V)BFg$-xlKgZImuaA>VL|<0BGzeDrIkp#kg(V8er* z%Bh4|xE-PR#lh!R`u!J7QAt9RDx>g2>2*Ey1X<~m%w`e>3*T)bH#XRi>mCM#LlGDWd{fYX>bEy9eBe@_Xn z8-GBH$SQk#7%cK6iy8YziYYgErrwG*=pos+<>Gq5b7HreR?MP(`1&mlN6=g~u&#Hz zz2CLiep4~_{;7&neOyj;ag>&a80R3c=2kblCS5E z2Nr))rFc^J!1n?1{in{He5}-!n?t^shP?r7FQFOXCm_m8QL+?;a*ZDZp>K^XD#XfM zJjv)jE+C$*sm9JAXY9nAOjo%|vnA&EtEWj)dj?v}rksOFmS`__5Lcl|T1zd*UWEWD zE+gWyK*fZ6oZQ<0psqt&L$K=?lXFQ>*<4s7CdMt{OI%f1DO=P~L8vmA4 zhYpBj<3k@VRB73Xf88;!0LWf*FCBlkt3pX&rsI<(Nc>$I} zat-4r4qoME1XpDwDM!%obdNyjI5-t%^eM-fse&7Fb;mpW2Y^ougW>vmEH%wvvBmb$ zGnS|{9UB&HvCW;n-2qmOG{rN84)E|eO_cr=Qe-7_@R3DqbIUZ7@l-^0_=^(|`t{k! zv-TKW9EMC*nu=wpb6MrhLs%<<5s9@~{!M7P`75NcEtX}8&56S1eR*^A9c+O+rgFK_ zGyP8ZpkhbW9X&B0YqjM8aVn~dxX`R)mqjwCOds|38t6PV4$GC&?lx0Ar%EXocf)kt z?pF4{dHt2}1$|2y^+I2PE-Xjh1)B%X5D+@nz~w30Hu20)T)x8wg8U%zEHF`udwO+U zv^F5_cPH@5Hl=whnvu97)8?&h7xr#$6Tx<>o7=%UeKfI~!)^sG9z$C)dH|xUT@uXl zd>Xq0LH7pFN5@0BJ~|%4_0c)aO>%NRjRz_4C_!DUK(GJZzFVk{9O;7)kbFCGEgX7V zp!IAqHenM zRtd~$uE2DJm&5+ie^y`;@UDzxSwB>aLi5Bk3O)m{WLZgPRWBmy!Oz#b&rU?#eRd*F zc%MB7E%z?%vyU)(gm-D52(re1X`eU@AbCe$UfOqwe&;?r6p-&eyBu9BU1nX}SBUew z{Ap&LoBVmV9BhP97H}4^)A*D?dP3dWkc$njfWV$6ho>u!0Qd)Vg`7#T`|ZukpJ5w! z(7l*E?v_*brHGPhWF%(ycua0NOnx~`b~#Loa+ovAVN!uHPBn44iaTd_YsQ9Ny13*6 zR!TD#;VfbX=Yh>Qf`OCYfzB$tx2h>t=qlU_+}gGZ^q{HM+!QUT1`ytkHJEm%!oT*0 zDGcTb{8f(!#A{qL)4X{T1JK;~SU_zIY{sQ86FyeYj$|~qA}cYz042+fgLe^s=6;+s zFdl%=aVD-zX#bkDGfrA1{SnJvg62^osag|%w8Ejue#Cn?0WY8aKR8X1MIikOKRMH1 z>qp4+YQwl(=iai|5NEOd&qlw1k4)6p?`hbRX^g$w#Al^q!01%{Ueq+Gy5ZRb&LpgN zE7tqDus5kl7=!-*%}GTWoBqB$Ei<5W<+GB({-`GVgqm~8M@8DhZGm#D7|a(GxLx1)ZXARU*$VGTv?;_l;CtRI<;J)Rw z(BJje8_wki_bn$PFwMl7g*AbTGYjiFM4nmbBFdgQY5u9qq;f~?)P--1u&G10qDR^W#mZ)2951=2{b-8H832BkXWw#X?K5l_>6x$tj4v_i zaDS*m1dxt&!hG;Bwk}!=QD+xC2|ME5!c{E+yojuZ;dt;$0`I{Qa2ni!Rug~&kMVd6 zpR9sWR|iiWRm_3Q4kL=``XId#5)WXvi_wcT^T7=PQ8Nu;I)%YzAAlOK`X1$%9^HIB{=zE^TW)o z59ecM$+nz%hVp2*=ym{o=i~jX20~o)5rE+})H4Pb;Xx)d>oQY1J6tpa!0pLATLBpz z9cSS^Kt6DA5&d9V76-~Ic(^&%22KT?rxPZ2^)~w-csbH2pKa3yq`vZF(dya1TP-Q zn9XMe#T5h^f;V66gnBLpK(g!W1m*PtNj4t0gj#lT$kI!MylWt1y5KbIG**Xc3Qt!z z3S>;zx8T5ooqfjOdt4ZSW&_-y;4_X@r}2Hp5p2#w({%ChyFpR)W%#`A+h~f71Re&E z|E4B>fya}KdFbMx(3SvTO!w|^X8qWSx#Tn);S)fN&_BV1W+oxTSIVm5sUM+V#A5Ou z#%pl{L3KGCPVN7g;;h>oV4?v>UFOV~et24P434S^fZ=ad#?Qs+NI&puU5vwM zYa15_L|Zf?=jx!Qob0BKz#|fjz7cGERyP&x*#I8I`yZPiH93t@@r-_&cpAet=X@~h zv@hWaS{uOW7%DUW4S#S5dCnw|t+)ld4a|QP$eu2SA8;K29{~7qKW-m41^{P12$S9g znd$xUW4@4zRlzq9biB}M&UzVY#Rbm47Z<0nUt9B54FAjVxJmAh0Q#bw=@9=bk2t^! z9~z?lK_`QzFXFu&ymC;p337V@gY`RRz)kP|mj%RczkrOu=XeYJsV4zEimbPFgR>AE zeLy_7695Z+rLQ46z=ONyZ^+=9$4#+CAZtD=TX{IVzX+TGV929* zsdNEqK(Fr?;b=1d7N?@0O$>KX zPNXG}{vMo0a5F)s$-OQpwqEPBbaobQim-94XvZqJT;bH(c}8*E7kB~l2;%cB&75;v zKoqly1gyz8>tN9YKFT&kCv3|}p!MlNG1CPKiZt;bCyle!UjX;^I&kE#Sr;h>t%OG` zvmvne3R8UG0O;mzl*4nX<9^&eOXQvkf_8JDzJd-AhA;ce7dpV=qqrgq7q8p}AUpg+ zK-@RZ0WO2@cZYi&vUjkJQR5yb#=;&*H+XZ%G!5~X#S|Ps$#V2I0WoPWfc@OApa-0} zd?j8WJ1r#YZ^6SR=QIUoeg%9Cu_rK1z`LSzaccl$zkW7=)A053TAx@l26t|Yg`&G3 zDetX-hAoCDo9(*jf;rbO3ZM)gZShfVk*N#Hd2n{9E)zHVuXzHrBqF>ft3#UvN_eiN?X;mQDGgpMsEcn(5Ol$D7* zg?V@;-b(UnCKowVzJarwhmzB8f3%`Ii~JfjdkLJP=t4G(tA*!rFrem()6G*O^SJRAIl&rI>@ua;=gP3V_EDVHO->)L>rM}j3n?+DFh z+@2E@kHYb&!9GnIeP{b}ThkiXU1VHBA80Mw+Fa-~*cV9X{-N6cc3}ICVJaRyDjJ=o z<=St7mrOuJpms1E>Vuq#K&|ACZfJ;u;L1g9+=uRSa)D-6xorGV72_g80bjNaOEsR& z3S;zMyy1ckG`9_Yj$HRJE@a5K#Pp@A24SQ@8-(%3>v&KSN3?Fb7Z4$LVa{I_a3X>| zkto%a34%|21pTVQ_C|k$)9}H`k9{?h4Zi5u22U;5;P5lZB_BC9LJro~*!dXX0&fDC z2%z!fFe*D(x|mJiRjo>JWe8Vu05ppRf}5Vi@iD?pW8om59w|k*NyRjauZ|oJRP7zT4(0|3iTv^Xyu%zRc8n;0G+ z3+{&rS&DG;%d1)MAbbGf%r~{Lbx$`m4OV>SC_OE>6aZZ2MD6Rs30t}$V!COW<)Z)d7NoAtVa{v>Fz+4?FFn@~JUak0pHWLp0oyXn*pF(q$xQ zSfYjPXYW$=r9NtO4W0&i*oSC2PJMFHdIQ56_Kc`8QBSsZ0)W*b&tNT{!R{e|^HJ`>cU=r*i)*#9H3P2O2kUJ3P zZ`Z_F2e4~mEHGgd37Z$=!RXLADkq897_g^++9i+*M(g4uSe7384x`2;$ZQ{?qo2Un zk&#W2TO!{JS?2*$xAeq zLwXL<&{4&^NeZ@mU`Akj2sd7!B?bGhz=9Q066maN|g(f zecnq|H9;T|?n_l3!hNaAL%1(hxd{3E4?dW!`h#7)&H-ds?*tIn)qvx>nh39}%U-I2 z9#K_tU*z!+u2+YL_>*28dz^YouZ|-C{(%iTVO)vZAbIIhQyMR~2#V)^mIjdVKE9HD z^d}V_`=};j4*ttM0dd1oi5JQ=m$yrXz(4TXiCf&Sj4~8LjDAFnAWizUAzVd?3ODKbNd5${e-}^uzbxbAL8W(TyK`y zT+SlDo+ZS4SXH-N6U5SYC*CDQaV<+iNI63jBN(#+KtWwioQImV>;*vJ@%7O#)LZUB znogrkk<$>sa{%7lp^1Al0pwsAWVYXr9Iz5=c_ggqdDT%`T8XZR-vU!^ft@akeiFdz zxE(DE7=pFv=a~t#V$0z_?F%$9n#R06Y zT6O`@xQ;2B5=aLyvbrhmB7l0Bb|DlLfjbaWx*X3NvW86a7;X^XP9_rQ3Vkw+05iB7 z=ZrH6FoTO9FvWT-^%#RbiY4L)3sf){+bqLyy571LnlSrrEUA7DDPZ&&LM(&NmyGGz z(G>4te}RDG4|ppytkL)hP2}g`rR-Kf(<9Hg5HDlYA!aWy(ygyc0#?Ef#@YLO^&?$0 z{uHJ5M5*%{<2xE(IzWX>;P;627GqGyF}V;C>X$18D$5<|=b}N;6&}^6J|OWh8kChV zbgLmQuN-pm9{s;@i~srF#5;HVMq*OZ!}amgi!G=(&J`#1F&vw2gca#>%f5+WbCtr4G*nWnbp} z9eE*_;n}xnqT{C_G4f)x=gD@a$iL132KO+;t9TJp#!Nb*iS6?g;MD1s2rg_gWmnA@ z^P{d3BD}n!lMdl=vz=sJSt^e-RS#TTs*ATi#x_?D>c_2NV6Gh~B`C){^V`s+)256gwH6 zzT);Gc7268y-*Vyi8>QnM_s@>3Kt+rbur}hnn!U35*sO<063$kFV+b%$##yO{dkjs z@c`6)cVod6A=b3OSJkj_A>BQV%1_{7PX{CPZj{B2FjDm~_%X(h)5KZt2gSg9p=j_r zNcJn17&rr4J;okW%v*toOQA`N$Pc?VYTW-ENHEb;r5C|nR#2R~JR}CLPSVWl8VAL; zAxQsplBRzOTipERA$&}u7|{>Gwa0v}p(#4tiFo*(n!Co~c`Dom9{3J!;=TdD+0Byy zv_zwBN-)IImQFQRq-*$MFUmWLYP`j*2w9E$UJ>GUq66$Nvt>S>{()ocz(iEz=7=tK zvQBkT4Q`Z}FSSQC7#(FbOuWecB)WQFEj(u|bS(!z$p{(0osZ|1&bP$mx|;q2Mw~JD zX;b_g`-79Q8wjFvFcIiykZb3x3y8~cv+X*_`df7aq7uWiG@~1wTy!|#B8&w1Fcs!w zeFo&qY=}L?)jwLIGw;nuAa;`vJ3x=McoQD?ePzs@&7g}8C;(+q0{da#Krm%hq+EmL z;Iq(T5@@*35P7(}A%XR0V7rMaN!Ac=>uiE$Ac3P#=^}>(AV%m7VYSMkXB@)ba}ku_ zw3{`f3m!tg9M%KE&V|ouTXiv$u?d=S>TI}XGZxHN3SsU5C<|I$2$yUcqvGYJsoc{s}u&d)?t*0*!h@Vs8KKLBSoj0Z%AY@v5W_Ojl0qQ{F^pC{Bs6gq!@OMoA$DL%UlUo&d)c&Cj8T^e9L3;B z20n&LPqgWSnT41&z%+vSXy(3$C$aE=%c%1?1~D}7EG2F(OVlp10=sv@NZh20o1lM2 z!9c*cq#$!OWp3%Mi{w{v*M22a-;ZXR?XsX$q4&O*x~9HGHYi(`#s(P0omx= zG4dzF8U5#`*p$5oONn+0Eh<6;2!{|97jI3b` zux!TsJvtWy{OEa_C~|?^!PpoJsTiT}qxzW(`^Wh7EUf7;)RvBt9awhXINCWV`8Dox zymk$~84u0HD-eI- zt;eL|?M$JkHA8iZ=Lbc&8gg!}8E0VuZ$}XBprzBS$Wx^l#Z4AsEr_Ni*Gg=gtrl2Z zgeKR{6d5E$mwG!YVkWkJ&}qqa%S9EH;!p;oD!Hl9tD+pEeq%B(#5cxU4tO8~bcw{t$|5o4Xz&xrMQ;YFdAzGHa zUNaKm9BQQ?4DZD^2cp{<=4?abMm7=oc{Q(;<>cEZaZZU^xG_5UY^?62E|DqD0t&1b z#jE-URW;5{d|3;hV1EeW9HJc8uDrnnm?kabGQjYiP!o3k>l%hH*MHPvMogiV9;eH3RfFNh___~_mJ-N#`mIWkrudrhR&G#i zhMcDtB-VaPu`M0Z=~spmUK*m{p@gReybA~Y0n63$Keja8^o1%xE=@}T`~yo<{bTf( zQG&z2COK#yUINH~P5N>buGW4N4L4OKEZjZku2{q;JjS z(DO&l3Ya1b+5?@d&hpDqbS%VMq!fibP;3EPvzQ0;q$gpY;2oDbtY3F6)XeE0Oj9EL zbl%y5(!fep{}c-kW6B~^3~z$nkNFUgoAD(cSPjqg7gWLM)sY_A9cVM@s|iL3kSR3jD0AKHH5=On}oAWs8!GQ2NK9tP||*gFh3 z0sw~riTuU{W`HI2U1jU@Gxv;7JF~E~>9N9lsC=tG7ZX z0~m53;{@K_(@Hv83tSTB{sb%@S>4PNM76pYDA3>k^7 z@>efX2&g+T1V;(>w-d?`cIU*f=b%Rlds9l-tA#}HrUs;(qMQFUvbfj?TiZ~`Pym$K z;3J4B0swinRw2Bc5v~K|CIa}FrF8>XQ3~L9@5G=7DRb&WmSkAKL3npSh$wS@BnfNi z$f@-s+Is*64H;`>TVDbY-=JCHVAT2$Kqi5K!A90k;c(X2Y5bRWX~(lz3g1o~&ctKZPX0~Y$>J!K%u$5D*e;T=VDE4vmR)Mjn5vQa~3 z#}mq7EITK`Sfe_HtNj%4JpdK)s*j5v@^q5|GNj(2mh6F|!}qK*M4odGmZ6M56)O^&*LG z=cFJyyDsNZuH2-^QWLn!=f(!gn9I&fbf0!eW{NgA)Rg9)OmP-aa_TIdg_xYo24Y^uWSsR^R{u# zTiBH1AY4Xa)DOXAP{#TUI23W^61xr-2mDY(+TJr&g=3j&Rno<6314dv@&nCjkBoIv zMUJ6)S<>9z2t^)&x6X?C$oXl_m^D=sU!oIZSOAQ_2~UNi{Mc8TQ5)+_nzga#G-Cza zyIM3yco!DeXTXUl7vWblqcz;;_SZxB4NRC=?$;vC+nRAbp0K^A7Q&xsM()D_(GTs6 zeS}u<>QmY@EGJ~Ueo-}~z_>kl>1HtMYHmbsGzDB{MXVjZ?g{Ta?7)gxK4S51t}s%-oUW|QA{btH zvpomgh%G_vi?rL%yiF79FgwK#1H*-TISaDu2fE;%S8Sq?`!?kWPFt>a0Ah2?+lP}c z4T_D-Ue`iDz=EWHLX}0#&;sSDhkOH185mcw3@!AzpSq$;jpd-nx7<7-Iz&KSNek(Y z?TMm9tg=h(w^Xl!L*ou8iC8@?lqM;^qY;RSG^O69oaY!xgd zrJj;f;^+VO1ww4Z60=Ghk?qS#6rVTT6g}D49`QNhSzq{9lF@a;`00ZmBOey(`xs9Kid0-v$&-t1;*y_zr?bGLt5QtH5r@M>wV+6 zS8_Pv-62ZD)I~A9QUdnqZVE=%3h9rqzAL6$Se7SRua}dP53Qj12FkWqIyRer3W!h+ z!qp*gdnuUQ7fK85GsQKSCI_W!X}z1Mp*<+72B3eUK65K-A@@vWDG)q0k|rjpmpTR| z_(qPOy-TAwNkexIs_fe+qByzyzbA@g!rCCHh61SSjSAQ!y|bPW6GDoAy;WgY?ZF)S zfDu`VZ+u(EoC!IV67RTK!Ble-njn9@2?S1G)CBpB0nfO2pA^-M=eOhT62nPg!;A#P z4!r|UloA6|MCj*(UHS$1F}`Vw#{y8;45ZrK1>YWNjxa{jbp_^J8}scJQ{`L_ zIkT5_QW=BsK?9mCv!MK(iT#fAof3n`lz7I|C{gIR$t8^22H|c2Y>x%3D8Id}w$5+D z-Y%gmxXl17Pw3KIS<5#it6k3jR|_9F;;`w>>cC3sd4*$mmChl5Xy#}Wv@#qH7) z4k65`7V})(Vobt=^O48<3$Ud^>Qj@f!wBy|_@XFKBZB*}p12PegdgdWX*o3AlV-N5JKC zDFKJi2N`zueXOBAKIZ^95ufuI=kU2V!hey^6)(Y#6|x!fu*2sf02kLk89ti}ar{T> z21!;Ggi8><=vweO0^lHlJdMWEv3#BdKAU}Z;INjmy_aJ_zNGL)H{~gxGMFeF`wDYe zrh}Tvq1HSXUCzFT)#VL@$%n8ufb67f(Cn+%sqRGAh?GaQoP=IjSTO+++4oknJNe+u z&x|D7>aGY{fgp1&5Jyi_2q-pDdzhAKzk%76SxCfse5Re#EfE;CqIyh=cpp2K2&j`# zem5UQZLWbs-#g_{N|7y<98~BhaBQi7BfXSIG~?In;8loA4G25eAg1mz#B*6_i3k8i z_hB;y`ZtYA1s4X?Qql~52WN^Lw$}hk9wYuX7GKO^w(>xeYTew1F5!A71)m$heKHho zJ_jdciQ+5NIz7eBrQ;2Sl6MTQAl3TcH2L}8ls7;n^m*X4z6Z3iThCU?EE3k#Br%=j zU*XmR-+QTuEy z(fS&(xr{wqYbL*V&seBqQM*{H5Q;2Nx6isPsaB5h#Pu{DEav%iIx63cc7_A<(rVb2}ba+R|GgLJq>) zk0e69Nn=r_S2N3fT1ATjy%PY1*`hEXAmA5d=&pD{mWaPB$d<}h3bO1oG{qZ}m(A8i zQ_QcCG(AL%m^{LIOGGN`6-BI15$-;w0lGq0-JPSl+bCW-GboQhB7^iW&p*b?Cf7KIWh~bt|OE5 ziuNl$#E^&{P8{bHLW&{xp_9uOE1T}0v&VMOL^n$O^}1IA#*B!}K{MPEh=?meB3Ocu zMnEb8?nJ)`AIX@3_{iJ3`TewjC}@GOFcjzfif|wNPp)L-QQhAAylNZuUgQ@&YWo!- z94IROFVlpQjhPs6Qi0@E3W^EjVQs^XrK+>`!)!?%qhi9#6I9cP7+WQfu<~LBzY2Iv z!_+W$7<>1}L{VF-1(ZcrECd{BV8qneApjQ0u~P!T8#}uR{IRi6HleNUt(b zKWk^mo3W96cb3rU%wWz~g^$8{*)%Udk_gCTTh<5R$m`?a|pQH%>&?Zw>JToyJG?TKf&E1G^C8X zxcOKILVYE^c)%4cW(o+RemeBGRIAu~@y5?T3YtUHQ2;7)YaYKXyBPMmT} z#XGYnqulba{&$tzH5X#B2RM=*s21!w4w?=?I2sNw8w(?W;UUu2loD6uR^h5Ox;URz z$UmkE9Z#|fC1q7m26@EC+26vj`M`t7SAo!6%)=a2C|N}Q6UZ!2J#2_3Pt+qh!FcLw z!D{6v!|Dfdqc|6NH4Q4?4SD=&*1J$`VMNA2yUDiRD|$E07>%$6@t8)ITb+d!C`qbb0NbgaK>28IA>8_g7AqJ z<=(V{DvP9r0k&7lYc9GFwvSPKXsssQE+Tz{_H9EIbJ9T-=@+bO&+{Q_oniz++XpEM zZfEc*%+PBN0-SLA+wR^~(PXJy(mk`3h|D{1vCB0}iHI{xB|@5|7JWc=qh*o)xUcOx zfUqax96;EfI0q0S;v7IE!tVeg5k3cygDAvv0LjFP$#Ve72jDt@jAexD08&K2bpTlk zAkG1VgZtP=Q7NH+)B%L~_#Hsjp&-uzWG4X60b~yW*8$`R0oMT}72WfP96;g?_j7}p z|H}+_xv?oFxFy)*u37R&m}*oO7&eC-RX{bwN2b9yh{MlAUB7yH>WxuQt}=bS6Is^w`7g=KDNQKb^ zfTu9J18^0_P=-&SFs3rjQ5Xvm{v!%Qe+|l_9M4y7)D_RGnRZ7XMBMQ0Mn6aZg025YX3FN9+5n=oS9YofF|B+g}BpAb-$&Y z2LA}o*E~Xvz*S#=8ugJa8;$(sTCl~N>hw1Lgj7%Mg3Ff(j#cC;gwHzG3J4A}0)QX=G88t)L7pa==@V(D%NPOu7fF*jJ(mc18_{B4Ml#kzY5QxN)%} zU>5n$bJh^LIG$D+z1dKrIwWXOOXfm4BNqh2(m=^4;2J0c0C)z0s8TgVfy$fZFkjt7uwq#&4N&BKyJ3NP@9SuHeq^53r;&k4EOR68@3 zrz>x=e%*mrhv>2bUEG}dw^2p(L%iAj6WniTC`7+8*vH|Kr0lK3E^Uw7l|JY*TdM&2B?myW4V#-yT5xE90tzrH<_j%1+dx|0EqL0osHT9lS zM+hvWI89b$%*?B-mk*58U8F1=c;q=mnv>GT7iryy*TXxB`&w70wX;`^lcb5v69)!UoyJd>7IYNDSrEilvEzEvy;`JiJp?6R)^>? zuMhbxHt*9^sDV)5Uz6I;Y}!NFfYIGS2t-$~EY=SaNWqN`cQWhYmUt<0viN{T{uV^z z@eGT8sRIC<=-~`==7Wa#2?H#O@vfgy2iX_n!MxirLr1^C{k-4S;S=sz03x`#-vv*y zA0q8wTmW3SJRmA`2#M(CkQQqV|1mNzdWEIMdfugroJIg1v(zRRIpzv%xUVi|H9_RE zP`SGdFMNgSKlmIL!;gX>VpX(wyJ0GTlzn<-dCOrT0QZ)|YJ|Ph?h*p-Y4>gd?rAr} z?rHZ%s8e?{G6%qk=B+%&xu@L-pJ?7X$y*NS-l(z()7iZdyr3_YD&)sw%&fXW@oqiD z*0m&Ko>rY|6r207k}E~ea(s4V`bk!n{gi`{8GaYe3GLacC?N47dWMERvuBJ_DD;Jh zPQg3;g{i6*81o|Vu?Y)I7WEK7j0>YUQm&{?R`{ffTHq8_lSLs>Xn|7{q~9q@YG3%j zvZz3D-fKd9Xn}Yyz5?j9h4xx>pOtn}CAx_)n=?_JlS(w%>4v4?5)y^&)bACG?qV+0 zwV1trj6z^3Bcem~K&Xa8(FO?l%`Fl7VX>mY7!=W(T76;P;WYnxVvuj>Zm0Rxm`ZMP z$>#Hb1$;@JTh_V)MsBoTGtoS<{PIXMfY%6X9=q z9vi{WjUA`yq5GVsQv!G=oiR0}senSKtvd9UiBQ&=e^ zvaUtTi`epNX!#c_Rjk|c1Xl_sf&3C|kh?a>S2k_8n1cS4=t*@khsHRVUGL#-;TPDz%in zK`B-vjD&RnD73+a;Mz_Ad{D_)qUs}C*GsePO81o^>hB07C49ONNqIysXRsEn>9;a0Ecs?EvZmNPP^`S*jVa z3;?+VW?*Y413V(DIA-y|?Uc}J2ay0oRy(bhoepwRuqs*Y;jVGFqX>vVlKLo_W@tXM zT(4D2<_cl}0GOemkbn03PUp!EXOBGU400lf6g`2L!ycF1RR=%wvnlWp5~l95 z4!#If(Gh>OgE2TyqI;q*-d76S^4+xnYO2OchYx0c9t|K7fY2j@crZS(b9Rvlau zvUnO*%H~~y(*vGH9RPr`Qsh7!3cwqPQvvwJK0v zI|jl*R(&D>R6EGK%CiwhmE~3CSYMHgJ{_ghN#pCEnA}ok-+A0^Z{oOWfE`)Q4;{(AnFdl9YjMB_6E^Z z0`4GMNWd9Hs~L6%Q3=A{AleP!M1$xcSGaYVQ(RjNix48(1?(Vpxi2Z`8T-! zQ47)46J#8xV^=iyKB0^CRQ~l6%*wbYG#pODQTfHZ#mLd@I9_ckMK9z7SG-Sau6@Bl z?W21e_nCBFE|R;!{yWsA}L_`(0b8}Z~nKlK~$(qM-^E!ITCrPNRqUEMD1opi*!%J zRzUjbHF~bcSZo5Fh_RuCg{r0{DiKNXI0;m+nb0dB#x_LC0o>re3Mk`8eBw}|@J^DB zhu4I8Q%~jc9leU%&nuDKObHrdb_&vk@QBois{>*!njYN;5AK_5=;Ag4hX4#u49M$P z(fa{J#_94|+31}BmVIrC7&EAV3?dbD(UYBd3u49`!5vWYf3D;DdnS92top92COXwY z%og3^Dsa=i2tTD~SzH3{Cg5KP*F__pg>Xv{b3T!>wpCBGx&v{92}NnX)gh~*5^X)VcvkM0b+2Okp&z)G_CzQR%hcmg8KCm_}VC_C^7 zxowk6`fX_2^(b>EXrj-cZG`~#5J)qsSxW%q+z((m{8&~1=uTj%UeBroQ(!28c{p0H zewX4F)f^4l#2si7*+&G7TKu9qca6YqACqJlsnV)nP9O{IqE%lCz_aStAgp}M)JH!l zyY7Hmau}9e-i<-ESGh}9pR4DYpG)!8#R2gW)JF78Jw$5Oq%v}dz6EzDwt|T1M7*O{ z57j|Sh>%^4*2tzcK@H-XHXP(}O(Q}zP4-cDCU{5Blq-*+tUp#BQUazj=3PD2Tl}yf z|Kdl&lmzKzyik$HLX-s73nNTK-^aN1zpTNcJU6lsDB|46i153S5q1T@JZm)GfXG3f z__&PxqI*S*SeJF3@F-f-+KBvFmy)oWwfR*~4;^y$2PBu4!LOa7!RpF))J+7y9>}rYIorgN0?nh{frPXH7Fo9cml>c{*I zql)#)5ey@eexj#`DSSf-EYic_767KYKt})z9RNwqK68U2yCo>)BY|{V)2TGgr?8Zw zTPhR=R4x0?oP57}w*}2X6?MF|EQ}d=tB{jd^l4BnhH-5^_!PYP>HyP=vm0;f$TOBYYOvR6;gMcRr8^^+s+OE(ClAAUck%<4rKx zx;bd3E9+whspkcw(+z7j8n~O;TxFz&sUQy$ScP3JsrIY~0Tmh5m2MzFd8XPM0DyWS znJTXcfYJ#zrwDfY9M*an8qb-5h{i;?v%_j6h}#%RK&)RkNSM08<}AVV6gtin@lq&f zi;yd8by)_cBQ<@Lu)f7cbvb_a0DxS|=|eoE#*TbND3gGH+)!zp_}n~1ZSK}5y4=W= zTCfQ+iQZ_`mPHLN65S2NvW6rlaIq&x6EY>2eI|pVG@HgVW z=j`dMbI7o3jRrQSHMUA3{A!AbIQ>tAqyM=>)dVFYha5SVb!Ro49jc)W%egGRwCnzC zY21UG%F?cLx^%fJO?K%{hFxy#A>il6fA3NZ9bA!7euw&8ZAaZc1}v zHR(1&_~a%bff9&_+$8iR66@VWaxiBCjQ-mwoB5$8$|k6M#=4_>A^>l6F9qQ1@e&g5 zaEjXvz^&s!h8^ogUlai&)4p+ZbS1np|02$n2Y|iNYV^@+Oh(_C5|q9|(W5k%OHmyo zcaU-)iqfW*_b=aoI^|2o(YHY)m6;WAIw|+^fM7w;h8Wlu&w3d?L{Y`C&5zu3C^1D*SgT<3L-#I% z-#88NWA`4y`QW{ikaQIhqr5CgBbV!>1ZIRJ|KhV7pn9ZNaK zW8CpKAG7*u^^SA%5vuhzrvNr~;2bMG)J3SREr|#wz+*sdL+7C!bX$^?u-*XNE+5OV z8sy>es!@$ueb9RL1S=&^EBg3ym!}nR_Cz(aqhn7Lv9y|IC87^ zICNrZp@JP3-o{d02q@7O<2VbSihv`VD*0R>A-EA9t*vPU|5qZNRSo)<{5 z5BnEUTi|2A&*6)tcs!JD&)=pPMMTQya5$OfM|`T;A@{LEN%6YItq{z5bUY%1X9JK$ zxgH3o65)43f@N`{jY7`}sR3#HPDtE(RZd9W#U8dkIxr9sv6ZL7hm5w&fPfau!p#GY zy67*kj&9cQEtoH`Gy9{dj_7n<^2aFdHxSQoHUe2uAf8Rv1QP#2Ho1-(=dtoEDvnKl zM~(l&rjYAECFcty!oGlWxOOY^oe`+y^+zEQ?0UB#*aPwXLDt6Yh?gk>uRp4j#@`>* z9>??tO$ON?_9aeb-XvybpzP>RBHW|DrH>%?|0}xxujn8pRPLTG4*(JWu5rAga~75B zFqcBr8O6)nYvLjvfvqeX%2GM33RLxmvPAebo<#UH9uaXGPa^ypPa-^x=X$Tukc>VM zh$Xn*D@4GQ_l#=^V-@Xrq)UW``0k8+d^&Xl0K7Tl$vhG9 zGS9s_cXBrmG%@AFOPt5d(knD^IVZJ3d~$AhiY^)uxQh=k$p@)AW~pa7qEFHb+(zL# z-L1|4XpR{=#R8sA*XG&{&fe}OqUd64MqYJx7d|HH_8g!R20IBmLb2;~buvHb=Oioy z%6HA}0@T_yX`d-_ywRHlt?4V^mVl0qHV;;_et^+28-Tnnl!3+MasVkCvE9Xcmzw}& z@6M5z7)xC$Ubj2|z`Il=9tGc>ThEycpWsqa6UI4*^xY9Y(FwF?HzuP6-c?I9&AX1p zdD3lKXPnVWulh%Vp7p?l(G9pO>Ka)R;a52l;a53C#Hk#K@T(k&@Kg?+|0&26IusT5 zE&@nIy95qpdE3qG_M9g2b3io(GGI2o3lC&{0wKx9mz)m#3olU?!xx`GUX~%!Aso@O z;L*>3`T33N`#aHdu`y(}eaaLWj30)02F!0NsD~@yjt61*2=(*Z-61F6VTnRM@Fh>O(|i=8d*V}OF;sUP zC>}%I3gyurGZchL-HttI)QQLF}B}Izf}y_~g!+{Nm(8 ziyVx6x$GC@EziBaL%^-*OY7CMW!ST@>S1j^-~g(G?FuV<2ZjLvdPvG!fwKXmbT`$l zz~umVD-e4w&s4zId6=IXE;_P^3Cqp)VI__EEyTxpG~jk z+%ED9ZKrvrc-Mxku1O5ttVRnb_KXMcl^Kq9&JC_)RZcbJ_kuDGB&I&3Xc?XHnd2Sq zr_H`hliw4{n4pES{lu5x`jZ^Ae(LK78uE)n8Fy--TtD@)<59o%vXI{-%GjudTKK6S zmbccIInom-1zH#VSV-f zYQ_!6u<7y*xp`W_wc+`8ZR3B~1xZMa%_EX<+JnDMzf#GMJ zGFBR)8Gh|Eo)hR@+@Cz=;_Ik9XJlNU4q4-`#qNJvY2u6vp@hHej88OROk8=orjJIi z=nJZ%n%gF;+m8iVnihL=0KR93QCHB}c@nIaPm0dW!e&S-{IHr_G#A9Q$_WD&ssTjA zm1hJ(J$!JTLX8V>DLGIVo;==!1$J*1(^Orr^h?!wC_svaf6gkztwMVVzG=v!p&vv+ zKYUSSlv5NDSDsZ?G~qgJWYLo4{#kX_r2+9(0x}q>#kXaYR`q1s5E}ASlG?i@C9r~91DxI?2{>0-a=)&Tou*`-$j*3u+c-_f$Yoi z?i5hQ^KR3hc>D_ZYkHA`An`uo*rs zrpNF`J%!zq^XnVNciKtHeFD4N%Vf?mnVe+LtMT5|SHJlXH`$)s)8>EXwB}hYt=3`n zuzbP4)T8MmFayh(b^lVl$IbRXl*qy54Wad2lPNH}=OF6gu8BD8FRSb$rzDaMq~&6y z;E}pY+H!pLU;?Rb{7T~I^GziqZ^D&n;0g}PzJuQL1lN8?6OAyG3b@wd z1SKh`Qe1hz9M|mmL~cQKOg7$h)XqmS;URn~jug3|;Kg{E2W~u>7W6?7j_3#}=HY`}KT1U!vRx zlx0*fLJ!ZY0(*iiA1P;6J{K;P)Ox6P*tteW%2;&%pRg9sMiz2-bCgcM+ z(FYUkZ$QlwDW|edac@4KkF(2tK8osi?$h}T{p2+E6d=IVBx@#Y+5sr5piu89eIF(Q z=$wPa27Mo918`5Kmou!K5#(L_O-waGPqO1WYJy(>PjwU~c7DUU+z6`vs3TX`L2^CU zvhzVI#jYV%q_o}(Za7Bl=KsFf&DW13b|GqM@)jkCf;;sJAl4Zx0Dr$whAEVJ$QtZUif4DReri0si}kbrJiCXojAA|Jv722Q$8I9Z*gX~WaqRBx z^3MIpsfTdc?IB!t_i~e*9J?2yNKXf>2JpM=h9-{J0YscA6{7GGHHLf%S#hs3BVqV-jH;kh9wHiCj{97*Ay+?&3R zTL+|g5)=m@T#^Fwus1P}#CsTgDXQQZP~c5gHLG^_Q4IOUR20uc!=dM>c~C7;@PeM2 z_<;{GP2P)^_f29G;M7hJuYyl?^^6Ecm{;aSwP9L6;4DjeGOPV?8Sag}r4q2Za0Cv1 zM=VeURYxolq5eLET%>p;*byd4Baeg#wT`hkGwep5C?MDCoK%+RpT3FkFN6p?3n7`q zL6t)rFNefqb0ET>17RnJ@CdZany=~*`TzhKNVUpVqw_sSML&x=e2?$Yk$<~&o9tp5 z)It=zttTI!bwmFF)=mA(tXue(S-0A$!*N(Ah)(*UA)$!Xz9Dx$AUKMl6zaCw+1t zDa`1h037*aUQ<`^%!Gamdo z{N8vt;?yC&Q^9?V2e?qEMN?-~!|kyWe3B{lOm>W1xuLnZrl%(ydi!efB5T4{rQV2|Y;bClOMor2-4(Vh7}4=H@h`FedriFOD0le^udh2b zyVJ19l3X%iIc^+~HTizl3@yhR3Jy8vRY)TItdXL1{0%cJ>$*He2<)QQ1BOp>+|X>*8Me z*ft804vOiuw4_ACL8KDViK1=sZPI*p-3$0E#g?urOKD`~pVYgg_6<%NR8eIz4>mZf zK}2Sj9SIfr5b7%`p0G-e{M*RTsYxi+%|l7|~rdm@ysGS43pNC*b!> z4mXLA{GR9Vn@8ujmS zBG5OG9%|xHbRtEBPkiCynWs9)d?L#_ayHxc>EF?j%;Y3GGQJBwlU*bVne&GQ_RCyj6xOs3`NwZbi!OMDMjeh=nI@$G)AI+QH@#)#XCDK=#0-9_7jDi!{O&ybzuF4`tkGj0XllPoXMG}~Q4dkA+0?IGM1^qFpwlUqTT zqDXHAeE`6T*1~_&E*jZk6=NMH7J)av8fq6U6M(m*ZUVqvQg>(Aw~IEEslGLm(2;x! zt(-Oeb{)0BRT#wi^VO8YpDt8KUxhF7EWk6cA+W0VyKPq6wuSEn<9q+Z;P3YShr#1) ziFtddAF}rwhfccpr=o5D!@a){MS8u@M-u+&-UmCZ&FK9S_G9yq>iyjSyxuu=w)UW+$kw zfBAL-lF0FL5%${-r=T@O;m5($&{TsIVSDx8@P58meurzYvGN0A#oJ12C3d2~W@A2(ue2ARAtzvVR=w zL(tQ6V(+q9N8U{x;X`FIMcle;v=DO zLrjkANE;0`lL>bcs1V8uPeRNd0%@UK86#l+6lU;+Mxo<^etCT}WxbD9_05Ko;)ov?yO4=NGa)ThiS+UA};UJF>-d>ox=&(w_f z&N9UMttxF68hODMmH!*}YT`lC^iyvvcSF5hHa>>W=iz(PV)}xFTOBK~6{4pv3@7~T zn0PkfmKnh}5TA*@oPKjwa2LXP437v0lh4q^0ER*H4bl`bJSHi)1vIM}z9l`l9^q1k zuLuX1faZupzY_SI#lTOgnS2I#+nwR=VG;c5|FHKR@KqJr|8wts<-Yrp5FkJ(frLj1 zEtEinfEo)LKoM+U0fQ(+Y+R$PCawx%$YMYXYiqhzzJOwH!%UjDBvC7XI(=4(3~OY9RE^; zcTXk8A#tM$r$(|u_3G{`&NW{FVYm<=lB8%FDZUK0lL=BoO~moadL!VOC$&pFa~;Os z(flj$>BM%4!F3pw47bZp^+LEF;qEM{!wi9;b3EBW=+GXK%TU~WTrr{35v+#f(KfKApG`8NJi zNaI3;rI?B}p~KtZ%+iF9)%5k&EwE(6j|r!{ zsfWZw%bQjB_c&_&HHOyAwQ6d500L94C;vJpF5bbCcINu@yb2{ZF2}c--=-2bW6x^V z^$0_zEY#nyUm|9Hm!G~U41bhLKY+L#D(gAqLh_Ib*vyZcWR`?OGOL-6Z)BE)Lvk_3 z@0*c}C+j-g$2gy4r)$FSF{$)3dR|?q%Q!@TA3^wpuIan<_Y(cx)S*~@SJPfS+i#{l z6_#>yIl@YAraA4g=}>(*^(8s=5vEAj(_gwT<~8C{jB{eU^f_9xNVr{g^3)Kl=D2i5 zCjr4ZYo=eth+`HK?$|APUkFySCnAdU*@uLpm1QMQ3BmGs4hAoc$)DB|3cXo1XaRUnG-CWw)cJ8F0sc39&a0TFr#v;Da3%nZCu$JJW>$?ODxMFAy=P zbzr91E+mTQH1U;0g!rm6BZTHc3G2DA0RPt6Y%}R`g@+Pr{Vh?!Y2&1Itc|>c2j|vHc$KRo&NVsEm^7;@gFRCFPIR1u1q8wizf;Gn{@6@76$B=-MBYJoK!WokmIFP+!CZ55tQd1)Sho$C9 z#l2G7T&u!zgb8Ta|G!F2pL-PfT&||zJ&|IwAAl3EHzCDlB>-$Is$FV?wb)F)qQ!{h z6G$xZh4;{22{DN4iT50DpMBscQ!i-u{3b5;RtsA1FL3trH?@XUX5)h1Eub!N#ofoO zxGOuW`+L~i(JStm$X;$-a4#q@`#*aC8`=MnvoKcOX8)%LBgkz7c?h*&)uo;)YPczC z{v`Dx6t*>VQNzI0vM6qY1RHLBB)IjFdlRzVv9-@_k79wH~s9pcQy(SGmNT2Hi~;b5}keT%cv`%|++*nyMF6R6EiMod}?ysPJ_`<63tV$h|1 z!RrLWiZr8OHgUP?^rq~q3wy+IA87$ZtL3^gZgsq`4+6o^w3&Z!gj}`m1x`c1#2RLA zCj_I$1|)oka-fXG~Xo*>u$=uR)%FaRU@pr zNg8~X@sl?AtV5U@Z)zrH>cZ>r|75(RMt!(e186{kitQr6GzC$qUCA&^K~!kh<9}@m zqRLzdzNIOM>T(6cFa=Rnu0puU6tqQ3FGenxIbKb(^Yi~qVAd36oV;#e7o$gr=>mlT#@-yF0C7uDih#%ii`G0}< zS%xqLan7swuv&iD9#KWshdSXtOsM7!UVu>5yb+JrNm7-WY95AYvYPL#($yT~1jBVT zhcb^c98O5@q3SKwQcO?TyT+w1%Cm5>>k@9Uj z6jHN6A=$c+J(^l#x9T7}t@-xJ_tm!R%)`)~<3M(~na8Rc1Mj#?)T631rz3_v?!KR@ zmD_OJDxCpDzi=mZz|Z?=*+v&ZTY?+<6$)|cg;_V>t_Xlei&GbD;%es$9}2MoOnvGg zH+fGuavAo_uc1f{30M;UvYQJ1goD5%C2< zMA#QZXGSoOB#b``K-dpN0$+b|KM?BJ++8S24wLR|Aup`B~CK#If?D9^BN+wS=y)1%9Tt$7B3gkU*%c=^i`RnuSx-R zu-8B@h0uSr7xPgM+l&1GY_31-VTm8zi@9Xb7}{xi@n5$&V$@rB3-j=V9JdGJn`G&M z>|QFlOhE&P?A`}1P}D94B7@T}!EGAh1JUU&IFGv`j9BS46UnbHRA~xz6ud~IS%AVW zv($?RJwph|m99?17!vURSJ+7;x^+yUU)u5o!gKC=YC$h~3r8-Onl=`*gF2-#J!hWY5FAks6p|J0tjVyf!! z7RWn;T(YJe7(!gm*Mve;%{2bXeJ5G;GSlu$(QcpZ9y}Yhy))Eij{OKXN<@Skq3Ove zBDhJnc}KPxxugTl^(90!v<}W#t!O~F=qh+oyHjshNyPn5GyfqV#-I{yT|9<%3f60e zRq6A4#@G-%p#n1IW}RUg8MgJXw{}SgQFOo4HQ8^OO2ZgM`Ee-z?T$52L`DbS&lZcUQA8{f@k_V+;c&arglN0r0Y$a@SX4y{ zojbzq=2hCv!(PhgbWn|fz`^HpDwst811~T=L{{!}dZM`%;1Ut;A&Ch05D~VA{>^lf z%~~uA@e2_Vx>)^tf@NI z^iW=NkyqmNS1^SfhQexE`yND2?lef3Wo{}tTdUq!>4>5!PAiL`)>bslX&c{}Wt#Dgdyaz+xvS`Q7%a;hYhR_Ha4|!|;{zU^o$DoMr(j zX%UN^VoSWAP0f5Lx<8Ma{g{KHW+eeb%_;(hnzaBnOHIEsnp(%`W8t}w&K4U1wIC=9rYon>@l11F1+&fx-8y*$MFhUTxtJ+yg8u7x8n^KawYI zzReR{@n#kzzTXEb1t#;%MNQYhWjAi#HvtdBN6yub(zUdwsx87S_bkFJ_ePo|TejRA zj3P+~pNqFK0Ji=@A;D>{T2dmFHY?j*QO(R!$1ZF!;FWwe=f^F=wA3O@OD$r{S~@G- z()wSdr6O-?u~xIe5%R30oZ)lPI3tOv7F!wHj8uRsEMx5wibX~8Cn}GPXxgu&Jc7|h z2FjzXet06G<`bRuq3vuGi+Vyd7IXtSp02?_F$6mkbdigd+Y@b|C@d!WRPy_a_hJeY3Ze5g)w@&0i^7I3M^KC&9!ju=B zNm3W!37xmALx@x5+X*5tT77Sp&^OW2s`U~PR_i4KYW+{r(*rh(wc(05(xnm+S`SE= z>jC^p%2cv(W$;^RmIKuLBE*mg5KN(nEtbcN5dBw{$IDQpmB*_A{6g}0outHnQXcz9hgw<) zVC%P3sX1r1tp!ax!u)tlSldCjCiEe2*uJt3j*BZ$K}enhMj4@K&K0%y&_GNko`lM1<)@I6^NXBJ|>lB|j>4R2DDe?w^?CxIfh?~8$ghF4o8`B#>lDr^T&JYI!`H$5iZzN<;l~g#Dtrw9 ztHRd-2&?eSBcj4f#E+2g{*w!^N?>_=f=@fVs`!nQLYIMYSp1EKFISUc4WEdJhA(4i z4L_*Ye9DYSfn?_k71t3l_)RAtwza$o3e}%+W;^j98A34YAf|I+42k$uBYH5G4{@~2 zus=CxNasS!{)8jlNkpVOn-LLae5O z%j1v;2GRe(RJ!E_O>n;sslZ4HCg?;niV+hM5f&3fSThR3YQwP+0V$b=;f~Bg?2l$H zRikeux-V0&N8efkMp}vKpp%hS`2hZRr4?j2cb5w~9^xv|^r;qFFM@1ly6G|;=LCvD zpfyg?uqgUcWZuDCG4(0M{7-0vKNpC?TAY(Q$H_`u1`Vr%z-?uTCDk}5fiN|!7Z9Gs z@BrLl8#YFDIki7|Wvy=rVb{&UbFgQSQ+7bKnmG{b4~7s$+#;nF#l+y+KTS)DL16u# zF4AxjvY38lPWnQq-25)#s`9KSP%Q&P^Txq~KSDhuCW|TR+HTq&qkPUFhN0Ms-Cc1v zCH?zN6k`sV4?wYFG{p)H!n`==15r~4f|wWQh={y6ClPulPZo;Pcec>`&veC?ol(eI z$4Zhk%lIfHNiY{FNs>%ysYO+pQPf1f3Xq(vD3*PS<9c+H6~{{eY*HL2DUL}fR?&*& z)r@XL@_GPPB=54s{;#rO{zAnfKMhkO)4@JR$_^VHq5FlNukd znOwdIAr5#u3uEqvrWnWdY@XgD6k+nosnpY`M9BEFvju#IdMuxzk?CnS269&h#Uo0aN6(r*KB)|fv`NukpA{?RjADMlh(nfAvj3kK*QT%!~uyCD*~7z zxC9L`hE*aWt8P0%@O5~0D-pKSnB2%#j;ES!!S<$+lrLK>Tayd4h-UsZWteKX3Bdwc zrJ8M=JZmf?B7+SHy$;GlzzoN$HX6q-YVv_b^sv4j>1C8#AcI&_iuIa9or2VZ7vVGs8DgjA5bSE?8mVGa!u(d{j#^`<=B z1|#)&o5g$&!pWaEbzhJt?(n!MD_tpJ?uV!jG50uveRA77qCgUM}@N zL9_9esRE?-2cV{>(f$Z%sa%b)(f;Zf4r_lN@{34hBJAMy$ANr{m{&ja;FZs-;W!vk zik@`Zr?!0ohePpo+CZMjx$|Z98Dm0zwg&xCL_CE>lQHNMA?aoe`W9gf`WCTe2L08j zgv>BZ<{va7nGUy|LqsH%L>Sk~{w>g3*P*1M$8p)C1Uj}4-HN8-p$Ky{&~ihAXz*!u z2mynr-KUhYl-HcE3&~P@&AI8&S~ha3>4kCirXFZSNKtQvErni9Z%E0XBy5pbx+0ex z7gu61)=&*Dm+I0DYPHr6%dpIidbKu&fLX280I;jIc>sRN)tXP+(n6L9yOK}4(h>r& zktDdNUI_s95uf&?wFq-D?bDVdez(Cwn$jt_-5)Vv1&iN&p*}47Ne4%uOMa0TGf}jmf|wjLD!cV*KVz24ADm zn2Tc#N1x{^g?f=^&>mo5@IJJBJ5-l zhMkIki|phmndUWob19^De-Q0<#ZJq}L5-T7)`Zzf%m}elK7e16ouo|b#}bW9t0Z7# zS``2z(`pg6GOZ3k#5lMWWEyqmMaWl@g)(g!0qD(ArmY6BDVcUhhzYF-`#+h6!Nxy1 zvHlGKxxTpjaaXM`?o>>;js(6-GogPB03*{10a%$f7{D*dg#S%4?d}jeSrKN~$s&H! zGR;nr-yMdhoN~c6_b7H6Lk_xEvr~1Loo0pEss1;_PJj46c52$o<)SXKNfWxfX0501 zli4km~Fcs6>)A z;nIQ~k-67R1!te95aSKvr3=(zgEMJnCC-a32cq9e*nTsIo+}A##Y4}@z89(@p(%+@ ztG!Z@^cE;gAu%XdBs*!FT%N90P_mbb!UbvOd2HI7TQ)>UJ=EN?v52jBELt9WcmX9z z(!Q_}Y3~DR>osYwXAObyN!lt9FY_Y4lC10rs!eQSV6GOig}*j={azq%t*%<)gO#uo z0~q*ZD*f^is+y&!)r`gMA@72u&EYR1W-K0H55f`F zS3ztXu6JkrzK4xNSjX|%{VQ4FRaj%Q>(>HcxBKjNakAzC)8!nEk(2Ne5k8kM5#e+B zM1*CP>~cMt+=jO|>T;Yk_isR#=cDWl0d{vk0Q>ga zNH~AHB>xe?XA4v$_9wFqUPGBoMFh__1nGmD5QtG6Ju5j+*(U7RWZN>YhsGumk+EqJ zTf3vSLrHRMe!5XdJ%$^@vNLU*Z#Rnbq>0lGLJ9eJ4YlansQ7#e1nQ3yd?e6Xwv>o1 zbXHx9j{KF6@ztS7IY4NeTm&FuVGNmnfBOAPQBcrTA2wgkNse!*6};2UQM1?zOi!8h z7*voYnHK=O4go4>u~+q6b*kw!&Pu^1XQE}OxSfes6ZmbMn(2_g0@hMny^|44|`;l00usn%IT4dr{NHuvA$V4 z_c=9T?SzbGeBV4B({OXbeVSzr(~5(HyQM_V1Cw#cfQj)jp_M^yM*&V7H3Sv_F{7k| z)j|k|wGhG_G*%0d5kguBVWWkJ#9C+_^(^wA&4Yeg(;>Y|+qn7m`WdDcQF=cPF8SLc zN+Y6|wsWHw@k;MCQU$1Bj4Y?s7F0Q4m6@h9tAJ`pE)=rbcB76R9%%;=|E3-5Z99@r zU8Jx((`UWJ&l|NbNLQaPSK*38lDLZ^T9aFL9E20LJ3mN?a79 zX_+<95C6NCeS1J;ROqTDwu3HP1z_L{DS2UM7Q*%_(?SB_t4th_o4&mxFYGL1d~=m) zHGuF{CU$$|!j43kt4v&ea&YX;5^$Btu0hLyFl*3t$TFfFP$q@fpc0-?0k-&AYf!mP z4Xr_&)~S+4{w&lne5r{oiI7Di?4_nc#y6Lm1`{we8Ur9qBO0C}G?IwWrKW18HkX>_ z5ipmU76CAqnpPsrLl?Zix}ITksVVm~06*f;I|ymcU9caDwn=o7=Prto&nC`Y;Iln< zF@o{S;nl>PyC8z{B{1hMEW(_-u!t=?cTs^#NUe-(oACg){@NxgUEcYXrHgRsl}*YR zFuqbrc3!715?$d2H12WC9E6XVD{<%D82UI&e}tiLC5)nWd9{|nZ+m&AX}-eHJnt-R zg}vGhX!Rq_ZzqWxLNuq0puum`7C><#zW#Sw0P}U#)5Z<0*5}s%sC`0r&-L1wShXTvtl?=? zBFUPt$0(#S7h~&%F2;!1&LDmh?#2{fU1>=3%0{HA$60QAA*($dbRs~q)Diekdm~$f zN^If$^S|MZO!d_y)mLuA`y2ID1K5~O%E-oY>z0TJ8~?95EQ^pP*6`&dY zX^4oB=6}_vnIa7ihpQ>?pBs_p22g^o&d4>RDg1~qq>;2TZqJrs#My$^RZ+bVYN@0eRQoHZ7KPNOv8*0P2~Y~kMDI#BOd-uv@0RoeA&A%LyFJ{ASt zcY`~49$>kNbNgCHD@}(Q_M3RGKF)HY7jPaX(_y(TGACg>+|0>RXZ{V($x6|@%+Tzs zIeNW0)AKn&uZ6yrIb}n7nTc9}v+P8jPvAd2QTIb7ep?f@>cEMr1KoyBm+6yQXLtc; zZ8E)7Gv{pBiNE0)JVLWr!(C_T18sA?fYZ69*}M&D_8Xqs70r${g5t|o`rO}qFW@{+ zn(ag3diI7i+wwWT5`)*y`Ben|r|0|)mg$vuV7+=}CZXoEb2+Est+@@>tKD%FS{~ZO ziql48of_m<4wqiklzqN4=qYT@4}57br5Tk%`nS4nfbD!=cwbhV{I;;w816 z7rpk$<<~Zy*BbONoV@vTuTqbxJM)ScPtmu^5&+V#ia!Y_Kv(nAYA^2Z4PZTh-LJ)| z*Avl*{4)UD=M?%Uk8njl0{dc@au@(I2`Aj$YrQtf<&#y3648;K>qms6oahw(M;+ z;9GIwz?*sI1J7}9?*MuhEpWw~Zvyi%FeGej?5#0{`P_42$%8#{6#SZJ0Ek%rYZ^ji zQLx=^o}fqD%tTkYXM)*)%CXascY!O82Kh6wSnwx2HbL5C@G%pQ#eH^99V(vr$n#U| znnnP!TY{rNZpIzr;`7H|RzQ*y0UL-UdqA>V#E&FB`C<1k=_MjedLj(zgEw`>@er3J zf6xcyH)Vq!*#Y~*AUc)6MtxIN2toUq=@;(tM*4+}p-T#0(#(>@Rx{r(bjfh=BlsMT zzuo7KSV@w7;kA`sz}5n=7fQsO=!KHD$a|}LwW>w&Y-a&7j(7o+h+o#Ll|LRUgM74* zZQs&W!C=Jyl~)C0P^4WIR0G)htAgML-49p|NOB~H!8p&3Awu5f^67tdmZH|)cF%AZ zd}iJ3o}opUJwuBydxjRVWqXG8y7l(fbpl2HAO*OsEbC=%coPvxB@yPXw(u(<)f#o{ z{N|v>a#OCkLev8}{B~~H`sI*7Ye)j686oUxk4zMBFqBYHQ5Q)wh0B8+)o1l)LFeLeyM=BEJ1pSt^p7kgb8G(y;<1f z%s+PMB8$}T&x4Z_WS;q!?j>X2@8O9Hsail6DcEmgsVW5N_* zW>O+HmkOW6mg*Aqidw&>F43r4|10Pc%XRCdF0sax`y19J){`Jcm&lzL(j|%sU`Zo& zi3$M!ExH7^@Hr<))qxYS+0K^;Z085u&Swm(OK?lyB7V9qVYc{xwk|>I2ODH!2p5k`1fgb`jpQkSSfkyd!k1F$(U^s{w|g~(j# z5(Q^92to5u<^>og+?$|-$}@hk*8OARfj&vma{&!VYakV4SUk7lT<7Bf>F~Y35>Y=@ac%7*xJNBe|b9^s71Wyx~ zmv(qoRUXc_Hx)Y*b0|FinwyH0_Tf7MW;(EU1Z0HJnRCMC%z5+x{fW+2JV3wl5Y$Uv z1dvUijZ%%JuA#&ecd+U6HfZ{JKiu^5w^q~Tb%(XA##*?iqrHQT$OvnS?}7rt}6 zA$<}emraJmlDrmsqOU7%;nyo&pyYGs4;O>I`0z~L*D!pvhl#HAO7-5;5h3dFN@{}F zP#3cDSGP*NJPkHXg!9XjUF?B=3J2NC>CX;Si?c4klwMsH)DCZgIat$cbcBwG@Vi^$ z!89F#Fe7ALg~G_baYi`4d%E)&1t%4p+{lk)*5Hd(4CwCScPA9!7k}P70TWCB0b2ht%VRJTn z9)TZoHe0@YOM{)MU3_#xx*#sSKz`x^*L?c$B^X5eph}kjDIbK9N3eJg-9$O0J9pHQ^0?* z*4+}~X@1WGB-}|9bjMN9U9qz(1>L|S9B+4cQ#cHf20~a$KK0H&)01TkTn8y)4sRO?XxEC%5e6q&hqqZs6>+afmXEksB*MB^{O@(HEq&ImVN0_hK#hmN z98^B+vzBngXRSnRq0d?o_4k^DCqq6>N5Mfd*1)-L)Zgo5T>6T5n$3ar$yCi}k}dY) zEm@$g)5HR=Kktfn$RxWu(#5ej7};rQ0GQ|f>JW}R??;x7yyizOB=VXc5o`gxC+-ZZEHn67ulaGy%)URjh5*S!KlJMf znD^&$AE|^VU)UD_`;~v^+FdA3ClU2 z`T}bsBWy+)6p06L1+$t(j>xwCEx!DV&vk<*B_;D9TIg0Fs(RyYe^+bCOmTK^f zeVUwcutUQtF5yV4WQ0(w2pbhQaT?~^MmB1{)`{H@!wpr0G2&BKW5lmvcp_)qL?zU! z^^7(D7AMekw~_}s$3iuvL)%`wfaLLR=Ttx$>+mKeZuky@wB;) z8)J+I+eRmGUgQ*MKC8twamEP0q)3DnW5T=T z0yT5bxXE$pRKh#C2c~c61~V2r!aMuuxSYRdd;=~Q?t5+Ua}Dmo#-6z+E^7PY)>qOGo#LW1C^9YA4Px7?n)kx@Y0cf@^lrN-1a+nC$5O%4;R+^qcCK*J>1-WA zBL1Ap`bRjz;t`03^3Us>5Vt|4oL0((A2n#Hqj9n^wMYzBr~jvo#QOoLs*HdJ*a)Ln zxKjI^cC>IGLSC_&`{JTK#^kh8KrRLb9X5BMk{@EYFX z%muIvz(Mbo`0GXsu^Qot`$N*c2Vfn6cX8C=2>||70N**O#1a671R7I`*U-O%8Gf&= zfBi0aQWD|(L*2YYJ%DNe-Ofm*!(G|!zCK&jlWBj9>iBPF?GPiJSmALF!(Z0t znvcL%XoJKC*Njt1I|DauIJSw6pK>B7Bz*cQpM}~kh+URvqmADKOQ?SMbgYWDhS82gG~wQbth_;sT=5|; zU`@LU@@pwDQs&JyrTpW1Er6<(TOs*%3MNb=GWWv^G*Uucg&Y?a}^ zpX+#6!H@m@r3jzoc>UpIa2O`^=@T8V-2g`{7=Z9Tj(1R5OzcMdG{;;1T3kHG_>Vi@ zstF14D#Q0U-uU8#_$?@={`^e*%MTjrWY2Z`5=;o$CYI* z0pA)Jb0cD*cPb}1qV;7-QH1AV+*BDb!>beGN~m~6y>Yzhm4_U0NDe;3_h0PxwXPUM zfM3qw;a@{FB{S!phTQ2?GBmB4eA0Io)9E=U&J zwOdTQoDIxkP9>b53UUb~UgTVk zY+}2viHV#Zh|mU}-rY3F8Cws3h5xz%k?v<<7lJ`z!xzTHGkJ*heawlKc8rN3z!t5J zp-l_>xMIlxzO1>MAZc!W&l68wf%GT)j?3ruVk<6~}ld7&DVS(fsy3JW*PY?*P<17Q1DQD|&zhiY{Z3e`pyK*D?Z$bw$^hxcG7a51~nK zLR3rpiR8tWA&PwQTwGj_;d19Lw=(PQHH3sYIcL-6!_QzAVeY$hCase5~(` z^`?q|Udz`aOwHIlS46r-*7K}IWIa!WRfMheW(2U2r_qQg!jjZJjV2M{r_qSmx=*8J zGsg>>;}<)&1$r?#89>p&$(HFAM=81zQQa|~z5zrhoy!4F?UO4zp$_C|+s)}}J0XRS z;ZBe+J0ZD7XGf{iwmV-)6ainaVV1J3)yY=Dqk0WV1g#utzG7oyz|s-$B^$z=;Hfh;8C|! zlIug(m&70f|5%!gQrR}qgop@Dh}bMmmijbFZV?2*L_hk8q$BwZZWaq_@n~rK<0{>3Xo^IsYx4I zybm693RX^19YGm{^u@tHA!OMzM8vx#Qptur6@nZf_ojcZ5$sHL)Hd}da`7KmIrvZE zL|LH$_JDP4Fn~VCJ8k`Jc=8zoATtS5tplJMz`*@diG0`uW-)wZLE_I~^m>F#XB7Ed z6*VH9kC&z7vS>L0vn*Nz;HN6os5>apLN}Hx%swYNJ@pe=9O#Bh2a`%4Z%Czd)dp0$ zZ$m0Qxe=9;-{@SRKq^|ltk2$&k|chzldcaDq52>zTc1kS=gJN1^U8+3Hg?1MOx(CW zH*Z*klbFa@jM8CwcdQcTm}T z!a+NH0_=c6O-Kesu$B;|qBcKy<@IS{vgDL~O44@W3-}~|2&Gx=4>Il35 zKifCpp!XsG16su8v(C#9?q85f@WIyA2;(rf&$n9FBP@^mo9CQ4b(!<(BDhf3hSgSJMXTLZo4(+5j}H%+r8eg)agSS%u4aKl}+6~jgMxSqk$k&OVPr0MIYa#Xi4X{w zSxWA4n)}au0%P?PnhV}SZi4}o`~%MvW{}eu0E2G8Tl2x)V^uC3P9-U~dDcxKMEe)9 z8MilN4(HWe#>jFz2D^q3@{-His-_rH8g)fYn1tG@oOuUm1gK$%ofQJQ0K;p+obltN@$(!$LS%Evb$$i6|FksBb)k@Qwb z5;>AiMAMOU|9((!7VCDu)5?Erj4Kurc+TnK?~}$F8NkqM-FTuBz)AokJI52dR>B6r za9+yK056_YmxK~ufL!?iMz-!AysJq^?U6&*x-^xDu#}+E(kUz@BqGeo5)tNPA}l8- zw^^XtUZ9H->01tNqQ=NJndCs!k|g#KBc4d~52jS92pkeXv`t=kU=u>+oS1?{{n(oJ z%@aG0#><5acP{X&M#J!o@X!&lc+gdM9#`$dwvXp09|$1^-JnkXr|0P0n*otnjlPmA3Edrp< zmPdxsN~h(fDD^q4eN2s^6_gFf{iPA!0B!UDG};sM(m$w z!vgU())O@!zj@q3OL9VT`j(5eBVZIo0I?9-bC7WA^AMcO7V&X0|d$0SQ zSmpPwxSZh=9mi|^9$p|qL-8SWqRwVFY;Wb%Y_INk*@q|OWOep4rEU99W!Kybb#>d& z2r&`OlJ?!!XsaCQi;&q|$c#B16P)Z9J&a(do^q~Vj(BQ!Xttd16T71k^8n51 z)ZFLEgM|nW+uv#Xla3vvkJKcgE;XmHht+`MfFl|Z5n2Osuk555aR`uRBtEk%w$8dB zmu~3=*EZ34PWQZI>bfR)&{Q{DWQBF&IenmRyBC@~k3yc3xnG{=$tiEnjtO40U$P8& z@1*pXl?Y4yC4HS%H83>9oL%CLRq-13Xb~6h zg8k==NV6*BAu{ruk-63*1K~|nY0s@zrF5J5ikr(=@~Ae!waZjZ2+z%PnrDU8j5D)2 z7lE$Qe7P+qFF8SB+EKFXi6yS+1MIvNPSB`n22jj<9_E9k8qpC5Ni#!Li!fBR2t!pW zFcGRsjmF-Ym6gCKwp^3*wkHO$9`86ouPLfQIjqO0c$WJ0swRZAvOKLTmPQP@K6^zY zIBhDilH`#Rb`UL$%mx3rk0kWu9iBSMJE^lMXAMjUtci3C?y?w`-fyudH^a{wh8U$7 z0do3bn@x=8cTht5tep^Jc1*`848^D^a#bFq5#x`jr_2K}Z62?D9upNvau)WIo2=2) zu1zVyvudU|YYJjuT2py+55*V+?rvu@3I!cKEU9ly*jK{_#{? zPO|g&mV@kMGnsv}U0ja$`KKgC;X?e{WkSq9HD5Z35RZf}b^-`r?BqZWJBc71u`O~W zkU4?|y>LT`ihbrDqc$Q+bT4&r!-IEj#mu#<=`h=FHt13vA|6omN{Zoucg z4dSOihiiomh3}9aDJyKGFsAz#{^gWh1Ok94pjOs4=Qp)z{@I<=N9jkyDJ15fnV-J5 zS(6aiYiV{mf2oSk?|b%2MP$g>Hl$p7;=U>hY)fMP`SIYJ&lGtGOX*;48B)YXJQlFm zhjcEqJxi3l5tiLj~*!onQ|NtJg}ZcMxjKA*o>oq^*-U|4-`nD>?HCs}EcGDBkG z%K8K^{yVYxaPl;uK>oMT>Rre{o%Wt z9Z^mIAF8pId95`{8HOz1#m$D>mm$km0A4MQiBm5FFcrY~fv&h=yiPxQUp(S9PNiQp zBrZN?Ef7m?fgi0}D;ipS?+7O!IX~_MzsK5?%^i)8Xiw9NniTqx7d6@Q5w8W36%K># zPyV^rga6$8K4|Oq*`9b6gzEc8(g)iS!fk<%vG1|apdX;VIB5bLSIu%I5o>-jmH_;4 z9vb8x?}_mQt^jcKE-_Jq(be}#y{KM@!lVk2{0@uiQOJDo?)Z#*TZw(IgFOI3m+>@ zwz^Oi50Z(#4>@_l_lILFG1D`hX8u|T`YHgpuGA*k9snCh=FOj*Di;2+(_ouYpHm4Q z=Bfw49qP{zX4K}0D$n)Pt}Pj$TLK2E)_oE&kg!O8jXd^dkWjW_fYmy83waI6jN+RfSOWNNx?J^A9>9(hk|J# z0C~95>O9>Mx9G_%Gm!@dGknn^GU{QmqaXndiyFRC9vDY0%+Yz3w(>~iO z(_i0J(I&i_$};i>jlnI(!t{DAf4)|*e>ZN6uSA77_!E>kYXS6qeW(;TV%Lzs$tPe0 zPCozRKxs&dU&l49-#OVVj{W?2w!~?h;fbhO$@thZ+*Dgc2BUbJr&3T*L zur~|;A|AOB|#Q@=m z7_bN<1}wsefgMc}BL+CD$vnJ06;Bz2-vFj8L_4e)7z|)@1KRp8$Tj&HF+fBll|)!K zX6T*UF!;SwzH&sLfoR`9o!I0CM_kYg;T;|2{|Ma0Zo|IBhY%4E8hyJs{`i`}>O!V$dHGP`v#^kXIv<7vszl zkE5(4u(LjnvJQYbj*^QpYmTGzL)aWgsYE!kWMpwx*Y|lGr3z8{9_++@9!04IK*}b# zx~KzyBPfZM7l8c`#;U^Sd6#7fO9y5=@Uof!Rud^6J6Q+7=8lr2a@T0cbjgWA{G&HY zD{}%ijm@uP^S9B>^D!OR<`n}l&8tM%G_M+A)4V!_H{ZPIX&W^0*F0?_Z44>2&McW8 zy@+p0qk+R5`HekczTJ5gghwdL(JUC5dZ$aTErH7FH> zdBDYvcg?%XN$P;^j=Vs6mJ-xn!+ocEq9z-WS|>OzYo121b1QjDY#zh2X@Be}_sB$fVNrugSskI^lltEp@TE7NtZy%Zx($h-9`1BbhD2Nam3y ziIL3P7=)3`1|cQ0_>(F@da26?5RtJ7q}|X<9dWWwMl#Dt`#Y(u_l7G88A^q?nDopc zx-@_RU7AKUVP<7bBSeJH&=C%sMhHhtBN7odjSvwMXx_-@fXG3yrH)JQxlM}UVtkNu z_*>5_GvR>V>FPiUxmtW1(5JOk9l8@98qZqrj%p#eN(`v>?RTmc0}i9`5G{9u8HGy~ zBP#Z7;fcwxnG85nxD^~;=q>@ zVq`1jMA#dChDNku`R+Jm=5^dZCLUy@T-+!fx(hDn4?;dgj>~_&d$9>f^TNo^+OP90 zB$P8?Ha4gd<&|*D{31U0jQf2MUWc&s$}I5JUlrPsD+DmIS0{V=rUUYc?8r&PFT5jn z)xk|O@W|dRlXW3Dz7JeIX59~6i{lP@sTkQiWzWY@bdM~F+w(DmB@dhPF&42^_sfL4 zE3^Xl445?C0}=ABnk&SOU0|$f>v&lo3-L*S@GwW}lyj7*avE0r$r0Bx(gEr1uT|~o zi29B>xLNYu5IpEzs2mXv95bawq6;j>wO=6iF*(v+U5~JJYTO9mm$X;=6H)qdmY9Mr zwI0A40%1Ef8`xJOE!Eh zZiFF$$k}-T_HTg!WzrKSDY{}R0gQJL^$MJ@bj|wl7F(9Nxf8Z56OJ^9h)9E)5pk-M zm85=2ZY9DrDE(h%Sw_`D2MktqQyZas_Hewfmb>CP@b8|3pb7*KSZ*$UHk!L9O?5@F zFT~mX5raOMHi~g%Z*_NX&tZts8szdO;7~aO)di0C+SRy{$8diXvo|a;?pPG+U3m+f z4B*Ve?42C%X*eW18Bu2M>3AK!fi~0~;oa1z+Chz~c*A8d9aF~6E={EVh*{-N2o7xN z-}(d=iU>D*8Y*q)JE2_@c+YL0;6?6Q03BAemiM^p5Vkjf7ZETwfR_=_H-J|&tZx9X zL)cze@Sl+v7P1CGH8Ucr+ubegy>8TBgzt3|?!1{B`u1KoCbr1EZo*CXx-s*P*Y}$^ zLCqeNN*7$BO3xy^d&gi$kb<=#-0P3=>>xK3p;>#J59+&Nj1D10voWz$aLZ9mc{Hnp z*|K{BrF6KW|wu5WUoND*~>9ab^?a%vj7;fFGSdqeHj5m_B8}F*~PO6 zYqA$2Y{^~$0QW>TBzuC_>8tqdzCH;$MW{vi2gwcYi;$aegxtGLRHW#G53|e4g0m(l znB)< ziDw1UK_~DUx;F~(LJ!n@h#VqyAj#}J|jdX->wlB7P(-oDD z@C~;qBYa~KhHosw@J&mT#PE$lY@Tl*uA_WIM2K$^M{kSU66l55+h+R*BfK18XCWSP zIZ&%)T;4ek!fV7p$Y1j23L=(z%@R1%C)ObPc0<}Fu&fm88GbN7G46UHauI907dm8} zc7#fljYQj*G#80wPvG`1Kfc(~Kkre@;|MpK=;r$;0T@r`yce0ZUL$KbL3D#@TkuSf{1% zNx1x#>XT2ZRRUm1J}FiUfYeHmT8jXHQYlhuHNu)oKB?qCuT!ypg8{H^DN?5zfUZ}7 zCv9ZC&}g_8b-N|^*BwcOtdGcwp`%%Md|}maVPxn}-UFs^3t&v6d z^4f^t9-UivW`8^`w(W7S%8ROcY)6;}r|Ha^0U>v`z&gD&4wJ0dd0cCMKo!Og^URM0 zse2B9Jr008PV^A~R;?3a%Jr<@6>;-lkZ}uBSKxC$0E{bAgOTlcergkIC(^@pA!o6W z@hy{vU)f6c4&3^Xbhg8Lk8O%FU-+@iG5Jei)Wqs3Sr(67f;7W+L(4lNfRGYl)nKDiLn>F|=1sK~)6I z6jVz=3xOLGN(i#gB{wscp;5t8nCrxpQ_49TbOPv=QnjdD1|9&TQeXLk`}TSHjw)(CfJ=r!&{{K$6ZhKhLM z3nANi-U+hw(fB0IX4mI<;#x4@d6%Y-enio{4ByVXDl1}%IlnC#2j?H#r$ESJ-3IIx zs;(H131;j-^!a0Xk&N*|%6f|+9Px}mMA$O| zna+BP7`zI=ui`C&>V)=>2@3F{opaO@s0n#U!9a*O z=aBG(3a~64s&I}41Bklgp-mD|&-BN;P0l?i>BG)FB+T@w0+ijz=qI?nY-Vg{-5I!k zX>upS)g9wDm+qC9Gx||3x@8*FU;sRjWE>7++(sP^N<`Sh*_-cTh0jU6p@H<9VHAm(1FQO zBEoefeIiZ~iD;^$x>yQKU+2sbi(q?1aIxi-YwFm|3PapsauY97DI6w z<|hmgAwBlk6pS&cf14jpk@c1?lcbq6ps7r9^rXSGFs$0WKQUqPKzc58yeAyh(@PR@}cupDIDX47sK67G|F90$;MF-RsJRa zi0ZON%)Y9(gGm>E^6;w^KMT=OW>!A&6?NXF?tLYJa$iQB*W!gRc6vVoKSKhIVfrnS zKvu^5d!bX!42{s41t2`2Q)pzw%c(?!2ed@|fY7OD5uZ4vQs^|QBCODn8AzdH_GPEW6PbRln1%3eXXW@$;`IL_gv*zM7adf2C4o0?*^jI%b^h_-LBSy!zNWIS>f0t*mhDNygW3Yb@1TcoceQjLk21M_1_nO{YxHdtekV@`+2BbNfqa?%Ad*ABbiWO9cyWUql4CKl!a1m#h{X5E zXcoG%Y)(8e5}DK^%pvg^GH66t4v7GXmlNQS;E-Mep!a+61V{FIgfXgr+F^BF4R>lW zWXaHM4B0Vb65`7aDC-o*DJb~{qZsU3KHYKL+HLT;?7>*mGt32#KI@47NL7A3zQ=px z`>@eU6qQ#&Ig*~0s!@iSfNn&q{I1tx?7o9U2f-%^{X>igAa6$cw_`WImY=Gy5qm9w zdH|CDonG+1LEt{8&_8Pg4ge6~tH1jKAZ007<%7$s^n@r8^1& zL#Rdqzbv6f_J+u2F&h!;2)_F8Qwb&62imlyN;7nbe=%CS7KN49qUrMhi1$KG&nIA- z-j4v9?vqC<3E)BQ6#1iu0C~eFZ`2b4U-;yUMgri86nSDffKb;-jcQ=1Mx)}MNOVVK z7C8QUsLL9}FUP?i|78H{nbWlZ$h^7l1F#h%U@A6-fT>t50b8+!giOVj5HJ;62_RIl zf+H3=f_zn8jbZyKMk+^R`2_G*>~|Ntg5$e98*jb9Z>)&b?t}-`^HQSxL)_Ro1g9mB z{>oRt8?m^!Z{MT>MqTHKZa4zOXtL#(qvg^l^QXsLIoX%5a(uGtTGXceHMEp0D?R{V zShg5Ih-LZ7vMc~go;m`CJdFf?1(szoTbE@)pY}&O;=P3lQH~o>u~$H{LlYn&fiG}_ z^`1-gmvL`6;*1vRODD>&Sct7|DFdChv*&{NseJpmGAW@;RVN(vP)w}sf-ff}T7%mb zLAftK+4p&sayi00&EfMJ3%1V-SO)`drXENs(o=Lv-C6Q^nP9(NRJyi+ zS&%$BxCD*a%+bM!WvqN=N>Tqaq?RVNj{uQYoCEi^yCq4#FjeYx= zGM$vS*H;|RKwYIo`SZY-TvwDA;AlIJq0V|6wCIRw_PzzG+rahFmy(HSdMUXc@qgtr zsEsJnGSYGYn_(njZwDk$Ww|F2-rd+-D#TTfK(A4x7;7&+fRR-;=KhmKnB%n;VUE{Y z#FibeU9X!K+0@!xMQ!tFfQdAZh)61lu$Lc#4q7-+^C|Cw&gPT#9NR?518wHY*C>;< zX|hF_CR>DQvPEoJlXKUEdb1cnq~Zybzu}4EAKP3JZEyGgYg5z{=@?&z_`mWPUyUN|7+(kA2f2cr5*Y-Nb^gsc zbNSG_{|-n|0wb|ucspPX!&`)5c#AL$ZxLI@@P#OHi!1t*$2bhQ9MCsFg^|EV;}DRnJaF;@s`eHE^**3_ZxB=!18UMl^g|M=ivgE{7GX5%HJBu=M(w`_ zz-rX}2pNsKl7P{us{n*F>Yxf2*fry2Vsej6M1sZ1eJ!C zT|{XYtkQ@y5kqk^Xg8gSL?oQ14L&0D24Cu(DL7Yx>XbLfj>XcWRk2x!P~H*?-UT5< zdIl~q%nc*nK)m4T5T?A9(F}}< zfN_Ggl40!xYaPPYE|vQ_K7<@zwnKIiyOc!yB6g`FUDT$XU=^cc^ld4fU{wH+oxQOW zEa~WSJX@h1UDhzH9bL{tc*`AMCFtmKA(MB=mOgBkAS}fR5Ad(lfc0UUWc`m#;0#nq z<&~y|E!26DUId?mdB~<20MN5?gY8QdQ|1D}yQjgfyEh>aqfc%yrlmWx3<=rMwKhf2L-2rpdhMwYSb!h>!=| z{Sy#Hyn)ZJc<~e+zZL?Jj!67T82T0bwAzdNdjqHfAZ5Ubcc_9oBCV7GCu?s@|{#&5|QURc8 zfYkDn86b-QNP7wg$Z7(ZAbk#wbp(Foz#!{J28Kk02Zm&Bc!felT+m0EK2{BOU=#yD z)zrYK1i*oj;y9=Vz%h{AaFj432(Wz+hl8~{01%-#I9MY(10gx1%SaW&BJx2dCTW8h z5$9<{81K%3aaxO2yC{c~9_vTCqsiEK)wKxYRo5a+Ni8=li3n4YuvKO{S(K^rkISg= z+M>9qJHh4caUexq%Hy}# zg9mu>MqPOq;MI|(wri1he?W5mU3QTt9>$8MypJ0!*b)BA@E^pRDDUrf3;6tB9EkIX z=zJPonl0M4hi8Z7fFxPw;2;ovot6($WWjYzMV2y9fn+HI zB0`p3fQXQVh(hLW$T9_p5LwV2yrbOqeV|7pp4kGJ3!iziN49l?4y+}U<2AIMr1yC$ z-PDsHKp{G+e1zK}xe%=JEn@OGLiz6O_>LoxE04t?VZ7n5$9SRuBe48JH{f>ABzzpl zxb<$K+8Sa`c54VgXlsa{?A8zfYd&5=fZ|SW4G}Qr<5Q47XI-fW(DZK+QV*c{|0)xO zdH}ZoEP~>W+W-b(rf#)0#A1y3_y*)b5n#8548m>=Sp@I>a%;#SOr}Vkyk)Tvk0LAf zYx!+%e(+U+D_#LY_WbQQA9ndtVG-xFX_4m5&(9HoVt7I8Y^ggM*y@fJ!Ln($H3(aF z@?MnO!*j8bkCK<-xb;n_;toJ`AmS0Yr*A}64C0(V*$Gx9_s^(CdCI2> zTZ}NPAkD@V1ULn-`0)U2(HO0i-P@uZIp(@u;flp*Z~61C%YUU9ldDJ)!La6u2Wo-! ziW`hUpD_zr)zxnMQm+<9@u>#w_zp~s@-5VxvE z=g=JgXE(`vy4M*ReG1?4>ZE7vgzMsRhh^yBvBPp9tGo~7NvvuoAx_0M%kFo>_`h3S zT+Akb_W)xL+zng%l%)D{!D%?~eyy*7OFoN?miPS=m^RE7Ajk8>Z!Q%eG3}U z7H=w!I4>?9xho-d&j6SWPgZP zF%|$6?H*BzpZ&MdM^*G6W24hvdDec(S!dVd*1b!O#(?EB$Plx2^|86MzMsaVo(%( z3I-JosE7r{j!#r#0qhhD>Qlgq4Y4DN1}k=+6${F{`Ie) zwa7ht&z_k*d+*t^XU?3NCQee!(vgDHw@r4q$f{ogg^V+N_u$KSImB8l{ko_D?!5Mh zh$-zoc6Q7HM93EG;`A~L5JX70ZRT7w{5`6i9%jx(_n<#2cGnMtIIlecje)HWI?j*Y z?qR5l%>AE7dlEzp8ty0G+7I8sLidA4_**1-IZ-8nwBK58C*qD^eeT30JnM5Ocn!Qv zgqpe|D12;O)H{p7)1X#6|({W*MH@#m^A?CZ{)0)4FL36F}XXV z#`vt5Zg>`7!?R*43DDQD`f31{uaRw3lYkqP>*Jde5YSO%k(ENseDys^M2M5q$6pfh zm!9#Eti)(PgN%&uTSo^`1Ng%SQ7ifEfO^-~iqTgUzjlXG>ku*xy4QE)eR`=y!G(Y% zC;v;x1}6T=x1pMq1nfzFfGqK(Uy49HWGZ29vs}QjBO@mfQO@Gqj>T$Hf22?Mo#Gch z3sjdr0Pe(9pzcbq>o2&EpC5vg*cAcaXkjrW*jg>Q>3;c-5^M&t}za5)-Udw-S_@ zvFav>|H`VHuBz!(w;5o}th&tyAYE}It8Po!ig?v+C7{dfw==K*5Kmo=pm9(uFFgRdrx_#CfFtsP^!$e+yA}j? zd}fSJ!{zgIv7WdzcOFaFgj~g6e}GdBFxU)Q;70sxaAW)X;<$ty^D*d3Pp&>HVjHf; zeehffE{_`|E5RcGXq%kG=h!A^;@Q~bVkTHN$sU?vlY;mk*yIW@W^8f|fZwvo4Qxeh zlevT0?C8p)Zg}2wo0OH{N@kB&f~)aN@08?9@T3^{YgdBhnxh$Hlh+(2zsq*jd_vG@ zR{v`v>&k~tMzqTgU$NkUBXLcWoXAoK@)4!c%H%3Mo0ZA+0REdNvZQ$;3%djNT4kId zE(rT%md>E~Z=4|Rv)tlrbAq_Q)(PSq+H^n_ozjy0n@G#ZmZQmtj?Im135#sa`8dr; z(X*{NABS)g=i~G(%o>UFVzhf0(Le8xoI-9N7BiwENdNz{Vjyk&Gpm3l0MI$g{<7QT zB$6*hsX8L-f*aj0q{CnAh1ECJ_rO7S;Inw4j(xE^ZRNu4=*;XN`@0FDA`u#9qbeN8%eG2=7(vw9V>_Wg$9eBL2Qr zgDW8LnJBi<+c(RM7*?2-;fzQBe`gFC$-hiz{I=KcFLTCjGepudKjUhN_Q(?pJ=Lxx zr3Q8O{YMXs-kl8cIVpV(1HQQAYe6pSlAn)^7QO~8^Fz+9sd6qL4tm&co8(k_Eho-( zez8oc)er!BN?k<2o>G$s^B!HQX=`zHQF%gzCCJh*kskPPWLyQTsedBKej>IuB8GRu zl+s-SR;6Xrff80vh(9$R6rd$-Fh`Z-_(hUCZ>J-oujU6~bxgVULNMOmF|cEjc=wP#;BTLHxbp@R>0$3W z-u}aIwKJbTj%U#JD+}(pNe)9XGj0S0cG#r805Bhb?5+tZ)d&*C%xVfHCzf? z#!U4``(eO{`i@!`33${UkrR+Z7EJ2w^P;uwQIAHaFW5D^!?3Xd(jWD{^k_S2k6D3A zAo3fPi4z})4tE_@=44!cI;xw~MOH93?2f{EI2hOJ@7?T* z+**Sz#woeaYSaLDfVp7GACDuBzJ@Cp#g9Uyw)iclKQDQBLXl?F{!aRcIgyMmLt!8d z(ht-`8aNw>&P#$qsXliPq#odi2p6#Q@1fp~p?;8}a8PlRiyt-&#CJSS$< zAWylwq9mc%7rAAKn+q4k7bBx^n?wB&XOiE$F*+Z7)UinB!mH%|ht7REu8Nb~1+a$- zv`v!7>f{s8h=%%6Pb0}KLC19uNAGga#yXyRTpJZF+)lJwvh~3jb{0TBbI~zJFU~4# zb`gNZ0QP+X4J>|XX%t+HzC8;yo`&X#PV6G?|K61of<`aRO0zh+y+cvO=m)Y=QuGSD z=ry`%aD>smfxUnKROF^czm|o!XN>}YQ}JaNn?L$mzSdCgd$0|60W47NYt6CRb^HBF zUE_pm%!!g@zc5{Qlu}E-Pv|6DcSCk`)hWz1U2@q;&*H@A5zG}O*%ox!c2EkFu994K z(%3qD9>M~zirzW8l_lW#V>C>}h}Vn8rk*}L@_b_gCpB>ggzV^MV-n&ic~VcKuF(GQ z$Wq2+Iq7@;7ImCfC~r)*lNYi8>H)G+g*8d2Ki;iDq}`#iPmc_0Oumzz8fTJHS~M(W zfm#v}OH4S!f$1ro;eaQdhD!7mZzL=@sk4{n4Z zg5$g12tydHRc0fML2Tr3R#m*##oN6Sl-ZpO9jHz8Vw9r$YYQCKDJ1(i$rX^*1j@GB zX_*`~9A}RJD10N8O5_5V3*f-_`XqTA?PB~tU|+0VyoZMs1m4Bgw#V_XhJZe7a|40+ zuuT@B58Ld9XYdkPHtEal!!`-qhi#^*019pZ641_+QHCIF zW%MM)U#AS183!>j*4ZdpT;8%Nc(qxAdZs#tGqDOB-C#KTZ<`4?+XjXu{?Z-`AGj^L zKy%C`FdmLjjVN~CG8!$%Tm=d$SB9<}NBl%11?@jWcW^r!BpY_9m%|X@i ziKu{kKye17CmfgphCUiIxD3f_ohBGuiEr0=2k4l`LBRp9Q4`jE9`pDdC|+$!3^!p% zos@ykJ6-I|Yh1?h$Hxu9J%IH?kKK^@hsPA#f&u|k<1)7D9`msiD9qigb{UsrKc?`3 z_p|kPvl?Mc$cdY}Hk<}Ax0Cwa;l@Q?2Rn_1IPaW;qqw&Dgkub8aoc)wZ?Sfv~(F%EVp9#Pdpo4 z&@`rN5M3GIuO1pjlVf^l%y+j%(JL{iUb)TiBi&;hVg%_P2b~kU;Io5tCp3T^mq)dZ znHFp*#aFkN|s_P?y00cZvDeE8$fg_dDDI3PI zO4)nG!eR~_9E87V3XwdtXCYbX?J^Fzl}1UV{Q9vAW@3PwZP zNb(XU?--=a)Sxp<91`Rt4?;s$GIiIWG(iRwCbKw;Hp#lX;hFWOsK^lj;yT0Xv!dq0 z0jn{41O*1M4G|-P0;zQpv+owd-1y^&=o++6kBljf1|rxyC`eC? zDfS^nHyqe~XiTviDR}JV&o@Lo5CJ83NPl4=_B$<|O0qd~!NY#%B#Wgzi|zKTFzrdU zxDg`@3C~Ryq)tYz4Fo2qOHj1@OTLM*D|b&+G&(4iy{ps{Vpml-E>)O18-1=DQVS1B zrBp@;FlK+W_Pd)SPQL`bAl6xk@#luAHj||$nOVd^Z8y7!L$WiAn9yNUiqPk9d1%|%!}84;VeCp{ z4{rb;+03LjWBO5P{7pXs5waniH;%i_%}sZ_#X=nDrosy`mTC%U3Ib!k+v9w2Bx?Np zWZN`P=_eTxD;&=K}>V2G7fhezl+!BFFM?f>?pH?r6YhbW6)Xj4i+NhMFn@T z;NH>*;O>=@7?6tASsoOGf+ZU>EWIydZsa?2JDJ>6rOJo2-gh9YnyFrMp=0Ay4Bo z+E;8ujoUo=_z{Re!PdB|oYtvX6L7RMfHVR)m44x+W7hRYMhN=4Lwo1S zS!k<3-nz`GKTVNVXrDwU@R&+O#%tp8qziV%7cEL^U(ed_b$UqcNvJET{jE!)${+wW z?mnlTxrKlT-eh2IAt0ju76Rpd-vffgUPQ@kHmI0kKn)XzAxF{^EM0Yy*| zr8IFrH$28JV1HTuF|#2%&)qu*axUz|Biyji&T}O4G-C0U^BlFs0Mu}_8+Nj(CpAUA z{EO{2{sqB^pD!a8Q z>ItVMA|>3@KneG5suJoCjkR0YbGau+5l?)if!rT$ii_@p6Or7XXdw3|o1%U_iO$#+ z(tE)T540t|64a{x6iJ((V2~SW>6HdrdR6kYY!Q1P*pTV;x9uM-e@$HHig)s@v;k9M z4gT0TE%*j6Pt)MXQ$ZAV9PpBK)X6ZLu2ttKv!1xGUnwd*=|Ty%u*M9exO%=sTXWb9PWqL z+0-Nag2rVZ@w%^`>ksNX{BW^NeJ9H9@&vrx&b^WPI%iv46BXuqvj2Xj+<9%biq=FY zF7eZ+O^$j!wJ>q1-!XhJE=~|{$UO`)4KAT?uqANS$b@>lHF7=cD|Z-JZzO?(j}KH1 zVu*?F`Qh_6m+yniM$|QVo=TBA2*NjP>O?>rn}eXLk=wuRWVroLZQ>h2+^Fc5JGiO@ zgUrN4BHUn8hd6VoxE%BNi43MM4A;+5F(vsi5{kML9lYL z`W#k%#e88O#958H`Nulq`K4sEw-WPn*5%K;2Ht-r6gBaMWIBzt zVAjQvbmGcnW%kGM3ppZ+Hy}vq@Q;Wae9=XU;`F*WZg>Y_#>AJC+3B@kM`aMfxFN~& z*Ge$x=O2O9;)eiK5cnol60UhTA_b+&-_>c22<0c_9-)al-iU=f0^j30g1!LA+jXGc zZ&6Mv_4@T#*+c4nPv^7^2{1JeMeX+j5QAfKjGSt}mvizmDW1tGNiRC6zV`iq2p3og zx&97WIs`faTcY z@>c`#)3v?hcho4^Sm2&h&{@XUMRI0BZO5iUsRKxMtW8$d6xk6ZJIyBR0W$fzfSo{x zag#x2trFY(Y;#Q%DAYD{(&UX6BW&^d;qi9KVe~**TM6y{mG`aVR-B4{El3T+0i<{dX64SC?R+dn2Ay%*b&`nq7MhsyPQneqs zsVrV%P7bjFL!G&EDt+{r2+jrUbilj`7&sm#YG+>&cLs`q#z5UlEB9j zesPQBtTfg=klWSww#)}$?rm8DAgqh8##sr#+}o111Q}WImZ-_SKR@jvRx~go{j3+_ znn{o>ZkN0T8P>9<9o&lK)d18(03N}$I6Hx-A^_2~I0wWW{*4?yhIcG`#t2lP{PS=E zY~J{&DvSWpJvnD#3}D?H3b=rU8J<4Xi{8<{z-i(JnDpau3$6l*`zXF`rz}`ZJ`ud- z=C8e$iQHveibMpZYp!J?B9?GkE9$tI8PQZZMW!`XMUm+nc4`0^O-%-1G^N7!vAj5g zr1bHl(x>1L8+#jmozH@tEUpg{fho9hpKNa|Mc_r{QvXc5{)Kk^b$0!$?E16biN%VE zfpS;mq_u)EN5UM~DNjsc6-8*1f-NaZC+o1#jPCSOD?NsO+}nxIvB$0MS)U_4TO ze?KSfOsGesA9RYc-p4W|TT6=6$2s9^7TmV0L}bYY2P##9B3VL`ciU6|2;Xt@le`9K z1OVxPToIZO18J@X>2jHx*55O+B0*@&BqC#FhKTx=ne>Rb4d_0~AAmOG#BCr#+VE@4 zGZAdVmlhniA-(9ph@XzS6n&o{5p0XOq?8N^@KNK_gB6F=wsrZ{haBbTJq7Jz~=x71>n@i_KdaE4Xe78IDJH0GmX*JyiB zZ68p)1XB~)SAq{n)0tQEP#_bq+6q5xy)cp{gZkR7_4LD#p1TeWN4KsWgALXq2b!Mqj;; z%@MU@6X6Ow&p6D(K_ zJmzg6hcj)g51kXeFRy()5q=uiL%&t~MgqgFJ6eZYHg8jhxN2`IWkVwT)#mL7w4_nH z*Y4)YN3FHZ!Z3|djb2z})jVusE%S^Sh^$-LWW7PwsL-cc;n3#hU}3K?>}XT(9cHWI zQFsxWWNObanqu1A_xdJKH_;_c4%4j7@N<6Hs&UP+m_ctuR^7@~$J1UP55wXItp+_A z2CDfkIM>5AuQSgaFX6|iM^G@m=i>Nr6?jDyYuCINv!QM8!|F_n!?Pi_V z!d36kV+>EKF3*;FsxTWsI_bE>wfh*0Mu@AOvQykC%Ft(i1XlW_nH<)99If-#{u6y> zxz25pQv;* z2&E>U1hAWvN*sI>;syZI@>1zrXGYagv3r-grQtja(e)?nc{U^*|M%|f_A(?y2nl|p zWtmBM(2S4=skg$exB4%xS9*jQJ3oMOUO`u#{tqWjX;KC>py{Vz*URrqRuz|BLzXq@881>Wfvq>E{9{`O#NB$^n$~y#RNI$wJfwtHozxDLj2Qd)9~)V%4}Bc%gKu6B}az+`G`9xg{=L*^1dNl7+h zF#$9n!3M0L9xdj@er)E6_*2ZIznG0~<4~Apc=ZLatL0#B4f$CJ=AHm^8wi{i8+Yys zFxR@3v0Ra?ZQMj`hH+;~7FDX^(>`$2R}6rRWU2jhnoHr)T7+z zd&eErc-M(D(K~;RDa9$QcUoq8*AB=j9pnxagb~7@cfw^s)a$d|baHvrz7ttX4ptB{ z8rb&ROE?(dw}!$7#Zw5xSHcRmTjOP}j4EHm_b(Wqc+?4A zHB}O`=rQ63Cd&zs(9T|K{P(}cb(!V z7prJ|*oKSCeB;t=zTiuW>4&)CuCd9AiyhA#?qql$378pgXy-6|zNb30N1nOZEQ*&L5d~KeG)3ut z(T>&W^Fd+WOICwIV)CobjAHWXcGt>ej)~5?_)lh)AdJ3oe5ByeDfZTdYzST=g8*C zHLv1%D2B04w}8y9X6F*5?B%2%LlsP;5N7R-D(P0>b&QjP#XvwbJxw`+lqWjr*`Q<^&1e?x zFUcGnMoY?*T3W0UJE@*;MuyfO`N&w^l=+Yo2{4;DH)` zzPS>_2q0M7&|6zd3-&c|N?M>{(*lE#7O3=3D0Lz-wPPVmocyftN>?2V1Z6vPb-vU> zSZcW(*z{nuY7Q`b$uo2*zOU$oEH!8*j?&BtO8_)OKc*QB-P+GiZwkM4=R|e%1VS z2~_w?oTkV_h~(rGQNdqE>U!3*zj0+|04?G=eH zcY360ir)btB7X#TveFhc!f4VUggv>x@z?rHIbjP(b_*Dz6#F2$6aJO$0>sYbE1ry< zho!+;=R4_}(Jh!Z7-_R+IXPKbi(P}5U6!AHJeV8}0*oc9YD)X;zk{XIZq47SZLwDbH7qkSnX+UntkX#r0)eO4V{UruGx=>5F6M1=yf16`cdT;AlLm!eU{OW z*bi!vLCk&{tekbc0~)F0wzv)=GU{+XZ%{|IT}L;h3c2*v>kw6>=1Vg8xZ+lU1Cqh{Iz-y5{85BI|U3%h&Ud!~XBXGNfMlAN4r@Kt3N61T_ z9rmn8@Fh=w3yxp%sMIu+JA-_!L#=ZFEJT?cyoP@4(OCWDzXG+Iid_PgO<967Y^lGy z09^VoPA{eYdO?3Lc0dcLzjElW-+D)lLF2XlX1u@u8}ER0@#f!oEyA7` z;R{9}L|6}d164Q#B=dmDBO5(9z1f?;|g0(c1|8DC*?ZIZ?T)&)E5C!KBx*1*ebks9!#&BOaxD-c8v z7H8+(<)|UlOPe5^1_$&7(mB=+?GogsZ$gpYSGXg9h_aw{);&Pv0U-`=Rgny+27WB1 zve_ZpfIw8T3g54A2<`$z4;Ilg=qp+J0>SV^kHLd99FM`f02c9J3|9X29|h_MO7?A7 z%lFM)^*Vuf0sI1|GK8*bD;QNRmaf|qXogRX#vOudA=#{@u9H*rwWDUEKWJ^tz;@sh zX?_>_QHMpkbl4mG$SJ%7gtS0A1?QUv9d-!?t(`(QqzZX7xKai;p#b!Z%I$#dXl1E}b+qyd z5F)xbT6xF7QM96AGsYQ26s;twux@1O1HWZ6227O%;_9=pKqHEa6;-5RR3Bc5mK_8{ zFY>?6Z5w5U*U^Ox|*+lBCE~ULcqp=lqh)vlq5=iB33dH8A@&gQS~G5I)bWW4O+>Ak!mTK zjyQKi?1=w`7>tg17a+tDzZi#IL}WPPVL)U!VuR3*SR;%h)(Gv0HEcRQ9q}r%svYqZ zR8sGV{VwNwYEPQ`!RRG#zUZlK=@iwT899ZvljD@Y@?WGI$Le zgExrC;6qLVh9grJS?cTLC-1%nD-Q^rhW2wXpkur^2C2f|q4A(|9uQ&+9CXB?FV?kA z@LGvOHwf*}HNrS_jnEEV!&khjyn;n` zayp3AhrSg{eJ2D6j2MOiA@n=PQa1=Kb&W7m*9a|j4eN%;EafGXEAD)>*E0D$*x>Yg z=z;i9knUsxfmh?0E_-zY;pPF6AzXvd!qo^PT#eAe)v)1-uB02vZArCick<)gj^cD9 zj_Z;PC})s0g-gO1OwK2ON|OvEmjGae2?miX0id!J1IV>_))l4SL|acrMO|60iz5;^ zW4#E7JR+V(02!_Y$&J8>&3R6#Xy#2I#Kdx)VqrvW1^PSyWTc3IW~3Z|VWbLxW~2ts z8H^}2un+5P=@bYft$>hmij1VGmyy8CB}p;bOx^G@bfcTYkeXrmM*)$c8-vig(Fmg( zjnKN$u;w(RZq7luA|b7t8-b|TjmT^$P$IJer%N{H{;gnSg7~g&@*A{eCRrbgw>_M0 z-?1j<^f)J)Zfk^@ZX1M5w`F2K$P&YsKuEW9y(mOTy&Lyq&x=9?gFuKNS@J<4p4^A8reiAx zLJAGMo11VOB7AJ`T6w zNS0dxKnEz@2*kxa+n|_LRxuL%oCt(?C>{J51X`xVBQJh0_Q>V2MM40VyPk37HX&>!KqG;SnG&E08VpCMf8&h#Mb&24%V~7 z>9v5RA8MnYLE_V$95G$>Ndwb02pzXCCb{kwE3Aq}A*)@{IKaB1Xzn=o9Y^(~Y7WDT zT~0@C1VZ|A%j=03HKq?~K-YpVD-fJU^u++l1PMS6k7-4K@x3eHV)g*hlTM6QL%szzTNZek<72P@@q|nKHJLUEH zIFQwXDx82>vyU&Tth&tc)*X$l(@<;GKj<9(f&ae3sawi-rgcjp`rN5&N)5gkpH~9n zzp8AgFAvu4@ilQFFxmvywZ#_lw(ez6qyNTGoI3#`XD_&n8$CB;za1%@(!?&vtCO5E zI+hh^fUnB2DyVCpirQ~N?X5aSwb!tAvo!48ijwIYGz;%ti{)8F%+8MfG9;nvn54P$ zamprQ45uo<2d?T#By;uA8JerS=K#lYnr}Xh3}?s1rY-Uc2mKEaATg@8e8MBvO86Q*YYGRc|rv z+(fD+(rl4E3o}S`2GTCoB>E#Q%WA}W6ye806ssRLQz&5*`T$lA%OKT^( zcq06`K}io?i)NN0?Ww4wFLX&y(;(bh$TIO2aGW0NCY^nar*`d+JTD{?&4bLkDlWlM zepJA!M4~0qY*GA-_xe2Y(RnM8XxAWZ%PkX8Pg{eXv>de(ok2m_>soI?hd2jYft-` z>Sa-U`+f8Ue_~%yl=a4+U+|(*c1UH<{>oFA!*{#$e2Cgz07u}?;UAt?l3j)!;3e-S zmAAm5BHU?kXzrDrQp&v<#?3W1q}kcXQP=T(y^X5$c%zcf5{9?RldUj`!nso*Is#@&W)?BI2J( zU^Rl#NA^sp*G7gaZ*Sx&#VvlLP^JKjZuV3wG&OH#((&%cH$gj&h{>)v4d;e}87wg& znr)d-cME{h!e)UQz@ks_z-KEe=>@Dq^PznYCqhh`8J+*uzBd`)7X3pc;O~RHr5`3$ z2QVIq|D=h&YDG+IT2EvP2gAmrqgq8qtzfa|-Nd!z>@cud2FL2JYLift&J0yqiQ_MP-@_N9(epmv1?ti08P)uRRVZnwdlNja z|1%i4>Z63}jDS?RKKpy8i?J<-D1`74S06S@sO7|T76I%9DlrZ3?44b8$FNYPkA%?o z@8PO3y91aDAQx}hmw%R&l-LeC!Vlg{Vl3W!HTX8-38n*xj?3|0!1w3ln12A3#&3=M ztL9>S#jGOzD8z9R_Ac>x8B(7DBmRI^p26UgT8zqWZ~6-wVZay-w@h-Ulr!&|e|l=z zr3vNil(-GS{lXl~rgu(-2-H*^o`XTyMKl7yDge2Mrjpx0&n#dFegTIkp}O@*b2lW~ zhlc}5Hp3!WDv=+K0Z>9_~;V3SnFe;nTqEWKK;#F3clw8NEA67TM`pNxHu;K7YJ9xgy9cl2TR7d*qu|3eSIIF>>#T!-$Zd}K%|W=~UZ2riK%L!? z%*-mqvYC537B|r8w29?cZnXR~%V&w4xJVuNRpE4Ct63|w6t=`XW-iQ~!AR2Y z;gpC%=aO_!r$eMr01#zj8&GVBo<*5Oxt20V05Hm&K|m|Bj(}F?1^`rMNM)A8-BFQQ zROAQ%mJ%c7OahWxq;eMHnH-C9)&rmxMLFg9k#a&RrHba_i+AS!QFoQbkm;qmB(swIjU;k3!x1waXa z^plviX5}L4tz^N z5`?uhQ!4;5*VQa{U#BQ}xrJ!aD?gj@F9{ekX7|s}AzTfvvbSy_&y)B(xJ&XPq?3;A z$*$~>9BskPE@_`V25Qpj&Bj!M=#IE#1_arCFvJ>W4h9Cylo@7-ATzoWSS(_aX2QUX zhylZ>FtBxtOt?QBK-Mn^XBJYR`$r$<#Gd}dS@?{M&Z~kw(H+8(XE3^mdno>R%f@@^ zn3t2P;~5wpr)}e@iYF7QEpG&bUPW0N8ER7M6p9T{_YQH`loyys0X)9s;+nkL}5#qd8H0By>?hZXPD{ZyD0CepRgAJk&V9? zLzoqedRu=K1*1655-L#$W)|FuO?_9#KsQ8yIoYA4fO;?@Sbx7e z1C{k_QYGGl=lcM|q<`*{N?rI1Fhd;w5uER*pRaob*Ud+Ggo zDzzR_z+pIMXZkg9%F|!F>S081l5*WhPxZeRz^~Zx_w5Df(~xxPWrU5_?g`>zNNQ(quupMx>V|ALfekl&)c6RLv-{Ey&^J(SiNWG7?H{tV|prn-Xz=MJTw zCV+!}yoHA-_02jIK;C}&r?19e0RUTqyeHw#@({;K6TF4K`f2~D05sUlQM{in4^+uk z@S0B{%i?PsbuJ7m%*QUG>pS~uJ#-kJ3hBe(l~*~?Q>A&4><|- zR4IVjV7BaAPpu`;4P;|?cGN#e_7;S4%FYS-q$IqDkvhJ>Q{FQ(lzJ78ux)QfP|Kha zZ%&}YU|_fTm^~2q5qXY(#x;DR<*#8d zc8@H;ABp>0jdavU<@TRzWIS9JyOHh>>Ka@EZ+yCmip%G>XBH!Axe zaC`41f!ccy8-+MK+zTmet!iJ zfb6<%xZ38jIAsV9Iw-)6Mp8h{u}ZypFp375l9K?u74P}#sGmTL+t$2;_DQHAtbo7` z*JJrlr>w`P)NoGkPvV(a`N5Y3b?0(CsP za{e@seQ*SVD&`^Z?z5h%L*L0C0A^+uVC?|Yn|vBgtK%GXI?4J#oL!FdRX-NZJc}{U zyO>2ENPF!C&*m?~`Q7s#NviD5j=xAb>a-phN%I_kyD3WT&u0uR(F}|x=VxQfCs&7B zbay1;XK1U}8}9wlRf7>#wJ1++fzg|881|rA^y`#72EPVAwk#X{-oWme81QpG;8=|5 zc8h+1+(nR|Uw|>8Ezm6{fdx*M{X|V%`?_!K6$T~(%I(t`2KX(6G!#N=u`i72wpzT+fwyTfjFY2l=`QA6idPa$ ze~PZwokLH15yD?@uQf`Y2+0*55JVRu;SG)v!RZJNQmYcGa6%By0)8!`i^AiAPFcMG zr~>#jIj{EVSUjAa6iyBDB9X|eS9M$2!=K3 zquut|7eUCR5X8ffmkOuCIaRT^%Ys&ki;++Rpmk{~+#Ao6Su|e2n4-D)AbmNCz7eS` ziM*z-bW5|(h>I4)<1AXGzW_Oj;DuD-%>kCb-p42R#}5kGXh;vshsv9ZgBFkJ1_E&l z%OOzt;%*Ysw6*+w7bTi2%=g0`Q1mMD+s-dcbO5jcK)b=IFdxrFt?)d_X&!EX<0vPv ztCO9ibjb$#mdby#d71*&un0N(Rg3xjk03_W&FHoYMMy=AY-<46fh5I@K+*(@EM7;s zlR>Ma+?jkH+@*<_^=K49Mqn_iu#?{>{fvc3?u9@;db4|LC!fpND zsU0mu5xyHq_p=ct9{dJ2Hvc_PM|VYzA@uijSz>s3uxu<$xbsT#;`A$=@M@S$9XZ5- z(pf(s_j&-rO?ViJE`e()yw52McLiM~fRYj?mBY2Z8US8C>XRa-k`AXrOA&JcND-;# zF?Vp5ET&zmH##K^gNP!Y3fGZ} zKipM?b49R;8@ zUYs4V1prxV<#~&K{yu@apjT40t91N1?R@oR*XX&~+c*QeZ}gmaAMa%`27)GT(r1vc zRNP~w#asLBAy-x zrK}u2`-D;-A|7kkj_u;O=XY{^bs7Ss=jf>*mk5J5kDn-|pzL5PhlIzJILusvpm?nG4T z-hnBQx3-0^{{3iDwK-Mn=3v-TX4Q3jxa!|0pz7*ms&!FR)2^(#I=OwSUyRt2hz_Y# z$PP3UgG!q-+*W2Og3jGuiV&Df5&Y+V)&q@Pk9{Ujzk^z?ar~pNSE@gsp{{75`pmAL zoN(W~E{cY>haN>Pl@q-v+hfTkF)LWiQq3PvCCA0X!2_tH`L#tUY=jai5l+r=dzkTp z>Pk*cz!;OuV$tp-c~UvWFs+4XO~KkW*{{asgH9EEhVe35iaj0=!pe{}nAnl)71@u) zqzJcF^QTe~;qCymwRL&dQ>T%(&Qv*=w9BI^>l#!^*DO`~+ny7svoNb`{unJ;*7jxI zOpEb;!XcH%fa9X$86QaJA6}zWpOZpW^aN3OQ=q(xdxCl@MLf!6sbVR{nP@*8FEn1%S(|I4H*!DXAk1*O2P!6f8b%=5dQ z3fI^HdlqiKF#$Q6r0U)ZQS-RT-j&Rj>uQo_B_^*2~&1*?%s z<#!(&b;IC*DBC_r5k0auDfeyqnS-8nRrxKU3Ql(X)rfPa9E3M*b0G#gCU-?&ko5k> zSC8Eck|~q|UzvzM^6M^-dH>4spM4+W2sz(?7>FJ9dPqR(`sUx!x81>)iQQ4{gbr9E z`znq0I*g91ztuw9$MP#@df$3^Y`yqz7{mGlqu~;A)u7byUrvGWdVRyHUNsXs~jg9Z_PE+8JdzkogplRHky1&_LatZ$xd}FiHbrzpn@BL_@DOOfb z%cmscGF4}kxf&;1u*@O?C{J`yPQcayO(jDIM8rBseHVK$T1@aR6t&Jmh_gw*5_3=- zlcdI>O=PKth_{^r(=PUm;5l?V&9oqd=~Qm)q99Ebyn~B|JPRS7(NqM#E+mFIakp!b zM>9u6CUcU9By(eRaYPFmAy{z+1=v?!->rQ0BX#%z6#C+mf%=ueYq3Ia*9xsg2S}Ac zt8Dz~zy_be)Tv=2#Q%MW*PYZzRjiRs(6A`2CRQ4nMYEYqa2-xqXW=sm*yaOwDC#za zYcZQ%MuceCXo3zfGM}_o-*}>^KCK#|u~kEasK#hQh9p}PW=t~L6Tc4sl-v;xeT`HzGe{Fhpb;j94@B#6!t^62zxW{PL=& z-Y7>2>z!2Jl1RG)ksf@B)i7#z75RqGGYXLUY&S=QC_vh|!L&1deax~Km#4ggKKEf& zu(wC!(<)C#nr5ZsCe+4(Ez33X+>=?e-L|IN!CR`$btfEVBYQ|)3-3<@9!yk@TWHEH zBjPcq&@@x~AY*4lWZD_0zEQa$%Pr~xNi}ynh}g;rpgdW7t0DlA$r5c1fO>IFj+4;a zbVvrLq=HE+0m)&IwTNA$5CD1FHXK3XJD`F z`awZ*WLzTQvXWNmyLv?QggXw-;tBx%g}Z_O^%Qd_w>WVIfLyG?ae4d%JeTvibG$rW zMZo*R%i~;!$E~I+=L0Lm|S_lNyCWsa`0IQW16R z?i8ENTB47!xIj;D*2+*wW>=tvX7mj>4CRf-3QPh$BlsBu=;|FkwHUr5xCFq!Gn5*D zRjlAs0EeC9s~ebdHGuB;;Qcm;I*|9eTyAvf>AbJ;Qb?xxr7rX#FMM4_Ti&Io#Pjwk zNN~663e@K#<3)loSYdb<2R6&R`dAO?SHLZJXOD3e_FSuA5#GYNH3{WosvTSopzUH$ zO+cLiw%K~U?}{$X4P^Cto8HK|;iY(a;Zu}+^#x9}F!3KRe)oh?2@?-z-jc(j&6UAY zFXbWvpnNAl1;GPeX?m;Jsfe$gf)i)>9(Hm$^b8>NY;1JffIJJUug1d=0g5v5nKMal zhl;dO`c315iKzFT3rR1Y1!%+49?bNh*WR!sBPO{ZOJsT|DQvbXfyiKs2*Xz0X0o-a zNw)g1$Yr=hS92ig>e#zgqU;uj!k2UY zS;5pj-S#s7904F>{wdwlnt$58GsW!GAIHNM2O%iXPM3&HE=Faw0{w)TW7Aw2%wM*e z%R)sW(!!~vf5j`67A|BP(87={TuDH;Zao3ry4?Oz>k_iL5C8@O*;`nJXFUjrP-=i+ zi$o}s?QAoxYzwVy^?H&eqgQdvgI1-)tr@D6ro3j6n6{bb!(ZZCK&$y^Sp$P8A!apB zHqaH-lPnk+X=V{g-uCiLXOxLTp4Zh_y&!C>CnCe@V~WTn)S<~4E`dHj!zGwOz*sy6 zye2GOLYEd6_eMcf8`ZfZbnw@-V}|D7ONN)*mBwqsTp!2 z!pLbo$v4dz%ETnu)smAesU3piWMn&aD!v+eETMuk+|(DbF)%O+reP89R9FtZ4iTxc zL@GT4c0vRQRkt&6u*W4af`-@aOui&ezY`C57&}!k9eXVHgdb+6PBB7x%e!MQ8D3Nc zH@MM2yAXr7urmOQS^pGR-#v2W)Ki-GZRp0<8M!65s5@AE_yyboCte9E>l!{K2F4+Un=1{MXrpf^zpGq z#N+#JI96&|D!JIrPX8QR6A`JAZW@~n zV{?+3?OeBQ)-|x6C18W5q|#pjVhQ*`@aE=4i@$e7rs2-p7WYqmIR{1)o5re`e=&{q z1hi=+y8-xbn?^TQqD`Zc!2dg@QO)N3PfVkly4R*L32a2B@t@d&W$1_y|Bh+o!gc>&U>e=PMr0bFHfb6+U=YTD;?8^g zb4*O%!+^5bO}~RdnGQz0_7Yr|xEK>rBE;&JyCtb>EkyDi%)Ty-5j4Ey?aqMIvKYZ7 zvE*W>cY0Fn_ZW;NFTuUcJz48l9dSyN7k>KqmjMt4~9OM4Q z+rNUNiZw~S`|lCUMP{6@xy{qX79!*YI;Iq<=smPhmr@^DX7KV(QzYpRw~llsla@6g z`8q~mhNObG+=6J>cu+?abqLI-JOkhGu^VzxzlsL@IhHCJL`)!{7xSkQu%jxflwH@% z!HKA!gU=JHD#&jCb-6ce^N$PD>cLqkU!IxHNAR-D;v;j)F z-?=%BD++621-U(--tXO3;aC9O0LU)Uj&Xd$U|2R2KaN!T7luHxnRu(XQwTyf6PsQk zle8Z!lQ-d*A!$#(f3=u09Y=XbRXNei%2VJQJ{+A;`!R~nju*1N03#A#Z*gj%zU4?6 z_l8O~1ky6$@84JldW2bckr;5(dWA9E`nL|!GpbpM?irH^{J+vOX0S1Oq@Pbfx@)G9 zZ`%Ce|B9X=KGg0RL_|Gf>z%59lyj@c}YTM(b&_&H8*mrw>+^pIKYN&=kX zat(AX0M2N|?<$;6!P%^_GMRDPR>nS*;d_b5bdU8`MkaO7m44LpVuv5kNTg?Rv7qk{$38?f85_wS{pY}Ob%9^v^E3*ZTw}+P*rTYtr@tIOwACHsTr+2 zBv>-uEX_o#Cr={3UOnMLn`xCS8`+C%@j6oddOHyrD=0BVw76E&uvLf`Gh0PO{a8Pl z^wPJ1-V|GFw6GTKWI}G;p7X!Q2~GHf6i(VS3q44>&mUbgoVl6JTDZB*%8tE&M5*jT zvdCqt>4CpeO?8{uo>iOMo_4WIkRY4w@z%eOFW<0#-Ne;rL}RBrui`{c4Qik;87^%* z6okE!M?{7l#uW9w@6U~}wmr6^`PjZsn#JXrur(C7p3*@hL+)@X!Y4h!e7{tJ;&KA^ zE*I%6b{NoTb!`*k*LnvnVL%lt(P2Oh0XqzkitJ<)G0OU09g`RM zy-aSCoX%M1CdqC)M`O7t;Tpd*)5BeBv0w^O${YNF6Tjz;mvO%Y`v^1Ld9~*%#W%M> zThFXMikY|bQl@Na9uS7X#=*Qqyf#UFFyFT%VtFSDsXb1v?Fhsww%OjXv+=SFaI}4WUM=)$#)Ra`S59cus>oZ&PdA%*qyI4S+F~wbR@fP zY(nS5qI+zHQRibNrt=Z_FLb{BS?8uLZU3px*NgR-&d0`>&PU*{>wHj=QL?d4>0Jw1 zQK{F~B%6+r*}Fgz^+wWn^x7GE=pUXko&y?>J) zk@2Ee8Zy{=(QEpxSs@Z(?d)|l#Y)R|^g0`XnLL>!JN-UMmBpMXC5wKwgzX*b6=xQ? zTa%pX#Vv7-!?0OIdnMs?_onhl9Tlu&?}l~QLN+=xMV7D=)in8nSJx^sJ;*W+(=tpNQ*iH-eoHM&ar({c1WAqOs51bVIqLi4x6?lVpcszumXErk-^P=WlF@Ke`P9d<115R z-qH~vKjR_HC}2p$c5M>V)gr@8qs0h{oO$6(zT&2{V45f2SFECNrpJ-XdIEOj@;e5W zYj#>0MoK6plxKJ~y*1tA(5TNyhdw8E#N{mFTx{Ra>+pQZA=`dT%(ewF7g#Zy)B%La zW9mp903EPjif;Y`S2ZM_D-uEbu9vEmGONk%u3e9i%>PXi5&U((>7AsMn}4$u5y@@8 zS&CG&_%}=6&~@jERuGvPkOH zt`#Pw*fpDOkXg|+O_d_N*O2!)*uALjaU+2NNHUAOw5f41lf*8zF=L{=D=fz9RilR= z$>ihuCq4XN+))9CpUjHv{%0z}tGm;cS&{dS=@+Q2mtcwELafyfD{rt?zXx`Vh`$)< z1d4l$f*fB)kP>cOYKD8W^gt%B!1O>?!BoB2S`EMqDU+gpfxhYtsoGMhx#L{KQhD(X9e~U_dnVdw1&;u%&i}?4b#pea4w$HUbVCQUc5Xh78`;&(h2Kz$ElA zCY<)Q%*ZIikjV1P78Z#aEuw&rM{LO|*mmm!#qSe>ZF~v%O4x=$@SI$#sw7|sd>fCw z#n04`KJqh~R|!s0o{@=R#PBL2uu1AgpmzoC3KI{u^Xu2;z?>jVvGqMk*DNH9{oh&v z6RX}6_f%??n^MFur?NSt{FX8unoB^BU5f!2TU-&P)GwC*xur0)EG$Djccu(=q|dY2DZF zM#r4;`;4FV`x2VeBv-5`7pHgxUF@PHC9TRJa5gF=i4#e>dOtZv3qQ z+#*kDSj-&yl!lc6^eGMN`5d3pkh?XW|JaA7{Aj5gvv2BGqV?gO*aO;aY_74gWvsJF zHsYxswG6xQh$)k*$1D;-Fqk!44`m(sVZU#*kz+x~e zHi0}iKPelx07qL?qpulD?BJ?M6c&zUO67RiYxvF~WU3O4Z`tztZco_~a zV>>bSI)_{zU(CkbkB`aAVT3CI@Ie2!5lOGdvmEH(2jOZGr@`<*|C}Q*XDA_XDLscW z+ods`Qh~i)nuv_;(hSc3N86>Pr*XS9G&2zsMDO~yaCll@aLm(Zy+=OAl`UL^Jr>6& zcb}uwU3~y_aa{iTKfNA*=exb*-?cjq8^TmR*b$!@^Ni~Pst;Ms4xaCEZxoLq4Di}q z4hPHs_2}q$v4WSPb9GJtwM+$gdSBxc`{d*>e_tFQe?3ljEBFW%O$PtIH_ub!y5f|p zLmZdC{u~_W!;hs)$Ag5&ZbrwAP3|0hLtToqHsy%1OQAlgZ_bs`5o4u?Cwb+8HoVe_ zMX6mZIOA|rDw*3>p*np{!7`vqk8WWu1|V#o=gKTR`AFX_K;h$V0du}9x|BKJbtSrl zJ_%_ppK%h>MMx)auv*??kO^17&*of=7O6InD!7;erIH#8WQ5JBNrdrAKOm8?JvhO99xRt_OmQ(!k$p_y2r8u2uB;f5eL%!#khP`t$!f0`}+sbO|;Ogg45Aw0RZl zIle&JydkcKZ7ynyqH&&qX)jg8_BPd;#0!UFdjfKlo-{a_7q^TGDIFiA&cF!9mJ-h2 z2J^>p7NT$~e0y+9>;p+rcqiPZKD3pHyi1bxhqe-tacCWL_KPaWqvJWr zVmSt^1^_!mQ`dG(Mw&MGnS6%9>y84ekdAT@e#to%ijD*)`*~a^oqfl1lLe_Y&;dyV zu`bopbORzv$M-kgfN+!DK<>d=2o9P)JPg^Gvwf^z$WoP_nrqZaSoEvaNkoP^;W0AR zNkoP^iO}jyP@8q&ru4Md(hXMO+14Vb_!(N{Xu|H$$VAintP85K9nQMIkFisVxU{yV zu~Whsc1lEsoeILXQ}&GvJ0&8cVMOSLDQVeyw(N{<(y}BDueDpom^GtitTCgb(-GSC zNqD0j-MHzqK!rMunMT90ROB<`2rpoP#1|*yo_ofw!~IK_S8fT*->KAG{B2 z>0RAZ_rz`uXq7)5e(o9zQMlYKNcD_!kfLy!Ta|HpQ2s7npTFq#AQYeaA+G#6&CQz@ zqVP*MC%GaPSk3hyXmNgXV>JR>xBkRFsY%~9)v}_w8?z#m zj}e&NeKD1O?#@wnkCZN>o+?HMu^slG=nx^DK?w`AmCX*6p==_IvJ*Q)XBEf;=CUq= z;HvRVC9A|fC~Y!R&TE^v1kZC>^59f@2rQi96qj==&Tiw0hD(?Tz?{s)SvlrRNgY*4 zyKc>G5oxOxwA_1=zPJ4=gReRyojEXyv7adv@G0`3o+2?JKL%3;=V|oK4P2x!&%bi^dEg0 zoyh0vfo3!j`Pg^S5s`5h9TE0jbcA)kO!7SyyXDhBmZDgk(rsWyyXJm44h)QV|IkQL z1BvQ*V=|wciZ@a}#Zj-%su1<2zmKC{K_Kb{KKq<_{zv(h-q>B{IWwueyF1D}XJM>7 zJ+~_dojJR$j*0f!ZIs2PIX)1|D7K1q-BT=vvOca$Pdzf6Y_db-WE;7AV*(Nh+T+x3 zyHKgV1f`Zvielyp)?m$i`mm|m$B&4sHwWo%x{aEMnlVuvQNv^|@8QcrNol`$q2!B? zq7&Ilu{eU83sAj(*MZSuM8PjLi?iVjux#PY`|$2)L8f58}cVbH4wgtk!GYE>pHbaBw!QK{XV*z*5pWTf{1!nlB*W1}Sv_Sa8V8WmW-Tp*g%* zW<3C1py8Zv3Q7kxH=GmB;GBpI&KVYFa85)9=S1j=#0w<11LxbN#lTDOtPQ+^&)UF8 z5U>rL(W-6Wgqt>SBuG6ISkIPGJyWB4OhhSbWT?xmv&fX)u5Z&l4(cWP!ud5`b903&5gEfK5%#c2*bJM;z?j%K zdIHH}ua7$z;TCyLDurur3;|yxBw|FZ=<6(UH!&<%o4DveauQe5B^K8o;7P&7!g$I zu$=$H-FF5^RV8hod%JJKyrRp?e(%nYo>O&FRh_Cj;hx~HVG+(* z!y<8f<`=)_l3wEIOu%@7XxucRH2$o{eyhXCorVvk{Tw*@(#T zY((UEwmGQO*)AiVtq$SMS$^D1sA-b)aQGMD{9!pWcWx2os`M&^#i7%?ZvenKgLrqh zU%>;M*8(u4DbE`M<8<|Cn}+a~(&kH0KGk(=;Y*Nkjs%IwksuK{5+ou= zfffVp*@`Tz7R7sx} zTfeEt!fQxUp7B^U&@q;u>#-ukfL=o$hUVw-*1(Mn?;cahR{$_Q%4MWKuw^&q?AxaP z1wB$!stVcn%Sch>4A(1azl`7a3};dMxA6NO!lrMnLT0~j9YG-2*U@%@eJkP3_pSc$ zpDsFQ1}N$rT$2oTIcOj=Mds9}XhzbXA`=!hqN-CuMC4471reMg6Op4=MC9ld5k{}@ z;H~amhM=*EW^{1PY?S&_wAAstRl+$hqZ5(Str8LJRtfvvDxDn}zy<>;_Ui!bkCUfB z_Wn3|4uFQd`Vzz$@3?~Dz}T3BL4Kq(UY0$t_w5DG+6oPmfst=7*K6Jdfw6M(4vp9y zDT*F!hhO~390nWwy*bR<_O@D3f#{o)yTCn>C#reTEqDrU8S%u>Z<&iA9vcyshggg5 z@?Oc3;+{kv`I5T}K9%w#bJ4eP^T1di7N@Kt|HZMvMEq71pQ_D-bQLApY0A^u#hccc z8mY@H!RO?$Fe0JpK;)7tzx~efs=U;DPfTLzYz)QE|E%-B2jox8rY=NB9k$LckEv#= z3eOx&joYda5dZ3`QBC_Uphh0;<4b%Yk_5Ny7rE^Ch??^*UWFe9G4WZyuzA+c;=JjYfqV+IsD2t`pml480k>bT=Q@q|wV<|s^=@UR2M1%~^NI>gjN*H798H=a5zZjk3nNcQBog*j;kQuC06>QD zl7nn{?GLe$%OR0f5WJU?`GPHYY1onH3=!+xf|QKs?8HmmB4R6_-LD@CtIFSmglG@w zZ4Dy#&`G1qkk=rhjT5oxYd{P^iXE8(PXoHALVg=T2QHW`jx7XmGGb|R;mcaYV^9Sj z9$f`2{-l-ZAq`vo4pj24A&9G|H=nk0vU=mc{g^OsKZfoHJ@%{kNtzcJExf>peHKuo zxho`IwCh*p+O*i8v=3uOXTv8tciJ z%G(c*T^@7Y5+O?eSQ29NNMpNDRS@wE}&HK}46ivDnZ+iu~c3=s*p(W{r_(%pHYL3M)9# zF35fefOV*lL)>JUm2@sfhzJm^l80C@2<04sBEm5|-OVE0Xy0ftLNOqihzN&GY7mhQ zp^S3+p`0X=(A^^m)sTPk0%YRU2W?L}XehD!WYF%DI~c|%&?8u0YCdp@OXU?$rGd3I_h1f9Bw7LeTP;+%9bOn z#9b4VIvjY0hkSuIG1nr^K~`c9JXEj-B@q9>hmPv>PcQFVA6V)srrEOOX?qb4ACq&1dYmyL4N zAP~YBnD=uq6#g|+5Reo`IV4F{0$fERFlrU~N9$<&aO0PiKpUjD< zJs`=_CE$4RC`)RUn3}d;trBxbG9tA~OrND;^*u;n44UA?YP>glW0X}|$y*#tjmG?2 zfL3EI^#UwVfLr0lFZ@*lm0w`GfG0EKBxvKPkQxc<;unOiWd87w`u-Q4Z2fFoRq8y- zehkC1{OiCl$8*MY)Z7(TZ5qdv+bx!S18)YkM?vl`u9cjOr!NLV8{Las$ovIZioJ$? zT7Rg0qdPV!<%w8W^})J%Y%Lo@TpxF-C2#vdsj{8mv7P~G2kvI6lXn2{j$l6?Y|4Dbp*<(D&RmRpPQxB8?e0cE+L@c22}EfwzjI>4ye6> z!rPuC?J@i$Z`w1gEGpuZ^a#oT!qg-lZXVdz8oJJqP}HQAl<8F{08PDV=?RPj=fOqRM}as`N0l z$#Za6CvVii;~zL`^lwP);68R6+m}^x)F3FtMxZJo>M`x`9`g?xm<16&tz%GIb2vHA zF2*l*)G)McVLPgg=XvCf<^ClA55`Y&W+tNkHPcnid&I2d^LsmLpM9dL`P(qy(v^v_kK$(b>BFkN5)YBuvQs<@)1t_?Rd;Hrbkta zj+Xs>OCUzH3aKm31OgXsAkpq%s!FYH52XO+4k-~Ds}x{u4*+E;_BZWrRH}JsY~_*W*BnVQ#q{S1E>kB zI->fchV9UCDEs^hQ^F0e<7wvcuIkjuvga~28BFvZ8&=Z~1hy+2=5W~R^-+cqQ+qES zDZCC4E(XLWgdX^j@>iCHRLOc*b-|V1B-CjIIn9oT)a@|KHh5z;S&4%Xmk{Vp)x5}e z8DrW&zrj}fJS3Vi#8#^@ifBJDWF>lbg=2*>w|@m0I%Bmmu|KZyod1}s+P1Y4w<}AX z-U+Xbrme&-rz$my;e?f#xPM4}!8C)dL`{c?I-K}YlpsA2eR(3e)RvbN+jX=OJ3L{j zGhyfLa0E_#Xd*IB$DRj_xX?*QDb)dTX}1qBw}aM1(Yuz6{@YEV7(}@+U{p!-x^@Q} z#%f;I?$8>|Cu91=B~!e2x;s=^iL0iE<^67iy%BrTJpbJR&wnS)^WPot{CCnk|J{Lo z6#6Y1v6zQ>)VwPnH3#xdeEYOlcg2rznm^Z4f4|pNokuX+;YA?vfHQ1$NYj|Am=LkN zKHv#E>|ut$_NPvWs8bou$IO%WUgoIYP>YH)=n0^IJL0DdO(72pr)C{s%bdfmwbC4n z-h?zVeB!7V&-{=MYJ$CiLjY2gVKROmG;VdxjhIJ4p&P>{lzkI&$V_T%Aj#QpJL&{9 zQIlQJUE3+Nr}r-Ldgz8EMvM66eR*t1Ssj&XikmxhLaB4NK$^Yr^+F~!XL*8`1P3C4 z(0=tIZ>C`HjQk&v;kk%P4y}bedPG&UG=cWo0DN*e#v4EH090qF?(K!PdY6?w+Bp-d72^Fy196s znR#AEvITgA_y^W=IO?grEUZps%;f-*_d047V;(_&&<+Eui3Gky0h3;VTv^Xi06zR) zsXhb_0BtLO!^nsQEJ6XZe+sK*tn^a=tp;1_MZ6Xt-3}$$tLTTop-NoVJfc2DqWqzd zsXSqye5WF!EOY#Fll0sVmo?X#(n_}D|Z*pG>z4wETTSw7mAiR z5j-`ZHo{v)OC4y7-3}c>ZsHT?hrGm9UgFYyk+{Dke#Ml0rdM)k{)6AyUgA@{#Fb2Z zswDoQeAANqta7}>S4M@55lnnll;Z~*eTYgrZ5;J4jI*Mvd2U@YP6 z0TESI2KeEG%csGovW!RYg4!%pH;2G(08Rl=2cQ_YvABl-SWe()D^@%Tz$yYuV#Oze z_YDlMZR{>=gQX~Vr|2ZRu=q*YJeCk?DJq?GI_($AIzWlkR_9_N&8#QVdBuf5tT}bUp)ILzopAS(A+NBbU zVJpK=M6>q;398B$Nm$>JEoOuLpwMtyd zX98?nK=fBZ0c~WQ7ElWIVg$r=K>?v1Ir$@c0QgSy!(#S0)aoP5 zEPNC5YKhgmV|OefDok9oZs= z)dA0JS3<0biP~(}5in-!q969nww!=5+Zy)J+OJXSL9?CAIBmAm5dI&`7ArquVjQI; zCgIHiyg2J4%J3+9466e^qUC{U=kEcy^d6hT5qBL%P4iF@O2`!N6N9?}(D{I(;!9E5 z3WU3q$6_Dql1V97*3d~v!2*x2!l%a;P#y9DwPg+!{~UHg1kI)Mm^>+Z4U3-C%uh@s zX7Q|wX<6JBRfpzzNs~~9Jc%Q0C;C_b!TGg|lUZsbY7`*a9*a>J788iffIXB0NWN>e zkM4^YLum3nt2o}hLl%+w7H*w?q6K9Lm|pPFK}wB8XOUQJN3NrNqP)bdc>YLI%Ca@x z{Cl@5wFs7-NQR@gBN=O2iDD9Y;h6hy8>Pk}U-SsQLgv%aRj-f{L8*v;iJqW+=n`VO z;g#scTFB^yRq|}BnR9Ibk;ivmov>~gTPKMQ(FnGF@;p4i&J{4$LqzJIVaMqnM3nK_ zEk6@=EqQ(*6A?L?1RJubB8l+3oGjj;`Ca7!oA7(%ru^QpDZeNTbg1wLSd_s$-5c&-iRGu- z4&d+Pu$u?V*?__mr-U0teuf3R_J6hR zrbQt8=nBYfC{X<!=>vvdWc#mLQ0^}t=V1&E<<2^MB7D=(qlu2d38iN7 zxI!mlUo4awM0PZ>J(AFVjKfckc)?N^wglz*5pT>kk+J$&?_=?>?6+v0#1cn3+{qO6 zKOAqhds>iSs#6ZZL<9-`P%AA7PTcEwqGckqI1xRBV1p2XqqC8i7?a02BY+T>?(C^u z0Gkk{{s?Ij1grvj7t4n@ddVO$|`=0 zNF43mi2PhMsZ^hiN*t*7<0kY8srR@_RT1^pKqLj-iphNs7MM7PPGFKJ({V{bUuRN` z+Q*wmC;A`-=aEGfm<=2sNO49D-udlDX2|lbmCKq#m0| zj)7&81H5jlF$fsWHw;v&cNzGqiMj`ZuPLY_u{%E990y5ax3y2h{YOku=lz=4{kB zYtF=QTw%-^L2m`>%%zUvH;Kf{T;N>?BNN@lw9c2uqNB0K1}#lkuJbo6U9l`ErApXt z%y|axlL!i)2$VY!ot+dS14iv3t{8&lg)*dZDR)EUKaX z52_rICjl}|GqGpLE2VinIu#@_elSbHXU%8~67~^mBSq0)bc--W^fTPS|8*NL#g0VW z0mR1|u^kY}1Fh2N`1W23LEMS4gc%2MRGn#VrTuY`ATSPcrsyn!Xm7zqI;yQ#3Y`s# zg;4lse~;0Iuyh3=!_r=FYr*UgcaH>NrH7aR5rzR>*?F zRD_H7$0UXe3UdgU1%)~SWFgkQ}itW0&Zx zanngs4&6?Isq@d~ctzyV1_7hCyJ6|Fup`L($rH&6((*H`@UMtm*>@Tpz^bKR$83Dv z>IGDQIc@O7&^wlM!c>OM;~A;XKT#72DJ=304jhLzZWZ}nU%PmZ#ZS3hdY zdU&z|Lj7WuE$iXQy#TbuRUkvKww;^@pmBkv7PF{20EPH;$W`y;I4E#(U_V>k3*}3G zf)8%|fMq`fDBK~Jl)9T0Sj$!9Gm+P6LC@jwXeui=^x zt|%J>Isp|q4`pm*VS9*8{&$wfXdqucBpKxCAaiL;kv3c9q+bL=D+p@4zFa9Bbj zRN>Qr_67v=Rr5c+TFK_IWY~82Y2bZC(g7tM+tFW&_rKQr$dG(TKC8*st$9$#ME6

PmF*nNO@l;v8&dgS*T8h)rXp`*)!(Oq~?M!_dXl;(xX~Oh}cp|aq?_Gwd%Pjdsk%IrpT#iDTexuFN z5Hy0Rt^(Ch_6{k^B!m4lH;sv?eHq4A8qDmx4|!}Ylk4TfJa?Gs4r`jvA8u?AmkIIs z$^JQ6sflRAg8RbCu7T4|HvXq2pGFF1V@rp8N|L_fut27ryM|?=Q1DgQeHX1>4%!R8 z3Ab=(cfbk}fWr26%)JY88Nrwfoq}R6>Q4cX937L79#*ad_&osoy@Jmj_(oK`osGm4axy*>-;1%)q$_(D2qih?nnR|2;kZX$#+dtjGz1{1XxhSkKK&}!E}Del1@iubYoqGTa@s&`>l$wPOt z)m6l>TigCtOO5&@A^<+9t+&U5lJ8=bAhBeIRV3fVY618Q z>{9^v3+!_Um<9GF02;EPm5kFiv<~5hYzXom_)!Ni&T3)Zf4;YAOB=wUh#AH@i{seF%4BxN|1{ zxUQYb(zbi1IpG?_we3|P;c*Q2Zx??_r^7$hwjveB;6!K=n705a_nJ=lY>VV2=UZu) zn{Vb2xX$WRJPAM@fDSm>Is#!bLrd#`Tb*1UMqAEE7pdO0e>A| z1vkR{9K5#oE@|;a$Xu+@7oijr6d@5gA|xUxLc&Ib(M8~hb-nAA+bSB`me9$T$TB;0OTCWea@rAm%1+72s> zKC9(ScEg8TE#juF1#x6Ye2g|(h-o{fWDByyF#_?0*mj(oTf~H>f4YcC$=o6)x7?B< zj84&cwLK)Oiy%(5J#-WJ@O)oascmhKgdk%JwRkxQ>iBU{w58@t;0ab?e3@=Rq*I-` zVb&{u?pesZirRU-)vfpj02@5*bT3EP-4n`)qoSgjWdv|^<}YYwbO{Qh`jDCqICt$k zL_y%_jBmI^7_C#$H#>Rxz62H&7Dan$wmv0-YS%&YO$5{~+9UusAA@Nm&7D=>j0DYj zzKJ$(5VZSE?AMnq_22k`O7L#{KrO@d{Qw+VUtKp_r8&-eMz_;d31a_vVf-1*PfjEF z-`BYoR&oOdyN#HKnkis=_gNVM1X579j`i!{0z7h~OGIrNsf| z*4scM-}Fcfi!L5$H}*d~5s^FU4|CR1q1 zj7olYOhkR$0T5>Lm@6!Tj@i%SM-D38k7Q=r)_9FlEwD+ysL+xHt1oVROIEM9t@l=F;i<|?XA&abIoVLj22sfk+vIC9M zrIR%uXAGQOFvd3|NRD{8U~-nu+2X+U%*}6cScSS7>vD_31`Wu!Xm=ne-103BD!KY$ zrTS9FyP`4VQ&r&2rAfw3`fcBLlBnNg2PF zfrz5Ftma~bRRDZPI1YgC2&WM+j&K2h&4@k5wHj6cYp3XAT&gi}L*j=98NqUMTG1Qm zzRcbcmXjk`AHlsNresM$;pQOB=MrXVc-x5Ib@pZ5Z=+F7*GWW9hebqAhegDH+BIZ_ zCtA6Bi?wn&n$XwERT>bj+`z`&a;@|wxH~2IZeZ|1M2-ZB$dMosK?!1UEIUhg2SMZD zSmkJ%Y1%)Wsnfgtd!Hk-pB@WfP3Y+C`6uoe@{H)?tPyobMMa-rvx>1QEPAM-b(pww zw`duNFZ!pkDgarlB3ov7F^zz4RRI3Ctm@PMpjCbTf8DCqZ@E>W3A0wE0ne(~xPQT_ z22rd26|gEIa;%Do9IGOtVXMLl-L|(X-^G`KwxSJKr#CL1Us7{iyg|tJz%o$l%d=7g zBF|a?e?p$9MUI~r**Mg-ZIt3B3@No>BjY+|Uk4XVoPeG%3n5k8wl($VOBLj%$?TdumC`-VH~eP3pnoHB~KqkzQ@XwakoLpxEqHm z;GOnGnz6{xY?xgf<$iV|dI3Q%73BcjAn2*0TmttI@K!Ny{x=BYu?T}wey^8tz(~OO zfZ&e<3~a^$ha#SRv-xh1;c`FZzX#~Q0o`o4?KoFN5yG~aGL67LHKUT>f{MYqIdY%D zg#&|oW{=#@*$>~#4u(_kdCdtC+IZhF9az4VRQn)IWbwYKLEO zHhit~1oVK>93=ycJPz$4Oxi*{tQPqFY?Iv9!66)hXThPOV;8;*po zVwBynYrLf%zwL&&j@@FYfgi-eja%C40+alBEF`VMQPPeFNb&)Q8^GkFksJrq+T-U- zgxrPaMAWfyrS|xi)wYBZx%Uin)OTe-?awbD{g~?9*TaES7os-z_t&fdikq?Brp-bD z6wh$GyB7yD^5nU@{!%-e3g2d7QZ^oAP;O70k$$m_QsY;Xlp!cFdd0CGYM);88*-6_ zoBw@Cy}B26v+d+qi8`nORLWPqS5L-+5cl97jNpN2x5x7#Iq96i8EAJ1rc*p$oxyo# zcc-$Dy5nmAjA`!JU#z9M@0zz9J1UU-@vKQjXLMd zTW$3*0hT$uMya(By_9)eJgoNI8vtXz>Se1_AJutIJIhvsAM^5{svmE4R7c!kZ+8jf z5Gck&q66-6w|b-(UIzm6U$=$y!qy<5@uguQU1BWkVkGGjbJzJ{AwXirT;NEZ0_?HC zk~$^Xm5nWRejF!sQ8WlRY7V~Ok$``NE%&$am>Yvt`%=epU%$~&?;)X$6Wi`0d|@nD zgLx4EduMzgiJtWa&I2DGReM51-7|i&)hK4%1^iz3x+6!uCGCLL;Av0%MBf{SLq;&i z5s#ytAEJIaog?aKTt+hD8K|7M!^(a0ccs26h$$PV>VT7@g6E+=_pp(c+=m(3o_ewl zk;$GXdz(Z;^IR+Mr9pbntKPHrCbUk;1qrUXAR#mZ(k%SZyF4cJ3(M)z80EZq6D?K6TMxi4u|*twlJg$wgZ5ZeD0ziEW<-N6wt$GIZ z@px!)zP*>D+Q7y_>ydROd?Wm5s5Q!Y<>-*Qdj|l=qn!JyaG^&zfL9!=(X%_kQG;&d zQtg4Z`UJKSs&*o0qRe*@j}ldAcc&mS5QtxaU`H0(+i9FS?qz&Q#0RQnL=1L{ou8h| zA_i?Ab0W`MY6m1(gaiZ1Vovih0r(upd3912-f?IwHRj+f+!Xz;vsWO)Zk^K3Q-KUM zr^eFLkFr$xLpYv`em8Rw7QJc!Brj`Ga3?&>IEF`8;fkY+P|Q>&Lyw&40iX^*&9G*f z5)ilw;T>y>3ld*IuO7D4fOA^ngYQuwr4mq$?zh2#itq}ZzUbS~v8m9JPLuRiKukue z&?!#a)a(N+wHC2(GAi_;lSvH;Al#?zSmb6D$`sHg<;puQD)rqYe6@nXRx#J|+#NtP8g9o`s^bbvor)wJL4+1NZBoqwh<^A^nL7E{Y>IwZ0Zz?;zL_j3 z92IgxsNNu2ADE7OZ)f3*cT@;%@&$DGDb)0XscDTyTnR+e-LWO_64(_}Tt-9_3=yYk z#Hm0Gn%&4LfvPfr!1%gBGa$_2&aUnA3)&z)^@yc*#ey-zg{7YKcI{Ola7zPsXRC|i z9sm@YSv75Jd5UWgesdBLY)(=+9=HRTYY&{qAeBUn0K!n|!6 zl5eZauy^7Yq##%QhlLW>U8#V>z&9TJfg(0Y$f$$13VesH4);jzjacPD_eRgFy>OB zpV5QuptGD!gdHh~H^b!-%yJ|U9ri0MSPsi71AQI#Em9&HMvi6bXvFjQMC6FZAbimf z5fF`deByeum{`Q~_?4){7f&rEVm$t20>KSQ~Zgn{JN&(30Y{fEX0#J`(m7ztf za1gAxl;H`oQ9eBzw+nRx%v>4!7)y-+P}B;H9PQD~t`A#nTf{jeAXS3kP6CxW2QGpr z>HAPXs*TPhZt+XFbh8(Qh}NH_Bc>3-g}gfpqXNSkm&QYtks_5hr`lHB4{iFQ&QQd> z+krd|NYPu)t>n@_IzyA}h?ybvIpiEVB~mXg)WT9DTO;o3`f=YL5mp^AXbC+U$s;?I zu_^Otw0=D#Ek=+W+nJOc?@6`6Id;|jkm^JQ>KBy^!8ncw>mg}#d2I&d&YI`3zU?48K9LJcvaEb+7TrkhjM9&rlg51X##REg6l1z_jO4`VBoAO2JqCc zJo6sR*#EGQdIO#%RO+UtXi6l1V>e5QB0vPbuS&aHzD8<33@{~Mu^xJb*)tc!Z0cL|HmvdTHHwM{p_|mY=%kh2gBBIgHJd6HT@8^+ znzNxna(h$kjgGeZ6}_LKy~j)?lk19>nGkH>y$4Fru4Vd0%=yX??uTb8(zl@(s06Uf zHCE%oVd!6K0Z31ly6t#N4eDg81*l+`>#Ww9`+=B@=sw*Xhc^_}A`)hx`t&VMO#m4N z&ZNVc)JKRgh=N`*$LSi#!DY&Fuxk=zoNzH^;M{bGr4B){Y@t5=GpStyaBOkdiOdTk zdSVWzoafQEpM*T@box}cka_VmkeO_6wR1QxW+dsvxKTPnA0AzW9_(3gH4`borAl_N zN>%1NVCIp}eTw7LFlyQ#>+y{3Q|c&(ktYHHIjcTHyaa^(1ScJ8sf&Stj;KBdIPuZ| z9M8m*^9kr(hy?VXNFeksL3KX8k026^`Skj*(EA1mctKYv^v17*A+G^O+TsAv_!erI z2bSithAyc>PLWpX8Vc7Te+qs@@~RXS!0znLe|EXo>J*_87=)(?Z)55mMG}tmcDc`L zmfG*6EFy+CC*r*Vh`vooyUK8sRZIWXwUrFACL@eNR+tQgcz@VjwuesKOS%6sNpIQ0`UO;wN)ngYf6Pu+Cku?iKy=bVnVAF0P^o z@|BY~grZ;LfR5NPM&sT(x!AYczPq;geiqWx3Ap3a+ASOfl(MIxV{@C&#v&F7s5r^8 z8eIpEav7rFk3;iUU!XgqzE=7fIIsougZ-?M)IfO9SCDc5Qqp^+_zv-BKmb-1RaQzC zyL<$XUlg)4TFL_cW~F6h(Yr!BuWG9(O`p7yu>;{H=#bZm&-MBnwKUM*lme(|(h3zx zDL%7vMR@G;wzxr#zW8x6>QI?HtzF!j7eO!iQ3}0o#|YJyEhxLXkSDwkz@6wx=lvpTAE<0aJd}!GLYGJPv{F+^rU&HD8l;(nWPP9t4N0Oa#IwB zJj-29k(Gu#%UvZ3<7v_cg#D3X>VBlkS}uzPML>l-hd@LtBFaKEWf|d*HLOnk2&)L4 z5V=Pvg~J{~6gpP86R_G-v)X)9RspMuy#uTYf~<63G=w86Wt_#J|gFy3A0QD97Mu<75-0P)WW$y>- zZML`j#xn1@bTl;F4CUhfKE!*S3<5FUK7&KK(lJ~Ilycv0h0oO(C08`ZXO-RXMR6s% zu8L}CXBex~?-Sr2z7M{(6!+Oy@GFnK23>aY{PRO{`CJHh_{x+Omf@@F9NLH6ahdFY zrFX6^G}X0aj@c!UZYk15_?3t4Oy3YX2{W@z5h&^_culvqlm1q8^k#|*K|j+hZ`xyM zr(-r#%x20}_Da+$n>r5w6=o5`g;U6Fm|ThqM+t0^ji<$cKgfG5qVUfXQ=+yNg>sAgHSzB7qW+@x<*s| z5ep^N&aEC197~ew0h%bn#gBmMv`%n56M*WobOOS~FBq!3fs}@+u4SyDdP*+Ur>Bi)MHK&b%G}WyU*T1?bl|%L6)>fl>4(U3=N~P%bsdnSQRND)%nl&8aHHd(S zdl+I*c_^gLqhjpn+@*=-yoki+C4P)>qji>w`~YIdXC48uD^XDY zBR3(mVC!k{IucqK&|r34ZFhhM$FS1qV#e9Fm)$F~KY%g-Ty`uw40A+=W!W)BO{erZ z{6g9maca9k1e)Vu!{L!QL)e!ZKR)w3IIKlc}(XS@g5lS(mGCa-qH%Uo(gyFCR{Gvde*U$eB8gOb-dKDbIx z;`uNA;HXJ$5uHN!$61z?)F)8V(=6#?ofCs^Dd|KF(-@p5q@?BJlwVTxtszS7O(U(d zWUWO?Jv&h9p!S&ZzJ{X9+u$SJQ|UNYlxY;~aQfd`oFM}>jJq%C^MUR>hYv8I`2Z&i z2SyY(Wc0`2J9rEI!hBEgqPoRmbM1*tIkqwviz#E3;-fRI)2qz zb_arn4T%j9Iu6ewJUSKtA+=<*fNLq>6gZ`{pGB+?mC>v}mrd^Fe;o)Ba9T_2OOqw7 zvupq&NgC2xTE7B84}w}eq8j(`wvz(k6*?IR%$`+sOHI@i64g={I2W zSxx{#Byx^xJ8`1aP#trTCedP&%p*Xjqf?h zR-Hce(wu;A?hABy5qiT~9p3)Xh??q!l|2Csm2Z9NdF|>eF$Ca+{rSfhIBH)!^-$f( z%5S<*sqM-T?t<7#G)I0PJg2puig1oM?Y$SGM{8U2mtX>1z`6W9xZCRUu7;a-s^6vfs(0rS0pqlny3IEqlx6K7qeL9;RG_cq^F4ESpD#wb z$n;937$I)B2^R@v{E>WqfwmszMe*+;#+#82$pBYKTp8oO_Trv3abH)+e#=V6{aP*g+6~p_ z`fEj;Wp)M(X(PT!thbhFqj;!>mDHNVQL93_lKp@X`lFVYd@_@VtYYyE(-A8Uwvn}+ zcajoUi+awf7WY%OAtxQI2sb%U_~IpZuy*rz|8S^W-Pda3BiL?0^zyb|vZ`vUiMRC< zfWHxE2?5!)SxA;vFyVn%MkfobNaS>&RUr(nVeAoBu>czhoT$lXQt@PGU_*k*D~O9V z`%EF-+Qlf{45CFI*IFgsik7%?dQ78l&*=N>su#l`c^Q+e;uQo^EP6t#>tah(nze`+ zZ@-FhrsdT2Pv z0y_#L>V-Er4QWf!Aq{HFRhOuSw58@7yt1}=ZMh5kuo`HE7twZx1&(Tj1@>Qt&Z6?1 zR>0WAk2-QJKC^CK;oIRmV*{;_ex<=yX!SR%Ar{6xlfy#e02wn+bbJ;#5D^xF)|b2_ z;t6fLdQp$e(L(DiBf?-V4$35bu!~!9lNMJ+{!R~R6XY0|W7B$t|FkjWu~WZrc4YMm zzvf|_`Jy^i;mhl4D7R4XH#v4EV&_XACrU#cW{iMRwqu5%+c*1#QxO#NY z0D^mslykyKUJ|$fReeZ%=RmkyW+A-Sfr-el0BrZQ(XZgoJ{>=~9R9k<=kW5)aJWHp zNXfDI|L-}x59(F&8zwdwj!{eO`O~mS>|77tT3`Y}0hrcvvBi_E$LZish@*_Eb?fy3 z9BjQ>1MAk?53tBWx88Wb!PYad-+Bg-ZM}<;CD?ifHmzr1(|Y;W|0^)G_!!id+>A-X zt%lFZyMWKz!ROP!V%fvzvrO~J@y7dz3-b99;2@tH4Q#X&aFEaVuv|V3?DJ_5Sw4Fq zOOQ_k8$J!}^ZCMWdc?;;)kv6*XzUG!&!Z-pXy*Z~vBzm{_dw!GatrF;*V9y~dY|$? zw9&^W|A%Z6m-24H;km!~96q%f4r?3W@Q-ZtKgJ%G~(!KM}ymWn%geA7uiyqd_&u$wDPv>C%J-= z%i&izV6Qp+elr{{X@J8&vdRA#hl9ak$s_237MnJ#8vtFk(HFiC?5Tm)TM^*x8^i@| za-$D>qn=*@8=E9=iM=(fTdx)1U_WVKzyC0ZZ2wVJw7i19OQF>fi<7^0uJ(NV4qKe z$nyCyvIO}wu;J6dKA$JP8W<1o1rgC$cGqH)$74xUYitv6ORw_0=Jp`i;YM=1Pk8~y zuBA9)f{{-F$E}qTP8WQJ)*Hd_(87W#P?o6-*A_X;Mg<0*dpC|Z!tpegP112hO=UQk zox{YF3ez0O)*(!`GaSS&2LP5+2k8MVKbXX4S%s-1u@{BK2m%*Rr?9zA5L_#WbGw6E;S*e2P_g=Y~4r9dFPZ-gzGj3w|lU`zn$L-f5j1CG7EDieoSsuM6*$3~Sy; zFubL_Pi11w`y7OQ-s=Etb>8_>ONlkyR^Nd?;r)|A(C_ZxdOKj3d0aa)j5^ zIJGm5PcWWvif01Zeg?rafnNt;eI_u&re99(_HLYEv#&xJO`aZv!Zskx6Nv@P=wh8E zDW?$&sA^>ZDQ*t5t0e4+dz^$laZhDvo(>`T`m zjC2hglDDn$ zOLsZKzI0asFw%VnnR2A-BaC#3$dRr=N!a7P zieb(BWQMnt_c=^#>SCO2n(&E!7ap{M( zPcyJ@bp~Oq&cH#d+rR>~)w!LsR#%3wZ*`RfJgcL!)dDm=ZHk0FtD7TXPvCV7Yk{v| zSXi!ItIBf(3)J$Qg0S&ovk>;> zxqv`co=cfWd$Cm#_T;%y!k#=+6-cAy*^OZ>&l-lcJSQXU>*p*0TV0-S!|Y_gI`@2t zex5Wzuc6%^=b><_SRrlmfxMrhgv7KK)Ao{B`;;Hu?M=FjSL4Cro86-(@Ps7juZ|+8F7>&?2Drcz+V?f zhU*n0ST>rI%NA1@*7VO}cr*0>QS)xHG$ZscU|G63mm=)bzY@S-rytG9NARRMr<&%B zoUW&Xf83nhX~X91pqrCZ;&mhy&1u6^D(p(6IJl-!$}q%X)-<-XIX9W{i#WQmEG>>2 zgne;vJLg{)M}||~sVp1K$r-KoTc|!{Bd(~Llm2{jc!iPj9hG{WOH(YRK{>%AQ2qCGauocfdmo3fdt{; zK%$Zb>W;4#Vbk$VM%eH8rV+>v-{&z8IzCR0mP**`_*O~S8@_W(C^|lw92vsUcA`6O z55#HNmm^Hs%T&7t0A#;4r`j3Lez@6`3dKp#G={gP1n03pEx{!S8wsvJ*q7iM0$B-e zWF9?qDDBCxC&5YydlIZ=xB&@HW}KGbEQEat)&bbc5`;?Q43o-FA8DpCnCWodm_P9Y zGbjUwYaQWNYHfuni>LNGoUF(Hp4xwkxZoJW+DCtQ&=%Q%@^ z{W5#*i*AZs>ruxVhT#|ZO>-l|deqSexq_pP{-zZDO>?+`;YavQa};11=?pFOx~Uzq zk}XHr_X|}3vVLJEveA^xcT5ADl`jLEm9NYg&_9A@>ruxPhBf`O7}leXdr@$Z{s#@c zn*Nsztm%IPaFG55EK6&~QiOf_R|3e=|2wh;={K;U-@t}`C_y2}%3pL=V4)Hp5>)=q zJp)Q`A6*{J9m6zF37TBHr6UuETQ!;2D1q6=mQ{j%Mxb*egL#VI#!M1kgW~W$UrZ9ELUhbqsHY{y*y6 zHaAvT&ayQ9s}T0--vHpR(+?%M0b`Z?4rYfRzji)FwRj84tCu*7UDncr*0>krHffgtLZaY5F%J?9-pB{CDVw68r?mmw)5hfZgvw zOkdp8>?;A*#yutY(I~;sTRcZ`xPdyT1ZFd1RtXLmh2w4D!;Fin7~Yz_`UnE)jYcVB& zrBsY6PQ!q$oq_czs2j^NnuxIPJH`RX`o59K7VH2GY&t*#`yJp!?1h}lvY~XRgZ?=T zYx?UL*7VQx=`EMFnDcztqyHj9ucrSR18e%1vn);jDujLdHvq`e|1z=#={K;U-@t}` zd@iJ0!tMAR+&J^!zbmY+=2pbNe#{}Y3n(?m9LfRs#~i8%WRE$FV8RBEIZR=!Ip#2n zz@IzjkVh5V{4s}#=<;Rbd==7|{jS@8ueF*-2hPC|KsKWXZ}Zq48^gsca3Enk=3o?D zhP8Od9B`ju{Zcb$>M6zpC^dx?^-4YeW&M>DTikO>)mz-Z=!CCdD`6r2ch$iYuu$0R z97}Bk_CXL3x}h{RD*$(zYj=vAq7gLBPSYZd@GtK*=nA)l$Q=Fv6cfGiw1~Pr6vf@u zR`i=)alSI74XVXPT}Rand{;aWyRc87!FEySBxXDHo3jtA%*5 zAT$v7bg@}jm}%G^*ot1$5$VTRk)nxSvmvJnjm1fHH~Ik1^)PlkzSMiKWgjxfTigic z+g9Fl_yFirG6C7WTa{#ok&nL>_y{9e_ueeq#RCg{EnE7CguUqm3jy<4}_bfo(Aw!b6d4#i7$nV zBDF!p$G9j^k_>NQt1>288Ez~|e1s%<0N2`Gf+V0>h2BK5cVKX25Gg!g?d%s)J|g}> zUW8|HOak*QGW9fyc^<{Ew+KBNZW4JA#TbO#6Q}IyV=b zKD4__4fBsLfdxO$vR}NFfY5ln6v0D7jg}0+by#8Dh!@p*t|D}X8{s8DD-a2SRcM+U zOY?g3d5@t%rn@B>UTwYv0IoI9@bdK)40p~H@K(V!2;l@EMoVATcqxrorQZIhAZOV z4&O(GYA~n=XRjq22 z;U&*}CZp=slw1oK+0Em_TnlL6?6rVxkb)Y)D+nd~6lTB8%U-cbb^~X#?-|JMJPc}T zfk={?yPC^A`h+RTs%N}A1r2P}(!1(wl+FbP)9Dn1HjCVz?>0#3kB%r)CBN)3cNR)f5IG(#7<&BQ+&M5m!}7ir$LsGdOj zi``&l`+xn>ww^{gwQ2oE_}$Sf3_l>UB{M8Q z3A;f-JJ;YOG7;Cg8Ig4jr9gnP9tXge^;7~z)^iACWnITy3*9`S>iOL@RdqtuKTy2% z47-9n>Hf~1;?3(@`BEIqm`L)af(RszV5E}4yPz^oA(*o-a>?2j&!7nb1O zL0Cg*nTsy4|IbkHi5y|LmfLJS_C4aGrvPJig4-LdW7>TblE-uy;~kBZK`K4C2&-Fv z$17&Fn|=s_s|Asvci>qm#mNL-hh}Xm%@n0c3QuKgK%x#MY7j=M(~x~DNOhZ?CP5!J z7K?>^dnmM;;^O&D(JfzG2OI^5{VYT?kD~cT%W28KC#Mzv=j4>DLv^rcQMj+&)SHkE z_24}!hLO*je@{Le|If+CJqtG{ia~x&J$lqQDwzt1?`#G6m_bwfm$dsFkiCMwjPlzx z#?DXKPeTu72hs6>Os-SM>8_x}zaCtAf|B?j!6=by6S4LCqJ%(+XU^7xw{cPeqstH- z8i$R)vcR8U%X0Q(XsF59Y8tL34GnWeB{1&y+{)m&A@#rq5|KXU5_IyIXdqEvhffEv z6b^lQew&t81PtuIB0xktB#>7GGQ8P*De@z^TyV} zuwfc}=gakKj<3<9d*V)cucgy}M@y@|o<^sF8r|so=$5E-nkrq20+@aqu_*TWQGmtN zU|YT5HD&sii}7xNW+=yd^gPddPl0+s@3Ix(&1luWRhAkP$!b+!)Fh*mYc_;c@BJhq z@_3DBUYu^yyu8&mt`L|;>oy^xJ|6Gs;6_{|Fj;ft8zMOv{$4m<53w1V?k)|fs&!e{ zHppmt>O5P$G1@cvv^M#si2N@xd3WSnm;vXB6fIGj;QYSNmAH|{i;NVXkae}$2I1!) zX}iVaBI?6RkyHAniI$qCTO+3nsBItHQjahX`H_4ZnM*y-cjcaz8jdGh!KvH%G+TXu zM=lZeM6}v4{q%CB&OSk6QoT;}!Fgg>U92Y4475M2WftEz%x_`OgH;A_rhU;tH(;IX-6lZ*xa5 zfH!r%HLoev`%F)lei)0@oXzRd;QTG|y)vBGi2O*tjdUq@XtdvQOI?1Vry|3rdxCxy z!lQ~fMrVk~`z_|Hj7gCCw^W8B2I^TMbs*IbDuebH{i!4X{gLN6M*uKS*G*-ZdXrTX z%=DxbxyF7TGyVw`@pQy@5~hj56!@dM3u>{3=f(VQgYj56SC$R$gk$hV=>|oO| zbjFrsYk9uF7g&wxF`tKRG2(!VFN{1ux<_(v`hPjbO*Locsx?Axso)hvX zalIE?>TjMCN^SSwH;EI`#Ec&Fep0Cq3q&qyu4YZq`Yx+lvj~_~n*{{^`s&|OWdFal z`d5Ft+x&#EI%vH(2a%#b2{>*&R$r${M5^+?ZxSHP`cvOqzfx-87|%sEf{R?KRVHU7 z|0i7JI^^GWE>d{$ZT;Y6L~Xd%8-4Be-)`$)o~G2Ho)1hf#`jd!-|NH0)=L4{PvT)) zuJm_f%wMzd)Rr>?krfqTIwrBC_hcJ*`Zp0B>xcd|95UY@X+YMx;Y5mT7;n~<1 zb+ve}^c67Z4Vss90Y*D6c5sY%){dn=f4U_CZ$XI~#t} zSi>7S-E#qnN!TKz`OR@>V+*!qCMxSCOOPMQ{fQ_}D*P{gesNb8+iGM~#;D%<+91?t zR(TJ?1%I==$kgA@^9J^P5HIcdDGnWQp~@h9hPi;&`Ks(X0^!YnZ*urPFw5Wq8M63K z1NNEDUzZ*UeFE?E3`MLx?PnJW3tk*XMt~T%3 zJX@`-J_oC%ZDc>aRv|x`-s1^Q2PERE8*#Lr(nw+1i-aXXRRLln6>pJdSEt_z}sYPy&KpyI`+&ic(1}+ z(Mt2B!YR6)<;B8T1h(|W!g{KG1NLm6ho>zdS@*2>L*C{N^Q|Me$a3B?M;*bfMp$HN zhpoPp2EV+sNj6#O9e;g{e&c(7=t<|Su1F=$|T%ZC%|P=aLGmct3QR`BEgL)Zf!pCqj*{Q9dMy)dIVtk%F?ma6nAlN+N=Hv_f?Ag+s=KtQ*b;#=55sS zdet+)yQupeJ493)FDCu@WmpN)jHP)HqecUTJdiPt01snes@Y`%Hs*dN9?&ZfQzE}- zdS_KwUG7CjxRHi_CU@6{?^&K&;;4hX@nY(v|5DH5dxwfij=FuWXE0~~7kUS_vp*AP zb#7RVxks2y51M4DsalnC`ulOIEuMnTL4G9Pmi@hN{8t|ah1N?*7PcSMZH|{eVf@RH zf7=K7F6M|M(_no4iL<Ffo^g4g z+PN>=>hF4cRoJVvMuHgq5#2dIkDLh^^k6f{!4Mv zdvh((?5^CF0KDn8oR*`NdM4~C(yef43v@X-J02RH=x<%Z`VoD1hm=k(Jk*_{4X$ zRBLZOQ!lRkjF9@u+b>x!?wN}ss_#EV5cT4gof}dMzm_;@hy?+?toX`S8NKwwH)L08 z0m@sl8vz6@kqb+-M7||kHqf)gEqO~8o42Rp{E&NW*O0eb*dk`Rz57MHeF6Zymqpw+ zzVc4bhT0Rwi#pv?Zp2|wZi4Jg6t77y=?v2f?v$N@ zS!VPhBZ*2-PeW7gUHgX{9!In|Jz~ZYDON*!;YmDZ^-mZ2RU*Q^1#kDr9(y;8BgBm{ z=m_IMIx+b@5O1c=&F6#WcLF7b``LxcUHt@38ZysOAuD z#>2sB>_Ci^TG11*vZxsDX+lqVw?vS6`+aZHXyyNi*a*KT&)#N%as3vSr-0x7y6Ywye$-)=i_AuK8@Qb_Vw4}_KX|G z;PfjDAc_sv_GqLPehaBMU%(kDHNW?4OiZ>1yl-aq0T`JcU#*#8;!b6%e|AnWX_QJR)dW`eJ4W9LuvdR-$q~D!}Tf$k# z5G$QN=}=q~4nR)$l>%`0*C+hag`+H01}HkzD#~;QPzfN>E>F%P*CL#cgXXvg{ugjb z(qQx|dPU6RZ+w83cIckVNy}A!TItDG#8mX#`@-rYN~a1{cRv~*q?j;cS@vLvDtdJH zu=)m~jlOI}A3PL-$`MzO5TA+28V8xx;Ux>2_NSwI)7t_uM z+Li52Vpqm8uLGV8ULrd-${c~6tg{$y980~R}e+tjF;iVG|NWK z%%hwybm5#{Ms`X&6fP48+%4`AXGdyssN~AmSoR^5V+_aP;NYN)B1G&Lk7u)+BPnVIB>Hy)*R=Wxym&SpF-n zLpc~YC=15t$btw@7FpioEacTZpLfEM0Plo@ybH{$xef1v;05L(=sL;Z@KPQd_#QfC z5dI-#$*8FB#nsj-fN!M(7lV;iA3UIIq1rD%5ILL;;K{f>OC)iNVkGdH|Radug zuGIV!j_lD=-m4}1gzX)}P%3B60#72Xfr`G9j!(YdgQ1-&vM?`xyoRa8k(={WX8SV{ zgpY}SkWPOEO(;b;uQM)T>JH881|Z%dmg=XqP*}LwDow2qBJh}O>S0Zqq-bw#C$Hs_ zHX`)pn+Q4AE%4}prLsx~{kpUu;mDzRK1+n{Z-gadL)6dcM_C&Z{S7n#;a~#@9BcqV z{D}r|ZeQRLHNF?P6KQw&L2b|G(d9?>>_FBZ+4B^XK!) z%Q;ieoH=vm%$d0}8JQerY?Bc^`blnLgCp^gJi9WHk@qda>j>|M%S}Y023ovPCCj}A+d?gXach;x z^qN&$xl)dP?^{hq!HNEm8qHFW0=+;y*c6GQDOQuo05k>Zgc_Nw{--RdY`Xym6$}%n zDHsN51rvLyS&=vwVNmOuqZ=CL(a&IX$?ZQ4LLJIS=v&a z=whb4=!pqfqYara*AqJhirN1*^rTr&P~{G}AW!5B!)Ln>P6M*g$$19$1y>V8aQMXK zi{{Hw*|ID>-0&2mIi z`536Y9>#;D@=+&e_R_GT@&$0gU3ZGMx1?ZeE}VnwV8#|;9e8r)jE9s^L7$1Cr$j{b zj%Y~i1+V_l)0Iv2IwD|~h8N#*h9|B->xVALtppJQBWdW>#hHZJ(=cJg(8VLI2Ied_ zv>Cj2e_j`T^&&Q8UWBz&fR)8*Pk7>MOq~TsIWEJZN6o;c2;gS{97@skPH@GKOu4ZW zJ@TBe;Ls_EJJI21hs2ZE<}RpoT>c+D8E-_(TsRaTy}URg{>fb96xn#J)e6WqFL`1e zYzh}V<1NwDegxhZJUiOEMdL7%M8OH3x3pQcM&hHCrIC-8MiveBp3-T_$;d_V%=v-2 zr68GOTh3kqF1&YjVRHOkGT2)d#LrE58*B4P#-BODT0_KnX^_<+49L_v#2Q_c@yG?} zDKD;TNPt+02Z$w3Vy*eY01|7>ms|$$ ztt4Zvo+gB^I6TG)HQPY`WvrTPhQ>+W}Q=QFmQ&14K@g%ZfXpTq^*eqddl+v+TioaRR zP#(9!Ks*xQFYz?~G9Zn=EHRD046yvQ?Bv0wf~`ibl$})7L3Tala1LR+I`=Qf2_TxEgV7g%-@53-YZ8ao+~#!mKV8ao+a*(t2b*aN`@ zXJuHGA@NaOy4CdGP#bn68nt0Z;x9`I+r4G88hf0%3g!>Z+*#u^0ShkltxA((-k5FK zF2`m-OGrE*#l+K88Uu_L(-+?-+$ z@t_iwcz`{`)1;CCX;S%rbe$KyLpAD1)_iA%r9_U8DXF=Kc#sl_2Ph$)MhOE}g_1Om z6%-fP`HFh0V8SqwU=KHvfe#Kza7t_;tItg&I32bVK66Bzj)5+~Bqfgv<6aNK^1v z@8D+DL%(B=zYX^e#(pXdr&8dNN%6cB5uZe(hHa7oF~gr5MX}PQHUXF^@vHmbQmg&K z5%m%wFcLYo-_b-T)mE(Fo<-eR)rE1={FwK9tZ{bjTMiSQBO3v-d zgUVI#Un2Qha={AsduVvshVMX^^uZ23K)I2J-=5Zn;kOUi2V09aAo*HqgWHYHlxu|@ z1Kr47!L)tZ73~J*EO|_~^&a$~y9h2Oe=@o-xe+eO!i$xD5+7T=0_(nT1~xY))MI0U zFiyG{R#AhI8+2n|*CGs!Cv_eZ9#nK`XC;H*p zLR^eW3)>tisXM6-3@?86EesuK<@lEVtcxPz$jM0aHmW~xj3YK8vI~%Faw1|Zkr2u~ z_hUz#Nn}IBgr?#lN*Fxxe0W#o{hIz=7YcDT>s^eN|4+c{f1WP!QvBJq6e}L`XF7PgW3wlw5%~^z zp8nKLaeGI6eP_8n?PX7VKMwq<4kZ1z4<{N1?lK3%S8LxCe^I62!N;)!06J|Z6-X_b}TYPug+vA$d5@1Dt8J&9#NUj51_((jr1#pXkg*O}7 zX~5Wo{Qt@He_4glte3N=!~v4eDd9xS z85}!GGj#}y9qWvZ9ih900kMC8?bSiH&(8HmpsQIf9ciNvh(}@pTrafaWw7@fNjXYP zTm<8?1qk+Ay_0n5n6c#DNR%5ECULS!w~P^dXVc3*@X8UVO){ zc!dF`QSxB#2|X*)C6uhoj@%c(djIrcsH%1MUDkW>!Z0_fR~2 zgoikr#=9^+VuxT>n&nK&V-FMqQJdbeXZ4(mtr#XA8e?LrECw(`#B>=0%uact8uNWQ zN-6sN=)Bzl*8+}bL<%L+Oe8Y`n>T@lqUZveywQ&troc)OMHf1SmMaWMJ>h=Ca3%;& z8-@(9!>|cC>@aKt5*$atVc3PZH5!J!tjP>R|7cm09EM52s^kF;Lkz@4dNvqCBX!q| z1Ql@^N-26oDdK9tMiDm8_Sj_fo=%z!jS%z!jS+=)_(9#x81K=E5e zTtY-CV#-4e&?G)Tp*++Bw(`&fgz{ijbRMcmQ_&1aQ_(UYB^#|Q!KmmCAXYZIff(87 zBfLto5ra0ivQYwLWwKF;xHXcE8rEcFqh8e{WuwWKJV4nE_wkQ zxyZ-T$jU_t5GxlIK-OF?s!@uOi$=g!F4~EtbvamQ6|dfMrP-EtpIw z2PFtf&Q@|z0ocevEnp)DO@xhppugP8K?jgEmxFGUV&oupd_WG$iKOJ94rp>;B?paw zt$t_$k|qZ<(9-mSwAg}%tqe%%hjx}=Rt_qFthpRiqZA_tjet}7 zfQXa>WwG}GPre(o(}7&Z1TA(3q)i7hAl2RZCk48@1c>eK3LvJts|gQu*vpYuha8sU zO+Z#Q9kd~Cji!T6)?}uG9#xan7NX9SJfP{o8f{#gC*RAL%fx(?0eH2Si6zKymWdUB ztyNkL#8{Kz>=RT zVmg>Z`}w;8TVncv7-C|lrxQ~Q-1z7#0UKg!2wP(6nMxDW0oV}Jr(jJ?@fjfI--?)W zz=oJAz?PU=AcmL*!U4`S%S?(h9e@on-GnVMeN3f^DL*qsOs#?gJ^*^qIbe(rfOwh@ zKn4VT05U*#HWviVC^PwGzFZKr0k#utUwMs7;Av6Y%n$;ZjA_uDhfCeMPCj(3D9^^`XJ1em_U~!g` z5_%W%2}>#Q4*FcV-Y#Otep~3B0=tbKAWj`)uUsc~HtckR)6FYigERqj>zV_*%%I)6 z-Yr;jG0iwtNQ7Te5Qm#jWKDO*MNZJQf-I4>xs#8z?LI0Ax1q=Weu(`RfOy)s0Pt_? zZ~JT>YVEN%4vCoW2Z%EdPBB~uFG~qpn{=EF5{H5f6>K`TYo>q=)r6%ac-;3Sg*bd6 zl4r%2+X5BQ3t%(8&;8BK)N8r3vEhP^PjB&7i-nko^9f1Mi5VZU^Z;i&DJL-lq?0(7 z<|NKRlI6U_5#tr!n#APcjCYzFc(5}#V!SkEOfkX18@F#@6OZkjfNiNJtN|K{lxM`b z|Js6oMKj@T;Rb9w5UV=6fEd-$OIWFnc>TUm*>FNKSK=#(Krs+VeQc-}2k9U<(n&ej zWx&xBK~LUuF4)Y>yEvm`!Tna2w%mrRXPmz*Vf2S_>-$Y}Ij~9eiYB-AWRsd$zG+e` z5Zj~K=tw78q(LuQ1B=O4@TQ_ppNkW{v@<}3z zxHXz2%20rvBq~)+a+0XAB@b|ti1VaIJ#r=2h1#I1Xa-`8j5feloH~IRaq1zg#fe8X z#Cgo5jEpkC#>l87Y>kW>rqV`6D_~>sbSoGKT#Z)4p;hQEr_cs)9!YN1KVTbZG)^0_ z1~g!MM|}%k3?yy7p#7n~1&`l^)|NAIg%eBg*h4jtqO;<1gTIcj-XCoQY{jAlh!Kl+ z!b&WJcdwr1rcne@3OC-nkRYpjoIQacXS~23q{PV*Ob3+oUZhX%?!=@yPym6nWdAVxC$ z3saI&LfA+~1rRG4)j-xCHm5c@;MlzZSuaeGaLk=q$T|ibQ8GVRbBgu$e9FUA+AgD=7 zMmgYB*BMpFmE2cLMlBE{8BKtV&S)oWB%=$6m5g2>Yc3gnV@fj009(nZA(E1eW}wOa zwPdsbv69gVBuz3_*>37#2}Ux+B>~CE2Vx|ngz!KmV|8~`Do}|X{MA5A7uNwEXctT0 zZX-)F-t?A0N$sX2j2BGRoISb_l&sd0&6m^ zur=y>nMxaVWtXRnx*7$8b%Rk)6R_lt&Zt~EA6kK+QW5!kty=Q)_#rv?p*8|B!={CBzhU#s%Z+yAuw$SLh#3RDfYZkShkDxS9vQ&XJ#q~A zR|UpE5{N0O46rPTBY^ItN(3ZNbd*1-1_)(`U0P3Ac0tVelWt+Bp6L9_4ken}@Jd;S z61_ud4kc+{r#Y1HeVhn7l!&J-5coZ^S|C`55+xE2CF_JDo|cDxD}BLKj4md+jyRLT zr?7!XH}iA%VZ@V(i&B)o(0Q^Rxl%}y`j zXJZo1Zvy;Wb|%|F+8$v2{~j-8u7q(zovow~vjT{bxoW~v=JK3>!}-N@gPlB?shP+O zovAI5sWUxO57SjRd6J6Q)j&Gpnf!Q&R8WG)-xE`Pa4-kcI$?X|wiyxe z8h9}N4JVS8{a;RY9$Q|_vfp=x=dtM(L_UD$FRi^lI^%`QLgd|%&qBgXpD%ma6??6R z(ob`xKeLAU+uiM@KeHYPwFrf*iLewf$%R&?TjuU4S=YfhJzTp9rw`ZL+1O=xf%I4P z|CXTCUmUI+N9q3G-+H)84)&2V?`jUlexKrCF=3^LRlgsm`rTVxfqu{W{yj&!ddGj} zI$3WnbL7$B@y}ySiJX0h;^Zwi)t~QGEd+Y`x!COA)i%GjSfdP8c0FWG4cyYm2O84Ao zRvLEX9emBKb%>*?Z3|S}8LYOaf3<8^TD1(Y)yDq>QpGhWx!74haXgfFJ`j$nO)#cP z2rG$@%6Ja48lIf-g-}vLhm{Gu0D=DeZ9MUIJVT7#1%k3YZmrLUHXe(wMza<*2yr?Q zeDdhGJ>rPJ##AytcRO4yn*(GHVwN2h5!(#X$Tv8IzBfzbH>g+72#XoaLu9|lUGW(6 z+=4uNj&a4)%mYMzqbvEjV}Q0Zg!;T~>|{sY+fO|PTJV9ZGk&=MguCA%*4-Ps9y!P0 z#?os?V>S7llXdh)xMe2}c%T&I^l+m}Ywv^nG4Le1m~gRPRVm7X=9C28awiJP^oj z5;?G-8!h|k*0WzR(fIGMd?dy zc?X8xS<08#PFVXAy8v68uNMd)48*jejj-leVozA~oy@gx zSj3!Z=gt?EnedvSAt`Y*+KLvHMlRF1+#7q}1!0n|<1iWxUECsB?X8g>Qlhs;1T?o@ zJ>&!7T*%K3O9<=L1Gh#hfEQh@wnpj!n#3{ER1DL_O z1sR|+f$?+;ihrSA{b551V7suZCL$MhQYRk;m1(&1^kxxpGl$R39*ZDvsZfh<86V;I z5e8>bs*)yFa+^A|+x@;NS8{#N0N1(NP3QWZN&*WPtP_$u(PX59)YCeNIvi z*mAuJh~auI;Q-egWF~!12(aOL4`IV~@nL}L`9Rj3>m?|~ET^jhTdp?}kzAMDfm~az zb9pUW+QH1`bO>PE(mo)jrLm7vE#+QGF>tdwtp;pXr*(wql%r^V*4oHadUe_b*sM}n^+XefLK!M6dap3?4E9(m0b^YlKN)ZhV80Zf zd6?^V^B@xb)h-1=-pyOjj2{%ryLmf5QTs7@Oq~2TkfWGTR#5vH(tSBnR?rC8RL}~T z705iDL{#C*KsXY5%#467F!|gHUqX@NNbf-}OU%Yiy!0OUy+CyTBmvw0DFb5qr;@Oi zMD|Y&aMM4HfKC6j5Vrl(&Q!X8{LfSUQ>I`nm$)%i1FR_5Da_-+ga#nAws0*51gM2k zL*Pszp&dkwAOW_7_5m@3;-gwa=&#ZH@^j*1lxZ4U1=uvUmauJX15@e7b^EgGn+IL*0YH$qJ_DpJCo#u)K0`q ztAK40z078&)h|;;s0n38VDR!BfjmG^{uRnH2MDTwSf?A-+bH!7~w@_|ncqFn}MS+cOai2%d=`Zl;Z#^B-`ybnFWk8*QaZBHC=JA*}gZ57_dz z35eluD`7L?-+K(Cm$^^^w?Df9|8{0egaeeb8dg=JXg_CUdcXnB$T$s|J`!}OGfcKG z_6-ni&=eEa?JEat+gAm|w6B)1Zl6bkh81qc3Ij$BzmFTJQ4^;wZD7?k;5n6PGZ3Te z+5o31Q_kSjcd>7fl6A{~YuuvDd$9zw0Z;SGd67q(w3B5Y?u?E%)?h=K$PrGy+(V4@ z!Q1mMFI(;|mk=>uV^so4+Yg}fPTMJx(|Yi9y$ne06xFf>vmej^#B#G4h~Z`%VZ}}R zf#eKU72I8BfZbj0L=Nkc?*#%*t?&cM*tf>fxtbqH7NY>`LM;b^n&eJVl`VOIdx&a- zpcdJRj&us-_HqLe{ascYU|2LUejv*Zgkw)yHTJt#2BevX3^3zd?HaQ<{kc`~cgi+V zAHfo#frmeNca6)HnLje$6`k+~79}0^D#o<|CCCrE?Uf9?xGU|0ZU)Gce&z}W1_VFg zCLa8NI|+@;kFay80V;vmTL_)WYs9fgWo!Z7=pfgK6@fsWMHB8`_{qAgEhK8DAnz59 z%FIt3O=ccF5w7ndUHklyn9ggPF!Y@ zn*`mg$?UiHshVWTu^&yz0~;&SF_BgAnh>Sr@q!ibn4b#D-Io@~_L?cF4whgT-VMYm zsXicv;W2bekm1GbCd2S@AeP}(L=400fCM=fWOx(e)`;P)tjRFEL)9c1-fc@B7{ddv zZcIg&8iAh@(W7OLK;Xs*%z5gO)Ogz&J}Euk0#`-RUunvjh3lf#=#-bM?Hq_Y^KCO& z)%AJO9mQ$OP8VZtUYXVM#-!6j^AL`|(BfOC??nx5eN-#WPynx=|lthoW z(3=2AV}v)+TU;9($Fb?+BQa5NGmNI(@^57Ufv)DnjALmC6 zRgKfz6qnv5=|6!~*`EFUE#sC<_jU~M@{B4puoDE($Ao!b^Z=Hth_ir*pV27zn6^Ix z{$#>>jVb29=LDQSrne!WwSejEI1TM=B}{JzUykSmB7IDJK&}^v_I7-t8ANR(eN4e; zCZrKzUYuhJYee*d9Wj9m+Tdfl0&qEC>Fpp=OC;rEx*8dc^zU*N9yOCbrUZ*g(e#r(g4_UyNyW7xAazk+s|fUWM z(*f92(9LAV`_o56dw+6v`aW#-AmlWV3{e05*ogH6k&7`8rPC86<%WpnW;x)L+yF7$ ztR<}Fh8%2QCe6Wiz=ng}3Ko*(eN6O1q4M{{B0!A4rv!-d_mG@QM$z9xa%zcaavA_z za+-k{a@q(7$mwJzO^zQ;kyET-MNTCUlA}Cj&!T6fN9Nd?h}p1-b6%)nGF}Wt9o;}g zPYlg~t&VO3VsvyTVXdQO5k1UB$Bb0-Fq};hNx-&I09OLSSGatF-+{KsP))6bb0I5qpy*pPmiG04eb!T{-)F}juk^vf7kOWdg1oFBdkn~kiTf4QFZ(QMEd zHa?o1`)WM13noRm4`i8vc-v*J_1ADJZzX;7*Rbn4i0CQ3o3QS=KERgkv30-}J*5{D zHnXdl(rKxfDZLyCeIsE_P77d5PCF1o zP8VTA&Wa}cUL>%SeSVhiHcs|sLCvsttO0b??0Y8h$g z!twC4(Ne^zRUotVG8-2q%;w{&Ib@T`l7Q86=X$JBO(F8oSu6Nu1N4Ouw-B`68k8n8;H% zI|L?_{T_sMr#vVzb0~&x8R;uAUqvz??W;%z1iy+TZhR$t9k7O)lD?Ap$H4LiB7G%X zjCC=Fz7i%YryirPgvn}v@J>AQvM|;;^p|8BpRSY^Lf(+xpj+1M35S_FEy-FS+a<7Rcm;v1i z#B#3#h~Zv0VKty7_xhNN4heEE1~yyn6%#Sss{pbx?$sbJ#l3oFGu&%Z*(CQ`O|k)U zPk9C86oyr_ox-l@2-%hWUV0(V6G>dzdm9G=u(HoQ@pv`JDaV`dlV@>GL!0kYf?wh8 z4`c{6LC|TJvkq>WQyx8aDZQlQ1XvZ)Iq)17%`0^d@R7GZh>CO$Q1iub_cWNdBIf|= zrw1`wzEi~9B=1k%%1PbM{`MBa-Z$@mf3=so_r3K-M=XT%GM>P_?>FI%T66DvVjDcE ziM>{NdHt!gVXzb7<@GIh;jQf=YDnCWUa(16-l{Hd%zqCeXfDZ@z6kmijMebYHW721 z{fDz6fqUD@0=Ej1Djf-j1hNdzha=%T&k+}m5@Ny-^(fZe0i(?MIxIezgt#f0OiTVB zf&3Gu<|b&CRb1nU3G0tZoCUZVu(8VO2urIh(^wGf+X?HBOwdScWVVe)N*k>WFt{G0 zjmF|R|H(ZxqugYGn)Ho%#uYvC$BcDGJk2^|K+rlPuB|gkcQ*;xY_O!ekF@G_dhA+5 zw|Dt*iXIwvNNV3;l$PLCSv;ZV-VZ;RT;HO@Y&ZO_&=I-q(Avc)Y{H&{E#r=6Nqgm~ zb=UJiAfw^MA47yChxfNt;w+VzfHy(jU!X`J9%GfV*a{YV$lwIurK~1==mhyJWj$#R zJWENRS?Pci1Lmkl!d)N$eE~Xao`L+ZvLvO<%MEW={Lhl4T^%&Sb zv-5@M0Wzi38xlJT2nB^R!_-=5dSp9@mJK)s_lMiEA=F~(JbW!bStpT|9p}K)Csvz6 zk(;70AF!pc1jrgwIEEyzK85x|`9_pOzMBi>k7K#uWsJNew~j%;uSqS6bKk{*Qujmr zNZpi&AfuaV@cJ*GqAAW*^M#Zf%C$)_`^T^po#I0K@(g>aco@c;`>iQ59LN!V&l7iI z8B<&*)!O7h)EC2{)?R?X$SUVURyliQoHxuB&}FvHoEjyr#TREX2cyaU;zsrQ&8@&; z91;f&iy-8Z>Kur@l=dBabavm$(#A~gXIg0|{!7wc0g+*P(@XP^KCPFILckjLQb6j_ zkTx(;Hsm{$EgNzJJ^ zV;_SN?nvl8|D_6LK@@(1S8{50SI@{4eu;fdx#W3E$#Zyd<7JLmuv1hNejkeAdsC?; zIN%CJI3sdOAYkGTRI)ed2@(;aFcHpI=d+=GUMp* z@c3*XHAFrQW#{b#q#j6oq6=qPJR=FqoN?ok@HoV^68Q=V4*}A_guLKeM7SJdg`6r2 zM}%|p_^f$16aO6Y)Gn8Q?>B*0adw=ixG!JDIq3C}v>D~AIK_7cUd1WEOR@GpF$K=xjM)UP1%ekF9#A^41~RW9*{C1`M0mIm*bScY9^klC9na=3dxZY z*vwcdfuyaC8Q0gebrLbO^#IYdeT{^o8F3pT;hjK=iF^*)ZU9mVB)^xm=BQjW0(MpJ^NZL6R>COvyU<$*gG;H_y8*d>==}C-pFdDoO3?)AN)+c z>?L1+I_-5Og;LJ1X^f=gy!K5clJfPZli|v+a=z^J$jV=T`r;^TreWr#oX^GN>mUED zdOJ+Y`Q~_^jw>N4=T!>>axRscZ{+;Naba=To@=JmTG(tO?(IN~QtKjY#J!hDkf9*q z|59rH4JesPjpCjJV#U3T$cn}Nsj-j;W~8_u2&9GxMQRTq^+2>p{S{~v<0$T@0cj;d zaX$t~2NV8+xOX$L5qBS}*cFnaC}*q`chXh{Oo}^ct0ZD*s{x{E`v>Cc8Aoxy5=avf ziu?IMxM&WDdk5pzzPNX@S}E>)#@qkr(*becaZe?TQr!35DV!4OZk)X2b8J-J{#zFX z6n_25DTOa5bdE4%zEs~7vf_?M@`Qi#A}o4}AmN<0Z(3K)2-M{MloPNGt7TuQ^(~dS zhZb)!Ftsk{>OMBlh;{4_DX}glY{a^p$iT&VIkUj3D6ZGiR1^b(DoWx(6(s|LRm*^& ziei9OQBp})fm|!K^*~lGwM~qbQoCdVM2;D$q<00nqZ`U~k|97p;B(sdIM zj`TXx1!N^7U8?nRCYEyk9OfYZ+6@Et;zj%Pm$h$^Mw$?Rtr(CAA!V(KRTx>T1!7ca z17Ra;%|wD7{>v(KIa!mOZevx3(_KJT&govpN={Fngzb!*k&&Ekz}{~O5pw!eAXPxL zp|~*;)-#Trz7cUvM969G^0zW!x}iuBwT5B`6H87%K#lSdM9B{Eztr{T^v{OV`2!o( z%kzWgK{x9(tnUM2SRcD3!1`h$182SDbUE@^PFDk2Ij8FwD>;4Ty72!oBRT!`gJ?4m za{5Cc?LaiA|A2&Dj3cLctzs_`a+>e%_$|wEI?W_cB3^NtkDmJDL!s1~ZM{naF4beO z#I}!YUip;j13p5!+>+~qi-lft;eADF=*_1F2Fi6m_V2#ylv^ykc-)$FUl|)>x~~$5 z>Ao7mX5`cpS;g*aV##Kpv;kRp_jNK>cHbUTAhOKJ?#l)u{se^GCxGMw(cO0-&=SV6 z`z8RXAj0k|1X9g}=>sLL`|6lj4ixUs`Q-&_$t^9-QJ1KRQBJ)#-X55G|AZYoJN528 zF7N{B-$wqz)Vte`VLSDDtZv@+fpIzdpQ=zf_15g<_M3XQF;nmQI}BVMHnMr9Q(J(T zPHiV_I<xP1{*pYEFjmUbRQQ-HfXS)%g{hDXB9y1cfYbre zQ{1LV*vL3ez3(Hgg$SqK*MPJ$VQPKU#W*wd_7X92jz!2X$ax84Q*;57axUp2V(9{+ z>8c=IjH8?jAT2~F=U-}F8FdXsze^y%Unv;0AW8$&p|zr6)&ZRtdE5U zGg6z~yB@4SBJAZ`fOG)Sy*vg9yBWt`ei3nfMA*xZ1BupKvqbO zTuRk2R!Sggt7k?UrKGKih@q_&h^DOs2|F0akLLxGLZF_^CWO^=JD zjINEY?muf|`W8OBiDx=NXfvjAX zx)>{EX`SEU=ngYd&acHG(EPiAP?jzRQVvAV+WAOW!#K+M{fMh4LOK5vkR~Slg;~3m ziDfT;jvFJQ+s+hXBOIvTb4$E4#Z?-)ITqy_eZ><{aThGnR^&P7ER$s^afsOTj^u5(f0=iwBR^ghS9s9;&LaBx1x zg#`no76JDoTwIs{)dQ%-T?$#1TRG1GGyIx_{b$9m1VuQBY7DO`09#&F12Md+BW!rp zNMsFoB|VfatP1||f$)ja+0OJvI=hG%>Ffof`9$d?7r2v635`)g8NmI0N@;{rY63K$ zGS4|%h4HM!UiV{H(cQ%Gts6mxZ?AkEGII8@ma{u#4kc&)-~jKEKn(B72pis25()B- z(vWuZ3NGNdd^ER5Fu?Hf63xev2m>E8_rop#OQDcL!ob&s(63S+2Lq5wbT@pJtOqX_u}scA zJ0p4E@~xgnA$;PO_|!wss_kZu2D%UH>fF;F|Jc>0GZ0QstM3c<$9Gt zQWhzk<|zQFA;?toUMvF)Q?J)d#ooAN>JiH^^*zK$rXFgTTJUGjFqKP7R{Dd?t|YaO zEj3Jy4M{Pzn6P1LIgvGGY846@C{wv|B&lT}RWg;UM;kzv8)2uW9m0UcT0A(h|xKLpb)u3c0 z7b^^qnu4t4g2e==MT=BNooqKv#L|@!d6d43{cq8 zD5J0qgfhDDO}$((#puSj0Ted6@=bsewzVl+PixsC=ajYb5yVQ$(mnxMy7FCP<#{`4 zT~!>=RZV20(N(P!8?CE42pf6oCbA0hv^u(KKTX|WiX7+CgC0^-rwpL@>=g*m;&X(~ zWDUJDbQ-Ix<^=)*;?u`=4^Vv4D5LlcgtEFIWfY&L03lLWT@VQPAJA2Q)AD4jwo8|r z3#S?R!rp+g+CFVJiprz6hl62eK)7PKTEYrfF%TnM<%ErJRT24(g^NBCQpe+7Qn=_R zu>lk=`f*Hv7B2d77(_3HoCxX9VSp7b`gBY{K)7nz?g0vyp^WDZ>A{H^%49&0G6rbM z=*eNdk}?Vxy*Y*uDO~jEn1KHQ;rgc*E@QneUQW0g%#!{SBV5~FVXaplLSk#q3J6yN znQSyyGi69?t~SC(xH^ga#=^y;JEX422p5kQ*#LGSj~AH$)rE0+#E4Cx1BFM7L;(;? zc=Cu*K9GPwl`w9A0%fQfYXr(rBLjleFhEnoLq!#=1i~Z_6;%_VYmkSE>PU@r4X)gp zl1reVHN^mQiM6IAj&8Bmlne-VjSL7{Qw#`LQ=e!dDnT%IA?} zeHH5Q!9(&yGlDKcZU1&A4=?S#!3?IIEsgjKXw z*Phk&o3Cv6wTLt}&B_Mn+T=L2D;oyrv1qKURd6+?ue)ev4P@Q5Ix9ku=@uHHIUpc3 zFHBW#S_%zUH`I%J1cjzIC^UXyN@$XVjnI@4`Ts^})@X%dg~qHP(AJ$<)K~|hS=3nXwOQ0KK$!{YEA|1J3Te~@7dF2{omtpO zVuA}B89=Es3mZwDG#l2QhNc8HVXBo91p7d(Q#xL;;uA9qm6Np2S+NLp21TeRAVLBk z`&bdmC-NJMkXayLD=dBKA_Ia81O{jkGD{a)P-#mS*-3P(n5B#Cr1XOaQosi&LWa5t ztSGpAkpV&K7@(;$%NI#qaQR|I$Shy}TOx#$=t_j%Ga}RmXAgb8oVLtzaa&Bwasgw)L6#irIfUo z&FJUZR%00_L9G>zG9X4cDhZn@s)ooa=$DoHaaX}ajB_`-p5(zil)KSQM9?R4H@X#w z-g8;q-RPGwY$V4%2ykqx?vz=`?P!{XZv;8kK`P9o-VMZXtdFqaSZu_aaZGMx6r+#< zdcEV^lP+g^a*HP>s)&$VJTXxVM00Dk_M{$szA0yOKmqkIrDCD|op9e0!uLjbnzQaj2fz_Jdnu@yk}cAthHUP|oG zPlUzY_*&LK5;t~CdKBMzzv~OX3COkhH0^k}rew^ON4a9o&PawBbv?8H<3nL_KXX2V z#Mey5jUY_C6v)^ug*cfAV)VD9U;Ya%V96W6&o%5~PaMd?fT(d0ef?}tJW>jJomyY$s zK`3)f4nDNPU9e*GlM2!8o9Bd7{O(S41Wu&L=-pYyk`3^~UW}G)?1@{y^u@SJCwj`c zVe#?5B&I{je83H3wxRn$DaxTnC>!XJ%RHQ0Pk&G z9;f}OpX6nx-F)#yM(XqTF)~4gt*=PpG}T44dx;R&N_rtNk_j6=fV&Q#M+?%q>E;sb_OqVWh^K*r1TJJy87?&tZUqRxrFkMGcLUK$k@$2ie`7b+dF&?Fo%D~8I5-Ps0-m-< zMAW}6!_kZ{DeQE$`Wc5r#I>9HVi(-??RRgB7pwjf6}y}WB>Pq&HhxAUlQ)fsj^{M; zID}yTr!;ayRYYw3SB2=dwC8xL%&XBBetr^Nw-U!3r=yk}C;D(xNccsD{)4PKvN12JrUyxL?u&_!4|-E=f5Q^=`s?pM$nc z>hfRxH_qJZdY!`@apmCBR<$m!A~3<78B8H4F76sNPIX)h6}fc6c(=Qiaj4j$S!#9 ztPC(iOXII4?qWI<`V)3$Jx?ztNwb2zo%dbg{_@N*bg z?)y0ZAn)*rezuJx-rv|4`{yDh?=gtpzLgN|o9GZ}8qL{Rh~@{PV*dk}H-b-XW-ERb1)1wJ(Nkkm2}Cu$lP$oj@jLJN~9WyJFB1 zAX(Xt%cmv$QMhSx(|Zt-K=iaKS1fK-i10fmghe^V|FC>0pZjsO!2%)`Ku*8G6`Nm! zbgbabheD!cH^jW2<@lH3mbjrkP@>FpdN0gGBFxi+qrDs6ie!KG9si!KJaNE-K<4|7 z+X#EWZG|Jozx7y0+;Ar{JcTq@-s6c9gZL+S;;cJ#%=M?@mCU;oLM8bls9vTD^Vh-K zjYY5)Bx&=o;ri|Epp$LC6PD?`yMdtXe$KyLar>V%HE;eD5>K`20){^pk`o+B^Ix14 z5`Vi}$9!6g)%PnJ**}RH%@pwIZD`x=I%ZKaBywNY$O|{YuDcBgTV46FCw_QD$Amr! ziH~1X2-;tSb5_!*lXnZk=VN_6p^1(-ZVJ9&z^P_=OQ=6)J0V`*G%7aA!;C0gCyAdN zK+&IPd1A?)zSwr6<9>|^G`ibfLi}?N1kgOjssZ+tI|CvTUAS>r{D>lUID`>G%7S}K zE+A|~3;%l@m!5|ua>nr}me=e>Z^ei;7jB8y+9DG0^#p|n0kRDqn4>S5F`umzh%K+ug51hth)tQ z+i>4zxfI)eqn=91cn~SDI1~OW_qc&3aI4UN_)Yc7gK7c|B7bszSp4ogG~qooVFB(t zIP`Ocz@SDw{w+h*^`)u_^!)oXZ^XE@jG!miPaLZ*nN$V;jzOWaa3B?(c>cmegQ*T; zS*QOezz*>ENURjM2M>P;JMQl5A;H~mL)5WG%NUMj*OnW(VmB>n&~C*1e+`dzxQ7XUfFJggcEMEJK~6c&dt-6M!P zW=EmwxfLZ-he>bR@qrH65F>^s0x~L{v=afq(+>cwFn|KL2&XLEKVp@wNPlf}M;wS1 zXXe>Z75Vr!YubB2P6D#z@{pL%m_nH|4DO>F_r6u6z7PH>2?(7kPP2K;+Q5DnpV;LryZ-mF*sN>Vc2M#iiZADrf?x# zQ5WD?Ugie5yl1Nf&C4wH#4xUkXPQJEtzmH?)OhAbnM}ku6eTjtJW)8kUqz2D_QVye zsC?Lk_)Nl9G~@V?_!BFtkQG(3BDg8iD;k9oZ(~I}rB}2wDmoc^7Qq&McwAV_Wkq`o z>%#|3wxXvGj)-}zXdhWoEi2l$e?^a|GDX>RsC63GUg7C>UKTN%PSvfW0+nLTIqCRLW9rU12GMf~7FY z9sNsDZ-@E!{6VNu^NO?)q|*?#nTURKi}LMdo$EyBo)H#DV7LPIAD+9|Q7+6CFRr6+8YDFmgO_3;J>?;3RUq{0t0=hcxo1N+IsJ zK_St;i(PRpbOsm&5r+8wQr*y<-UkY)LBG=!)8Xt@52!Ef8!(uF^6}B*1e~}}0 z$du*6gBe2C*Ybf6csR4DCeEJ|6644XAi|x5E{awU@hr3EZ3M_V0K-TB)rtOfz7Us^`Fr3#<{KO_ljR-aMEAMf6Gvi> zW14NY_Qczy3E|ruhg)e;4Z|PrL^zZk!nK}#IusV4vE(9zTmcVZv}ls9tICOfHrBOu z-CG}4(%ohQt%>0i-E<5f%oS4)~2x5%COZ zo8d&q?e2<3z@z6o(IZAfKl-nt;Fkp4GwYYO*jHu=UY zl-Q0whej>$4vBs~#S``9DHcL%rfr0>|A{@l6WXg1O*z65&m$;yyW`J(#u3Z*h>F-O z2;>Cx)VY{PV;2Lt7H*-Z(Ajt{&hhucQsx{Y|EABsJ0$*2)^!5#5F@Z5xJHC6Z5PQPzkpx_e)z4C=p^fmG4>Lvi$UN&l6w->EkMNBkQk%e>rR8G+rKLu61O~y=sOU7>o`|j@r*`}JpikOr5b6$$)D4o(#XiA zLVWqCMoNDYV%qZx5q{_0SSPXqcJF&{dg7h?5k)$F++K*!ST^Z+sM!;-2X)M48%4yG ztcWr5uyy+l_9kSW7S9vQSSw>*ho*mHiH>=rA|z%$reltH(-pOCI%YFG?Q|aLVV;&w zNBs0+M3yGpA=Dr*WnxwaFnyAfGY#kFADaw#1IOk6(LZ9Z^9#uJ^sSs|=iyix6ULW8 zD(e?}s(Exe7M{_op2zJx(4o_ZI?=1JqP~Ri81)+Hju3q_;Xil+UgX*gN`UeMdsIx{ zd`N8WxoVmuo`{DNvG)L&1i2e$cpfG$8{oX_MT)iYC3ART9ySx+P4F}`S0<3@TP9+g z1@Mg9!d|2)7=Q;^kmm(>cbJF!degTW8Rw3441+Rjyfe6El_VF^!6`RDd zZ7jU^HND%a1d`tJ{`8_@Y4l25()((EdNY4NUy(!;g*7@SDx7(yR}6vIfnpN7)>D#j zf)hQz7Ppj95-!0LziiEHG{^MseAxfYF}>RR`*Eryetb2(c5+&u#pY#?5(&1pn!Gxp zFqbW@1I$(?)`22wR1xw`zAm=Vyvdh*7KnM1ubK#N?9cl<#$+?G&Cw0%%{Xm{?3QlC zPCsu2TuT|5da{xIQ-o?v|I{CZ&jJuTa~IFNGec>fSvfLx_B=%# z@w8`V7!Z7BhPc^Hm-qD?fB;j$`lsMYg6GQ?h|zd9g(~K5q#PU?2F!uZAL(--+I&&6Ik!7-gdAy*@HOF zDP}Iio008j0X-@Z7sV zQ410IF1UB0rgH+yMk$dF6wg|TlTHlI9wcc;j><=!QL_3jjd-k{iHlX{7)dZV$%v2) z25`(+QhI}=_|F?s5+o%F6lCO)j55HA1mxE4`wPZ|5$h6}#;zt4&OTltJwaDJdC!(HO{0jUp0g7~ae?$QlfEE8^leP3> zoQq)#{lT%3sEwRpfRpWH$DY%ylqsI_3o{$hVv}O#+Y~1ezYqMYMyZvDIlDP<+zMTGoK39*!e++V%ofI=iMecI z7ZBAv$#nlOn(1U_F%Zj4z$sxyMY6+c5L$VJ?y!23mmSuk^2!eD0Bk#~hX^_>cFA{& zYH9|*)=fma^z;|#m~Vw^L=~b zWgMbsevn!l5?}G!(0dNbl)ZxO5N7ds7ns4PK0GwG73?bFG*Ni!#U5f|z|?1{iuvc_ z0E%#DKr#6Hos1XQJy#!I|~viJrSSZVbLOyhoFex!v}W~Y1|K=>~(A8 z--qFvc%4kR^D&M12f}}MA!hb$x_$TB&=Y@PnM6)~-V-(WWKbekZRd%fnG-Q;qLR0f zQ7;;96>p03K}jL9FBC3!E#yp=gYJ_n?Hkrt9{ucjX^)6x&l~t7BE2|j$MkFS5fQn= zI-(~m_GROLL~GnTFsG<{QA@EwkcnecgF-Ht@&v;Dso1RCAFhZ&pJ6Ha@B{E}KN%5& z7Gfzmvjc}#uF}XEaD0}8qGC{!2d+C|@f5aQ22I3*@jiHn?;|n`$mAb9@fuv>gECM+ z<6)jS8i!J3Y2_1L@jeck3~E5Ku^Zr^V~Z}j<{N0VP9RC-S?@w2Hn~wFPhB4p-($%t zOMATu>n(Uu2KAzV@p#hV@6YN2cH9~7{$wMDC-n}vK!{hL&@s~=#o!}tBxga1Cw{`J zUbZxLZ&*AI15lQBJwCKw`X%z@V6W$b_wcaRR~osnJS1itWs*sjJ31o1!g5dM zxfM@|CQP!LS1=mB)-gFaI@fGsepnO{XPW}9ej9sNSUgMaTt5*f?6AON4$koc0|O8k0xLvJ0RS%zYB~1Y=9|n*QnZ18u1>E zdg7$hpaY_g|5FT;G>#BSHJmGv$i;`@z)rbNHVk{5f5av^V}vv*{qs*yd$ohEU=UYB{<|>WAHm)$ z#nSISC?ronN#yWUhZZ-o@&LJD-1oWhi={y94p8Wxg{AR zry-7uOQWM6>~O^&blhhB;x>H*%1_7b*e~wqeIq8$|NKlimEfB~`HsKygpfD^f}i^V z+prAVw(gOjQ0=1+*#naLx9aA{JOajaT*?>nsf>J{3#cYNf6l$$m5Gc z;yTzrlm3BLY?2ugbJ(OIh}j-T3=YK7WYP{{%<21_>8ea~q5AH>!V{aY4QEEcml3e4 z+)c3JlrLD(mNIRxL_s8dG^&GoyaWXoi{v#toG#BANM72B+?}tMAM0)C#4gY#&c@`$hR)D|yayKN>vu_VgBjN1 zTrS)jSIslaWC7{?oXbh#Xn}rp!@LNtCuN5x4%$ zkQ_N1qzlWU3LFt)@?mMhvi`6EKQmSa_8|FM5*DScq_n^xZ^zt;7eHFd8q{bbvr1bE z)BuhJQq4!Iob#^^iOVqBOPidWlktYl>rhvvPeOcnymmR1x_Nq8;~X-T$n^|IaJYsBK2xAVn{m`LBk52Y!PQjE3?mVGAyNr zF`B4Nk=iJ&+}e=hM41yIo7hll+|o^)^+nbN=Lp5K2-NCFI8A#NT30%R<~6+lQd1@a zrTude7LK32gty~y@TzocrsJI)(YYI|rz%UaoN_TQis;qY;NxSlr5wQYJ4tq7ht5*g zu!WM)(%qbR_(E)fp;e{3JBi%?pc4NcAm4Z*ek+h95yZ&Gml26Oo8(d|Dv3ZML>`xs zHN<9tOUkb$g=uMk`q)LdQI`eQGhq!ngWT-U1+IXbvV^ig2_cjadjKVnjr2W~9^qs} z$Q1?@GGHhlyv)kF)>XVb+;Ot*Ji%35K9mfjVwcANxXL%(^y5=%beFvgD*;+pIa`)&PPS0->~#+q~O6a z$oO)E>=sL;l1QR|(p)z#vd+6h zEuTv>X$9I(l3xjsPUgb!7J`*H7pds52G_Bd z!V@3-D4_Jq0W-0NO#Cv%#NX7^%6Yg|nTAr^J`2q)=R14}q-5fvTrF1LSsso7vrE5= zTR+Ga3b)1+@n3pOwVv(!E-s%AZUW4QROQpbtw4UwM^smv!j1ri-9ZZb{s$qLXl%TH1GKr>_u7&vpjn?2`>EX2Y0a?KMouTh!#lVA~RTPPgTzer>sF z71~nHwlKrmYztgHs$c$KRMEcg=(e<{+9GvNd!Q}9pnPP%RIx3{Ahk~|5UYI}fc%=; z#}0~Brm;ClV_T5M&i@%2dxA6ycxx;l^MU-De6$DX<-CKggEfN(8v6~}hdZ_HvaV|x zPvuj(t~>BSTLRK$hP5f^gCXDk3>@o`YaZ$(?Qo*+egu^$5?E{hRGcbg!gU{p5$Jl{ zTjA-sf^3jZE7zdThNdvMvnO)9C9e*%l8mHovVy6tpbq7I$Tb#gJ0$NA^YJS;{t?kDc-@&OOT2j=#?HaDD#=6_nv?v#I!8IAV}C%rav? z*D)V0!5&txMjn0D5qn~1N9M_x>4_6fo`SBhxI*UvcX)0{F0eldj4~b~kpom()%3ZV z0lMB1%4IU`#N4al%IUZZo5Uw&DC_%>K)R9dV}k_#sA(rBc=V*3=}yV8M?bKq!vh=k z=m+tYAN}YrXAg5R&~g- zTKZVz%sE@_i%i?sQD5J7w85K!d1e~6XN0@oX#7}JRutf)z%9BomP<}bX|p8aOX}QV zR+}*(?UVrndwwg(j~=gn|-R?~UO+3DVll5?atV`q~mNXq7y>O7bBBjvJzlClJ3 zEl0}1f7Zob-;b2VBt^J)Ps7hkQ!xt8`MoP%0I2AH%uPU9f@<=rg9v(78ajVj>G?G z#hEknaD0e!Hd0_SkvUXRCCI)(VX-W#Dp1s;{fe@fScMyfU^F|1HDlaU4#*NSiZ0xwFOhCYCQ$6t^1GaObr;UqG zj~^D7>+p54H*m(cD*gQ9ggA^a(!V+a*MQ(K3(Hw@VMx497~xOgG{mVmu)^?Z`(eMD zFv5?(S%|H5Iosnjdx>a99&(9S*o9!@CZun7Rk^EGixpYYgBxj{pDIyAC)hilyH(8*cZwgS|VB z9FBY_k`yI+2PlUkddeM1MLG}PuXKHqKpqbs<+1)$b`ThRe-PP6ARn=j7dMAV<_nHKnts=*T+eY3w(I_Da|JE7? zV2(9?<$jzW#1qa|+Uz|APeRHHR0#==3*b)VmP!f zCeDW6;ctr7R37YL3e+?2sFo!T>KNQ;DkVjZ#_ni&-SNTrr>Iw;D}9S$zFp%iT7(-4sBu0hy!kHN+D4++g##T-E4gu+*wP+0 z&MRn~@u*TZ&RM3h(v$Hw&P*zw!o~^W_RP8D7BtR9P;n9BJ87I}h}CSIwTSPeah^LJ zf8o)PLgV~|zgM>0N7)#K+o5(L{-bbL~ zHpH#weU(L76JrFg+T-ReMciuM9_Df-Ix+Uy8W3x7+vNnj4xt(ot8Cu(FrSsp(Gv(O*nM-F?^rkOx zvXs@?d&3`1%--;nR?vPi?#id?oS%%%SqO-oPB(8#o>94Mef`21?s|1E-DNum^g>0`d!b z!y8a>1>#n3AXX{L>J6)j)g0`b5x05+vqpQvd$W9^mV z@XMi)-B_<-Z)i|}my4Mb|7YFJ-Z0D7`Mw=wR@YfC=y^ZR_*C6)sO}0|>r-!-ZA*LD z8~#LZ=#DyNZ&+8e-Y}HPr?5BlMQ<2SenD^e0xHf#d?&qOF0q=uVG-i$-k^^z!V;?f zq@ef!E2aqt>Y7fGP#^4#(bJI=h9M#c@N>4)!IN8Y=N)bvn6Q@~Jo)12_?gfP_ua2q zVh{$?jL=&ziri?nn^JT7=h-(fmBqlk2U%$QK*>1A)dez1*6 zz}ALncBqE`)TKTz+4Om~A3haB`jk2JDR=5KSf$SvyFQ`AqWTOqtIs2I211{HCV}Rl zX1z6<@^CS8dq@1xPOn_pv;m1H*NXFvzq5KhVQn9jAiLL-(d`3DE3dz414r%-p9wDG zJ^Vf}n++V>dA66fVZEoVXHa=7O=Qv#c2sG69$G@5S!T6Ck-cd`j z^Iy*oh<~F)_daL4d-6`aRud0k2c`FQ+hrB`HE}P*^}bJLA!Z4D9&dmMHb&M8+rIsM zV2~}-3pX5DEwdk}y`MqLH2c|bZ11PdZE4v@hO*z^!fOm^i>7yLtAmi+d$(>Jhu7uJ zpL7Q=*wg0pgK$5zJ`q3L`TK#j*doSV$bCjP8CYs;esEK?`AHN1#9mCF2~7@gWNkXg zC#VhkoZIA3N7mfm0%8u9lzpzs*$-WwT;FF8xRFMMbmLR(#{Et*`hTB!)}0Xak3^pv z!d8nwj_7k!eqiZM#uU|v(l>XC+-gf>$rBD-Z6~bH%YEKVqb||qc`SLOtt@5Uk{_U^ zr<3jZB=gQ_oqds}UI35L>xrb!*yAz!OQSnYom<8-`3^>{JYti&zPgm2!h*C@< z?eUhLDwu>$@0&lRBq(SY_U$ZR#j_c=M)mF9K=^*cGY;e($@J>!LL3W!_uZ%U7&I~6 zcqB(m(^)}rF#f*jTOkXJhfsKE1JV3GyuRo>E*!4V#h+-*zK2MrCd5=_zMAI@gGtQ) z{7_9Ci~9N=DVcf`(+LfV&W1Xb6hE;(o=St>2XWN{@UE)n7OCe?{!6aXvN7S5O@0ei0>>zpl|*|e+V%SpC#*iAO71zdt0Xixh(#U zR%~MangU~EyYGv+e4jYFvgrE~{W~b@{lMrQIrHzh!7o0?X|3-Y(xTZ^>Bj{!K9Axb zHn!C<1I1a}qkk~#SYQnWtiwg$1-Wi%aOo$YE%hhy6B_g)o=L_NJ^g~Yn%=uDDA(hS z`0Fvg`#q_dXBl}8!8B@B-mQ@_+x1&mFCrc_1_hlf`z@;1EcpE+Hp0_5nHTt=*;-hG z>~O&fOafbw@SPe8TX)IPy}7 zU%20Qfwn=vop67!85tEOsXttaPD#F&Qr|(Zh?Tm0wrM1!o@5t7QrXe68bfNR7+bWb zV1rC5zMvJVpsTlN6?B_iY!&~z)96T~_?yluR@w<>70>RA=lH%htN1rn@diHD9IfJ& z?W|bU-0Uu>qUU1{-;~%1W)%~vH8BpK4U|?q+74Cxvc>F_(owCpvtsN;Q7f*qOC(2K zU?-SWy!LHCT#cvfWEJ;Q6&K>QbWtnNLmiI#9dn)RaIj*VT_RQSg`HqlvENACo{hOe zR#8=gDpuhsz-SfpY*K7nGz~|qIQ(&kqYkhW%qsS3)_1s%SgMUd8fG-QiGPd3lp24)&sn5e{{r;7`VFbRjS z6E*0G;=)tA2vI`un+l3B1B>1iuPn~J+AIS_#h^n=bC<@XTjZYqTU5tEhZf|{nrust zXjtgS#zrN{n$)o1S^O0=8FBh^vgjZrW+OrG{1AcD&oqkBIbhK79Rm~aKN6`*>ERRV z1*>dneP2AEh@-Fr^q)tvR~8qZ1O1m$+|+*+#do0pJ}5(i4SV9#e-p_v_1}iLrGEsw zPBqsbCWN+@2gNA72T692>C{2KzsTM}uG_8;-hV@MJ{Ytz>TEezcDECZK8V@!N~|mN zYiLbMXWURp0j4>e$p_p>=O~(u<$JaBxC^#COcU?mrCb9}@WtHVG2ldB^pXsxzt~H% z4j{k5c+C=pID7k>3{+}0aqVOQo2KbKttT;(IOZWC+&{J z7$ok*n^9L0TN#~=Xj0cHFEkcc$#hLWU~B-c&~JrEIm1+f#wX5?OYznylKP{s;8HBD z=a8Mcf6vG)B&c6~1UC#Q4s9NOQe4T~8Bl#q|T%XOs ztSeVTcRyy_k}zOl%njfJ7Iw65OD==3o!z2da*!^-FK-g zL>lvxb+hyVmB!WbfWf|)dq|Ov|Bm)mWCj&T=RKs$F|y@cYi;^GI@UPN4R}9#66#Ma z_&!wQ%{C&$>GY@}4jns@hR^@aV|g)VRXLWwi1r*>tql0W)^l8zFXeD7@u#cj+<_&A?Em$+=iFjm z2Ml<~Z!N-P|9{9IcmE$vR)9ZER+!7nQy%n-ZFsXu*+qUWXRmI$!1onI+1pxZT)UuH zguf@s^6>_S3-A}hhqzEF8-m26ulhyP(vT=yfj9U56Hj~Bry|R>P-RbD;NwoBOw%-- zBB7428H=>C5Eie}Wwar{%d_8q!^@9xRbA%yM_Q~h&e|v?$^!mY5&Jvu%IfGL-!ha~LP{(PHw-lXE=s8AQkctM zL8QNP_Ul+bx1E_!TJP7hu!z#VH)vwNK1BiMm3if@-Ct2DOIK3qfgN(YnUZO>w_jIm z8b$WLz|f_&sa)_Y(`7Wa=LIU6;{w_Bq`z)5MRR zLZZA}%gOoNC$8vX#Czg0q#9o)0Nwmn$ElM|N%VT}=6~phq$x-=#nuab8=zdigE@o= zCTCMCyr`e5y;sYr+UzrU*JwFMwbcyP7qMuiW3H9V!)ePJCa^V}hBfjtwV~C9HB#qNN?1B0 z!8%VyoOPaqcvR;_l8bdN+JPpIhBG5H1 z-p6DStcd_~!XU_AOX?rerGPZqhIr%~-);q@MFi70X;45Klu`n<7f|ixlt9e|RP$&g ztXhvOH%yT?*Hf)bu+!ltfu&pn~4PaWg(5Sxrp-!TSQEJ-M<Ux|2B|Jg_lt+MntJ`+p(c{z{#rVE;aE4phrdHDVY zJ>*i+87BsMS|cYo-lSX#iuJE>F|RXy=0m9!L#%&+4}e!HD#C$d%#F+U@>kVCZ3H(nF3n>tb*oU&(|9j(%NSe5?J>X(OPC3 z;;J=I1e;q}^T-uUDaCiRf(foLtHTDT=z4*kF9I)`lwO7ckw4A1KGHo3T^H!#NTta@ zO4GGStQ8CNQqV0|3?(TCVARQnN8~msowwyS%{#XXxlLM87JXcUE-Na^Q43$8x?N|$ zGU89q3O!c;UR8K?8rJE_=s!BG`s3Y?e4SJQNAt*iz0A1Cu9y+9E|oe^L!2InHUtrN zyj2jfzbKT-)a(%?y&H7PTlkK#cULjQZ@mBB+ME&S?AG;lA5w1!uH@o<&p;{u;g<#Y z+Iku!#9UjS3_{Y^*0cbRUR%=>VRCD-4fpwuzihRD5RbUCP$@EUv~Vq|J^^WCQrq*%n8kW#ss!4G%g0JdE$T z(BCu_E2FOyke1-C;kf(NHZp|@q|+9Jl5Sh>#|4YrhOjzV z?!IORo8pfh?^6;O@8x6*6-Z~hU>-GW!7hr?$C~#w{_w82KDrAf&vDm7wK&glqsbKT zr{^3e^p7w=WQ$lBCWW`VZ}Z1Td{zw0Droycx$_HQTn54#ZreAOXIg<1z7?9 zbXl0gaMnkpU(L>6GY(TaZnWP!CH(h`?+7U8x)AaH@Xhu9kf^QhK=$j8T+dx|tr z@kxWgBy62h30h`UE^8LK>?k8$1&!%534yt$1R~%w36ZxiG#L6JO%ftc+X-id0+CzH z5|U$E4sJTaZ4*?7RfOKV$b`KnYE5$K-HR3h?_V?yOHw(~^hE|s5)owOEQts)k|aS& zvZPD^4}G-3l5#KzF;a*SBSjKepTNDQVR*to;2Xt}#isA*z60sZQ*8wL=EU`;GjU_E z@y&@xO$kJh-<)7y(PmSOg+z$ajR-NiNkXiJV@ZnL!XZv6M2L|h32Y%Y^yZlVw-;d! zlwE4M*~f@LAF+sZGy9n2cnxD{>oG>-osM33)a0T-w+Yd7<(uKib*9K?NjrSuB0?|3 zq}IL=1o}8cgkFxx1bRVcgkL~9lGMdpH?5asVh%RmyeT3>&||3(?Muq0n!J$qM^?On63 zR`5DH)@q!K#Ob3dPr`^MNYF=BXj7*<;_~Y-w5c-`3EtEh zkGN`6XC~#Dn>uqTzN1Z@f~QgMBIL?1v-r&W3o-KP%PhG+{%Q~Wx5et+SAYO(Hp~u3;i@LDT!m?lvY7d=+H$x4)pH~Wdpm!K6g&e#BjBcEZt`ulLo402s;^8^D z;=^L$Kc5?|_Z7s+nf+07(vpP5SS*}tBhcyV1@mlm5=zLE6Q6DQ#A%(kt@C7T89EiY zmx1)iE9N-;9^+Ul_mQbB5#(v-Jac4A4m#}|U?b2_U*jC=_Ops?U-z?0WQ6S;A_sPF zQ>t|i`Po!#r{|D@4=|Ru&}g8qB@IU+gjXWdz@CNyRzh(a*q=gpZzOnNS0Zi=?8!** zz@Ck`YGBW!Jab?#rT7j9_N%CO6>{ak?qm+^6XAOLk}vL_q5pUtU01ScDeYggR(Cpw`%ixSS5SC9LTneJugKa9Ewg8vLx1 zHTYR2^;q|+a~LY=SNJikZ)#_}yAKy580n=Lx}m=s_(jgsJks%qnK{zW$2(DCM>>6= zfJgeIPS#~X!9!nRyA$8hqk&ZLJO*_sC6)yOg_k2yjs!+`!5!$8qbZJ6e$iVP>Qj-R zMQOtgNX(%e`ob9{sHN$jL7D^*6l_7`E&zk9;APad0tp(W1y`U8tfm}{(87^OY$iDv zoqw9+=yDQ6i$L}_T~|<_-)@N)fv&L&y!}lX)>zz#s!6wS zy(o9f?ZP`EcMNV%I_x|toSIzhOCECA$JtIJ!Jfc zGh%8Ho?;bC@n^}1Q}eC=;pjSZ#LRpYwVn~hzm1mtEnhUYV@6zTJu^tRFpZc)|J>1Y zZ{c%C9ww>Xy|8%ZiM4Q-<1%h|>w$TT@|xdu1l(a45E zR7K>|$@Z)fxcz21`Y!%vmThFbFY!U#R{TBg7OL9Y{1oP3^evWFe1h?t!jhSXAv(fBR<~a$A@;q@kgRLs%k6$*K_@lMz9;L{v>kN(7yL zswO98h!k;B@**%v+n*VU)1610X0!-~g{T_XHu5s=S)mrAG~L7!;Fm%Yf!+>7{{S+B zdD}|i@euM1o@%JNu(Y7hbeu&Hm$$=o!0j+wC_%TwY(ygTfq6R&i=~#2dDkQntlMFv zq+Md!6Hwn;JT{wNfajmQmyih)U;3dKzc##Br;3YV2u2F(c{d*17XyO!w$GwWi zSqFnJS{FN3~Pmk$0R>zPH|47q9+BKX5C8{26 zE5D|*0CDSUIx8r_pXXUk33}&>ke_+oOodjo3=A>b0}tbgs>j<0|6xn-HUjr|6&?;n z>2q{dD_a#_gm@Fg;mXLFrUA5pT|QN7P(c3dPMHU4c{OloQ(Jy&4e(Tp>OsCu@s)%&r85LGYH8JTXOiM_AjfI-Ipj8*Mo?klKj*EEiQ z8RZ#yD(-a$dz$`C5zXH1qKm$;2xC1kzwA+;I1Hn^Y=pdPmUbdQ_skT1g#}r2f;Eug7knT?Dpw_Zr z0vLv(-RWER4QZH6Mgq6Pmw=)05H#u>N>6H7*dOr))IrdDx*^^oq6=EVm$%m%M5y-= zL5>HX*@K8cQ!)=pP8&}kl6)$*g5;lBEc@IwC_(*&OK>_mh?j!H8pLGWYAXJZMg_0q z46&KwFskr)+zu96FCWJX-U#-$P)eSJKG2K@97`z^3Cs`Vk=SjO4jzD8-)JjD+F2;Ek;{vCgctETFYE24V!8^<}f_ z%Yj&mI1j{|@rZOOs<#GWIc4%dyaTy*r*JyzlxM-gP9e9_SzxqT7j3A{L>y-UIhI~D zrSX~ITTYu#2h0O6p9z*y+&mL(Wj?yszo;{oR;!E}QRV-h|>OhK2mJS<3&fiBP|>KJgxs#D$Ng>;bk?Tx5m5xkiXZ zxJj`3Gu$E{-bWYR_CcZqU)8)0w?S-1ZPjCuSpPHbh{uAu`Wie{B-h09Ra2AEXuJZR z_&d&h_xxs@UIrqg`er;Q{oG^5`3u)9qWW{KP4HnGq2Lj`>D6MPtE1|#w9Xa_5hRNU z4mMZBjZC>B?_sR4mXhK(kwLVqk^jw}3I^8bvq`YBHCS%<6_9q5(PGti-~lqyat8Ho-S-1o@gji$(gV zz23!Qkv^gq<~n=?xgt-$A|Upm_FPOpvc6b2)uzpDkKs9f^3gJ10co~^lv)lSk%pU` z8cHA8HIzQ0>T9MUd~_7Xf%MVU&`O>J7XOKk^t{=T=rmvbB%Jh%=@VLORv(2AOEiB8pYE2Ac(xBIRP;pov8X5EyOdnv|Ui0>kpm>25L^)m8hQQZ))uB%3Jc5 zU|_+=q4|v;#v=n*^;b9X2P-cynjZ}zs>k>n2ahxfkYf<0;R1ss(sf4l6n{~{X*i>e zCneAF?^F02Rv$BwsOS-vkG2r!o!}f?5|)p)SZVXo7Ebe{Eu6Lz`Y@!?NjR$qg5$DGUrXn7_4S#{;qJ}h%i0^U3 z@{^ISKHFa!nTKr>(q}9P1rvRZA~S4+Q9o+Mx#yV#x&?jYFj^N!ZZccsG?H?qzf0uu z!wo4k&*2{Z!U%mYmBbPu=6#juXZ(`y$j_4uWy(RTzRKTJesXm+RQ7H28=qX=j06>L zNS|C4A0u%x-U0cIDV!#Z&?$PW+$&lewMoL$boN2NqV6C&$%`l|2jV?=uf}L-RDGmB zNc(oA;83tukMkE46r6{v7t~OFjK4y@e4#rM^1~E+o&;AT!Edh^PjUJ31<~*vbfKA4 z>NtN(tDoU~Vi35JDk4nw7hARNNrV&q)c=Iu37b9gQzo=V<6*f#$7**?AHR467hlz{ z`Z4ZkEg}a>M;qS~m@Ws(2mTGRP~ z^xbhIi=L04?OqXCiBCJxJ5gl+a$&ez=lekcg@ZvBfy_7D`=q}drf}AQsbI@ zOnz)b2 zF~^{D>n~$;$cqg*IkiFW=1FYmsm6RT_A$+xKuVB5_Hp^GVp{6Pw&F^B@{1;>v8`fU zFt%0PFHfBe7l1uYE{M*_cC-C28GUi=a);T=HL^bXCP{mtoAV7{9p2H}$0O#$JJGBi z-Gc&&y?bLbqrV(p5?i8#&JTKZGyKs1-P^Uw$9aa6j|}@_S_NskP|#24grEIzy4ROe zZKGOh;_l5sF|NOs^Y8qi_@@y!u9oXBz1vV?Tsz|lBI{f*IE>vH`!{*VwTtH*Acx{) z{9y(5bTy*&hn1!LE0|!YAC4=IHK90e6DrAs;jRDQ$)VX~1NhVVRL2^uRbr>bVZDvT%D9Tywy21^E#{FO6=`dWc{n+3H|SnI(HP$2 zj)|QUkf!O=T1(ldggKh=NAb8BjxsZ-3`%{{1wYn*MOM@A-NNwL(Y<1t{^(xuH+>1F zQQ}Wy(+m9~nt0mu#1C!B$X?KcyYq)X8NN6s6l2pdq1N#{J!W)g*hKtn(el8!NQ0S|VoMc%~CMM)a6&0$D7TI3ua?B8(L5)UWcB9Rg4 zpS9?98FJP-kqw!!FzFU4br_P47NNHeN<*x!wFED2PqJ&3XTXs8JlL(1yl+aNuc!UOozHpy8_RHgsSj<@I-hJ49q_6L_I-L;xH3`xhVMenbPU7~!{DCrjIo&iH} z--=_fxBe*UF)}m*hS1YFvPG;hGWNeouYSin3`xhCeGU(HYm990C2hz|hau@0Be^`- zttHAje2zQGS!-?v3|Yr#c58{U^503XwH9T-kb8KrTP-pYU%pDRMV`rkA!B&3TP<=R zw(62JWNiivp}*#1&m&8ZPP#?5WWbO$yo|S|-^m}E=aJ5_Tc(}k-!cthN9h>wr*q5n zZXWE`^n3UrX4k5@Ateq&(lPzc*lw^tK0E0a>74;Xnr%1Oo84iKk(#$iWd;nPe@*0I ze+L%HWqf2{(z_^=$&fVvt#BI;_Kkc!^4^C@8#3ErNIJ&Ie!Psg2Ky*nD<*j!nU?`W z@cJpodF1#NNgJ{>1BTqrgWVbj{idTup5no7waA8xlb(J{GhoOR9_-6; zbG1Ano?n*q=0mx|kaP_8<9V=KhWyw$=@uEC0YkpwGy9voM7h3U(qm+*!;o~0ktcYt zTZXJTHtDW4Cj*AyP4vc@-8zrlaBR|lD=f%>A>DYeTZUYVCq9!rkF3amA#_u^T*h05 zJd1n$lQd*?1`N562fKA1`5Z5(NYaqa88GB*9_*GO<338-5HTwKXZG^gd)F@a4Q9kVkuX>|NML)~E$@$=458crz~^?D1s zJFr(*{LmALauNvgCGc^_8&(}RG{&mqhBl7-7Qvyg3jFfhh2s&ozFjyI2`|4_P!kOU z_D>g*RqXre@J!5&jI`oPTHAIcmA_nwu2cl4H))F>dSFj_o*w$=o6*~zB*gA`>T~kJ zxz*+)pJ*i{=^1A0ag9T4C4?5_65IANp5HpaDnZXW$vVgsuH#!=(wTMq(AX$J>pr6n z>juRaY$c{V?&A{sJZ?Pj^%R#d?v9tw`!ui>84(GJFPaN+{Juh`TkIr5fsJAE{{<|D zYe1I_^Z-4pc@^G2#u5V9-`I|!>lqdUiV1oe(=RHqIpxkdoF+8PiaP_;`m-v_uBJ&Wki;dwN=ZQgfN zrO(RUc$J9e(p}L0)4J;7LMl5#LjihzS8vl2AKszIpn9QFTyg~FKaNNcLglk-c-lc| z?IJmpo-+mS9cb4fbfTGuyPbvBp(NNAuLvLsl-3`}7vW1xhTVxl z_{BQP&Cx`C^1x^a38C8@(?cF=choWdsPF zqVh1+P!X#_N>hbFy9}*yb1N+iG-@6?0Ki58w1liOriAobLHF1a1v@Iy!mLB~>PYu`q}62dLZmpizpZ{~w3m|*l^4~S<<%pr zBE`b!1yhjXUU2UWzxb&{_JVqN_kx&BwVf0W%{6OlY?REsz)X`QSvwPClfvBGD@~7? z9Prp3HjOoSjAcse;4v;iY3bv7kD$an(x7QL=Sj$0in#1At4vYS*-e`Txu|qDhIEJ- z*}kTj9kv zkhrfVMm3eDR*~gXn}lu$52lt~=Ufz!;*rZlp~XCZBFrN0$X?@(XbZ*=^Hp%FO^DWc zpU^hD5||VZF?}m#V*av3%2{)dR%$I|SBTL<|0oM-9dWaC$dSA6$YPj5(qW z#uFy=#93>f&=`cI1ger}v9nDjC`~7v5R2pnQ)&@yFfPIk##%%hEJh17Sd12EFsBwG zbdRYQH`vX#G&fk6Yjtt6t-*db*7w2r1M!g5&&Kcyt;BvM8T8w4-S+?Z_rDK*8k|DaBkonefqMW3e%Zbs5@8HaDTTbwqUoIM^Qc-g` zF_(+VoTZdwE+7bdEV>)Oa=Oo}D8f4l*Q3p}l?09lI|I_Gff%%`F8W0gI zRcSTFo$X=jY!`$rU+%24tsq5hzD%yOttM$^XWP7EvsIlzJW-?k$)p@x4Ivj z!uo+o+}&Lh%P3KS#Da_M*PpZv;s33(CfZ|Q>)nxmHAXpCBk;B=V7?=-!Mmi4i*(~HSiXO>*Oy7-Cm@*qYaD|Y% z`sSnjpS$~|3X-{EfZxVU5ArtHf0iLEunf$l*7UEx}Nc5qa<*U!y z9E6s|={qnU`F-B^MVZg}-p(xFC6~J*5Y0dDA6irxl&l2&Vk%beysz>wwnM)<&e#T_ z)xvOa*tS9B{sgTse4Oe3P6X!@MZ+y`<7wxkI9D2rQ7e-l%lbGOy>&) zBARU zi^NnU{MZl~g!qS0h&Dw0k>W6o6-r|y$_)`o_yPpk&e#wM(>DXZjB*r<+~1J*lgZ-8 zh6u^riZt~hq-6_>s2DY0CBln(He;^V~rQu`kOY(rOG%>7bPKL z=m7@I-ooFkxn$t9WFXP|fPwUd_*@dtX<5Y}WYh-(ZGiZT4DC2AwUhSz!S-N7gi8Er zTI??{N^n}1Kt8-hCp6#oC$zlnPH1`d6B-IePfB#2$mjEf59bNvY>>}q10T)?RM%zr z^@~=xhUPha2Ik*}r$h(Ij^?h{X-M8*s*Bb%cVRU8d*JV*->Hkx+(nV?<}R7*I(Jot zL#0q@1vO*+g79I8uSQ(XS(HJu9)<_LQngnuWpY|FU=o!COb1{n$UVxIra3BimW=?0 z9F{02wQ#;AQO;SICgmaLta`RNtKLrMtUUXimABJ5D{s3w>r`4%iA}cV_!y^;3FjfP^>)(h|1Wm;{regoqKlzNM6_zW|z%~IbD}h3Rc6gyN zW@cXx&A0EDx_Adf|Jj=C6BTG3c~U)lmS4Pt46R}CCCH$blv_G?wU&QYP@2}tzVaqk z8s0&=tH_yP7Qp{XLR;J}__mowokE+^GiRVJ?Vr^|SPb$KVp^1e(lHElPSqt-n4MnpE#)cJtcIG5O)VCImCg-8sg#Bz;J)zlb%h*nhUY)z-o_xVejxQIAsYrang;cQBr^EBVN`{O@cisODU z-#1M)^i3o_)^rMemADyzAc=XJjlCEjO<@+%M#cD$iKIAAtNl zksoXp4qT7L$ta|$AL+-n30`VT`;NkXcVGx|jsyp-X7tJ7z$f6Kv@FrON$@>e+TY1n zC<6WA%=5rO4WYLy3U;%l0}t!qAQ^MO0VRaqwxN{4X(>Yl4nx)ou+aaJ`l;l+&hAGG>1kGNXYs zhSP>I#Bm2SrJ<>xU~q8S;2;+chm3B-F*6_?bRx?%9mMIVgHC0|Ob2n=Pz>!%6UI{8 z6gC5w3NLoXgp#M_P&-mSc5OwlO|ksLdmegxuv5OQp7Nw$UN+i?)3W-|*(kM?PP4Cv zLt&V=isI)rlkG&DG@<*C^A(04HLH;m+i|{D!Fz3l9Ql7qfCNw>*>V>cjm>Eig3*fq znI(&C?Dz8njqF918|@NXBy=r`Y$CPZbFk0d5qsbOQzFz8`kO{0kwi)dex^Q2HWQ^k zaeNerM{VlHR7AG?OHs=xZFV0THN=8P8AY%|z8r6qwvRVXN5>mc?Bk6&baT9M+UUj9 z0f}NCZ=8;HC!*NL8>dZ0X}l51KHiu`H^&>N%_213h|~okk2gx&#~Y^&O=-LlMe1RW zH%^;EV~jD!8w)XvVGjFvBMwR%95mjDvIi+W80;1f)4X~k(z2Zez9mBgk_ob*!^^Kfj3OWlbGvdm{iauk1c&tBmj#l8(}w@TbTiUBVA+SH22H6%KvALpY)IvFv{n9KslPUs^CYKDsibTD zBaE-W>ACnKJ!#Sz1iL1jHp*Z_VjnOZh?4BE>fM4uZdB!Ixzrw5j8i7q1FL}jkG$*hJMGuj$5KQ?84NHVVshmMAvp^!r|M%*bzA!oBG^HRhkXGCpp)+Q*PCx4DM{COH$joakjvVdrYD=d=vktuUJ@`DQu zfA)r);IYG`KgY97>FGI?Gv3Hq$~o}#hP?w~EP2|j?O|JOkJJl@mrYL(!&!t{?|!Q7 zPQ%k{&DzM*0y{af^<*2AB1N@P&QQ)lZJS;Ti0`Nkc2L_D_xQvlvke}z*S5%LgUKWl zwox0*Wtp;dR+zO>&RWhvZO1Ou#ck9&JE$#urcZ1%Tc;DQ+brAeGg@bxSsS%Z309Ma zZPac5wyR`8);ed1Q533A>r3sT1o!b83nu|KeiylEEPXe-#OJSh4b-pt9t@F)8=P{EZb z`1vNEIGY?}7Tjzr`1vBdbKY=FPPtj|ODgy*ts`ug^7NlY-u?fDdoX+XaLJwb(v8Lj zyl-3pm+#nN5qYcj49ff*?Dprqcb2h%pF_L-Lca|gQTjFX^EHY36;D-^d=e7=+cYh& z%SgXC8qV~$#n+y4&(+1J2jv(!!xw7epo5X1oc+)9i><^q5s78j2gEeWK>|W=vLwH9 zd_YPLTo1|j^wgx}z*1ey^FM?y1fzUl3lfLS3W|!aks!7=dtw<*31a*4D8G2%Co|_R zY};G{ugjc{<9*^Y+?^-OynJ*}41ilH2fpHe3l7AxjxSVhMw8rhQFOP8CRN*o3M~lb zpAYuQR<05o8WOkZ4Z0pPY2u9Ij+#1S;%R42oitrakhL|VrpNFc@Jc{jZ9j$E!|+D#y8&?z26dFOd{b1ixcmRY`KIqroiOFNNz?y_A!UbAQV2VZ;&p}2de;?w zReILc4lc)`oBVkB+~lb8y`m?pr&oGpA&yByP`KoeRdhM9!j(J-X#{*M3Ja zzN^@wYKL9jK9$|6rq|T3T#iGPo^JW7aw@u;Jhyz6T(9VE^}FSJrAJ+tlW9NIwEmiw z^QyhLehyV~IiEunpI3CZdN|)1s_J+0aXM4{s(QVmvwhA`CEv-%X*YgVer=<(Jshg^ z<9rTPd|uJr>fwB6sH)$|$LUP*tLpWN&h|M&m3${3r&au^rn}Xj>iksOmzD4Beu`K9 zf#qSJ~|qo&DhqRq~yDoQ{{@jZc+dSLo~y z4pn+{K8Gqkujp>|aK1BC)$iovbf)-K^?F5T`<$UlzLSsBD*jZ{xqc2+^>IFjDn761 zZuM}!GgQ^@0CdDs`@yeLlvJ_bhmmq-x;dvck*#MQ~auW zy`r;y&QK-a$;W9oepP;5r@Ps&vahD)+~n0%ZcWRn^zoX0)f!FA1MUM}1o#+_dlNSS z{|DsR=$9eA2zUT^65!(v#F_su8=YvM178DMfu@kv#wPFbw=_|R`#3uS``Yg3TnYL* z;A7x>z&gOg{5@>^L~9JR06GA}fDr&6+zuQv{U_-17f|rNCLYAQxE}#tp?7kd#}D-W zhwt#B2p|{Wqw)8eCoR_+(X+y8?5FoFJnbs(N+()-%z zw<5j>SOPq3qYwNq?&k$g1XclW0_y-iE<$`M@Hp_IjXoFgn@#%jHhOpHH4qpC3w|{vT=Lw+)&Y zvoXs5n~grmM$ZFpbD$L9a-D7YV?dt>%mmH^_((N<6YBa3_>1aec@fO&kl{3d{%iu+xH{Y9ay@0wq9OU{9bIurE*! z8~_Xhs(_IIACExhCg5w}XPf+I5P!|2Z?)0iLD{c?{{p|-X&ffhhJV0WM=&=(j88~{`Tqk*G<A)=D zLf~@XTHq$&4&Yv38SohJEU*e#4ZII*1ik>i2Yv?r1pHrNP6Ud8=0ICuH=qa52Pg-I z0*3&jfN{XFz{$W2;B4TZz-7QSz>UD|z&*f&zzX0Q;AP-VU=6SV_#F5S_&?we!1uK# z>H&p7GoTI78R!o52Fid6;9y`Ra3nAZI0-ln_y=$Sa4B##a074~un1TRJPJGwyaez; z@hw0LjM+9oDbU$Aepe%JJ>aDO1X?pkne&mp1ej|pUyk?*z-hp_Hu`~xk2LACZ1kTo z_qYBPIskhCeEbD^J(J$kM(6WChs@7u4ilwwISy6jIiJJY#;4M!w$a&t9IEu=d=Asa zr>ZAQ_x3)iRQogDexuSO+43s6yDHtyUzxJoO|MkvXUgtO)$8WZOzD+qy>526!$pReo2cb33T)OLe}g-b~SxwKr3G zr@CJDi(8m#J-m|dW(Vi1>Weo&UOrVlUeVq3P}SpB&Mm*Da#iJ2bk@TyRF$u7bhbmK zS6$Cn*_Ea5{Ca`g-7QSDAKmKb{8Z~vSLCxlI8^D)`5Y$8rz)SN?|hv7-TV`8e^dD- z+43s6nWD2j944vqsmv&?q>c85mS8Z)4H-EY1XYESQ`LwqBIa7M6>gE2*VQu46>64|`&T$lPKT5Ry zl9iim`9$?il)tv?m#95;oj=9strk3*Gw&gW3YSKH`r`X-yNvNu_|nJ%xgtFF+K^swXSQm_OY7oov2Wes;_DY)`6=73>Gii)?WU6RcWuvf+0FHEsA`A0 zPIt4dn%# z*Yn(WD6H%Kfo)0D4!3gg=4bh0*VXKgbcL#RPgnh1Pgak_`ax~+7q_1(^h!^!=I46c!bJ6OlgIhBMQ);cB+AeBx`m0#jh8>&d~WsC zG+$LNOE>22tRKAf1CQ6b?pHTE-0~B(zozoI9EXY4>lHuO?+jJ)oqU{*mp@rPRry5e zthZaJlItv|;!BhsuUsb|r&aZFzBBZSUnQru(b;~LUT*oSa=R*>{lTHiPR{2rU3_l! z)HGjJPDN+CIZT#MRbEBsdO1v%PgOqEbk?6kRehY#p^7h2x|=-CcZRBZoP3;46~9WZ zS9I2&LzP_4cZTuuC(EZQUsvetH89=GwV+t z+Z1N|L$*I;`-2d6A7sacF($Hp$oe5WE{ro|ZTCaG`Y~Vjyq`Vqb6=oP)gPFrrunLJ ziPGKlsHr@b>kL)$oP5r-s+@}MEYE2-{+i~i%4O*_n-7w0FR%RWriWMcWaZSXpQ!xi z)^5q>tLn`Zo$cXJrAMmsRrRXq$?8*6xvFxRqO%`3ROylGd{w&l9MTVy!vNK zzq(#;y#8grUBzCN9d*r4H+|jmRenepefV#hm;{^woComnE8@AoYob07`AZXpKsR77 zV1Iy*c==e4vwZzOG|?O=`=2Jx0r)r?@za1A4tfQ6hXcm~X9Ik&pPk{Zny<1eQ9Aoe zRj#h*tL#$I*Guadi~(v$U9vgN(kYg%4aE=%9}zK&bFWXgYTde!!PmEUT+-fsG->`FDA_2N)fALnzZ z;>#4>O|N+Kz2Zx?A6QQgRrPT`hi-hC%IA8o6}q?|SPnb|JPW)5@Zrp3`i;M8;z8gM z;01t>3A!%M0piVt1IGiW1KeKO(C}N< z54FP&Rc~uzB%o@KQOG-Q2l?lNcHa)@_k;Ed@E_po9ptO(Vfr^H^Jfjpart<|Gv3w2 zH-MA>ThR7fovbh_JM34$o7H1YaghTVx!{%^PtbHHMNkNXgR5?Bem2D}cu53B{g z2EGA)0JZ?X0nWbgJ7^)lF2X<&&=6<`vLm#JzzcX5%3xCIq((mHSi*}0`39s2bKWKfaSoWzzX0=U?uP@@EouT;PUK8PIH*08)K%f_`$8+;>~A1RjBd@ z^Cz3na-5-?Tqi%Lca?H(cDUuUKU85|DetCdviUXjk6XPg*DF3ZId1u^k27>D=a$d% z-1usmuPT=)y{_n)s9l-jPu8EA(pyz8+v66h%I~Ull|NMW)|B5(UQP2=<-DS+?DdMS z($g#XDmkipYa5;QSLu~(e!AtV>dVs8bA87Bg+rC!IiEu}K2^Soo~+zt%d7Ot($muq zz4CLi{UFojRengdUaESt^z`)qWZO4W?G&%xUh}E!b*o2JE=%8eKX>!1TmG)@FCRed!rr;_ItJzaWvU60rDRQ~k39mS2E+)p{& zRsG^-pIiQ}>X%H}mGyV*_^Yk$kZq^*wiElCLsh@vd=B0CQkAcg`*)+ewZq@dA70s; zF2AO$9#Bd<^j7)btz4?}ReGuDZu-=;oSWQa^Hq9zMQ8mu z^jfY;p4au&w4QY7QCIa->7Avg_xdC2Z^PeNKcvSGZu6pBexmKf^0Hy00lsEfRDov9|N2P%(2neg>>-=uo?IR;G=I?7ta9i0^b6BoQU`w z;7Z_T8+{4l%)ik_C)$g^e}H#@UjZ#QDz8U9T|5Z92z&(aaRlOL0<(cDZ1nkvGyiHE zooJ5$PXI3fUjsh@d`v@~Gl9#2yKMD4{mT4Vy5WhxyC2woRlmq|zDh5z=$W?9t$wfU z^jc2uJUo*Nya)UO1oL%K2=MWOnfIre=SF8gaLD|e=Fls;o4jQ6z0$L`$w}5P$(FBe z{>bX%?R7=6{Uh1(+4l6dJ+uByk3W;`_sN#uRomIkFPXO6pQDQ$pa^IL@S&o&0MB8- z4Zt=Vzl#1Bcye&voDa0IT|cv5IOKXc%^}nGua9e8;3nV>fDbR}(-iU(p&tSnBYJO<4;B3t>_@J(z1Qgj#9LtBk^R~V@ddUt({BT93Ge{$B=9QmI`9Ut5g3Iz z_Eq3Dpgr~yJDU56jm`Z&ANKZE051c@pgo50C4l9xgpB_HoZd=%gt!Lhbh4oiS$n`g z$;#pKA4AuXu$9w^hFzfxolg=i=N12*sGIt`N?twWU2V(fe&yt^>vXn9WrtgSP0Q6( zuByJ;Mt8H%Ex)$eQ`_`m|2f0Dq9^O^mA))5-cVJqs=U|yDtW1{=_5;B{u16KB^ve`IQ9Tpo_sXtB>-CDC<#=U>S909+a?AHh50#wSQa|g#p-SIG=`1ha zP$geg-fMo9yj0T@wJ%Y9RPt4HmHc$^tLjfRJyH7-)kh^?MOVpB7r(0hzZ;$Xt+LxK zUscX4I@iykN-pPfsN(aA&hw!f5=GH#(<};r&OjMs#^T(@S zP5I(2mufpz@}2r|+ADsQoJ8rYmorq!aq@9GQGT~_DtWby?q-KueyZ)ME%mb=&d@9S zopRmMs(MxByy92MQPEi+ReqLUv-7u`U)}OE<#*PLLzNz!&!LLXD>~QX3{~=-e4I{{ z->sZVUTveh+2NL-DSKEi4pn+^K8GqkujpKlGgQfU@^Ly*ez$Ted9{u1W`|pTrtD$8 zI8^Du`5dbFyrOeG&QK-a$;atL`Q6H??I=;_uY+4{J=%6_+eRk#RU_?i0=hbp}}pF1SC+@2%Fmq7VX}Ox@^yvo=7+jsM{UzH>(|VV^V-%QywZpJ6^CBQ&C2n1 z{Z!lh$^C`H+NR&Gs*l(HW_cW{{KoklCd;QPpQYDq-iWtdRQ`1J401DujtPD zRB5m3OSK%8{wlgk9~D2--O8!*y`sD6;Z;2>r+;%@Q~?u#lK?)ZmFnUW;3nWMfRDEu z>0&+bHLwlvHO4m`06tiM4pU8c)^mDid>;b%7jQGM5O@&agZVjhqnGZ6??iUdMNeP| zz{k$$6(~de`#Sh{M6U$zzkxk>*Tt6rA7_F#8@STUXZl$1j0esHF0k?6jrc>r)4(d= zeP9E?$2`cn1$Y2h2D|{g4155r2fhb>1biqH1eyTNZRHms?;c}AHPz(lP)5_sQ@1;dMogB0(t?xZTu=a_eTy{KBqZk`m=kW4S~0T;%-rW zwjlj8(4ea>S^|6=kN8wzHtSi_ z+4xm-wx2_`Ydy+t06qn@9?^Q4k3;6?G>0mBviT~xDtcY3FIjyvUB0I6pepAT-OVrQ zs>i9vFeU4&jQZ{z@@-k;CkQ|;7)*Ky$Vnrd=URR z0P$Z25dS=Y`0oOU|22S*RP&QAq(A9G`jalCKj}jHlP-4sNA=dl$-oleFMy9>eemrp z;C$dRfRCNgNAH0DpM9~u0+s=f0DSC>e#H*>8#lq42xtqm2X+T~0(@MF`1Qbzz|FuN z!2JLpPa*y}@L%9h8~x~}x|k2F1HJ>aW;ibbd=UL(lOBqLz8Jg@0xN*0fER&RfwuvY z^(#Pi@In0d0mT0pK>RNO#QzRJ{J#Nwq?(^}A^k}g(w}r8{Ye+npLDV7{~Byr4}1b> zw(A!={d45~uLk+=q09#W$#<6L`H@5R52raylwQ+viPn>9ezt={RehY#p^A^`-wnq1 zwf4jHMTIW<0DKVrQP8_5K>rzKoct$4#uQ)%a4x{djfmd_+zu?V(YGOf#Qr$vq23WT zeN^|y=MEWiTcfJf3v)JLzTYqmS?_X<lD!uADJ>GUx*_r9`D!sDw zn$25o?YXP^mF?zGWoNqbxgHMP^kF^@GtKW-e@*k<%EfEHn;cbsP3c1$VQ(K84@?2h z1TFyhSYC|%Vc=EZ1K=~@dw`Eth?fF;1N#Ao0Am0?*lrG0bZ7oS`|9FC;2Gc@;7i~S zfDfX-Y|_7vgMJlwt_N-f?gSPC4+1LylC=?_I`|;|s{!Jl4-o%-0P#Nt5dS8Ck5u!M zE~G!{Li&>~q(A9G`jakp{mECpGF>zSS_0jGo&X<3h*MrCfb#kS$^#2Jk`jwkG}9IOt0t>p9>*zy{z8;1}R8paIGc0Y=*7{0s4Gft!In21V({DgN^lAgx^&`4w(o1c6tLU$S|1DrGumSiS_y+h1pfXKOS?qV>e+?l14*=r- z0wDga0P#1o)thR5(uMRVT}Xe@h4d#~NPp6We8dOOn;d3}&h>NXl^!h58LH$v`8Zuy z_*Hsl={37<$dupQ`dy-Wu{>v(sGLOkxxPfpsrXr*GgR?s>2<5$?<(!}V*{)K06l_r zG*ARI1o&{vZvo!jfIvgsdj#;IqF)N$+knNug8&~dAbwK;*8Gt1piRzOpsxcy1vUeT z=Bvt)tQ^$W0@w{G1BL?=fvLcSz~z8-AWr<90pdRhApTPT;|m3SO%S6w&{I0Xe)qU0DlqI`am;)k1G*h0z3x1V57H$jNO1k zfFps)z;u9*Wancp@3lNPxtY#S)Lu7zYbuZBa;TES`OdJe@T>H!t@I1pV=Mx_JLqB{ zz{j_s`H&t2jEjR#ym>$?ppA|HD8!EeW&`tp_kaxmANKqUc94HNX!iiifJcF+fM)@c zu?gUV`BeGw_9vEC+xc0)x}tBY^<;mjLRI}Lex|F+c}3@XoS{m-laJGh@+Vu4%V)!# zU;kwNWB4atKdAa~s_82IRP`pxuac7}J<)o-;%7OD>gyFh*RKlGRgbfNRlQC=PJ6|# zl9MQ%^~#3c%u`uECgw->m#W`#el|?ZuWtU#RKBX-RMVaP$E*6Ba^2FZdR67T=691< z(|lDqujq;TC((LU@>O(|{8aO+>fKf8srIK+zRHhIK4&`7aw`7XMt9oDX_cOw?+g>= z=kls@S-Pkn353?UQOw{i+EthCLiSn~v9IDDEo3E1V6`l2S3sv>GmE(N3@~O^eJvel$kNG%E zl;5qKN}h_&@;FSEPgUM4I_s$lRrRR&neJ9D)%mOkhi>&TABTzZyOmSP^NQ|PKj*7L zl^)FRmhZ-=DxWBw>)}vUp7S|OmQPi_uG85+s!(Mg^Q-a`rMt;XHa}5)66I(8RG~^9 z^SkA{@wt^(<)@lnQ@y>?i|bc~s(MuXOs{Dr=_e6rJ_XRQ-w8%ldMtDqq+0Rd&@Cdb0k{l%1@%GgRs0#cvY{!EWQx&NxdY&)c<9kPDjwf)TF zE8EVyb~|U=*W32xapMfr<>zM)#`_F_SAjPGKD?s8atPi<2D}5T0r>EWo+-a&>or<3 z>xZl#s1NYC-qrd8+mon$Zsk&)uhKWw^=4YW%5J8&8m^0dfMGx-z{krY@a|S%E3ggV zgYDrk)AWtdc`Hzeb9J%pd_AK|7juAxz`Xz;thY1FRKBWSujp*2N?xY(ReHJ6yH=ym z0w)1y0(_|G`z!cWbdo*FlzlG33xSIOJ}B=9z@B%pEuZox0Yv+kjZU;+Pg-I@$bW<*4dUl%A{}@s{_BFH!qy8-Kih zNK|h(xhi>X<&w=;)thR1s`Pe~tFp_jT(bG9db4zI_o1@>%=(kZDutQq53GZ#ez$y8 zIThVaUb6YBdNV~&w>`<$=PcjkP^_1M!o%>*41kYzJE8YSUL{Zs@G%MTDS%T>qV#JZ zBM*AC0d}+LbL&p%k09?qz?%Rc8xh|OIOQZtXMb_X@;S|6mY$vOxi3&ySNa3%tkTyl zUsX;;caxWFzN+3#(bH{Dvh_L3f8QGWO(pmq8Sovz$FDn~=Yy{c(9Oo*2k}9GQ%<7v z;~--Luod_N;N#St&@V*ZoxnmH|AUA>4mjl`N}q~z)WyIeV43ZFMe%2VSAq9z^j{Iz zu^;XOg0_9}eG#t!h60D!=;IMT9ykG*W}|aEamaq)G>2Jw?L04W`>4XY-fm92RQ51m zs`6EGv-H|IF0$>CZ5N&sD9rYU%=QO+TkNbo;^kAdr?Wh#Rs5-@bNw8u>f?M4ReYJI z7md-yrNB+Ve1H$uo5L(Uv*Ru6|E&LcEK->5583{Z?GHlOeUKd&#+bXv8RH*1oSt6F_3YrP0m9K`ex9-0eXP9pN(Hd&-Q1d1+sp~ z`XM`yZ9k7?$3=ErWXDDPT|xup#dI0KNi#0nRDLJ>fu6BYaC5SOnY)ILB8u z9rbl>^2No?@jZ6HYn=*O=%Opo4d@RH01gC(0iyx8`kLbZ@4JEgHux?$;KrZs{1(vZ zzin%uUh(?j>rT4(6^NIg`39EaKXl*#pb|I~7!7cKd-SE5z;BSfJLqG82Z8%AC+yKU z%J%|zB60MCft~SO3BdB#ApTAlr14GXuWb59_Q1X?a2v39w%JG55PCEfwjN~ zK>ohb@+{|7__ho_8QVe^jWJ&S1DS6?=AMIeaV0PeK5qwKGe3uOk#|3^1ZX>W`+Vk0 zG;9Z1-GLs!zCal;9bh@9A-=?xW_rBgQj~q80{0>U9|0SIFAj*xk5`UYd|lz+en4CF z?}Y%%?GM@kz!f+*7TV}%qAe~0wl&nnEaWkNO~cKw{p*9GavGqI^hBH1R9>>>-o@Cg zk1@z{?#7y79c<-vZ3)lD9>O1(Lu!jYSv_j!`snZ0E+^p`?NblI^P#}%%Ix^~yS0DT zUdKFybL-;aIJe{8&=FOMkB6sG_5_TnYLxwJ2j#VDTt@@jfNw@7F5lT+Z)42%#XYc2 zI;R(5jhKgPm;T_n3pO$R8`$}WZ5_dM4wqrg^1N*wc^~Xr32=U03%`Z0^G9v3e|^we z?tos`?8}tCt>C*o>VW^cLC0C6w{QQN`fVAm!~O%*v^9tCE-Md{w**$6rB|YKw|df*&-J*4Y+pVi{eW`d1b`0}y)PJueCO2phtqDM*ZeAZsir&aRMnT|Gd$z;gERei@t>QWZu#stulU^L zxaDU`pMA&T9g2rXuOH7teD5RhPEz1Jfb~js$o>(Rw8`&!%%q7kjyr0?#EGX)I$bN! zI@B);`07U*H?RNDpr!>{bz>p)KANw-5WcQrN_}7bzV-UmE2$@h-%1838R&|_g~9SB z%p*jwrPiaUy7B0GW9p3pM@~!8qlkDw2oND;<;!H4@+G@W=2EVmy`GKm|LmOyc$G!E z_;b#j@5?!d1X2h^1W#zXt0pMcHK<$e-Q9S1_m(Yj_qvLZXjUMQoK#XY2zCf!MGPP! zmVnq$g9VWitSn+gu&fxxiV{@p{(tX$C8ve%?%w;q&$BBzGxJS(=bd-nKDxt{hz@l@ zYRnvrq@5Ot|ev07G2`$pOne5wom5uaM8 z$oW(-I2Z{ofmP%g(#=!4T1dTng5>L-Zk;~xdt9xv+tN`NbSTdTaLx@7U>g!8|cVmbt{?aB`yg?8ng2)E`nBiPU;S z^w3@OJvnwm&EQ59H^Bg_KU=%{xS2Wjqdpnr%@C|9pJQ%Dvi4q zWE}&e56ZqFgV0Yo{?Yir+>MC+*83TWiW)&cMF-@vSik#IqjMm(OPOjSoQU4yD7>(s znCgHchR9j9aYR7INsE}go@=_hQ~GCy`%^D1Ga7=u-JiN~+}6kQ1{xdsIxCiW#xez( zZp5MhP=h6i0)TUK?k!{BU=gfAR6kDnpxAP~-!6aPY@jYpfH@gvBtL15;9%rl+}lp~ z)>cIjJgdOHW&~o9_@#G6GoW3kYqwVnkc`AFy>I&R?D}4_pI!6}ta4^2*xS?DJiAcu zD5S>uDQyl0eD)cj(H}U|aR6!`+paB%BjbCVbR-nI-=VG%w3r~6;K&7$H-p}|NG3-Y z1Y9_R-U7)8MrW@8`#mgsFK~JHpm$Isnqi88Qy0EzD0N|D0&I@qk0S9|L$Qlt(m%WI zPaCLR7_ABLKV;*h?!zt#QBOF2L9uAjwWRJ=aKQ4djktP3krJ*hh};xSLi7qEab2&W zYf}@zcy}|5zGO9t*^6s7mXGRUy!52wIqg`IFE?Tr^5})_8Pd_nA9q@kmQBy-VJjoX z6;CJ}b&V&k}D@;|s?hcqe7!ipLxTh!l+v@Aq8X ztx9q>uPi)P!?~=wEVpuW+4$U?oZRvWW#tnmmXwAI$HuiQDk_dE;}iaO?&vWWgiA+{ zvG&dV72A5h=kB7!g!1vRo#sv`JP1I^ttcFG;M3FFoLd|&ERCCGG?0s{4t%gN=Z}sb zrnuz5J1&`6mSFl5#v~|Ah&Z{>gbNaNQFiv2lJVn9Cd74AT#|ckc~MbeDOh*FWTUK_ zsUC1IV@f7e6qbhLrW!uKv~cu6n57^|?&z_jC-QIEeoxmu)baE;cl_vy``xd5;505D zFfd1#mX5AY${jPh^t_VX(!%qK%feh9a&4Sf96rDN+#K-Y=wk}Uj5*=hlTRLd?#YE? zPC9mE?$~kT_4 z&^oS7{HyrIjn`Hr6utda`1A;Pb}N*HgT@T zRwN)?4t+duFispjp?FME66l}9$%4C?FuJ1nywTx8`{($QvGNy5Kqi!obqY%+3hN@} zDk+IMmW9uT{jl4OA6Y{3;fwcSxxE}>;}$LNvxv}|JGn6nG3!i5twa9LgP_=)3m zEu)MXuR%e(qVfrvKb4+QW{ewMqqhivmP{C<@t`-ba5x!hMHRrXb~h{H?>;f@d zWvLuJ`3?)8Fx*iEqr)ZRi}kAdu|~aY>E6OcxPNybCNZ(3xXeOE`61|hfxU@cpWv|} z=gkIFR3m{&;poya8ehQBLQtfz)IIv0e zkl3ikY>SFD%F}tNGX=Oxnap8HNe#57%tPMmNtPBwbzJyi^Kmbf(m=^iJ+C< zm%(6=y_0gLEjluU85L_(8fsOup?b52f#Id+IR`^iM!Q4J4a(mfJ^Og`SJAl9VQ^K- z*^7$NSD%U8?K(WsgqFqVh65d;WB0C-oKr$zO%z$DFTcB$IZ30EN+I zV~UHVcNXr>kE3CK%b9Xp@Tqmi*$ju`aPBc=+w%p_h5vE!Tz*g{we&caYe&zVL)di! z%FZv=B#L8ES~#&3LOPLCX6^0atVW{+m@skwx((-VzMg*Y~4q|d>M~@w=mk4FE zXU|`Slgfc&SR*nhYwZ%{umWY)MEPN(C+jL7>k!8pt0@qTAjh)u;)xp6f}LG-8b}sa zjUE#|y9|~=7R)ry6;{_in@4nE7#}*wMt9CRrGY(Z{yG<)sMwkvs5$2R!Z8;}pFd!| zmC~vFV8kxOcYmC%Ps!OA6zTlIFmfo4jy{NIJIC}$7i1g< zmu$uT2bC%q?+o)Y4n-${T$V%r}mhy$eNn0HdQgP16!8vbh)oct*rNl)MK8I&!=9lZ!y*MDu0I0 zW0EYuvj}ZuF z8|GZAxm)o96+aJ#e5po%b!lAzU}^QG7{4{u=icUoP5pVkp2l#sY+~3r)Sqn(FEc68 zUp&>T+1pcQ7~8p7;Oiyue!r?&TB>W48@ub;Fh;1m%h;B0Ci|P!6ko_V$y7c3A&Sex zj6}Ka!&Dp7Lh+;d(paThIMJVH4Dg?61Wqvy_kUspex!%p(#t!<6aNj%X9ej-NIfvA z$qXCmroX}rfqXxb@pjd{3~{`H5fWhNfDrwsfJ1M8ut^zt`#H&TW%Ky54y8-{;~ zF<_Emcn9}mxB;fB$us>e))+0R-GI_K)hsZ6`+b2=FoFJ0ZSHP}5aV}S3D8e9!@f*8 zypNUS`Fb0@)$Ja3Vv~{esHvW)_jAe~^?>S6>OYsupR4OTb^}(K(C&xS$haD0%!)?F z<%y8dmnFNjeqzY$O@ybr1FlS?TgZoeeT^g4Y7fUpJrDg7Bp;V}lR_FSZ!_Tmj{p|k z^x9s~y_OQG0(3w~mtG%L3b1tPjjT(PftW)E;`K8QQLBw6ng!If+BRQ*qo3M2q1kr` zRP19Fp6MH4WT=Jp{;;ljuP&@xUX>nZwhz=NMmT?-*#uP@0l_cJ+uu_uK!3p#VwlDC zoe5{Jq3aL{3x3@aiF{~gK+SIma}}*lYGZkQ)v5|kr-y<^0tI$~G?U-{cDo?YE)amo z7ma4CYOMCR7(Laua_pP9iKr{mCjc|dQ>#+#i zg~4t%eYeO1c|6n@%$b>(Cm>LZ{kw-ih&F@3MRjh1(R>31+V^ya;@=b+&u5wmY=d)V|4Dm`iI+wY@&9uJ+_}#^4w~R(bnQb=a=-pn5cNyPoWJ zyS@i>vG1I2i9M9I8(iO8E`!|_dpL~KiH(jR$@k*4Z|#XH34qnc`3OmBXM`nCqbm#P|# zu({Ld<1f>*xv$P4d2@SqNAkW0fcpl?`P{($C)9RHTH-4Ld<&?*dBVQKxWz7+q`9#X z>WiL0$jlRlbzc2$*t-MYvEA|^yFW%S*8|i=k<9gX-7weEPpk3U#8>?82ie_O-G?uG zI}*b~$Q-?q7=(M9Z}gmJs>ka?!k@s27(H)wf5NU9J#VpY^?%&QE;lrvX&)K%FGh0k zt0#IO9?mJtlVkIC3S!}GVPf7%X*5#Ikh-BPN94Y%Q;VQg`9`LBll|{Jit~(ADZ1JI zQ+-_8ERC;B4cm?8*#FLTT6}7?xWsL7v$RlOmcrakNrlz@rnJSEZS*zO2Pq+>4DXN( zqrW)<@zA3-R4};}wXJG}$`9rF1{=Lib$x@s8Ig5%Ljg@71~cjls9*y&c?;lKX4Uh_ zwGBn;{iLw`OV|BP^-&4~%`6kv4!QDHm_|laZ9Rm^Hq}GnPz?J8xTHl;J=FucHiRR# zzDAB%FSW|xz`>dfl^I_#8Mu8~>F*F>7PP#IQ-=?-~BIWag;;6S0{N4BN*}qL~L1=d}Bd0zYQe7g>;YN3r?~nYM5eQx27h8_1Un zqHL-|>+@i(<|v<0`MzOrE6bGC`g(7NZv=wDw-s{Rhouf}lBqR=>UuBg$ZZv2nU1O6 z6s5w=^{wzqkjgF{;s` zHwj@=>OvBqIR^-zPKd*H45Jh>4UcshKr z>}pvG`jnw+bzKomMu8N;A$hqrDPmDu!<~qfhni}naJQ$b`Dy+}J?#&KEm%?8A~(JT zgnR0N96$gXjZwgmYhHgO;A9(D)HWXopWqx5i~K1_#&0*EO@3T?3=bqjE0?5H+W;u_ zon)j2)$lyu$?W4Jwe5mJ>fOv7-;enH$plOTDkWc6USG$F_;ZehW8Y-5oGIh<0oELY z-VYmjBl~Amn2Wswg$CV=UWQqLy#Q$JCosBDi6gD<64E0ql!IV@KOp>}3-nF)K@qg( zaL93xle5E95Qh!Bohi&qP%R7SqpntAoDpv3kt%;a8#M$-Z-Wi(exc58><=sIb}NK( zcTjEYTD9JKJy`T9uxKr$U{54nwd*BXbRrp6~p=D7IA?zZM}(U zTJAM?9@lWRu=Fml)DkAc2TPa~8=$EkE^Cd!SZi4ObjY~-dOGfiJRKj%lAV>v3SLh- zXyWkhSHPKjE8)@{h*~VH$fF{O?&4od64i>%e_Ba&rN^enXH-Fy>Am*gUyVF(xwZ|!d1OuWdv}XIJWq6DsK`2E({~1_TdmHKAoGhc~ zI*U&9b*_fDaUM7_sP2W{Xv3#rPO&ytw-8c)ZPVJiJGx-b;rAta7> z719z~Ink|M;ws`?%^61u@nB_Y2&tvbNP&ehM;S-Y$5{dcItGR|lx>;nxykviRz`%M z9fq(uNQ8_a>b|D$N8Q(GaV+!jI}y|C!B8V1KTT=|La+nNvTXkb7uqerl7kvlJI6I0 ztPxveFtsSzqBYLGZZfs9WEvYZ&kN(oRWU3>O{vW9l7Lfz^9#a=Z>-H1d1#3$Fx7_I zFouL5nCd$}a>_-OVc)58A8kNu?=wcIyF6jz_vnQ%OvBaHBTQ|_`Y#r@t39nWWka7x z3j0o@>sOKLq+%<=_UXuiBe0KTVx=8y4u#dLDKb(fLlpX9-<2^^)q0T;7uUC8XU^x} zJY$HdPGJuJB5pw0;)awjUOwvn$xSeT0fm!~scx&%AL9eWF%c3th%aWKJJ51|1n-v1(kBxNoLcPE76yx+4(UI3-%k>Ek zZv}sIPG>6ZMh3XAN7z~2ifO=wBVgy`ROmzp%1Gzq><{+Jj`Tp6-?Rx(A z`5MKT>63GFVJ&s)S0Zr-)P24tUw||58je$@T3eTA{Dy^sqCTM1)FTfTF;6{Jnj;#N zHS{2zZbjv5X)_yX)<=C;*`do{s|nfV0>xA{rK(A&RvR1ju#r9m+ML-;@p$hKJo0xK zeZ!@IK0|fXYV*~7wPBgx)YN7c)Ko4GTOS7-MPH)cuaGW(t~$Kfb+G5u`9YtBwFLsI zsi|#tn-;qbFrx|P9o@!j-;OlwPGBLVr}ynaO5VWzsPT7z8166ke5mb-%e7)zM;)M091J_6HU zlf1w1u+r~p{LNZv^Q;fKbVrqJ^O5Y9*E`H3j%@9~@k*oFMW=T0hx?d46sc;ifv)pErM!M%{<2agh@dcx_#d z(1c~F1z>G~gSArvty1|7^xf7-qe*$7q}B1_YjzGe2yq=+BUx2Wqwgm`ZN1Vg#MM<{ zer!*c6(41)n>GZ2YQRsqMa%0u==7JVmNEEzd(J6LnJ6- zst>&!USKM7b7A^CY~$e&jW?m#0^^%Smp5y2JD=st_Zq##OSDKg`wag*88@Vtta2B3mR5lKUJgWpRgCUMFWUpxyz(O17PjGHR8iUk+2?SCui^`y9rOcJWaB%|F{)rqNx z5}`lVJ@>MvUj5X_c4Ooj%v4_%`Qq_?l3Ju7%K9^_?GB77LK{C9pGmnS^TmHVj3c+8 znzU!$Qf_scs!p(&vwVkDlsUpqDL91w@J$vn-Bv|!7U{Kyd#FM99fzKrpl(ct+3gLp zo7$vyg`3o6J#aq`7YGdA$DAVQW$|kQRGDv6DZcoTxF^6}kZRHKTf(^ILx=OD>9~;W z&n8=pRy-{hYO1+QxjAKp`%j?dPT-Evb7*1?AtobtiYEMWr*I$a#hs!zVh#vqs&o$S z+hO5C)i!aQzp)$>?@cR{wOYiY)IESOz&Z zHVY=p)2x&nVXYgJV*}~=A9;qi=rf$b8NSUr!?*R|q;3u;IKzvi=4Gkj48Ih2hUar9 z1%m#W9N|u`q(jv!$=uoM*lzt$pKJ z-CHD|?lU6JiQJ3QEi$|#irU=@T_0&5sT4V+8ERe`R{Ct!g62aS&D4@~HWRg2nVFnr z>qIsuIxGJ0|AIpzwCW}!-$?WSo2fo4&)YLS5f$=r>W-RD`(VLr&6@1c4Y`)~@j8m4 z8ycVf(ISq>#Iq(h3!`~!5YF{@ucL*dT@`9}J@*kdHV!vA-U1Xg>?!$cv?KZRU;@Xk>)$S3E>RTUr{ z?FCyG1(JWNbA*KUSg@5V;f={fFqgObbo5#|C2}~pnAVny-p4&&KXXK--Xbaae+{ih zi;G@c&d3_WV#7L7-~J5Z{Y+$&#~!X72$OoUV(;&gRP|zIhtaDX4$F@S!CleI zdt`=@8fIXetL~~4jaaJM==bJ$D8fTimt?3#UI}cF_*t0s*!bBL^(w&vT(pz%03+k%mTI7ABy1*J_2!ou(AVT<#hpm?@ z_bM-JZiKo*K0nclEgq!)JAz~pnAop`{D@#(R;R;Pg-e5^s!nbf=|cmaD2FIFTs zN{GG>Q7ftheFmwoJlyg*ro5k8fj?ybV~rmnEB41**;I#MQ~7zmG2B##hS=nR z-eTbQbCGT}z`}6=`&Yt#AJnnZgVe=d?=g|RKWO!SlH2m&p9to_&vt3;Aw#H9=Ka^ zE=%mRWE_IM4`ll}UY1jkam20Z@`jN9;w@i}{=KZ$&or6{K8-fvLO07MnClPk4%t4Do{L^)VsgKdeas^@KGnCr845au$R ztr*gdwe~T*{f0{X;B|_*+*R!_!Ysx)_=2VDMQ`ZPXJ%URuCDNdwJ@^Tz0#ZO=-4y^DoQ}9^F zrUxnWv>EBww2QfKay(57Wm(~{ulsi3;@afpBGQk?mJVQ}F&Q5J%DPh%KLTlo3 z)5Jg1P|M3SdvqfiomYmR=+GXA$};pRM8nm%6UfCpGa_!&F5q-m@H;-wZRuQehR7125W`h zs+F~^9Jn5bXMHk%r>%?(sqRCuB9=ne*}1@sBa)zsmE{yRl}zzS4-%s|6B%Y5uPB+%q4OIB^>+okSO>gz>^9K#l=YEg*|D& zc0bpPXca!;U(SO1!Y4jT5}e9)YpP#>T&HnBFx}F4zCUy3G3%ZX=X|&x zG1{mvk_%4Jb6QF)!!J==zrdVO^Y{yZGNf8h>^FS(QzN_F2+d>Zjq1xvA>!&DVS&}J z+S%`mm^1g+#p0Rrb!AwfehJpTqZx6a+-(0wZv~>$m7{qnI;T*n+tVP#6b|peDMr?r zEOUur{ushosV~GU{ULhaNsoZI+27H%`c2ze{c~_P8K8Sg1zS@|CvY*FaQsTkHqxgW zX=iZC#hii<3R49I4x0;18o@122>0xr%!kAMx}Pum%_PVbtYtQDFu#7M5@%8wR&SCW zCEdJ^>!?zL;zNFCS80enh)oPqqnVTAj_C&Saw&ZQ|D8B=Z~_BxZ^lry zBB>3Q@N|h-$BC3HI;qh_L(Vb6I1~sOeafYA`kAcxYxqMh?r8x!WgTBs$Z=Gc2J+7{ z%u4-{x)SAsX1N3#nsxw>8&N*=37&5BT5R+Y1RIV28 ziD>^eqRQy4T7no-H{S3&~|t$n+4$zXw`Jlx_&!Z>{S7ekp*ij=aGG#+ePsz zK+BZG6mKNs-3q{=csJVNhBIm`iubV*L-9@%iYJZ1^#iAPce98T;*Z(t!=QNgR%nX1 zl+rX)@K2LG!eXOI-T)vcQvhbtG!e;DPlFqPe3jG-ncG!)pk!_>UB!^O2gL_$Ss-)< z*V$7QErK_%(@FxGfaM>#z|^cNFlR%8t6Ff3GX*aO@lSkXL;gDGF6~4kx6sY% zCZPf!aF_&P+0Tmz(dvgkPBTa0LSX@D35@afG7cR@*m4C#gjnAo^L?2v$X|3$fpOIN z#*x1>Ld(JZ9_{OlA^!7?tm(#KxklCuT(lmaEC=T*ZuNBa3FfH4RN6i213u~rshav0 z3%de`K6ha~)DoXCCev!0uTh^VOk=7QsVAV;P7af*rba{gZP^Po2z~7N>YRKP%2DTp z`L9^ok?7eJ7enET)Q$eUc}BW_o+c91s8<3Zr^NwZKks`YuAk>NaRxua!4>}QGgel> z#4SdxUy=H^y=2t5ukP}4XS_)KK1M6T&e#bk5j!Em&U)BmFr!tjw0*zc=w+$b;%Yum z!XzNXdIcQY5!1MbqmBRmDhkJ(+C%w~N~@E+IoWyvA*1K?1eaV-CBVkOx|=uEkb)urS@6PkK0 zsvw!lTTG=FSKaoi0$~*D~YTLm%OW|jj zzqD`fJZj|RKcaS2b3di1CZ>>j8m<`Xni|-P6g4087FKOul~%DG7$yKMuKS~L7i8R2 zgt;wMa)8ub{OqkRnG6J{t`{6TjI=6a;7Ncb6HKSi z&v35974a54TKcK^zIF}5^)Vp484wOT6|gmOIo@pyeTOZSgF6!lj)q*ZL15L3CZ|P% z=MmV<6t&tYGWwjxjWHLV{}Z%EYDpEIpu(S7hFFU~%T#y53-vk1$h?Y0Jf9@WEzJ>e z51&zF@o8Ypw>Y?^qfcOK5wUT`{Uyis<$7_y)7yO;nQ4A0TL9~>dE@&m{tn(4v;uH> z!V^OwfmOPCMg)2A@hdR@r%2Di z*#of%H5=cLY{8D38#+0;uQ6u-p8$(x!pST_DhJ>82#z8L9PD#6=ekh1z%7;XUyE}U zgh9SSi~>Uf$1@W2IB=YCm|9!Y1i!^v8E$Vs!?s=3BIvhSkQ!9Ety-hs8$!a>lY)M) z)ZqukrOi51BoH7&qzKiAV*^XVSsQ>Pr(Q?G3~<~h{zZ)~u%%1%yPhH=>mp;=1?Y2& z)T}z(3Zx@app7v4&j4mGA&jTtZCzvx_^FZpZ^nR9BmJ!kqwhSp8WsZ1u3*@7v(?O< zara!K??S7b1$KJjmDtldu!tW8IA-qDvg_r^+H+ErDq2L|=?#?`DN~XA>Y8PtQ$h2g zP^v!gt(kuSmnO2{BaO6U(aY3vv2wLtrZ_!AyAN4AL%VZZb%;84X zT()Qhas=K%=kN6?oL|w7H@1$e~(s*yRgS7;HwZ~ib(AEto`sc#(-mt z!zUSs9t#VEYj&;HCu}uBT1k+pQlaN|w;yU;e10-$>ud+(UR`gu&?N4FB=Sskk?1?^ z;lA*O{xoUC^xPS0Jthscv@Xmajr!le^6%aMfZzY9ah-KL|Nf)r@%I{^aUffbXcHZ> z1>^S?tj-Z+(2WxhQdKMW3n41?B0lfHNj!jnfX+>Qx_6|E&L4zN3aF>NT42zZ>@9qo zLO_fpT#PwXoR@Y)9yAYIy|$`WbO$Y;!^%Hw5NCoeC5pbzH+mms1pYLGAhkWnE+k`u&a@m5mEnCDqqyMGkKVX$HZ8&5;uP*Q3lFhNeOj^Si^?c!H>UkAp5CT zduNRzBz?~v~ELg_Pglc6V}1NJ{>qO`;P9N{l!=D_{*oqYeyA>M;5z$}F~oZ~nPvwXrvJy* z%1?0?I8S$YrkjV^t#}lxkTyj&3Y6_sV8ET5+er)}xTLeASSb;hJ^^Ol0vzB>@6b#O zvEBYQS_7?1R5#D?2#N*O>&aNe0?3ew622I)Q&VtcSAgj{*r0rP`3ngFl;0NyU}3kx zq3HwB0${}&+gyQ}Tr#)Z;YA($lx}$|o(_g0A_j1K)gM{g=9>0c4AQpir^Tt_fpRgl zbLgJK1--9qth=IXO-aX!adL-*DE$V;*WG-#&Erm+wcWRwoouiEEkmy!CGg*4`2v?k zWaBtq_vz2&7keJLX z9KzZb>IQ)fs+AM}48}-|xay9uqyWiQ%_%tyMjnL=#DnF}1!{0UKjX74E|4>Z{ z5a(`?;wkxvCyXwQV;2MkZQG6dVhn3RqK)pyr)JHrv;dK zbV`#mW6%ZrkDTtHy00EgwvKngWM*h z>JD!Gs|i4mzjOFFU0r7QI}kTeYrt8lYgmGeHx-qUgio!&BxZ2KqZe9HCs~1L^D3;( zK>r(jjSwSI^LJOaJI76?O_H^c{FYQ{a{P`Hh6XLkN^gPX)!25|PDB(x zMSt?ZWXQrPTv$8?p+~wxk2DZlHCOkKxDbXb`=kk&tPxHef)t7TES{x+_2x2%&bUZvy00D!4 zl+0--f@_%tT%LqVAq(dckh-!oL~uq5sh-)FuW@p-$y~lK7Y`cm;U1&!BQy^pDn4AV zIp#JQ{~_2l9SJrS&yx%RsyqFsnSNiUFXO4!^k$uo`ico~K-)<>b~Snbc9XSPMD9@- zIp!dJ|?7y~0OxyiLB}A=5uJSvGy3TIXxkzaQj@5b?KZ z6~&9$MA&m4<)C^S(dt7v3xvc;0a09^0_7-ulJs8l|8{Kt&$e(67_f{y0?cEza&Y7(dm+xKqp(?=?l?3 zO>LK_N#-I1WvMsNQRr`Ov%A_N;bD}hg>C_TH*?<6Rv=n2&711Q8u=EgCjI3tcEi`5 zFXy`jd^uYvMc1sw5GlPEA#XxaJeV)aT_l7eVhe;t< zl(hIciQAU((~wnpOMMeL?fR-2o;*8?9ea^Di5(N#8g7bBVke}`qa=x)WJ~C+v(*y3 zPqtc}rq6a$!vNdR4C$Fw4+>kkYD4_n$)s4x=d47(7vipD0ZcGlPEc)27gwH7FCbds z3Qmz`k9L*jNTs?g)$$^pUY@VnBReUiD&}CIsrAC4;){xdU@oqxBr@a&eQm2~vrZ-b zsZwAwWn7qPF!S3a@^UjWDpR^c6ge;9$!W73-jkvZ&;!g*6Z2Eqo_=5(0#JU(^5&yh*&ROM7XqzOmQ2-CAc8 z>x8eK4r}=bhPkzlO_NtO{+5KNtfrbY;EZ3Z#F<)#d6oA!tYKt(vwp4#;bxE6gHgE( z-NV!ieajUU_rrCP=K)JoQ?iggJaMB)qENaxl2~MuL}7q>sfWE{S7_@ZiO_OL;=j5i zQG~C@d=$VJU_k;PJAIujWsa9~y#p&9qSnl0K=Dyk5tBL{$1v4_LvaCVLqOLzYuk)p zLCYlV-+%T_2p(*jz-<=kD+O$CL+%7> zjc!A`n%*}GR^$rHew~JPj=G*lVvJKz`;y{ASG?=tEf4AMx(2|>2O%qy%+(%=VoZU^ z;q1etzp91o(GDw-;G1p;wSw)jvS&u;+~gQ1Vg1=nw#5U_y(z>}53d<9*L62n6eqV! z2Bb}>h~>{%(tZ_5IS0#)O#)JNWqlLZNmu&OT)a;{z@jFE{2E+p<+5Ey&eWla2|1uo zn2j_Sp68KL+tu<+ht*lq*W>#mVM40;F9kkW74>EoiY`jj&3_3y1<*|I@wVo{{qkYw z%UQesQl)s0_gECm{kFYtoYLs`&WzwaHGg(?f$#UQXG0wB%xy45--Fo}W9pX9r8FxT zTY4K@%OFuE%xkb819CsOgQ`DK^?QafPq!xMRxYJCVh$s&vb-=dbuvgl3DU;J&YG} zG%K^Ij$<@fUu~L6d5wG>zeiYD&|q^duet@WIPIh_mWyz)qkMITx>pZXE{EkATp?)l z5LzC7waL}V57G^49^U<83-d?J52{!EkV`%I^T;N?->X0Hz>WHWcc@4HCTc|efH|o@ zG<%Pc+r;f)s&+@GgM0lf#pys`F>tQ@dQtv*N&dP^mw6A5`g|Fm>pgzIHg-Q&aIU)B z#_N6dXE&j`0tM7IETP(o&7Ig>N$3##qs520rBCS(*)K`rBK!5Birue|Xu@=ZLfpc# zxww_MS}eDt#b~imf+32K<3eUIw;{Hpr8N0(=?IITZgR8P7Bk5QN#f;Zc60k~O<3AS zsSS^lY-O$cMY}W9BZSDvY}S~uv)K{<`B~1f{S^OdGx)eQxtP*>VoIlR6x=DhZ4;Ny z(QW@|;hftxap}ciA}@3W)iuOyoCQO=y(C`>)YW9Ow|?6KsN2!y&L`8;kir%I?YiOO zNp=EMx8Y2u;U&7EJpUyo1DSE>l*Pm+!7Ea3cN z5@~$08ofOPtKIS1>1McbXi(ka>5!ld`sAitQpc4jffrg+zf5xQJcXuSYmDO(mfO|` z`Lw5+E|2By<#h7N&&F-F2yL)q5wNJOJG<|o5=6h@ha@pzdUyy>&fX5tq~1$vv{H|_ zU0%akbq||cIwxW2t?s$@&yDG(rTeP;6ZZ8;_aCfE_`x#?OSdE}y)Tl2xQkkzu=L4< zrB5d;eSuQzAjbjVN)D-({zdchqUywZxI*Wwhs_gwxw+oo3EqKBGf+C2n=IDeo!iA^ z%)pNh*8a<|t8#7fouyimD<$5Zs$gv?mh-${oFwOK1&rr+DU75O7clLNP_m6StCo&CnQze}JSy(mS zV;ZKq4;Nr`#l^WQnaF3cRCFRzt7m9Kf=t>RqCTkbjs*Os_k;{O zgB89eAPn!l*fb*6nxVG&{hes9Z8d`K_%wA#op(6LoB?hMwxEI@Ve~yxFD-gtVt*D;&`8HQVrs4fJ`XTcrHfN_2C@T#=Ep#h`KS;9Vx`?04? z!Oh<#shE(kL{Mpza<#IKG(jK&Y>r>8l~|N{EZ=SdPL5`0*6KFPq)m!Au%VIZYST`W zK`=Ga&8-dLpCE*ga4w`K6}ja4x+be`F=mD&sTH!10Q8E4-rve=u&&gA84xR==v-*G zccO}z4)^Yx7*)FL4b0soJ?t02TmsMx0pJCdDO%RrTH*bphw1kxdtQewd8 z9d+ipLPh2)Fz|I=C86*>#g&qda}c3FdhqAy7eh+cKIuksdOD` z11ix#@HmDwbtd*^t*n?GoiEu&UJq+Oyjyy3A-@)89~Sh0c)c3d9z3`8fHrLAZ{Txh z4}Xir|D`*e&RyJn!C<*zo?!%M@L!8HajRETtu^F+SO&S$-I~o@>6$A%iu0SUeg{Wr zkRn;@#@t2^!p-XN$Av;E<>X#d!-Qv`&ww3}7|ncP2h=63(!TbE8_@5R=!76MdKKsm zdZQ$MgEXK4(IQa`yj;hBuJ%Z1!FEyHEfUX-m+Jt=)gFNHJ(cN!S-x;Ucd2IMCl})s zfs(yH??%4BvoI{NMS?Cj)_TbehZC$qEJnoz z=c5id=l&l!Bfyynup|a~U%|N@_`npTM zd=gOe@Fz-9#b6p-tl&5Yu7`E+5aFu{+3R9{njs#`qBiD5Z@gQH>Qygx6U)26j^({X z$MT9EK9_#109_PVaN7NZ5J+O_)S2L1Up23yowB33-Z%y^*`+n*Qu5}P*wc0x`fCyx zGvf{1g4!V6k|sQHw_(DXNyn*~%w^!f(c&6E|)IUr9(7T zb85MShl}h^5HU9nVB(r2@;C;SXCYLcA?_TrYnjo1wy2yI^`9gp(ml=f<;3j77Mk~! z=G^?E)lE_F1=^)VT~{IAAl%wR<+|M}*YlkO9Z(0@Kf^tDDEH(WXfM;@lrE8dG)~-! z{?dE8e1b>8=c1uYH+}?Bm&Sb|>YUg+s@tVM0=#8P>I(FFRtf<3Fz#eZ{Ror80f*@< z_M>S^m#glUQmvK$0>fW4#k>>`7X85yR-b=#ltFHnoA4DggM(w%{w1Zy2T#?jzQ^Nd zt2a~?s3pWHY(W2MZxTmf_nRbiRqq58@_Ia5G@!r5VMW_z+$k)C;r@Xr@8nvXT0_uX z%(cj-axMOIP+gdq+wp5vo2p@};aMffs%EN7OxC=i+Iy5o*3!b3 z3Ia7^5(9YZgBlog7j`tiwt<2;1P7b=5>j3beK(1&lfl-J4BG~4EP`*)>ILjzA$e)p zaFWcsfbKv;q3_RIYGLEk)$0lqBz83Lj-_nlZO0?j%f4pKRlZW$#C~O|r{zf9SdEZ+ zjxcbydSNEAMNG-_{X|H^hdwOGRx-9$DRGmrL7+h9_2jM-Vz3UgLa{M~SOVc{vY=x6 zXJ6oTC21YUO5Yz6;UgT*LIiR-94|sZ&LKD6Gm->Myq-Tz5}{)gn4~2QaXLs>Zz`?6 zyRN!jdL-Jx*uH{j$CL&ng*$RD#DiL!3Fa*c)n=OLr3iaYaWCUJX_HYX{+j>Q_H(BhOW)SbwW@2 zA;M91r=gfe!Zqozxi)sn55~Acy}*-3F%{Nw>tSR+$n5hV!dE5lO)nt zD_}oDbHlHhL?U9q@jD7w_lr;boPsMVY1PXNs&^4O?QcQK&yb=|)VfpN1Qw#5s&?o# zfz&ey8@37{2$xn`8sV>)P&7x{i1$S=(e;R%>T%q#07y0J&eGL)PG=YC&ZL0OzO3NN z=|XaD@J3uQnB}etZQPc4;pjnTS&kqEp1WGR>@IG$Q!zK@Zn%Yt_zk>Gmx4~;8D@4& zS4*6(Y#S!GAatRt#*9KdVbTZYARS>xia61~MW{ZR6 z+oXk~4kr6B}|EFK>N?Gn><&8q&*NMRVV0nRDRZj*Xy^of2_p}8$ zWe=5i2=lT=mfkAaU^!Y(2OBNZy1VcX5N(eLs{d*NfsaM^W&8ZO^>b5n{k#Tg@CLDH zaV_v30_ldtkllyyDLP%4-q~T8ipBUKr5i`UVE1U$(&V&T110T{sgWpxPft5d3FI36>6hKE)z@5t* zym*URuK>)~d}lwkEZ9nqnd)&=Lpywcm4|s9%>pKVMRr;4F?Bbopyg#=alKkdMzVv% z=s`JON@4$Biou{)9WdW?aKL=6fO%f`VE!1?KpT4x;dNy?CBYZG!6@{1I&zHA?oM=p zM*0$6b|o2StTN8bC1o&m0&6tBFeb96TZ2|&u$%GVmEWlNylJAL=;f$3?nAr_1;ud; zMo1kjzPXoX{v4yXJJ=k}?hVF!{tSz>yEWTkV>B{fUbnxMsh{?zD!KZBh2VxvFe0+-k_QPa%e#f)es$_3fQ4%7C@elu-*1F|W&p7&Q5!JVh$ zoY)u*vSEopHU&SEL|-_7xyXaEHoCL@tI|-L0ejm8wP}Q;LO7~op*G&Z_bbrIY18$R zo&~<~!1<*~j)dv9LEUGyncg#`+k7&~;o00as6~7Og&Jwfs@`*|wm9Z)cdYH*S9Lm7ug87$wNv$QT-9aB-+G25vb0Zz-RV@#jjOufsk$hx>ItXnnz*Xf-B&&5RLzR}YNJy%Gp_0# zTMePr7cPvx(4|AHY%y+WW3t6V=tn@^(q$ZAjfzjBQxQ~rkUQ0)i*B1o^p}HU`dgW> zv=y;LZyouIVzy3v)pgZ|xT>WAyXwNYss}aqjGAL01~5*E_Iz=t_O!)!$4qUj)7|EZ z*hyRr6RIciNLqJ&KPIin@NSz6mtgJXRN|+XhG~l>Vq8N}$o3$0FR& z5cS>w(M2??Wn=ZrTh9z=)D2!7>pjP6uw($_E(<}b4-aVc_WmpjeVX?N+H>cRl9n?~ z4R6<E!{5j^5eTV9G=`Iy!{t1eAuSe*GH@*%8Nx@a*c8@C(@CQ5y$Y8Hu9>s+yBM!| z>9&d7iW8;fr7H9$v>N4zX<7Zm#Z&w@!#Z2Q{AB&)l4J|`q3CTs#sVb#-7P&PyrFyd-*!v0Wt-9gg6J|-6CFoJjsoJTlYHD7!)dM1l6&Wq-Y@pOb6!??=Do2hn4f)^NJyeI9HQKGFDI4nqIb?Sym z9dN_9rR4dt8RU&H0KN|Mqm~14^@1U1E3`;xZ{Tq3VKChNxPhnkY&H(R8P!+`$@FoT zhGUmqeS4x*XR6Dw-wIzO16nUm02#e|@JwWoAj6>%kmP8#+ww>Uo5ZcBCr(t_y~QoP zf>OzsHptXwMajZ~SLd0QSEs|Yj>Pb@qaGXmDKPvqn5PtU*4g19ZeLCGm5yUH?^bI1 z>sDNAS7d_$=`E<^vtt_EL<31unDvrg<4w4n2TZ!5bpId-uoIUP2Pj6mx+)^!`&DM6Z)wZ z;)X_I5q}JpQSfJ_slP3tkYn+o_`=Vs=JkuJ+tZYGyAPf?7H1e z>>B8Sh7iQl!5C*^jILhcZ6KM_dZgW$De@bgbT#vOsa6L!-Jl92+hB%m7;tC!zV@~` z-;%@K(oW{BwRhKu3T~wOFiC6gW;L)^@~caG=YH}99dT=%foIE=^16fU!>2SP^{A!5 zx`LBx6^h{~K*kz~*+}DG(0^N!m}JCsz6$sWbMg+)vgTFh9DyeY5I;!JQ4I9NquI8D5aFL*oDko7$1! zjN~wVHi+05Wyo79g)6>2Mo+!ixnleL<9 z9aieysj0=U4~4LLPM%angP_lr+s&iMwqY^LbyQ32%b&Sov8W9Zo1c7!hWuv9vc&(h zP4CHB#?X^xRCQwwZWhBWGd~IT0HY0Uad7O5RtzU=J|C)1mF)T+b)op1>Z@ii9ZJHI zn`fv@;V`uTY4!*+Pd!{Mz3Q~H!wPuLS86d9E->+U@ec28x)i_47w z=3?y_q1_+4g^MUmrV@nl7p}SW^45|REUj&~3#@$hONo218dwl~w{|}vD4oBF>&ag* zN4=ofUn0f`Rlp*&Mf_RhSDyZ1jk}n)E3KxSkK3wIoW}utnM5`%tcHq3!Z}r7es`+a za$D71rLFV=WM37?E`a)X1KF((WFN1VDAGSekw8|mC3#VSR`U_XX7)dEC68x&%|$_cJNYKVJ;)mZ?jJ?5ACgLZJ_1~vUx{G%DOvp zHC#`&W3i>KfeO36 zd)c_9J;Wo?LVVjQXuF~|he)LSkdP^E)$8%X;98V>)phS1ELM$8a9|QT$^Ay?WLJkm z+}sc%@Pf-TrIpcps7I|wv_g2R=Ln;@93L5IfYCFA;8S2tPtQzEL-^RY@o`uQ>v;?j zVsfo>wYm_y0gf4D7%b2|2Oo9e8{JC0@)7USiB`bZg>W%Z>u;AFS5qK|l6traE<{+u zYhfNlyShbuYrX-i?cL0w*TUFdiQy5Gc5gXU6JpQQomOR_W_mIeAT%ZF;{aZr-{8ILYCuWatUkqnCUd-^lFeil;1K7K#9#0sxaj;wB1-k) zRBtDPl%L>u%-Ru$y@Dy#5o?lVaS$U-FwPeLd8Q%aee#z>i41(xb) z1i9BaZ%_W;d9%)Y^m!w*fW^wXM~Z+N38D?Er_!Au+BVsw)EIUL9>3 z1MJt)O&m(RxQ;uXYrQDAr=&AZJ{UOHuB0=X6m$sFJx8)ujS$M)x4?>-b|-ov3^dUy z=fY1&LW!>NI#3r3=XIroNp2dQBsaWVWGA_4l-rm z!BS-MU)16nY2k|ljeVQ=OqqClw-aAtO`Hrh`#JHro!MgV%y^WA-Rz7sk;SdAMMgN# zow-34_vrN#LUT@%E2h778fW)tvQDF$z0RczYn`T9Iygr?-q4{rlg}h%XM25)B$we| zP(h3p+9-2Q<&Xw|jJoVT5ZTp<#rU3wY96gzB4mwCKsa z6>ihA+J+JPZYlM|x_`PQ(w0z3^ zkq=tZNNJ~f%7c&|HLZ-hZbjE4YwXOL5F&uU zXHQON5x>Mv*I}GS)=@3Jd@HJ5OjDL&su@f!k!|3$Bu-ho76V8fvO-A?dOtJk(ZZRl z<*GqrX{y0YL-dtDHq|gu^BtvTnQ*af#EWa~;czJ&M#_H*pCUN!Xmpw6?8rvFqZ975 zlEE7QtRrtXObe9*eSrO|4?xU4yb9%1XTG*Aot2<*U7Jy&VT z1VWh-$ON+W`ydnS(?Qm2+9e?pS36kXCSY^-8#|O3l@hYnuVO~f0$ocl&Xt{sSW9#l z2#4HHHK*s8IZ^@ZJVD$Ve*wxpXa!6@OAfW6m@98K0#neROHN`f{JrHE7u_k~xkHAg zp@wNEDs(GmQPJJpX6uhs855J##GO0_Aaq*C{9G{^I;ryjBb8Wu_F?KZ(jXnD){?HAj~mN+i{g?Z3D-FNQwdYz-o&Fl!J&%K~*Fsx>A3lIqFs_j&q7rK0jI zWfJsgyPWMQr2ev$NmerX2xStstU)MVi*)@qe8J@Rjc7V$dTVjVErV!1EKa%`(cM|= z5^arMSDB7B6z7E(_|jgbwTerKIEbdQw_2+xc2}W6rB{K`4WA1S>~w_D4Z3?7smb&T zMMCMRZs8#c@=D7KoG;gO1?PIRqf}~(tZ|A&ZLW@&FV6GFLKOEX_F9e6ZB9zuW-)E_ zwjU~)mPE;En*QvVMcwZ-8i*H#y*r|=cR;m&D9{{-0uOeL^ShSFasIinV167HJl3_4 zUq=CK-w|P&4@7vpdqlvS&Dy|$>I`;J9ZxWbe^kr{uIg&^3u$yxqDE`G8vTnjIz{v( zhp5Gz_QTh?8t|qF4Y*KQtpPW(P&qY1A4D0=xw*KEED*#4qN}m=-qMxm!R7pXA9`?o z2|tDPG5R#(w5NfiacSv6AX^W`;p|@{hgh8aKY(a0k3-i@k!!fk0@J=@>O8^Jh23N7 z7HgC<^=2$c7TZJ=dB+n%-H261?*7$1+r=|NEuSQg5d`k?9?QsM_st;!oy27ou>X+` z5wF?~5pQURh+|QD;Jy~*E}6=+vNE49xo$9ce~sK(X7v6K)JSl@T3WddX4&zppc@J^ z)pux5V_jMHu7{DLOIl750LqsQEZz$mMbOsSlw z)--;tA=i9DSBVXT3y37MnfSsOR|)CEA=d7_7G!iaO^)lAWr!C21XAsMnZlDHIO&~3 zGEJbwGA-drSmOssQ7&E=5kpDWMeJE0%pWN@KSp2ktK-hgYZexiYb=--j|I*pzeQj2 z{nY6om3ZcNXQJWG-jj)@>k_qZ^xar&1o~YT8}AQ1a9&Lfh&!kykX^fY4A)>~*==Ab z5aHleg#+1!RmkEn#C(&frr@-bigEj|W%|v&DM6c2A*xK)XHawCW> zM+-BKEk}eYvE}GCsvBDl8)>Ibi8bIvNO9uMv5!*RVQ2zCqIG3DcgI75P;F%*b0G&$ z#|2g}SB@-OutAMp#`YOk-jcY!fThT*#6=A=}-~ zWqjW<>@R;(y;%J~f{@h{SA>t(=Q{JgVVG;`rU+9lqrW}!5 z2v{sru9eWs!AqrHOGe`+y!V@UN=Dz4Ut4`Sytmz#z5;C9rMz*sA9mZwVc!aeR0>)g$PTq&cASAN=vUC%VDE4X7#X7;|T=i<7$%<2jzdat@VjBL4& zliCKjtMe@J=YFDtW60vpxE;8XVfM&}&vF{MeE2N!uHCy`|0ZtC>$M#x-L2@4hV)I%wa5IsLvKlv#Zld+FNF~X988fN#iiEx;|5RDb19uuj$UM2MOa?I=3lX;;>z$c2&N-a+zCt}CqhrjNhV!ROYxqB(-Cuc ztxP9-SGN%GAfvxCv1@SYe!ir(AtOBc;N%cN$|U>8Ruk4HZC-znCfDPjvo{v)NdE++ zWz?z2yduF|#Ipw?K7U7Exx+^#6rV*OX^YQ1;e}khssgTVMQt9M_QrixdApW@?^n>q z+>65B(n#*B>w^Vsl8DwzWOy43UR0x>kWyc!$%7>N$)Fs>iy?Afls4NA3g}deWoI>p zkiP$yP6m6u>zAcF+EVzy@9+jhh)Sdmg+WCr8K=-7Pw8eZ2JO!$0*_!N`6yQ4kxS$6 zPh}w-J2ORF0>-AOuWLZYOL;3fO?^&+Oe@4-#$=o{hNwl+DJJZ(+F)#jZzU#k31Y-_4vQTf#u=*+|nZPh4`O(IBrk24o4Kb@xSJ9%ybS% zrQ?$Qg!Z}SAwD}c%&l16UB!A`5haVcAALrh*NK;OOE1O;bx`nXk=yaOZPzXVQ?V~p zVtgpKoJf0EL36M1;JP>r+=8-6g6LiocjhKy9xF*AiE46%6MU+#oQHoD=FV)UPjRavJCvBDxV)!RKVvveB} zDTzTu^U{;Y$y+U}V$5*R{t!W*-Is`0RB{qnm4^oNSNLc((=I@QWStL1 zZA3>Yzgz4`+4s=?;B=yvR9i~;jq+f${m|q-I-@6C60R-Qnk*hI3ZOlMKTEhmqOylD z#r4GMh|O=6kx-h2AF~XLvSXV`s;^T-xdUwK>A~`hpVIs=maY^cJ#4EvK}vCU^L+?O z){Zq%A;}W%%hB3RNV25*!-Xa`R}`mtHwkd9v;U>M^OZOOZnliNl{6D_1|BPGL@9fS zy2{sbz-Itc@+1ju<=Se;KSSL~%u$sDwyefAN4%rn<+%~Z^*}q7;CoRkkJ<9YJRN9y z@FpVuH}V*c9YC1CcgdGcKqMi>_(IH_)T}=08NwKKrs17$2}acp#gfosc@c>?L-jeS zfbkO&|NA0eHI(;~2JzZyGX_aAsJl`3){EPTx*Req{zRWAd5`w!hL<+95=VHNg}83t zvm^TMAkJdAIJ4v%#}Lsr9Org(zK-qXw`%6mt>ONMz<&tR6Q!om`n|o8JHG9kcEy^|~SMCjQX$ zD{EEjJa$lq3!e69UL{jkHCwTfcL}u*oZIS6 z-0r~=p2dNx%E)gfF|-}p?zZ~MnxSzhiP{CHE@~i|q_qA@TC1RaZMyBR#V;f)2s083 zh=o*y0F&vYDRe*KaT9mCPoZy==|1RW|8iTc!9_+-7d+4tSOen3P4^A$mcl5uPl)^Z zPNyOkSeNN%1`>R6lT#7<#e6CbvyLQN8Vj&RcCG3Ck^P*IJBPbV!wUR zZeV&x#eU0+EcmHSmal?pBdOYZDN;!a2Ak#)RuVvWoUPLKX4*=w#LY;f5DyNwyu~J| z=5FEmQa_o5=#S41h4?d)eBLRA&6%v< zFx=@YFtYvYj8uOg0&5Abz(eF!I3hus#RQmFqfP$IO9BM$ZmnJTHrd}~9PZB+eZpV~ zNNbBQ$GiFjD(x zGQ1s=sYJrw$P{Vu!)KEpMK=5?{;f7nCH+{KDtp5>SsOk@Hhg#no9(~FR##x&7Ig(=g@6g41QT2= zi6wSeV>KBTn0N8=Up1qqwURXZ3j_s$=Puw}jpx&4UY>+gx8p_KHU0_M>@2A7B9VdB z3eC#LHDU|JOLHa}Z>5jVc+jI7qvPfDkwwC1?=Vs;OBR2-Rz{H8PDWT1wZeQg!ye%? z?A%r>M);_P*E7I!TPuQ3tZGHiL4jH$o&^_UQ?yZ9#1B!;SOM7)QI)OxiP2(!6pRMF z#L2f>7CM(_83sZFn9t{Rf^ws9^OhpLX*WhK=|9!YY#LQe3?1N0$pWmycgm*a$SI9< znrWs@SJQ#8Xu$ASdunCo8slw3Zm%oVf?Ot61(-#9t08?WzzYJs?#5 zshInEoo-N0&II_N0`&kda7-2|bOZh!av|U6Yd6wH7)S9vp`rnEkdbzb{foE9@sc7W zg(YaMv%7?sbf=2<6ploKonu(X=Q~71d5VQHhz^vQ0eYzol|_inx@-v|ubeY!*y%KD z6)x?Yuz;MgHe)P^W;n!MqGuu!WtpwdJm^yp6Ik>VJ|MkWt&vX_T+(gYYx#lzgZQ=R ztfq@AkSo{o6crDCHhMexlob;8s@peuo1K;0i9e%&5#51?+7z5e?P5rb)$`xALbiwF zFS|)tB~MV;Ab6S}!FUivZRbaEup}KLHx8U$JhNh1fK_#Y(eH9FvkG)pf!Mtu2e+tK zCc###bnoe&n5~*abkjZ|H5<&3(N~2X(p>qDRs);%R z%}v#h*S)DZ-`bb2Ylv5qmKPgnQogLp)6GE9fw8>L?bejeDnN-o)KbfALalF&f}Z35 zv3Dl$RaMviPwvjS+*}e!!i=Z^6}4(`XthGLw*7aC`r6mOZPV%XQ6$z^1r0YqAOQ^G z00I#~L?LJ$PzjEpH6SV~1Qo?8i1QEx1uaI!5&3_Ad!KXe%}p3o+V}5!?Z=XP_St6- zYp=c5+H0-7mg$4YWlk?Oqa`}^PoL54?(@_1`4N%hth{QT@EbTEqgK=mNdM+xzUfME z9)_LBs@7Tb1;TQBx!)mJN|PSz#!1@9GZ!*7ueKaVtNV6{w7q4sUtft=ozU&c>_L4%M#{h>!`R+Zz+BF+XXtmbD3SJ!O;HvYwHaXX~6#=xC1Fb$l%Un4c>gqemwF1xE0?*|s;BisrL#S-E_*Vhe*z-kB z9U?h^Zy^w|PpoLgU%f#~;rIUOD%W{zz z!(wo3e@@@*Bt@-W!KR>e33%$4X8YH!!e-v38MFlxy_~B7QnvYP6|AKS$Tf0><PfqmO(w(mMl7YAg?@b!6CRa%wzJJ<~BX6D!k>B}fG zTa>3k@+d_|2Stc+Q%7?Vt3P1~I;0#D?u4x9qbEH`;(4RpA>lkZMD7@sen<%6KM6Bh z>LDR~@j|XWBy6;+^5{r^RhDF@9Qr7At3oN!S-8^1sx0ipsze5K@p2!v%d%=5Le#-A zrK^q{@Xxm_Sn4OU4MZY8CaiZAYcUyOTrzNvihj9Awf3y7X?|OE!64WovZ&^P3i&bI zSg$HaL7a!bK`s%Fo-eojTS7_$ALN@mEWPKV>q}Os z^h5b|^;od{OCYJl}V+HM0us!Ty1C2ZTo~dYjWxU_&_g@P4Gjov}x-p?w z&XqU+yiSENf-k=2;cd#oi3+U1{s7fO?lvPsg#10_+?X&>iL{DHqshsG_U1 z%WvzHvdh01;dc228qH(px?O%(Cq93KFqpw1#i;_q&0LESfjE0{^Uw%JTSaQ^dx`X| zQGZCf%PNApUZOZhD)=CwX{Z1?^Uk>h2gH!2s4U15BuC4N6Ka*?MK8miRNCoV+%jadr`chp2WX;1S8oMmF-gbueeQ$K8k+*`H zB2a05K>U34>OD^Ja;LG?ZG?1E`d~B5G2auE!({;=t(HaN(+!n~3MIZGkp!y$TFxY1 z>N@g&>vFO_cPOA08wFza0a*k5B`wkO8$9k=I`_~%(lWp05_!^^EdX_6s z)e?F?!KEWk!G)R7Du}e6p|1+vYXzS6$SYx*qUJcT?k5lnOTU%0L;J)h-#Rz9rQYa| zAwIVA#=Y4&?TQLoDqs6GsQlkyXedFxCi&ROpzP|UES5M2EDuR-$C94fBz;7roawx3-9$W&xfrkJF=DdRu`Zi%;hpw4xFrZiKjK2^UC!hbTB+0%~ zsh@&%J)2pUj%00tmePR4<8|2Ddo4wZ>p~(X)$T`LHS#UTMp2eScv(34>gr+_$fCsh z8hwf*j4rQTD_+kMTt+SrBr2<_BD5`ynBOVi_dlk&X~}GDsmmX%fb~D(UfR>_%3aZjiUy%4&Af zU-hd|zd~bMh*Q@GK^MuRAi1^%iCKChP^z~~NEeYnAkQ3$z%&=jXWRwY^d?A*1Jop7<38##Xe~n*VV?whP;T*DG@tmy;}Yf$gnL_cEg>?hz2gY&RA#F_WuJSQ+YpDx;obZMo*dKl zF?u`!>~VXA@OJ%tf}b+|e6vtKtKln>N1q-81bi_zNm4k{J3azFr0@{|%kmLR1AJlpziDWw zNK;5TxWy@gBh&>fhtKuG(b_YMP7!rZCj0LlxH}}U7`-{~=9bujm;Fy2c28hCDNkhX69$RE9)Hmj%V12Jcm#zt1qn zaPU8WoYw0&8&!>^6L0z=v&300LMTtb9SeQPo$@($l1hw0Af~hrthTu4NHDp1%;TBP z!m+ip3tw=_uwq5N|1ck9gNNNW3?+u^0u)PGGvP%l8Sg3f20LBI_<;|<-Rdso?!LqH zoho8{l}T%AL2uGuU~+wlXg1ZRu7YE6xCV{k5|jz#nB}toMGDX<1>w#sfU)c#pqwwL z)oV; z^D;sKle!*nv(Sjz2qt8kbx^};4?BWVg1Nsv6&$`Y!=whPICYdffAyO77V zwT&Lxo^8~Q>x6a|c2%2&-DF3HYnz|bIE3a_UWDn9y9X*`!llc48aL~(c6VnP7LEUE`YxB(wJNssP@Xds_-w^x34&j9{=|lJ;cr~TXt1GdR+pj*V zO#kY-;MIF=UU9eBef4^qS04ngrUtLZ2a9%Tupr;?y9(bd4#4+d0NL=>^5E6IZC=d@ zfN??a>Xe`>4sYZs^5cSqrK=eLw=&~qJ=c6s@gnA?vtqvaI;;cpb#*=?Q28m4lZ|J) z8^Ci4O6)gNhWSp`;U{>QxKB3cvlX}f8O!P^GJ$N>$*Fc6r}qf^Uyf)@Pc;!Py721! zv+C8N-jz9*t%6|uD;R$~xS$o5o=-4@kO|U zkHtj}61*r2qWbh$*!S&OxOH%v8(StKcxP6v)1!o+erA1>2@P88eOvCmhs!TQUS+Y> z&i)kE+(FHJxwIU@)dcq6>gpE!R*1-X5D5oMlw;7kbuh|8vqh7=eZ7# z2P1!dH1h9Vyza3PRLYMnRN6DE)d~Ap#x5Y)6nW^yOF9$tNW`hZ)SX+zCn%eyN+m++ylsZotho$2@=&OlPxNwwRBx9WmI~ zJ2lg2H#2b*bor_=MP`Fn%3t5R=0<{h>iX9XB<2DMz3XwpQ2~r(CzoKjX&t2zrA^B* z^Q#%@=OkRRX^az^u`ZX{h?Uc6O3&}X$~ymF4ag=!Bk(L0zI3NZOXL~``{s_R6I4F( zM=%w}_aox)xW0DPx7Cq^IT08d=jbm8Se#=XiZF}icn)*!o9`*6qgeeW&fhGLKuEGK z?$Wc`?~T?H5qfsMCr6@ed^phj6?=szfcNf2hQrLkNbCq`Cz0oBsDVVY{Q*vIzxTe-{ z-_`1*uAyCL-K9!dXKgb`swvYx3y-rxAyA8Wn?VdR903er;I*$5LIL__RwF~``R=iG zJohz^;$+K5NMoXsuX-T;)ewSUU$|gMAqYML1PCI3vDX&kLghYy(iA8LILiUs( zkg%g=r*cM`EoJEPNWEgS_FUw3o9^}O>#DEtDc*9f(OFopRK)4ei5^?v9mioT3Yd0O z+R)MvAm#x93Z^PH!d!*6&F~0|4g@&Xw7Z#7k%P|W5G{tDM1HMpvRS$cT7jUI@Rxy2 z#7{Ji`<#EXhVDrV8LW%T;i7CVX)AP_jY=i1X1cQy{mp-AJkfUf+G6Ua^0k>&UxKeO zfo!uW6Hio4=%5zMtssRWcC{S<$=1=jn&GoS{J$WqOf?stSQuSrzvg<0rKav{trW<< zV0=ki?x+}8dGYzMvtN zA!sIQoRB;!-{PGD`2?tI`WDm6#o7sa**9wDb>LnfB=wEaB{~gV-+@;zjII&7y${Dx zkijL~S^kRbi<2np&AJz+uD@evN-&#aQrQ`fJg6ZQ{CPVUOe_=6(tHcd6uZOO>9G4k zdo@a$lxJ~bWX#j>HtczV*MFpKkerOdW}ze?n1TPXJcXu^?xg^2`Ul8e{c*Lmfw!j+ z=Ujy!;?RgOfL)*#nfYb%-F#y(|3`n#+{hdJPj~vP-qaAI8o95P1a`GTcV5 zP$?cG-|vD>QK1}}(I;Gux7>v_*H=qe7VX3j$x2xOkG({J=O1xIW4YUa2b}8lIfFwG zAYe8PZE2wV-Wvn; z@($G!iMZb0p@Cnv`Q_T!E7;`yam8nVN0T1dPW@e_Cvm9Gh#tUkx)(C){WxY@48y|c zE*cexRIJb-m%|#|O!zXn%$iB<-w)*b|DQGhWkkt zy*}U7`qv7dfiz6?5JZs$h(*4r#GyA3l|l)U@%oaIPcB5)z7R4j0ZH5AUpqt#^^%oa zmAY~p-OBm2ztLa0dq%Un)6NR&qeha>5>PmKW>E3@N?5uC+=Ljd0kgY}@cPX62A<*d z8R7Mv0nuR#kB%IY8DImoMO0*Yw)f906??{h$dTQl_1)SGt4Bw^pDFf19FwS7Mh{WM zYhsJp@JS(AnTp?cENtiL;>E%b}lS=XDTyvpI7h+!3^6F4vt1XC?46@Zes+4%eprc4; z&yRwDr4V>A1e+6(@l!sdH)j*GFDh(rpUC&SF?e=L_vo=a4YW@U=E0#l@*a&8YLGD| z!K3|aUtr62vSFVjd|8o+;R`w`x_O}2)r{d-J=WfdTSlyLJIn1Ps5w%)4Y;wi8_G)o zI3_BG$@WAdY^PZ5H1Dz<+b|c>bRx;%;Li%6regYeJt$dZ6=)-Gdq!`C_rG= zM}!#fuU&XG2|BG2M=6E+({MXcg<5vn9z1sU)(f|gq}#% z_}5J33)+o_Pg~`^F7+VxB;_c~ejkW+M*3Brq(U=qWRZCzJHcO32X@0Jc~Tg?S}9+@ z1>`O5DW-p8Onm*hQP%ppNXzi_DD7~F-m7un@hc>HJA!e}_$uQxs~Dvn;=<87tch#@ zj*Ys3cvp38nl95{)tyWcUctPW4l{JKyPT^$c6K(g{DKNSt&b;|sp3+x?Ed6*N~Y22 z7|LXdoikPv)Bi|3+YX+!W?I*ERG1CIDuHZf3xFx$V#Un30$Fi`Bf~tO2z3-L=)f)b zoPj3hWko-2jU=MxY>PW(ykEn2{b4mk%a?ijV{W<^0MobeQPoaaGD?m^XVSzi)e5(R zfca8KdqgHpRGqe$c}1$t={P7LNqj6l^F`yJRIFNyA|y;hN67ZRmJof4B5@(%wpqg< z+ZXZw%j<`7=I7kgQ)60@Tj=Fp>K(Bj9=Nv623P#f_c+0V6y{crE$aTc1XtEI^wiCr znkNjweAn^9L@5Lk_Dw^_Lcn?!cm7OQfU^?)m!HB5D6zMfj<6^?heTG~vV2QdRc52B zMyT0@G9@M#kZ{M{o|DNpBnVtJ3N;U_(ND+=7}1HttNM%T-X%AZN6@+1Tx6sXr?_oq zdubxLW-_*kx}*ZIUoOuqP3!NDT%QuXGNLf6Gmu(j*%@{gT;J@)?{H}II?GhpFO95E z&+`ZT)`+h^V6&(SheC6u5nXzBc;U`QePf=6^8K^{zE3H3h$b95+aoZ*BWWxVR8vVQ zd&JRF*+2qXs`Z7ALTPX%8%}T)7JGYMVPv0HOLkYj?N)xId)jR(Wwgq&CQ)yRkj<97 zebYQ6eO4pxBy_nfzb38A*IbvI2&23EE&=ExQWLZ#x$QxOU3peyP^O?ElY_va%?;;R zSPl|m4m#d92gy_A(dx+HOfVU@mCi7vSPAiJirBH&Mo_;N@<4P99?&-yA}z7KugjJg zcbIu;B#{=rr)+YO-($dtQps8=Uc!WDyPn=b0jTI)#*V<#f#opI#Q6dR)-W6e0M48F zWof{fSYX#<<=-DT3LcaOoNu=V&VL5L0gkcK5IFE<0Y?hkodAa$=KzxVT~Hvoh=8=^ zR;;Hymo@+NY@mY%UKD?5+DVvul=`c9^?EZ?ZyobBUTg;yO&1J##=Q|uBEBuUvrb)M2^Tk-S=%K zTP%{4Hd#MdO5|`j7V~>l^P5LpAb%K)QFk!yY-eO5vg!V#FKD~j?ZB^^Q=EASrX}U| zGTj#>${|NUcVDuRw&47?XueNXmkGG%8z%92RSh4qADRpJVs1G1*4o1~FnsF3@Wj^u zgC)#qQ21&~-n?fk-t27H4uMYK0Dc1oB_F;#eOBej0F0<0o$yWX60qWP_6{q?7i~7t z9duGl?CD8O_*UP(Xm1Z}p#OuMMf$sgStC+e7xQ7Xj0Em3chWTkpE!h_bZxFXLOFSD zb^;dsD)JsO8|*CG$(i#j6KoZZdO@7m4{=|3kFYe7-2%ibY}K5Or)ZWv5O>R2JC!eP z4j}pXUVj*jpXn>^ieBYWO{+&8PUd81r< z7J|9trVFO8(M%u7%ugy=jEsc0buU$kS$n1~pPy*1$!oFS)<*qs!eRTb_SE3|hK_OJ zi%q-;9plc+3_OS4!E?yZi+Oqv=d_c2ITZ(@8og(^eIKmk%S(6la@MY1&auvWrmL)5 z!~Ebk$#$;}KWz#8w308c+tte(clFXaY$pBcl5IY0htn!>bn<15jS;z%m-p@JB@wK$ zCR*UVjFBUg9J<_iGuL$x3%fUAE&N+-NQRk-lB|fNpC>aRCb!~U0!er|3o`YWu?c>Z z@V7ZDOJ>wf1PIabue_Kqh=^C+U>`px`Zn)PCxs2si*52I_zV6CSqgwU3sE%3T%N^N zeU?bl2t6xE{~*29nk;&hn?;sv@(*LjKa8tI4b^grA&gxuC$b##y3WqivA}iW_~jBs zm(dGGfQMwAS%#+6@219f!@!@#Nh+v8N8OxJZ0Z=4LlH?ei##elJ*FmbC{Rx7Y_mM8 zjFy;2ed;7i_Yedv?%OmFguYQtimqpRmMJK-=4B@%9n~zZH~Boh+0|iE_gB>r3%fM6 zE?=su)o5?&2s?M{X4gt<`j@eLI@0zRt4t`cN>T&XPUd2l39l8ihP?4RUx-i{6oK)) zUInk1UR5H$Je;Y3=XvaU^GK%eFqp*azv1I)Jz{5!FLaf*a$Voivt%uTcDY(N62!tb z^-@)=B)t|HUliyeZXO$p-+d<}M4Y%HU392SHnkQrrcT@T44y3h8{fKJ(ma}7!VY<} zbD=FUSDsVq7l1aZLy2alD$PMbgI`b_6x6tJ)^+eHZ?dcNv3Q6AX0;xe@<@b4K3RLF zE$-(WEtADpwqLxc{kHEWlG6D&G{?=Y1aR{9A>>jt;XKKcO*Vv;>UUmgJss?$+{)iT zZM09LcTDsQHTR8Zt+!8;eaa@Pp{YQW22dTbn;-F{8Pj;bm;GHY`a(KkzY*PaJ9A#! ze(}fc7k^=k+dybiTtsgt6!Q}luxHb?c@cMC8+I@WhpinmvpNZlK1sA;Hm{;avhNnR zefMVY?#8z7-U;4a)ArqSsETZxj}uYFBKP8)Hap;>pwjXYZ3Z=!penY3>)O7%Ie0g{ z?YpOfcbm)GwE0o+ZbjR7523KaOF3&lTv}5%^p8Ht%rFnwsqB-ZZf$Ut~*$w)3 zIU968RCuqow?!XE--PVoj^2|(5nD3nPd)bK z#PKDTkYA1~PYL?d38UQeglx$DMk4xKXXg5@g*F>b-AHtn%20h%g#6i$*e{ho+aqT^ zWNb09{CtIA2_p_;*%fnZnDb+a8Z%Gja{^a#ggO#{P9jT%SziIS`aPLtf;4>CA4d^H z%U%I`TqfN+#&C-%h$iRMhsntvq|kdx`PA1e>}s3LG0*>5s@yZO2C=hN$yMzV(zwzY zr?(@0SSK5JAVc2Wc=$cih4U=6@SZwLj+0*Ad3s@1cd^Z?xY!Q;PEsmqF3LNhsVp0f zXdPq;s`oounc?5DN%qtj^z>lZ)AF+twuyRz%+=vd@)>6W;}Wu8-7 zq*JhgO1_|f)&+~TBQF<+lem*a8>y0U^377-grae>cts9ciF-%Lr-ZmkIX0B(vJnWa zC`xh=C&fmRwb$52eyYgIhLfG&=e2=?ouG zv7fr0lCQRdat9Hv5AOv|CX(4^N9uQ#NUSbvAdCOOFpJSSET0^Ez#fjQP=Nz!;3iBj zlQV7nz+M|z?gWmW)?sIIW)t_%E@vn6dh@74r5`f0Wd{9^vY?3~zj=kC&M9#D& zXF{PS36IPC)064JSKl>f3TLI_jvUa%vD{=;t{^$|^Y35$-{1sx0}@QyT6{Zrx13$k zi_=_p|C&=#@ZvJgEQiMZHCV~jgZqe{Vs}E;0KoKIHOi{HvB|I%A0yWVYi91^wy#^U zX6D`1d@<7QFug;rNAK%i0x&Yuk%J5n&6GNJ3x^C#JaN?Y_t=qYw@0aMb~82|p1FEo z6#166MB6c{cg00-jW4=>Nvv)Wq3O6wTcnuWwIs}bro3SrxsxXba|QZE?5*uG9wls^ zhkK1OqfnQN{~gG2&BycPkn;vj_tbDd%4TL4kAz)7#1QZycQTyaK8_O*hnt|(TDI=5 zl0qj39Fb*8Z~gN^ndMg(<&^O{8?!s#UTf)*ZBe<-h&Mp|1kuU07_`!!`DVRW#5*O1 z^WS0i!-Bg@a0i^sm{iuAb|QuoHoWZ(l6mx3`)==R#7R#?yx2b z{A-d6>>Jn09CzG(k6yPw`KaNyU+TB-pYFd*3rFZEx|ZeXfQ`2>k;Sw5&nDa67vstt zMGD)i<&GVggUpyGh0wM?3zWzQmm6HCaE!n~_ggxtJ`OJ@KB0MLn7jpEu0lHDoJH`% zZWv@%vD_AOCgftsfC4G=rh)Bb%Qq^|yd7bkw~w$gP1N+-olJwm2@eiGUo&2P$&}$% zveAIdM51dKX%h}ZAmj9DdbZf-KgkHy*)i{1@@gsTY+f7=fx42J_=s!ogtgCp>-hk* zZ8Z3knR8j&Rf?M$@^_T-rw(>z?1q|TfNuG^#X28%#l%t6{sBsk)vOvXc>0AYw123ny8MR%8aD>!|OFOtND zl^D+3NI5lhgEn=tZk}x$i(-*z0*15s16&sfu;0pY5;>3r9*wh#OHjM|QXNlLs^l^VDp*}-}$ZJ+mH%h3z5GAeBpj^7~~e*p3{iBD6H9m zWM-|w;RJNRwqlddx55|qbJLQ=kLw~Gv%*w0*5B>N2VAO~C=+o*EZgf$@%rf4MQ)3#s#%-U)smY9YN3`rBzAe!Gv!1$i+P z_B45h+>ixJdVZ|M;f46NIUKTM(1xG!B5PGHSiNMPH(4P;kDkDXhafqNAYPJ|8DTL0acG z1k=16JG@($2CokS^2?;u*xiyB`%7~ZbmBBE!8$aUnzgyfBzO?fZ@=3`cFs!8)Z0u; zVx2yw8BmY*Eb_6+J4FnK2NwD4NSN}i!APETBgwXeIU40Sw00LzxIcix=lHmMSttaU z_MmBl_^W95f=utYxLFGOAc%Wk@3;{X_#JAjGQQCvi45=Zh26GSaD7kP_KKvmoUAnk zib1=OjM-IwG}J3|TKtjMeTns>kz=Cf0L;(7*9EBqCBZgDYqSVA<7@1OIW4QqMWsj% z;3fuOhxw9XrR;2&w_A!=VORNP?j!h^jsG!n0&TNkcjDA3{JxW$R(p=$Hjo2x5p=PO z0}(iODfg>1T61l+e@i?$*n3ijQR8p0uSDYf2oeg&V9|XmNx&J3LTxY*d+j0|$HKPb zSP9TT_&9DuUyr14Z<0d^ri`6!uQkj#ASu(5fER@F&D;1O2;{TJe|eJf1f*6Z<+iaq zCn-(AG~e{6**xmYla%#b4Ye>{;8Sw5J_`@du{$RzFWEUelJc@YXI5Er{#qpEm0%>- zxRGR=SF&_J6_RrGE}+otwkTWwnz3yC9%)_e>&|L>+RF{Em=d`68+z8?EN(ps{YgQez7-46Hn>?C7aS0KSkQ=NeF=j zWH0O?p<+rX{t*_Y2&ZkUTKjphJcEQlzTxPoppd8y(YUWV3kx4YbET@*un?BM>X+J9 zCx(6Da%fZ4_!*LuFUYgdU)J}PMi(5@eO7B^IV8Obb*zu7^~RXaac-h+wA7rV1TCd7 zh9c~CC0uUcw8HHcUgnr`WKv$J=w1QUw6>$p(b0!*t32SqrPkxP2V`r7ALY?EbG6Y0Pyl)L z5ZqqoPV5IKg4v&s#+~@b?2D&x_0A#*!a{B`{gRuz*5_;1I9BZ4agEm9d51t z-`Cs*3y7i)SjC4HhI-Os{4y%}eMSz{aZm-ndIZ^i{l{au*pJPBlimjl72a_gH#oGX^1>`d!{(Y$zPiAQ|7FXu`qu_yRey}Ej4d-QtB#o-Xl@;&^vjWhi7pa3 zw!jVO!Av}u<<|g+Lca#*mA^*ktTev{+WcvQt*<4H;btr3pLYoiJT93biN2B zh3o)1HgFqY9JfAfjY4Q>`!p%yeG9#w5LY(;6b=$!-?lTWeR;NzD+m zzi~0Mr{W~Y>G%zhrKg$4w$O&G0V5^ge&H#U$WlTN_cRZ4*}%P1>MFgX4W)~4B=D`k zyq4_!Eo>e3u<{CKgNd2uFC$Tfn3vHB>JxMANZ-LA`NdW{UR;cPzp&(+_uU(O0SsZG z?DxZcHg`$LkRG*s%2$^pi)&z&A^)2i)b1{YQrukFwK!`kR$=qmpJi9+VJ3AgG3BKy zi7<}^05m1Z+oUO*OsEXMDKXrX2stJC zJ|CCygg4-1?mdld6jiz=T85%?9g$~`GB@$cBPrM+a>Xpe`8UTrs|!&hxqOQzl+Sb7 zrHtuDoT5V+(iT6H;U|%)C;X>h0=%!U;yx{-+@7V>g>t-}C06(@dGS<9LcRhFe~FOr4pX&bB|^t=w{S%X2z!fP_?>GA;C!DgEWGD|s9TvLVE1s!{p z1BFezn_Pv*SOt=r&9IE|R2U4S>TZq!NpG(L!~aw6b=OCT)_VflpceByCl>4x3luMF zJxOCv7rA_gz&X7T39ePBs-C~m?5szz)~t*--H4b{m^B#K{iN87Nx%2&&^bNzeRp#j z(R|Hd#Wf>DQOq0+08b68B3dTf^2`!4*!4F33;E(VZq-2OL;2zdyZT~3Q=~6`?!EwV z2I%fv0={5#^ng_zh_faFUd+#g{>oB!F`-}n69M*GWu|?m8f>+99=7QQ?lD|5rSwT` z`;hrr2(r4~_7+nn8W*8Hxj+ZDZNyuE?(WbXw8yK6`Jk#UVQD*6wG3!s*Mjpb0Z54O z_X3$;DUO2%3I@f6E#83?cPiA<8cvN)*`Hk7H#mBNNpUW*@%g*tdH!mfiq7_MQ&~)2 zj2C*Bkyf^F9`$zLbt70AqR!=2Y|(cNBfd<(-UV91{>xLbpGn#s1MN=TFkDn1A0 zAJ_(%?lYalw}Z&3wA#}&WhC%aC}T4$XHr##9xKx#1@bgqe}jSq-WW+JE|0QLDj$5WY0z42w{XTZXunFpQUq z`Q0(hchN{zx;v<}A-`CaVrCuzjlBpT>lkV)9{ee%(`9J>^W%8Yv9Y4{=C5qYkStxA zX}$+~4&?r}Ejuy6hvs{X?(S;5?vVc01mSRPgA3K*Q$f%7xSn&&Bd9C9MOi1C$I!Uh z^Qx`=q-t-b_6(hmt!b8lBHu>pQU>|5YJEtpAB)z{B(S}$v^CTBB)3hytxBKUN;#-= z#x;9AzT@T1M>CBmr26bX+1Nfp!~7G;sgDuRE<4u8{Hf0LDKkGVMON%0?rFUU&Tc>q z=vl+1H+Zw|+Hy+7P2eZucT2R?k5;h-U&<_F(e55!dLh{NP=+;dTuX`r$lX0eUFu=- zNOC!!RF7Vl*bEFZWW4W!PGuixx8=+U)$F0WvNb5ukM!~;dcE$I3|B29$pqb7d}vgi z@c1&33UgC+GaaoL5#Nkihw>}49RGiFY%#xU4Syy7{FUn6O_}xdHIotGf5IW~BO(m$ z`y7O{hschC9GL&A^K#Cz2H6ROKKu#ql-DYIsdvn;y^ahjyN<{ji}+bcZpt&f>?6EG zPw;x5Y(GCVI?sYD5c1pT`%n&s2S-n_?;k}h<^9Cq{T*2h|M9V8GeKy_ z_>pZMX0PXgg=JnZ7{t=~ELwe4gQVnjyzdQMXs&nkS}%90w;zJattStdj^PAa2n61w zO5UYjuWM-NX5f=&*3nSD=?L&9OP^0STTJ16zv0>{PSeQcG4iJ5m|P-l{uX|@WRzX? zn}{_ur4o-n@|H1W-6UN%3Ia1T6D6$qn+AB2-_EwN@YPA0%4cH%B5`$u6%S)+2dwuo zrksgh_g~Y+b&3hz-Mq+wTgbGXP$ED>$iy`n@F-8{$f>Km#$ojj*;>L;Dx;nt{iLnk zn5_L{bKf~|)@|fv3(%ULKf>5$v9pHT%w5e=;_BE$V5~sO zO0{?*4uk@~oWaIh?e(1Q{=1k-BjSVoX0kF?+mncwI?UNWxw*&rasD zaqtiw2?vUP%}^ZLcgcR@%kfxQLe*Yr)Nk;KI)NE0Wzr)>_V&+D7V2dzQu0S?Rnz+Dr_%8N*LeQf#LHmY$V0>WolT0 zBDhb`+pDI<&h=_8*LNG4)seMbq=2>q8Nt&TY_WH$>xr|~$X_d`bGO4*S~xy(P$sqV z&9kbtnH0&hsI{4q*j&g@>3-)e!x~kEwYC(KkQMaoJ9#0brue|L?`rjReSBkGEd-sD z?;{y(+Ib@Z!lUrb&ItcNZt7S$rJ1RS-a_4JY+^yB1>ZII-00<>DBl{>6jyL05XxM^ zrI-WQI*lV}a1oJYEtYNXB2`dlv+W#^#I37aziT2ey^V_h;n#CMEHB~nqt>p?aa(LI zTTGjCUL~zQ!m-8r$P_+)uj$&HW=liPhY%f#jl^p{07% zBPnmK594O*!{|HE$WhW!2@+fF(#z3o$F-Qzal)%;wv%bbJCZ(wPFh`~Ct*&Xqsu;DpRB2sh-oVG(h}_)7 zt=4`T+;ap65Jjab6qO58Y($ng1jpak-~*Y!`Gxyl+0kZl9u&zkejNl&!=Ibk9IcZp zqd#!R1l;hQ%5LYwAE<^1UTqs9j@MUi2qB$aZ&A9dnTq(W`~Ia`3`iv$@ZfbI17WvO zVE09V@I0{+I!6&r2*vPEzcfhPi-SxCAwIqc0|Ncy=81equvVRe$|E3H+8B#5b`0dq zyJVOnWV5B*zK9!kyhJbrmZC`SB<$8rSaaV%N%w0i>nR^il#fH4Q8w&zW6zphb-}nIcNhx0nSlsL6Xb44c4I&J4F2b{XISHM?y0DOdAc6C*?QLO zrd!qiywVSM6?XSD>K*PweAm*gH}YVe1HEsUd0fl)OI(zwyU!`x3qXBvOuf4?rtYUo zV7&~zG;=*VRvi1acjEiV#oWn@2UKp8s>sTf8#kknd&IO~(aC8$*PMEYChmaZ=0N?H zDpz85G;(ACl@8|s7}w>NPe;HoEf;yAgNz`t8tj2({HW(|G329@`2wU0Z{%13e}xV8 zjxi}$ob5qGFz9s@llwq~>H4Y~=fI^I?2{SEFeGr$@P?xc`%1&3RnFU4g^~S&SvRZM zWi)#rK4}``RXXbI$sn8T82`!`I|hv%gU-j`-)M6x*n5l`d6^8?t0?V*3R<2l?3o-1 zc379N%SRwraHdW553F2{-!YP_E#1Js$j#=%9E)&-Ze#bVd;M_Y;lcQv4(=dAPE(1y*OXcjyBn-Z7SQe2h^McATK&C0R339U~8- z>E&#J#t@R5v)aoazf`#u14(op_Q$iOM)%EhFEQ)Ua#P;I1m}`=Bj!mc+`~O&tsmS=}N%Z!T-!! z59N@q7Irh_4)CH)X{V4TfJJL@Gci((L$Wq|9EQ!kRvVNmZ0C8}$>mx_-1k<|iwXm@ z-{eJhJkqb5P7CIqF%9mtkQWT#BWuE70Q<1>aCbR4_JNlTjffo3-Kl_o5!9T3n9)r` z%{B$VG3qD8_*L+JF{X?`anmW*KrmeH37LD97A+4oD9Uosr+yrZ!x`sI-9WgKqpejo z%|o&GD}<~^#-RvP5wWu%IHv51eM5?8&&+z)ZjzCxWE#eNAO zpUvUPb)kD;YHx#1RVgjr8npPN-y#L7nQxx-za`mZjbC8(WjxpU&-5?@1r)^gLo^3c zBTV6VMpA;z1ius`(tL!T<%nqH{lw`tI6Yl_8`S)vvW1m?aM*j1hNOnix?sJ|EZ3@B&ox* z51Oe^ZWG59>xcegAtLQY?oxk99Lxl(tv*O<9Y|E*z)5b|poRlUtp$lHFrN3(&d}j> z#Ht*uV=NF^LhVrAtH!tSGGb005k>j3e+87ktWYak3zCz5>jW=)8T=NFf<A;jd69lS&^*PX$3=BY^xeR)uo^bS|`Zg{F4E+w2)G1!b zmS}O~58q5g&u+)&G5&nUU+)ED%MZR@&)02bYbT5dyd=H3|2g>a|1B2Q0?hMmBa`>oWeSH1aMNF z)dYEPhZ zAF)Q++Q(D-HZOioyKT>*0Sp3>?+z8zAESovimL z6z;xrV@2kHPKDm_(O4x|)*nKy!ctqvZ*H^LVk7U3@C97DTkzt~?nNNx(9V$PVPg;G?JVvtb=<| zu=~X5Quo}Lpq&ANB6Is0eCxkW%Jn6}#vCI)P9@bXqbAhny zPx+unoM9)3@lHZB!o3&qs}KV+_DSyToP-+g9?pja-awK;70Y9oYmbW5T4=5|s7F-! zTd2el!s<$ZDve-cljT-#nD(s92&#XzvwS=r35!rS7r640XknsIEpqZwVM>d@xDIJq zUoA;~mD;kcQJQSwUfb?*m~~Ovzm_%(7I^`vQfQvhU0Hu%w_xH^2iGS%V7Rv+QisEG zgKa%7Jc#XQ^OB#Xjq5I)l*1;j_s8|3#H8!7>ALRVwbvw4c~Otnd?%i6|Cz@ zSl(MsfxZiASXija$;fy62F?Es78J(&2}`FikG7?sw_A#wFHK3D(|uvqzIff>!09`g zhV3a7psn)-dS2BzpF{+1*kK(a0=hb%Vhd26iy|@qLR?tqrl8K-emhsRZD&bP=Via0 z>mot8vTnhwk?&n!SFy)s7pXVI1PJd-6iUVUr7a|7n?}79M5048ui+ z<%AInZ*7Hz52qqbSo#P6}YY$WPx9;t8++F~2s(x%ZT9PVRlA@HdT1z~H?+BX%r{ioi5 z3}3&n(+_o|R!l#vGM!BmMwvdi#N7<#a?d2TLi^`#H@_~Yg_|p5Exco0aHyp6N#;f@ zE--fT^P%ol!KyI;_jPD^P4uEm)1bb_&VXfH82Q@4 zq5GKg&&5$ShTAIVBmjdvAKrfphw>yn_EhkzCR`%(aCgm(R^l~0sy^#Kgt!WXbclJC z%OU{QJbNxikRTz4oX4N$u1SBU`WX0@lN#gs&5rG5-6892sl73Gs~S~U#LI*EYs?k+*6pz?v4x{^ZeVJ$@O z?81f#a6GJXNTzpKa4|D1JTm3BW>~luZct-e`!_$hVfd;kU=+8BQFJ1WS*ZUF>%7Qr z2_=}Ybbf#Zeh`xI#VR{{Kc?s9q2d|wF;(J8zBtr>G2dZR^2HH5`vOMjAv{I=w2ZTZ zKDv65cz@T*$pIku#ql_hzQV$TRQMZbTnq~tN9XuSQSMKbuLH(;W&x%VT1^;*r&x|jUI%N5cj4H8$%+j@$Ui9xP5JUbO zReJeV-f>lCCh_LTpcRsM91tLASjf%c1B1e!1~rKYDslASQ1+9&7dk}}4k6ts@~5Iy zoqfSBYz7HDyp@%_=#?F6+ogcbmjV`RqWyV%w7CqMP%BR@5G&2h0r5vU)1!2EB(ip_GgnVSGHn& zgf?ch{4nA3aABxf_MG` z322&_^Ash0Xd!`=-kA^K;=hm`ch2}i2{_vjjdUZUQ=ye}d+K)5kIZ>EqW^+^pU7Y& zGu_oFd_vI*KSQzQIBm#JnN|NeY9ncKt3tZ|cBtjRpaWR3^^b~1P2;CsAz1a?EH zQEv78e>9)J2J@K{5E9cFq&(y1<`rWI>KL^KK$Vu7yuxVgpyB$B`OV}x{od&r z85vm_$MSDxX69#|lqoDTQ&0SN)|r1SA6#BJ;GDt3&K&ZG!G9cHo)|Eqd`LzHFN(@X zs7^+J7@V1js%t$|C|V#tfI@9!bBt5poD@|*^VDpceg+H~Tzbm+0)Jnox+9D4NeryuvtZx1>4TZ2y@a{BQ{ zl^uKh&;h~Jh72zsYWo{jadyVnZseRq`PXlxsAvHHjYyn6xO~W;1`H`5oESP{fX4X; zTOi*@R0K1BUBQ}$T+(q@dpN_CzFw(&-|)q4?TN$ zd8Hn*(wDPdYqtUkA|CGtsZDtMqNpu~r8>(rt9!3%tfB@y-CoLGhZ6%&=B8293#+YB zHQmQ0{ud3Y3CI6w;yJz3X&@G#;YBXAA^^pkRs5li=<4(@lxh|X!c0G+K2ynD&n*enc`;e%Gxaga3Os$isJqI< zr`cH)UmO&NU3XRS)S%dDkEng1iZ2a{!$yu)@vNZOoqMQ#qKfBG+=KCV*Zm-|7^W~4 zzaUHfxNhvLrl?LtfebU>wo+kdap6cCpx%7es@fz~yWUj`u2A#!3>Dv$^7VEcv(?G8 zIGvbLrNIK+q>8uLisnBHO&{yUMvnK?>Zb*j*QoMeiS5m}x%g4xKz~_0Z0%W9SQb>+ z>{pnbtniX5+#gifNG?Jx%vHX)!N51D!b6NF5N9cSTV;*GN3ZxFU7P%`{H4?ZZVqp$x$^!@OYO075u{nc_Ywex*(E zfhyh@6o+^+K*fJ+Q_TI44D-G%uJHOiZ&&kH65L>5H)~{InNrT8!0wVm9IQ`>qHgy< z9})&zOu5yc`cr{;mcKe^_$%IkWmm$T68 zda@V&z7xgu#ZCI6P|bWNS$K;Ik%xoD$WqNaRfs6ws_?HWJR+^|UKOH#XjOBC3csbo z-?)yV!6epO(t*k~(!Yy+b>VRFkQz8iJ3Qp;GJrD^L(2z@7+z66Wax;mPsB%@b>@(v zU%wg4P`)I0w17C`^r2@D9(KlAL*bD}6&-!l-eHo%&)Ey0*(;oO$e#v(eOCMR*GEY6 z^;<#c*$a&b;|A=V0hOJd`1%8~8*1?BgUsg1uM;3KM}sp9CrH9(f;ot!-tJX6~#s#>C0Ya6~l%k&Kzz(_cAilL^w#@ z*+Ub58h*MJ=sIL%3_mBR9LvZkXNM0}JK6jmI-=sNgdTV?a`0Jao<3ML?RW8XK`<#J zcI4IY)Ad;nzXqS9U%6qKBuMv`CW4vqlP&Cj;-3T%BK?Ypndb~n00cWD>JB;EHmczc z9qBj!$BHx0IvuPC`gMIUS+_7M)|bO8hS?eM8%PiNQvg`M$>iudA;S(mWAKnbpw&zE={!ZjYn=~rmM>vkk^rxHIfDDEwz4DMw*;RbPUHOh*IA{Z`~DH#64q^QJ+ zRfQ`f*p?bpxGEwg$~_FX4_B{A;n|miXCHL#fQ7JI9cg9?skSUg=1GpVAdvu4V6Lrj zS*l)&bEG%(6FwNe(j;1eA@Nnf;99V^H^O`` z8_P`a#Fj|;WvBP`SNR_>J;H76etIt2Sla6Se>**`Xt4t5Jge1RSlz-7VvB`0A@wWR z2He!UUA3O5W>>VX#wM|tUJIrtET)4McmgTb$z|NG@)R6^F1S+M*-Xfid%8?1e z`s;N{oEcvKAbh=F`$1*6V#HB%qc$;#Ur4~zGrY2{kQ^EUQEo2P5TfQ7aGVaAK`lWL^`=+>7?PBL4jv!4f z8t0n@TD_)Q@5E@GcbXq3A?+pRq;A5Eb9Hf`lxr$Q+)*&kDr)3H9Q-|*&SX;U9=qDx zryMHJ%>`nE)@YbqZXwyY4V4tOdOay^t#-uEa1#1QDz{>0a60S}0A?dDG5f?n_KvKC zD(8@OyAXruzUEr#h^JN*nfK!f{>GZLXdlFJF32{2R@%kBr9d*y-Qx|I@V;rzjIp?v zR5bE2`{DAAMYi-m>UquuX~C}-66g;)2#05J!@mb#PwY@gkeh_3ruetU>srGSob2^{ zpIbT!OKKM=E#UeD6_|5JmUvTwA@tR6`;$I9DnfX>J31)n#85rb>@17&DNW@u{)FK)J)A! zfJpa@^Q}H%V-H$;9Y(Fg3_y)>vFm}3Eh*930FxiBt&F`HMr*qyjMmm(^tCX|nhp8X zP8>GTg&ARZwyOZ4?j~MMF&AR=Gl&6awsJweo30#hVykpyB9AgL0&0yarLa^bib_yx zixM-v?q}H9p2o26kH()!#=aou!D{_UY^-kR1EU0b)_X*zP<(}YnB`C7fP1(#{%1dO0c>+x> zyJ0~`X16|p3kQoLf05W|=pkvM_H5I#t+Z*s_C}TQmW>KQXthxp>}}QD;Oi>l&JEE- zk#{8Q+J;#W*%CYMk4=_vcqJXM#7->pv}o@Y!%D9uOjxy z%~Sy@8Y~f6E{=YNhX)P2UVtcYEtL5!l;L5K!?jpixQoyx0pH|XmQAq%9q+95d8cLH z+{Z}`9GAkq6%uF{+#9d1_PMtW3D?7+WSQ6dK#mDa2Nao$Kp+;|OsGi+1`T9*PObN{zn|5G@ABZ@|E59+OktrdD)5X^`Hqdp*4ur$fsm{W!(5d~k8e~J znR(=>c*7Fn2-{#5d zu`pE+QVad#s9ve$0A0B1EJ~hZHj)3rn92kXd(q&E}Izv zbd0kMaXMAMAIh+aESe8{rA8On%lIzEE8%jk9qzyar7l}j^TODcz{!U^Ap_RDerOWC{AqwlhAd}Vol;8>ejG+tu z=%6R;FQ0q+XxCStOw2_3+74&%=hm1qx7O$$NKy{Z6idFq45aVos!}2>Bgmi;@t050 z8|?C>0^#qW8tEdE@@R%5DIc(F`s2EkDcywxPEg^w43=(oa_Iz`oi3dd6m7_uYd8e= zVSOJMhXQ~SqH8!c=x2njumzJSC@^nQuP<Gt;WXz@0-I@qPuTGGF+Lt%4(gx7}& zWTBofXQ9BFKt^>t_;WciKTAM8BcWL2k0GXzs2@VipCtsKzpBB<8extJKkh4udy2%H z4fvTuN`EPHJ~jnkFe?D{>R`mnKlN{>ZD=F}sWTA&5}N z0U+3bie}Zz9LENHmwEZSvfdVco5FX}3y-I8OM2lz3OA=04x;ew^ul5a-%2k$0Sd7x zS;*itrW2u%8^;xyIhm#WEe*z|0T&XYA9QKv8-F*rMRPm7{oSB#ATT&|`JqxEuq^S8t+h~!RLti0rr5?oYCN>-pV^57I*lAFT7K+wKul{KL{mZOTu_$#b7}TclHk z0qe(3{uWX$wZaXm`aHZEKgHV#qoSQRC$k>F9zu(%lioWoRess@+>#F?vrh5 zuQmuID2L|*ZDk#4iVtRCSMV8iG(DM4~1jBNKRI97xQIP}Gn&d9W3vONoMvc`-xGHRrey<|*F z47bC~?Wig~Y2=|Xd+i=Nvq7?%!_lV|X){JS~An0Uv6*l z<#s@{Te&^Wq;2hNbp&I|C6|<)-UrgGyo+Fo>6=6d9uV&rTCRcXHNe$o-VNb;KX4`6 z3HamNvKfbO%jTDF%I24E%I23W*@v*D(AfgVzg8ziH6D@8_pWLf8-e+BlD@Z^X+A`l zQf<_>bskoorK+=1zZ&#wm44krk{#QgZy5>)y4bLtAFYCpYi@BI1Z7F=VjixrVzjve zU6Ty{*XA&isf4oTh;=(TEV5C7J{Y%_d+OHP=cRFNp?sdzEor^(F+!z<8f+ukQLQk! zkRy13Io$GH|CG3M@i372(_~9#vJN~_RcqW>H#>$2|jF zp_qfLyl$`RY4Ov)WnV+rOG z!m6pUCDI4KJIa#cnIgJduz~bMS)$0S?~JN(O=!P%H_wYT+)+i_PZ+wpUHLgk{mp^C zs?O`r&k}y|_=FN^+)lI$5dCRx_K85>pX~;}V~p&j!0KJpzL5WykrefQM+dtz7?0Jl zndOysF5rxX92f|wRt~Qf1XKUgSXX8a{BzAu8P9W7wSw#$Yyz9)F@)u22g{}7BV2bA zG@Aloy734v1(5f132%ZIYdgRV;0OCPHzG8-#Q-LJ+qyo~j>V7){c!_K@2G0xN6nXq zonw6WXJat5KzpaWrG22WPUdwaREG<0E3L7fI>L>5a^U!@t~?)FbykQKXoZx*B#R*| z;d304SQasGi3hvK6TW2~HVPZ&RF!E7-fgo4e`5)_R&kP59GI)a6%clT5os&nsDwNi zL?whZ1!jk+!c?%0ac)yzlljd~{#a1HsQpd$sS;aXz-B~Lec$ae4bf*ZhI_W+T;+b#Rt&L6|?Zl%HBK=dq>7EeR66KCID!k0e!FgH!vM;|xkB~>jB;UN8U$Q_n* z1_b$R~Y3w(K$?70VPk(&7e&W>!Q)trrb`e5zN4Ve;S2DxAeln}PuDRAXTW-4*Xaq0{) z8GBf=M?^6rh{jEU*{?OT2@i`F6J)sMq{&!9y{J>bZjd4)zJUFswfF$&q{4H+sPmLwazP3a#c`=9jEU@sIv8{QU$Ok0gD!tplJA0%I&vcgG zEm0;h0nk5g(pzwhOJ{wbl86{5q&Ui6ym72;Z^9Uf3OU%P4EY#SD0utyqxGHyMMaS< zePa+lo7heWVQWYa_xX8*knN5kpE&M>-?@*Ytw$=VhlqV3H-UQc+w?dQjnXLCr{(+? zA;?85(s<2OFVovEE`#*DV+g@DgD|-adzKBA*OY-2o?~tv&-P;uqHm#Ov`dzbSPn}M zAmHfYns`9+vG3;&@M(O&*~_%$^o8X^;I+@YL9{g9EuIY#xn11b=jcB74mgk_KRd?6 zs3yi?9hY7vSw%YY)+QoxC>v;^z)aE~v>=9aOFv*xNGN37aacl+cGi!n$FBl#K9k4b z>W5ny1r(Z;C2xUC$KxA9iXF36X#EN4ee8GqUJp_8zq9eJ_cO~Atm(UiF`j|a3Yd$; zK^|@c|(9NEEauF&aw2fn|xPOlqIhDiksxigHWJ&06P!}0tDOvW= zN^Qe8EYs#Uga)SMHVWXJuEZA@RRmH0yj}LftM1wH*jp1smKhQef zbb|~-#+Hw%3rbsT>Bk!WgJbN$wb3g|qiv7D522-T^OABXiI`q53F-DRYTJ@-F_>)p z5)tqg0R$M`GhUfqnhBCoe6kMhUPrb^af>(6_UV%=NnxRC+bt98W~Nur#5{=j8(s;2 zZE~XLJvzI=LNV;Do0+1T*U*{RxoSKIo0WF|1-S9Pq-mr4REeQunnkfUw4vBvG@X(*F#?i0$q!*LkV4_y=fD?-vIaM0=e4f2gw)|pGW9t3^6T(^kU;|<0^ zz$>ye>=mnP5lVxe|Lqu!6TqcW@bhn#wHogN0vuYz6T#1L{x|-~y}9klJq1c^kUfVI zmW)c9)%VgUeC=1hw?RNl-k3tigMN z7D{<*(L&5iXaO%}!e9eP(fK$Hsz$_MPBf8bAKB@!19k3K8ged9Q%p}SV8>vu0QB)*;kSxC#qc&8j2ce`5m-71hzu(I0{ zoX%5;GP!_D&m=W@-b2IKC_wCi5;?t&`o!Og0P1g#;H zz2<%=dM96Gl{kF3Su>g*UK#1@BeaxBVM9VhU-N`&yfl(6b6qxLHSeWtA;K!zORdvd52$kqbr{!MQPz5PB|M=e3XrE& zHl4~8-%RaWWA=12v4LOI zrnwFPa~JFy032(^&5<3<9g*Dm&eQGF zpJLRs!Cyw*m1yt+!RpF7H-nO3Ygw#pwkMQEb~NBwD)8c!r@M?Nn$+EAUt&gzZP0dm zsFI5~W*N7i9-<3=l%i3Je4{Iy!J3-7LL_bpju>UF8k1f%rKjCaX&)SGn9{>cX(>~B zIJpq5niU;j36{}+9v+0dZMKiuq-GzYS-!E;XuW5(+k2UJL=oPy7R>#f*3Bg2L_wK63R@GPrZZMNoTC;n|Z<)k8X*I%gA`UPW zEzI>5yo3(Hs}H(K+WQzN_iKpWH5$#`VPDi(WNSQ44Gqn@0^P`&ZC@1rRILxIwi!4{ zE5utXWY-cHk9qxmCNyCmt#kHsf z_z@t5CC&O@PN=Twz*2lM8YXokCSp_thLe-I8Hba$2licBX~6t;tTeJ-%Mh>Grm!w) z!tps57Ccptwe=CU|a+X`E4P}KV2+9`IXZ6zpI+!_GX z?qco~ihnY?$XwW=l)qrDWH*91M~>+NkO{?&U%_Y=c6tW@@!n{z5ALKb;#{k(_i1Zt zhdTZ?c*k;)qC=^dzYbuIP9Mf z?;Z3xjp%kWYgO+>rnJ+RnpC4{G>EZKvwN0a89{vqaYE(RO(j6QLn>C)2=(7I14?2oAqaQoKj(`GD{PdFD>#McAE~bM+`T!zHxJ zH~fVWh9|C8An9fv7f4Hzm9&j%zj4Uc-6 z6>8?~oe$r&$mcV6FMI4~?i_C)B8bGvJ6|5Ut`6P^zND5y$uYueJ9+=VV|IY;k zuwK5yC8`=|kZC(oxpbvq}S6 z5+D&Iu3c7SQQ7SQ?Gh;rf~{{IsBc9POB56as>pxX9QbJJ>ijz-8Zc)f1omP7ey7RH zsY54VeO;dRqnp0K?Y#?;>yud?IR!m2K`4a~(1mk|EezDX!Yf$ibvY)Ah>W|L^BnRU z!E&u*FH4+n$iD3FV)?~%Gv`z{dVL4dQI0u(e54E;;f;K|CxB-4qsF!tWqocOD`^D^ z_W^ZxgM>q_^W@yTo})A+n{fK@*zul#HqyfC9&KPn0(Frr{8UtdvpC!1%3n$DG2Gej zz|A9v2W4DYS%anV`W&CS8iJ?$B1~yi8S_$i4DeGMw2)8X4~B*mAK-_j$>w~K+M7oC zNXc|l(Tgq%%!O)kJ;cze&zbCd95C!={f6pui>4vPl}afzGIXF#cArKLFjv-~B5E_l zi>q5KNtrl-DbB(Alx1G^m`f3(O_8GUH{1=X#eVW_CBB+2ZS!_Bb%N8i;*1-$WoJTi zJEP|5)H*KUlDIGHuNm*l`h{tu{Cmmzv#2IW)`-RB#r6e^zO9VvpFnDJP0sp`E z&T2^$L3AjAF>K#2ORA3)gvI%Q2%@&0S^go|ydMR@->UZ2h)O3Uor(nXT=S?f>`n5# z*qz8W!uaOzL}#V{#&!ty%61Gs`g*uU+u8xG`NWNhJ@VdYI|^`mepGw=o4J{JUQcsW zC73svNS&T$TSNv6NeweB0CNEmdrZ#qoSx>yn_CGnbIJQdQG==WmC12Nqz<>~otJqB zhIAvxJM~Arh@=oJ--J?#G{(C@DRi>l)Ym?m^9_dpZd;xaj!!el zH7{v=tE+jmSe^>cR<95!Ia+xnbU~uCt3Gc$s%}{WpQ=vPZ?zhR7KRnPr>z*u3UdC% zD)4Bv4ar(eWK1hHe(Lcz-Af}$nnO{T0IT~HyzywTw-|Z5o|YiTZD>tW%>dU`K?)=P zrgQC0GSNI-&B8vb-WFF!sG4P0()O49FcZr%o3&#ft}Z5xPCb89j~r<&3psAm^4XEa zW^q;-e*-f@8vbaGxGSm8TdS2Z94@>QCIJin6_ktEFwWv5xW0lKwmb7n2cSh+u!QGE zHV1Np3q)F`@xCh?(B;^GdT=0mdn5*>_VpBuJHsxP)xY?mByIH-Jkb;7bE^Z%*yBY@+3SS~hjuvX^;8E#J}|~Fo_3>AFSVp~8}4t{?fq);KFPS!hO=0A zzesy8ZJq_@HnsR%^E}_qb8dS8D=>Gc*){+M@BB25|MmqC!~R@yr<@;l!m0Qw!Frph z-()CF%9y&DdFtvs_eT3t+0ANkE-mcGYQ3KO0hsx%$eO0z3qhZzwKU~(=VXZ^P{SZHxKbT+J7@!zMKhzx%*Lp|> zFYy-|j^*Po(AmhoBx>qL;no|fOSn;|znGl368(8%9P+^S``*i3puTUQZ~EhJ8h=Pz z%kJi4O=K=jH$XV%rqRqaY}p%q4lS=IJT6HETeY}IEv}=5Q}hFhuQLH}3TJebZIasE zLc60lYzce~)lEM5Vk8o_2g!+<*59%piB_B~bYkWTyBEmdg6^IHZ;E4kzXlj>;t;_${;X2|`mwJcK73Mc4x!249fpj#clCk^Rr!knOycX z@OCk83A~R$Y43;9YMOidG0v#+#94zo`dEg?_`~ft!{MlSe7yk;-D)QeR(O` zuR#iU?29T0b~B==*&l>7!G2b1(J+_Z&Cdh}a%E(28gS~akFVo~Pi9}sMa&ZvKhdtZ z3v$;cDKL`BvstY*^Q&3HJgb>s2*)#PSi^v_%)i&6he1`vM{O*ch_V&*7POCzh#&TY|e^V$fP1gANo>MukGf{{`QrT*>* z8n4b*A^>c`pA4%r7m{#9$)N&EgqApoP@xzHWEnFWq>-=#hKgbkR1sJ8EVUK-73 z6D%5QgA?=2&3qA5E5atBKu_e>JL5<$y7Q!s;K8hezxoh#QSwu_Sx!F2*!NxP(Id|8 zl4rV<#dxMS;w03b6MLFxI`C!+=PH|?74u9zqst;+2zK&8>>R~b`F`u#HQk8rL|DQ@ zUDJbbWz>Sec6xwhD`hqP#x%MQzCnE_nz`|)Yx?MuVuLOofNd=3S8nfY++&2 zsvtJAJ}ov=^Jt+4HUbs7b^QERLDRI3tnk(n0q1EM0*{v*bRGY4UjjhGyF`pzb2FI zw>t?t?5+@k1KvGtUlJcBk%>{bNtpO)7Ab`l7B%A9i$wC6Wr`alutIO!FH zk>s4Gp^`SjOJn8`$%VfPTk=D>9{u>mxTWgnbPn&mc)_ z{m|hc8&&$-zZRYS-(mhpm(=5p4Ctzo8l#GcnWH29=;o*O0g2HD$gn%X?E^8RKITqb z;DrAwZtCMd_xl0@*h1ux9?@*E-BldT~7j0Ahy#p);}DLf(6vIX zMVekGn~CYbjziK@EAn$1NM8YBmN!u0!Ad56sQ_KW{7uiJSDOTDQ)ftHzCrzFN#YP?$Vv=>}~e!`W&xY!m6$ueKzCfDO+KO(-HcMM7n zKDMefiqsJoIM6=4xY5iqm}L81pg z{DKwX+tUGns$WB%`gw^F2yq@YFVY3Smub_3p7!>uVDCrqrD(>l+Art2yQTQ{NcpjE zQabPS!4;?fVZ`w2VXB&Uc<~@x8Fs|r>Wp2jP}^QdVfiS4<`;c3r%H-&6{EZ~!3U6t9OR93(Y6X- z-DqEBzx|0*NKLa+U2V?rH)S;F|6>{zsZ_dB{WU2;vAWFyQHxA48O| z`TGk|>c5?ujY5>5lCP}@Y!~d*;b)vN#1>WC10~*UA;&#bR!=C|cDN&loVwd(?RL9^ zfhz6TW^B9P?Vc(2=!&$p9UomDzzLV1p$3J%{xqE=&;jNna~zqtUd))@_)6e*+?Z zC|S3WkNEWqxk^@T1a>XL4iWt_pOg^VV zVyhaI1<7u>^t<6IS@AJ>8wj>8zQ`yl{yg-oQ>srN>S{NttfQ+Z$<-f+oa#@m5D1(x ze3*lsDmEsoXYweeG9_R8BUM0yx|?FTD^-cO9hMugKKF>ox(K}Pi{YHW7S~{?eb%wS z&XxrdKAmNHAwdZMRGmzB!|G)AuBwyi zZcv>pb&PFllku=mESwvH-Vao698D<3kSJOUm8g=X-j=9}A-UTUReGWlRmcr~iK@H& z5>=@mYgOs2?W3gR66fJujpJ6zm7(ZGyJ!XeEbiZ``>!KpdQ>a3cN5%wLU&W;9PT}> zd#*HAUyhXTb#XPrr=8&{z|i8iaa!!4k`&FJRI{LtR1W%u4JZ>8OmHclD7k=R7Cr%%*IVTHDU%Om!ti+Xb*`ILe{=HP`2=g5}cj4L}XOa7Cj_fS1GP z24wNM8Ier7?wv4?W`RejT*)9uU&;lQqmZ17@W{_6XVM2OPzIp_=+zk+3ffG(8fK6h z_^M2nuYe5XeEb5JZns6*XL0J)sk9D-WdZ7eYjW|eKzZ6U+~&+}$SWX@Q%O;IE+QBm{gk^(*CtqF9C*^sLj=wLEULc7qk85y~$lfMlUcr7kn0s^?O6`R##l33v31`2~2?|HJ zZKM0P1pKEgk$t-}FBh7Mv^O8nCi;Rma})hqy>~evvG0w*0#a!5cstXa&2$Zi!hM7V z`ossqf@?@cS(q5$Ita@)Ey3cYV(#|L9^QSQyL}Qr5O~e`N;Cs_&17<|THXFUDJTTS z9NDjz=+`PTBU(7F&rs!&9_YTout!L)Z*443fUc?qHGeelr9O*$b7^Lo!_?&AmPzI% zj$=2}nYSsR0pPEU)Z1aak!crscSn)%GR;RLnqumdt$G_HOlb2?;X-6(D`~QIZ71`# zCUFJ%rMpR6J42`Z&EqkZa8M)9HZfo5IxP&^&SVYH1{rEW26aE5WW-sfDS{m)Bm5!n zUp>gEJ=$lyRazZc=#8 zeA$}(_2Fm7>w_H%MUR1WnFnfEY0*v=^i`lwUvsgjc0vRC5mwi&QSL)XMMLFCsf*CR^&BqVQ;i&Tb6XN{RKQ<6#{)KrPc1 zSw`Vw@Mx#^IOy=cKw8JXO5fJK0y>R~E;rHFCD800 z+`QjqIe=IZ87u|ta;1Y=PQ3Gx&_G2I-VYOjZ9Eo3-S7CuUct)?A$j?UzFxww1{-RO zCLv#CB}NGcKUGbLy;0(jt&g9dAWDE?Q!}9f?~x3jaibA-gW8*ZBRP=!)$oO`iFg&} zkV5K^#~ZEi__3@>)MMd=2L7TGnwHs2Z9YWTn+tHI?F0UOaAxHAOxt=Ri96LCGd>^S zqKv<#LGu#7wHyF?s=Ah%Hu70$*nER3y@}Mm;CKV6FpKd5=~8Ca61Lhv&g`|&F(fOr zqq&ldnbW%?ESZPE7>bj{Yy}+D%;V{1Jqh(8a_bTJQaMX1?;)~Aa+P+qPtTg@wl{(n zo7fg6bsQZ-I4XLZ%5-ln$U2gt+T9;kBHReeOo(!S$3q-}FUP34J*5>#9(GQ&z# zbdBm7>DSQ%HIwHgsa}g5(nE^fn>pJY#L4r5@hUvEH!kxOPd0LG+5oeG$XrJQ;AHN? zaSkvEXz5@I?Pl%5DX8le%*(;)V-7|_24}hbR&ik;%{i$?|#9M)U`-p>=lENkfCp0qe6!0Tn&ZWZRdWsq=-bRioU?H0i zix5?U__Ry?9A=2N#T^%l<*aGLazcuL?R4ganC%=FM6yi%FzZvkmp z?-w|>=XXFa2 zp?DJ?94A~?GK;?E9BK@8G5F4daLWjyq$*vsM5x(?69ah!7L1kSBTW2hr3Sry44$2> zg>>8?IR+!6ydDML>c@&x(m^e(7Jw29Cc3+MY-`CUJCsvksD$18%o`LrxGQ>w7H@xq zlKj{vuje4>_*fgzdawF^oMeSQR5>fP=H)vF)^<-Nfkx*etgCH#X!>D9TzN)iW5|@# zXh6`>rfht+I#3O{Q%&SRg(e+E7K3u4r4O;9Haq$ilA{OgJ{$Ylr+Dh=3-hGpG4~J% z>kdsjJ5G3Y&|NT4bt8u$DX?}lN+oRjU9^Ro(QoHH^Sn*4vnxluXQd7pz z<~n(laHz(cNo}U**7Gdid_1B7x=}-@BBVE?92#8a9YJP-a);teB9H|Y@3JM<-X#6G zc>DsnbBb74M0zL6X1{zaie8BGW+=Xns_WQe!jhdl9%KuY?+TRDJKiMoJ<05SIS?Pr zr_HaWUrfJZtNo_L9Rb1xxR|I>Mv^eslW(0RCxkF6&$V3hGTh7|gp`^;u|hLJI|^Es zG7@DtW>uRs&d z?Dk-0v)#=0HIMo;yCZF8L*2|SPR`6O4cWG&nX&BlQ=B{wHVdR$r9=_mZ%3hey{}N6 z>=dfsWDa+w&fzsF-nKCZO1UP?UkzG0q%z8|XL~1*9|kH*zA%|K?hCW@*L*g@)`poD-k#|{p5uR*vCIm_@csxDX=Mya znQ6CG>0sn1XUn;n&GI!mQhT@x(P49fLs_D~_nqH(2eFI4BQgp5yrf2jn>%x)X}vRU z&GvW3`{>r$%I3W+H^lqKx7GF|4O71viV2&(_e`7~F4H&tHjXI|pi(90>DT3u(m^SxMnYOCG7 zFnHp-`-HFD$%DNTCjkLfnVZz=wflnCe7%5PEA9+FKFot2iH$5Bb=<4=h*C70qIqaF z<39uW&Tg&J49EL;=S*Ofn=l(ugKIIarO=xw=(-98iDsEwazH3Er;=11GQhM^B5ulN zqjbP-14|5;LkU)A9g2pZJ|{oZI~YH9PJsjY(2G?tOtoAWFK-35$z25<^V!+J)LhUx zUfSyUwLH&CD6?mdsjCpEx7?|>uTfaZCMv&mmSz<`azzc}{)(b3dzo8w zE?ZB9(;R1$L1vnPgR8~&*V(5MNYx2(~`0D-5Io+h`RO-+8O6P$V&in=5&QF|RvwP%M zn(O{l=6%n+(yh)rsNBowrAFYlu>fB=vLya8{y!#xv7(jHTDZ;H7a#h=$zWLzpQ&E z#WexefA3Y<3M>6~l@53w**C3|WkDy8hn+O~ojm4u(&%^cnBNJ{TXphT(8(oX zCm;EpTAP1ekVMS6s3*i>O6ls?^XoUxje^B=bZ{Soy&9Fbl$0O)8Tn?BsYkP zJu26)N@9_DX10#6r-G(1YW@hH+opbdE_n8d-pBZ?EojQEP z5bI}`>M|DIO!aXKZ>IX`g*W9I)}~Kx4#b<|@bWW~o_*mP@-E&8V?2CD z4jIu7c&dgCl^aakua%b%ZF}>q!8C7syJGaP_U@*5E{4k?_pmmjs~lYM=eBpPYg60X za+7U)x4f#dYD7EJC@vnz|0*i~IC#XVrw=?;P^-WLaKw;P?2U>M?F@X!?+mOSTyf@i z4{tjR_v%^0M^p~}!x=*ktr&XdAJaZ+Z*1qIJAQNEnEp;Y1Y{*>1~ELTj;38{;nMSXWIZ@ ztEA%`E@uA6aS|H>k`57&)hEr8E^JB1I67+O{l*B>T+oGB$KVt4`KMt-OZhh5q!m057ABT=UCG4Dr z&R@*7!?A2gMJ1r~-{UuaVW&B`;?VYop{D@{AL9CeE}8b2p=bGU@xRZDNzXGTbJ~cZ z6;*0NC%%^*Umk)3pY4L{aFMj;Nk27ttvL+9i*E3+(dq-BC0zyik?P)vx8vZ7Q-==q z+nqY(42uP{@+pNLq&dm)<1D-xEne$k((^9)ZM@~mho0fjm+APPwrUP&&lrB{;L4#6 zNL{oX(2`Sz4l5t7=fRCX`wo+g1n8bQ)cQ+y)m+a!_4ELaDK2^4_{y0Us=(I=0r!#~ zg8T?qky-oe!qut6tA<&`p+zgdL+%U?Tp5!%(LL#nNCV%Mky#EIHTcxZQ!0jzvB*XH z!6SxNo~}u0jRueY!;n*;vcrbjkI@OshP!R$V6_k`4-T9&!xdpFErt)S#4A+I z`Na|p88K||87a7(Ts7;F%HTqb;rfi>6%`gAxCUqKAbEp+PB~-vX@?C`zaZAI;lsuZ z8DZDL{W@h>l|u@~SnY589&|T&^zbS>m7XEMxdN_#aCpwvIdkxcKf51%sKOzAFCc!p z?>lKx#d&7v_x(%ec{v*!|iPOq5Fp&ev~G%H@~Wf zjv3?pJ@*kD&k(2}nR?tuZ~E6flmq8<$wGk>VLq}8_g?Di?%}kFxcvgBc!TwATQ$eD zC&!mYBCgeDzg6gd$eRv*l6DKjEvb>uuiazH$x0-&uG$ zDFp68GXK%XWBN>^`^>T^=ESU66VE8h8Liddv^IQanazz5-1ol|V~*CR>>(ToVt9<% zEEVBlq_>WJlcc~%Kcqa5Xq%Imigl)@(X7j;StS9zd(WsY4InYl>i;PX2lfB|p z=F~JuQMCc3Y(60@bBOT7zVI3*Z){~|HtOpv)nfTD;dSl867;6lkCq@%c+h}k!ZHrzXQ8qPCxb%J>-qs}WX z=Z7?IG^NY^ba1yh#NJaEQ)`OMd&uIp_Gt)>t#;N}P%f=$l;_5ikw!1?B(E^uA02Uy zIf56JA+wX7t)YZgUi?6>u-ZGkA2)Q+X5i0KPd+1NelO=w#ybr+T`3nH%4D7mJVPDT zel@x`pHdF7-%G=5-{Xh;C#+gM9<7?g9)(>?4_y+efK4YbHQWTqm zLY?D&LQ_6Z2?IXI?Xi=Lr_ZZ+{etmI!9YvSL-WV4kh%Rc0sMR$?8cKXGo&qK4dq-i z)$2>5c+MeRV#j#-57?ToUt!Kb=Q~MZfL|&x=tKnpeoflIWMB3A#+Rx#I*A42{$%+B zZktfTMXCPEzII_|ebD{h6t>U*x$XV~*ZpPczD3<%qV7MOQ180Y_Q-2|guJiE3Bd0X z>__*jHHBMi%D5=?_Sad6U)ERcIW#nRzh$8w&+xTE;WA&tRv_5%zr6hTK#*64I=(bl zBi+CVyK!0S6%p;H8T9e;XR8r*U5pZnEv%q5kRWSmtPcpz0PWlSvq7FYjB2*rPhMj_ z7%8sLEczV@G$z=xGdE|(3oE=HWL0<(PaXE`!c4L)#@C^D;=^6B%JDnzKB;`_l!@UU zGBf6__4XU-5~yWtkFC$!KM~}M9{ro(0wqoNG=^qX~T#g$P|1NJiM1LgF(0HrDrBIyHPN=6_^Ay z;>U@n%rh6sD-gJ&_gS4$$ra=5a1Hj4mD2*y#5j-Rnv_mzp0u7#d`l@8$+T;5x`@%+ z9ca?>Ft)v5RH@|%>XyL(^x(>o45zdhO#dl47H~<-=e0Tlx8*r0+=MI@Xb!7XHa^Dg z+gJ?+UX6vPlhlc5$(Gd+RQVuOLR$8$Re+?1Vig(MJ?!C2GG$H5Grz}{v<5um)~#Cj z5$e{=BBht#sU6o=nMz-+YBF=6Y@JZ#ncI~#ZqWq!$67~|W)0O$M7bi`LY`fX2zK~{HXYU7-^}AAmK-ZOEwMjeV%dyg`u!ie16>dI{y|zBH76)4v ztEIEDH{_DG9H*^=WKH(WE6R=d0+{M1dnr+cU9tV|rOdxsIB;qbx#p^~<@H)e~@Z}9=BXHN%Ft9Z^5?fWyo7#?7 zLjf&8yG#TPR|}p2;LYIRUe!G5Vjg1ApqS>^2D$N+^BkbQo7v!XuJH0dfJeEFyG7_c z&D!{S@;-(Dz5HWb4xj+5DP3;A`C(?!y(7Jxg*fxGEx@2pGs`NVS0q)5X@~Wx#Ra$4 z{6TnPaZkzJ!euCxz4fvvfYma;KOUT`weVqW7G^U3HSE)FT(&s$Bn@jTSZVC%gU|x} zm6`Dtea7NV3V6g4pdT0E2qQeXl1{i`{;E~|*rvF=C{m=<7kVsqTWJ}#Ww)&FobhN* zNgO4Ax4MYG7rO^S!ly96tVBOAcAVR!;e#)E&=XUp!sb8lN^nD9s$*KeKG71^{{r*0 z*YRaU@`{FiT*wdJPnbp$Qg=t$yMp|^J>fA~u>oGci;<>8VE)wC%fH)8#Q&XZSwdQm zWPv3Y?F?}--FxbOHRYi+zT3w5s@HG?ciQp&zJu{S5Oi>*r@GjCQ7}6gAMq|EY$Hu~ zUpw3z`|?!v{o)UXpb9;7fFaH_7)Ba#zwg0@dz`E~k)JtWgsskHC@U~rqGLvG0un}EVD@NcmEsv zd54&D66N$BH-8xku{;+KIiJE=x+JW}s1pNWKS6HEF~{<)+h}B|+7tPTlxaiN=nlaY zzq^?Ekxf|8y&0A&k2+v@GWHuwqF_N;bu{g4mW%|TbVG&}7(x;EkW@xGg1I8A*51=j z`~pYAt&$>lS{5FTOQiSI1x*-8W>#qsmOKmmOO(RXu5TtUAJksL^ZPnA2z4Pb*mcMu4y)nK5X8#ti|I}f3(3^&ZL z=+G3e@OmM~F0xDY0Q=I%cv@tcpSCcpJVj(2#z)_QVZdUp5&PK$7XT^hVXVB--JC;a zmtN$JnUo0;-N4K&L>~dgdzsfpDc4mY`6g1aCErZcO#V>Hd-Q4zhPaw&pa-&D-?sz0 zK5K;?>V}a3?6=m(_MlRns*pe{z3kW{F>|u=y;xboNjp>db}#dpYEhijBDwKak$}~f zTUy4%Y2ytlb1+ykf{5Au)DBDlxk%FAN%c%;e}4kkv$6Fg_`cq8Okb1fMaxS8N^(42 z{_%h#%M9XtI**lOY52a$r{4!@h`6*u!?_1`2lSpqw2W{dykkOdFxBb}e#8r%@lbyC_KlU9P-##a3X?#jwhsBcilTxoe|3S9 zTQT#q{1Zs{+S7a}lK6oGLU?y=>fL>UPxP>iBBulgdCnjj)ybF}N0w~d$17a!b+6_J z-mHcFyn^3jyz~n9_4<$EfKbG#WQte#9j{9j{`Q>9io8Lw+4ey!*56Gd{Kf&9UN?LX zau&r8kN;QvPyF|CFZSO+eF&aL3$N3Eyx1A7URsGv(4F*%6r*!)3th=0ri)}nH$-H4bkDe%1v zc_{WIvVdK)g{q`B%ib5py7%>@*fErVsE0-l^Ub{2FJ_L_#_4W8j*w^)y+&UE^%bI5 zzbXFhTIf|DR0XctR5Hc5CI}IGqKWPO>^dv9Z)S&T@QU`;Waee!19Te7BV4q6O@hAO zuY)n$K3>eMvt7=Bs;IADir)4yhgR}pS5pX7Zk6Q9AyubGb`KW~F_c3K*%qwg^V(Dk zcp0yFvKNu3jJG)|`_P4`Jx>0}0IG%d8{30w6HpC6mIBokK2*yrl-q^s?lkEDs#<#i z!cMp`%(OM80S({Q-yf{^Mg2X z*5)BRp)B}c;jkwrwN%IV=5ZG9rKDnBV7L|z^~{aLs`Z&=hkR~kgYHS)OwNQ_ckC6x}Ztc%S7PjOdOC2ivE{ldsY~U`Ed>m6u%-T7^q;tKL}+=GzQ#%h9v# z6DtQptDxuX4~w3~%={N2+$w#zAw95r=!%n}_G&&3bvpw=IY{?RLQwsN5cKvwDHUks zDt1$}v-nEdzwLmJwq?M@Dt6j}u^|=G+izOCs}L^%^rZl}-a#Ho2guvRhenjXQL{`~KN6PuzK#~nuv=R)KiC5Uc z2E0Oi6=5lbS0smJtG%?tr6Wk#zVmD-xi@pzK&O^Z$^DmLiYiQIFVR-Z7(?Wr6uK^@rknc?BwvI11Qz8xgl@{L0 zv#@%}v$VhmSeUbQJUVEQ(}n8j6wyMCi~dY<8(}$pQ9n;cP#2&dCXeqSoEW(Lr4!wk zR&m<-Eh=aof>@e|6O~Mp(?T%?M9nY4M)viG5@j-}>7gCqxdgZ6e(dG2kG6v1QzFG~ z7*})Jal^o}qg`_ufg>76%Xq0X?KlWwv(oy~DjgJho0PuM6A`Y#p+-6#=Jz^AF@(t3 znWb@Sws_{^EL(zf$)6?l;UCO5dZEZi?VSudnAJDD^|S< ziMki7fW8x)Q6V}uVqb?+6s7J|+Q58uDs5>0{8Yc=^V9A$>EQe%soUfecYiv?O`JyP zBPj$fMj?R3LYEiWOR`Sd#FX6qRF@anyW4a**+2g?{nJ=LV0L&eO9PI@ zp*?W?1!1b(`TISE2+s&?U=yJz6poUTsLUNg-Zs5b>ldzyPb z6TmJ&JL3bEZRjgy{;~1@Zw6NY(pF8=3a)}6oKOs7AT9(2>?PPGlnaI-rOoEd7N~Ho zHxSOI^D>XF_8-03_R&oL(O2^W<5SB>MP@)RmDgjZ$fXK0?TB1LfiKBw zv=ru%YB8o9oFGsuY^D0kln6PBkT9n}kl|xK15xe-F_0@sjUYbuyyas@Vt^=uRau4s zKOi6=oteGvnAwpq*&`JC2tT7yTYg46%X8|t$Iq<1mt?6|!p6nQ{%U#KkqoUqZ72ah zd)?<}DSi9=3iV!a_z7Ucv}+@G1Sj>TaWcnXc7l=Z z^vcxQm02OnbOY8JU#@_yZRHgA|L^($l`J#829?)*;+a~D#|S~Yx^U>xhxiO9k^HMGk% zQ_FUp9ItSDqpCZu8#*N%DC?yBXe8&8i?1!`3gvudo7zKst1rA47OXh-%JkD(`Vi7j zYqd~Joz`&VYM-V3t&e7wXz~A^k;RpyD3mkD{zIO`B#A0zTX0+qjF@{yf^TII^d)$=ZTwT~|M##G z`pWsB8wS)?lDQ8rYflPJ`TvC1cHkwVeREri;N?zrCP1rVnUq~*x#Ct^^RcIyLQ0V$ zT)(zTxpE1vy}itb*r}}+4c!t9L0TAulv3pf$>TSV;O@h8vn| zH_IA2V?4}kDeBv9$9g>%l9{bPKD`cmZpQUanc7~$l}0Y2FJ+PLQ9&Eqlt5+r*kTgb zl+pr8bCK!>Z=_HT8mhUO3a-yFPbvxN^s$x6R!h|CWe8xA+I^;D#rYHJxG0T{tRUDx z4n_W5xIiLJ+nXlNrpdY~ni{LGYhRzkH#z0OwdInd-kqwFFG^MEo8|cx+JHl|{4PFA zRUq-P$8ex+-Ge~{3kt1Uiy zX7Nb*CiXUqef{-nGI<wT^BW_*G1+L(n+AnSOWp#fF&t8!i@(mzl&zmBRhMb(UgAW$CQD|U+wS~@}g?!j^RL@PCxF|!i|P~~n;9r_Ef0MrQjS|QA4a;cBjFlr z_%w*;EDelw%eVlv_sog`y_C#@ZcFI4hzslF?mmjkgt@SFzaw40*f&r(Ih?~gG5a?R zhOF{9TT3H#CT_U6S!hPKxYNT{dr)8|V-x9pvfspheh@oG?&$tZ9UJs#+NgCUIw2wj z=n|RJtx9XNj4X^;Ab?40q3L)83=7gP+UU4zq$rHxT zh_6;N=JYQ!N3)Xa$u-lS_^M?97oV47*8=<&EhbKrHtBzaa+PfuH&?*8WnEYYeSmcn z{-8(*Z7yoGp(3-Fm+10CdwHoYKd_gV>5{XH@6nRZJKASRDQwFJmQIo>{&l-7P6O<= zirc1ig}7En3R#@0Zi^6>7C!>3BemW{yZ<*@KXMS+g(RaUr%PXZ3lc1-af;pNGtw2i zJX+{KT9ft&2|)REg*sX0h4GQ^$tK+g_6payv?g+}@*!J3XlqQ$5SAkZdNs3w<1v1p zLL6-SuVJ|CMM5Y`{~pJSOt^io6-YdDEzUO?d*UG1w6i*5=|=L+@WK1VYgCvA%`@prUYwl z-SLariC#K#ozaKb2P{Ic&bZ!Jhewyxkc|^?NAXVxHp>V(BP>dX~H19fPn@UO`BQF_;-tJ{9ZAp#BAwGYj zSFmm&l5jx#1Geo%Y}9R4Qf97TdJ$U;qb#Dde$fFzJkuw5Mdni#CJ#$ex7bE{B25e8 z+Sm9vCVsiG3@FL8|Lz2N0P=6OH2p?K%u?EoylBr}FB6&?1cDl_CZ&Xw2FdjNx3 zU!~xXx4332g+Y<|D2y^yo~g*ZLAKnZ$lfeAZ>-7y-if6yd$T(-yXR?-<7iP zYEBD!j!UC$Khy7P;{*Z?nCToM^K71)a9}quFqCPFnGRh#T^h<5t5dVCo@8A>cQydk z+%r{;_Ut|tM>_p}zY;ehrEvi0iwKX!_mgZJ_UEmcgkQ@S^bmYO3#uq(gOZdn#}7X% z-u?Wu;`{plKRm9QAlZbHtVA1GL@-;id}e*0bUnU+8pc^Kf#i^puocKd;M?YY^f2mTrW~vM?KCW zt0nP-Kk&NWN=KmcD9SUSX%4~*7ql6Xnnl@(N+;4)LGy832mt@z3zvwU-%8M)CUg6Q zdS+K>mS@(Rp2XOm&b`j$X`PNan8L&GBvSyEzKo8LbMnKGq70@4UExUl zaHO8gO8!=okoEywvH|gOXxBl%qa!j!6_GoK=J)e5yW%nF>KpC$wycO+EW{gvNH`HR zl0@L(TCZ0XR34{TUV33%6W2EzMRCRF#3-56!WwY{T0>HMeQF`KDY^{yy4~+}`3=L_ zMAVkmU~qJMSmaN`bjO2$mN08(F$Ho{a29VAsX)p9LD7d^q#ooCLWf;E6(m7KWCbAO zrKgo$hak=}UD=D2Xioa&?M2cPK4;5CEY#&1d)c7Nwf1s>E}yrT^L5!|FK^N1Ixd~q zBu%0KW8-IEpa7bnV7-Nv6=*N>N=BUzCkR*Mq^@3je?uFALq%~@-eF?)pT6V#GE9~cKl*$#l_%5m1u{a$02xTCJi{jMu_+_lZ! z@n}$~E+mmFsZ^Jpi2sOHfg%^g2H|xDR64UJ8q-3J3EJA!=EWCzF*mVU@0FQ3<1A%- zjU*iq#u%Oo^-PTSH<}WVA_v&iwL=~O;j!i>Qx2uO5;a^JKeCk0%dhju_+Tj#^sa#y zGGgY`I(Mgco#@gxh-Ic5Xzz@iHj0v154ZdXua3p(x9B!4-Jm;W(8$k*nkV7WNp%}?Zv(2W9^QZ7iBfp zkEJhGcxn`?bPQyi;sPu#iGOe{8DkwcpNo=z>T4`5B_sjBYO!dnMd~ed88KgEfYoZq zM_yHja~Q^}QP^)m?AK|uET_M>&*{8zZl-dU`+dJEjG8k}I@Z^8Ih#vgqOjycl;L$f zsMiC&F<;+k8p~jnEC6|?Cn4G;v7vm<4jfrCbv%*6G%@FMa^z7EqgM&>AEl-jyYiti zjb^D=&R>446@E61vBllYTOJ|u$06x4Iriq2`bnkX}d1jb1ki zl5?qL?CXZ;4#_d82@)d-rg<06N3r;rV3K_DR#E|_i-KD`krP9$V-W^n9_U8(SIp<+ z`Vhn?k8u>`3(v3Yux}uiUXF~4!Z%^o>Zm+J!{|Wf?g&^A)Jv+G+m*XP6aqE`EMM++ z>A}`y+2$Cz8Jd&38`I@(Z4elflPtrr-i2i8B~J8mH!{y!a;aJRw-g~tg5pE`jK|DV zl$*^^3Ja3%0dcm1mqRSn_1Iu)=gWWr|BM<$v*VSK29m=!&~u zikzbCraiQj~Mtx7>?Eh7;|K}>_*L++6@w) z{(|_V2zV}EvX^spxxrpur^{DD`6}EpAzbeQt~nI%^kNNWC2+et(hLv);$!%q36_`Wc7IAF(QPcYU(j%`x|p(ikUd}@!tw1h3Q_ARwdq`5 z%*B8$V2|#C3i&Sq^_Ib5$&^LMlCpYZSY{d4T5(u*BsF`BFPi;|p#oU)~gf{;uJw z?H6M!N_@V*M%r|+Kajw6;izi}(KQ_0dr;cC+e-Vvl2YE!u=5ov_Q0}7o~4d~O>vB= z=}WsEU^9|+Bt_E1a7<*J=3gsYE$}N0hjMPmfqN2Fs%>hkxAHXAZf53LWJl23ha^YI z1d(qqwLtD+Uc_lbwvPvGUcLV?U!mmKpNb?8+QU8vVutWmhVxE3NWyoH`5cO>+O(|&YUWSou(WqpP)SSxNSn8P{${o^^RRSR zgOUR{vv;b~i>8Gugi;-}WdFN?Ct-5W8Ce#_{57(baiMQnHi0*v|*a z{!S4M{DIn`&5A>^9P0_kmd1MgF@dR!sTHQWF)bU{VrO;F80V@R5WPLZ`u**K0ORlM zT^+?tYLo3L%Il8;#NE#N;Imt84{s01x%lDg1_X_wNLLB1?NZMDL(~kVLW_}bV=z*h znzk6}XCJ(Vx&bK&X;VT=5=>uiMv)>3a;j~$+!hsE%UTZJQ^uxnYToOOc~fZ%2bkB# zNOtRO-ZE}8uN;S&z?`(xi0LzGM!JRga32*F5G5&f*C|Zv;aiawQE^v>-_4AI9=%>& z?}Wo5chG2e&5mljX8GTmBo88_tX}}5BrQtP_MVQBNO^(YFvJ`RNsnFALsZGkQe_L(*C&10|{`4vVF(W%HMSTTJ1k~=4t0B z<}YC6Cx~@{@UmS<$TIhL73*7_%OXFrBTqY-wZDdFihbE8Wf6B-=1em6_9$ojyu5wN zxht&PB|hgg5%NnGuI*`}*)C@~tAK9aM+FLZh;YY^YcV43X@O={V{(N z&Jl=qJ31#3kDNklSo{);oGtC2mUh4-LdC%zWD-7Z1g9lx$EI+JcE;P$nMs=U4u$g$ z)dLn7$wQNcR&Z*vd)a~O7RnI|cRM~i?Ku%NI67HK1V@B+$MTI%P#v?(q?o$h6IA>1 zY6mB%ofB9)IG^~;$7*>b_@Ds_#`#K3(=Oxu!2>PMBkd4 z)x6htnAMAD?6VSaY@;{SH0e#^uX7YX6uyWqyP`Q}uCHOUzoKGu*HLVa&Rz}5DIY># zxqazNbyZ@C`(2`V-L+G?8aP?A!Lsbi=%Lsv*zi$fZc+~Fc@-S~4^eN|1_c4a_vQre z-Lt*-t`FYJ4Ze4YwIlc-92nev$r^nk`(i@Az9w=&rg=G|oGWWsZI-LmwalsydC$tY zs`GwAuxnr#_+xO`KIUFF?Tt zqTRn`Y?F0MeLjloLlQFij)mtiEgYRm>%!&G;<6et>>&7uCl-@)OK!QOE=|$_* zxj7#{S!Epj4A;7W-T~(Aam?YInij$Gb0zCLk1YQOa4WOSt#~-RuYwO#-I?uyu!Uq+&tBme(*3lO=#NIkjhMtrq6~M4biHl1eDh zR!kVys<%*P+%}BfG@xuqf&q`g96O>IO^l)>z#_CgIJpzN5z}m z;)HE#J-^MBIj+q+6~5^!Y%(=y^0?p4^0wW~3fg>5ZUlX5a;4wRVZmtLw%BXSU`)s9 zfDvzXWiY1T-m4!$8I16a&s7HFT)zy)yRHlduL_FTE+~U>81HQi%3y@Afq!mWzS6nK zHo4(!e=LUwW0__5bH7MTa1QUv9T`9I>FN(cv2J-IW26If#z-7Gby% z^Lp<@5Ym-6ri&h6ajk-RZeVZj@5Q3AkALUQ;{Igr|bazvG zJJ_A!*Jk6_k(U5;_<=MCR)igR115R}zw=@z00wZv4-lxMw>;b~(ZjweHy=FR37O@( zUa#GzAwDyKf3DZn%d(Eo*41meH&a&|d8@1H1OeW4%-+EbfKFf?=4Ud>rU}+Lj9})3 z%h%yMJeBfkZ8kQiKJI@|OL(3<_!(q!m8YlNamzd-PcQ%uQa5n!S=Aj%bBet7(u(;Ia<4JAXoa zh5Q!2&g3hFW^D!wi5-Td*=r)899JRY0p2$!ME1{gE4P!Fceum6D@U-V4e%pYZ4Hh| z`UGhf>`JEh8#y%7J92F*PM7<8jF-Tb0H=#AM*IEB*}<&C{lt1hgpk-|VMyQsuWlO; z`DB$Y6;f+aUX~~_!{N(?c2!=LTZ`@>nO&{gS8r1E)grVO_8wu1-`-J?$5QS%{92WA z$Klu0!JTi0Uw$%?6hgAB4W?|i>unZM9`+Cl`Px;FnO{)_nC0|kpAaM;+s1vp7`t7( zCVX&#^~<7g5wMy!4tGc<{u0jI`yPv6CNTVr{uT>mK5{Pl8+h37SPG{G4;xY*zF{BA zF%}|?I~?BF=}U7lpTnty0?3?f#?*pS@&q2hH)hqe9`g#?=HNvH_AkN9Jf9M23Kh6( zoL%-ca#~-AHW(~ktpVd|o2#gWTiv(UDAA9eGohz>PA|8k>t|FvX$6GMc2uXd8q$5O zT76_e1);of95{6liJWDyxPam8N9AN)pUZVWB*G}y=eS{})7a=`E4w|Xf!_t@nTi(s`?j3oSTlE+$BPwM3Emp3y5Vf7 zrML_oK{)+7|HWH!Ah-_=$253^#y1t?zxrEf`|oGg_{|pj{jc@=Z^$WD?_uZWs%Yyq zyw*;@3Py3}lMN zK-{fImOPRs&6R=J8n)S#Dym(OCaUoU!dK1#e3Vnm_PPG|g3s;cON$TW;6_!9 za`oa$o#Vd8qTO4A99Aq8J{1;?1VT1l1Z~*hUL27yZX8OZ6&TS8+%os#Z>5!fKga#9 zt8nuEy9s+7L?|%pbBc5@Y@u_;*r$m1vdn56XZTIFj#7vC-w#H1A&7r)!XIxQcmKLS zBImQ6A?vHFppP*2mbf<;NSFsW1QDH z(LWrR9{i^s)CB`edBYyWkwOJ}R0G-g%^Yo(YX!ahfiQe|32MB(%=6iJH)q8n{R*Q; zi+C-lgyn2R8X_+dXLJthJUKT?{JB z^I~UnY`qIJ)q9U<_Fwbf(OR`TYV7noo4;i6X0ny-UHIEGv5+xzHg8D^t0k5Q|KhKy z=#6G^oZtlfNhjsPJHlZJzl#$FSOGB=_lOKg8}=hS{|?26HMuo;jdYVRi-N;s*vnJ2 z>YRxDpr?H3E4A6#ij=-rKu-4fVB!+cH0sxCNo`%fGAT37^g}W68w@`q&TW&=fuzS1T^^v1AwL^jI z2?qk%PjY=^m{JuvlKZTEOTsPdWmQf7Z`a9XRSm)ONPl&5Y_P01Q6jPjBEvWhsh4>d zzDk^5aa6)wT@3kh-RV9Hyt<$$xa(+4F?}>?AbrGgIkoS(Od|3-RUe$-XbLU%G~PTD`F;gJIwojxa_| zj1uo)Bz5=1rXb{9c{nnBVv+x!YNN@5uq!h-N8L>{F%WtR-QR)n>#Qzd8`eugb43dai+dB6EF?LpE?05Q|8yw zg1~OMwCo4r{pgnK$@Z2@3Asqjlx5zEvKCt@SbUsZ4)3s4Y8nt|PZJKAr%5RJ1J2&- z>FYRDDu0n<^U86>uv(_Jzg(hoI0%(`ahZICz`-$kp4ce_|L!|suY&$dF#LR=rMVDnT}v9{)9fGfiDd~OT(^UVUS;x_8U zaFeZ*Q_9^wrm@n>^Y2=UNBq6N{~yb4;&FkwPa4g4QeI-GRK)B2*V*+;E9J?%S@HQ@ zk>E3tls`>rPAA>WVuU@u+SN?VVx2#x07@~ZQ*#OHqXBM%Rpg-^o&gT&_hwWZJx1DF zLJ+;U6-7|bDzEDZ9*-t+_eB1VsT4cHG{-RSs&pjy2}1ex8?~O3+*W3bKr!SMLNN}M z=Fieh_Na8cR*0SrPDhtU^8Bi)D@An}&E1TKPlM^-$EAx% z_I`x#FgZ=?Wmd&N^xp=F_1n!Ti@@-~4N?{5u@RS6Fu(eDrRZT>8+)4b5kcY4* z`}iute+8P&RdHC-QUY~A0Tir>h7{y^6uzRqmJ?j?jgZF<;Gt0!094M50YbX^Z-t( zsUkF&F$4%gCEaa9^kSe>4K($=aqN`~qzw2J>Pp*yOt6I+7a6+8Dr9gw_w!e(qA~L`>o9 z1A~CX%T^7+N$7s3G6*-iPTW}u_PM!&0S3D~m@L%V(Fzgw@T9AkpH{E+7%|<;)4d(M zJeOEktFH;aywSeQkmCMXCwy{YEM?hl#tx^NvM-Kh&EL>L^~2G2{iZQqt=}rUdGgJY zYA|RE&se@|V=Q0uXqIn!jOBZGw6EmjbZS@Vk-**PAr<*=XVQtdZ0$sd#^VjCFY#y3dkdtN=u_Piy+UG8Kexf$74_t8Iz` z$*DiE{a(f~U5MYJ(igY8$*qm?;fB%Z378Uq%oYIt)!aGO&GE@-${gceQzl6{a450Z z5VB^LuBr*P`%wiKqxJa$^CUVz``ru3vtaLRvvXZE+TMmk8wnpo{kmnilVv~zr;4As zg_tuY`x12$&k}wYww~|oPQt{v@OT=cyMgD^6%)9wlOn^5%qye99h`>LH+AA0FOIUD zRwHnTFf$4wM7rp(a019~S>oQA(I~bPGf!C}vdkCbITTjKRK%cHpYk-&tXW&Ehs z?PwoKI1kF?zO1HFgkWU`u3bzdgN-;<$z5VSQV z7?z{k^%3%=kzIumKc*B7FbM8mYwtGeF14B^>24q$0TE?mQ6-`Tcr98MABhsw1;=c1 zzpm0R>n}h=yJ8oKn?UX-hQid0vs1KMB#dht7(4Gk6D)air2asMNeM#@cKy_FxJhjVadv zuJCFAbI57LEMUE+;?vv4Yzr{4I4$ zTC21s%Q!}~SyFpYV@d13>5?+Ne=g}aUsBWnc1i31221)5ThB8;v!<=|O?tTY=>M`? zG+fVvb??{74Z1}U*VAM^0(IYyl*NAzwvQLif8>5#$Pc#(pX2Zci&T;xHd(_su!~I= zB&KO$kD;Wwltu&Yqca4@0jL8jy#XZz2wRQBXAvmH`49#+#+Q-OuV3J>H(tRS=bE~8 zI<+F)+g-9Mqn&L6OfAv7?As-JI|a^=;{DGB=WFN#_eHrWPl<9t79Awn2);dTGTm~M z8z!{FP1aMFFxSkRU{N)M?Q{0-BHi`5$rUm=y)9+}DV-`h`=015m^;Jqk~bY^xz_!9 zy?xH|7%8g6hgVTWV@b4}zqn>$0>!JU7lNG40XmV;Q1O{%MyXRG`xiQ-hqE-b;VfYN zz07UEI$=Hd&RqDn)I3JYAcnR?<6Nb2!Z_wek*GHCLAF3cwDdmjsI6S0-TWClNlubC zM$5fpsSRAv9GmDJg-1p~QLJj>MCIdnaV*+QyFWg$`$Oeb!z=~m&WkBzDyhrcB4R{p zF}u9qDtp=4H4e$qKi7CS*7ysyuw^sryl-D}xJT3N*lvmgv9;6FSFPvk_> z=`fDpuW_i)P24K^pvcVRaF>HBz_6H?OGZ5}%E|Y0s2=P7nH=+eG1TT7SwOfAS(`AY zHKB*gf3?zBDC%e!Pmt6wy>WfVjaPBh3K}=so@ck$xZF-~Wkz$@xWP7_ zL!EY|tGP9|k`_mrd*n|2CFcZ~;YR6RW-3wJFDz%Yu$tk6cLU$;G52)36L3$oon6%4 zmmO%SR7F!$I~7osnMq%)XY3>Yogb|LF{O+CBeu z1iR;6G+%|d6J(K4FBY4Wd}>eo%X!)dm$$Abd3~mMT_<^c;uF0r67HlltX4PA(y(hH z{s5MW63T~|E^N5?Lh=`qayNcI;2je=Fw-ko;N>p#yuW&duS@h$!m!i9s-aMwca<70 z0RoYZj1FKF6U|2>8jvdw zk(G+Q-Zd8AkJm}l8Z*B@KO0{}k7y-)8)6wCJHf2NIr)b{FJGY=JJCDPoLixzLS<|s z$BMBUr1qu$CXhiDayB-2I3fV}70&eC7=*@$}Go)+Go=|7(1cR{bSg5KUAVfFJd{7F%t#k)Aef=0gf zSVn#iBkzqJ3Ft)z6@nc&1>49AwfIR1Etb*3`l4)fc%ug=>A}PH0STcFHvg@d?SJf< zoBn~jwMp(eBJATBrbxW79|s1iodrf##mMOa~Ivx!js|oBi%(Jf}kr?zYFfvgCp&7x|Nd zj#sH;1g2G4_~7s;KQ_hlsGl~9G<$zW{bjl-|Hf@2>&3|5#DR35_;jo(Wi~S`8~K^6 za<5mMkzswXX>whg-=(&BmNtjJY$@cUqh)#MVV2_GIcB`!Di+*b5Kdf5C5} zDF8SRw@fGpwhe-9As5Xg!Dq#8E@+7Uh_%>oW@GfnXeqlE>AtzNu*|<*`OR*NZ+sqc zIPzE0O{vqH3mRL0t5vfA!I!ZFoQKrs% z1f3ns=dxQkzE+yKm1wBR+aTkAeI=G7lA>ZaNz~eyB>di4@m%vUIKgwWRJ+matFLhg zJ`UySq$;c`{#(+*D*>wwVS1Jmv|hf2qbV8GHH+_r!Es>~vscX|wTxfRsVD(_mIIkK0+<1hSuJ zpgU%y@RdudSk8|VH38smuCi)|^$BRsyehPH zu=1A@0O!UkDhpsIPXO&3Xmp6Z@4;n~#Per8=xR3cf;kD$ACjS$+mS;aUL#=bFngMZ^&WPXhkm zZ6PzHOt>Nrj1eNTk#L)&Z%gQwqEsnz zOL2}bzMo97Rs>v%v3WnR7DCilGMfwqGYYi}?{HiCe%1wIW;Rq((BOYEF$0g5%MD|B zB@rxS@XQt|Qe}}eQuGZs>Yqe*1hE6ubEDS{AG&)e(Hc;l()4ZW(;^x1Kyu}v=G|cP zinXV0UP*V!W?Jb7St&NKzf9(-)E#UElegJ+`9#Kno+=dE&AgkftexP^%g|fz_g>=1 zo_Cx5_f{|QQ_uUImpI$*yPLBKE|s10JmSal%~uLyx}?&2DAeU}T718Pb3x2}q9m~w zR>l$ezsjy%aEtXZTQ!cocYk#=Ujny!DA?lLNnaW;C^q>d{QS+A6)Qx2ClfB*-~3wk z!W*C*9j|4$F6F^KwlEhD>1~QQ&=d@UeaM^sf*j`gDQ8uG$vRj_@f1a&!!Dl1>e_k% z_1NC!BB!VV%SeTd&6t*xB6!$^o1P;r2&Gp<%j(RA3ajb5j)@g9xZDQwN=1t>;0B!5 z<%+kZ5(=|rf(U*W2tiKduuMoXvCPDIn45BnyuH>#H#n&voXpP=mNr$eW(#r}yuJSD z^&G|FlmG|o%=s)%O_rjFzHisbPIyayi^M^mle@I_VDtUx5HF2B-pI#u%^%qdW*@%z zC}SYT=e8Wo#|uG_JhM^oRdU<*vlMrj%2vZ=uJ=YTItT==$gUg(kyjccunJY?_0NVb zW$g*#`e{jlkcZ_7ek`~xs(0U=@>lGNDeCEWg zws5Xx&q8c+{FJ}qt##t9>sVlW)=FiSi}Yj*PdH3e0ow2|k$Ot7`0-iry6%qJ{duqCk;7b<@f)|LW z5WY`CO{90XWN1YZbaLyHZ&vCfFS|ECC;6@#zFlqe2GI1{>^5JSk#7g|px<`$$e`^D zIc?hB=GxBl+qR4f+HOv8KusV0{kE+fj9SD0ao5XgynxwXHGb%HIPKTmi;+m$$@P8i z_DUSU^oyWG=41%>rNgb;70%)IMyv0CVqfSRyfBy-&QE<|aLRWV+a+_uT1KpZc_;%9 z6uWt*oyBfZMmQuT5{Khh;fru0oriH8D=>qR%H((xH~T|hke(P$A&27LW`G`Bfv!m6 z(1AQg((@npF~xf9%XAW@L^?xhjxrlgnq!S2IFkxmh-M<_;_Px*mW+?|IR-V94- z(N~~JSs(?P&HzXmmtndzEyF_63T@wltF2W@T%u z_7M$6vbM zb{k1-cYuGGRn0C{9JddRTMAMbpXFQ&3y@5n8)gL?Tm}l{K$>MfA0Z7>jyX@t(AC3= z^?<)6is-(*K)Ije=Jv4=n-E#}#@}Dts=+bfr-#WPZc$t_=YR~)zq8HM?_-7cNyH~n zHqO*jW+I=!DBixGX@caB7L#-(n>C|DO1t<`Gv|2;Ev?_2T`5)u|EpAY2CojZ5t%$YN1&YU@O4jSJ5 z5N+?o=umygonRlN217Ye8vl%tO#3<8sP{ObL`qf9V3aN&y$qj{{C8MhL>0D7Y-heB z>J|3&%p=0i9pv;+ohXlZ!DkfG)!zryzv_fA6u7C>ngyJstXY7!p1h$uqh{dZZ(Fr} z3tROW*lunH{St(oB)5ydjrK9WgFXgTx;47=`t`Z#*MamaO-+)19r$DH*N&a^D?@E7 z{VLfa`t>kQu+W!FD5@dqW5>O5oCjOg{07eo+(rwj>-sX`Vs4``M;!G%3qEs5E}~hf zo%twQb-Qg?tA&;5wKR!u&m}a`^d-5L))z}y)-x_qi7>JwQp{k46Xz#y=w0zQaP9aj zS-;WwUq|y<^JaJRMwW>Me>~CJEvW95ECcF_WT0|CrCxJgdnKy{xKMw;NdQoN&(*`- zJD4+QANR;qi%evYxy z#N8(I<`0-yqdXRWAjgwG26>v8Cxg+m{v^0U6Za!g;$|{@%#!sJL-h|wU!Zy&fI&1t zY1q)KYsIh7i_kznSrqRhWYo55cTHLK1{6&3Uxj#nN^nU-cQ*-*8;XL8&z7tHas;OJ z04Iqx1D6=ZOOKUAe&ccmE>Xidj@0Vr6@G-q-@x&2$EY+o&1`zSl9<3bgX9?KVhq~R zqGCG8HHqJ_fPaV6K~bxo=&)L!x3Hc}ZVG+iW9|l!cOKwD~DCDNs-5iQ3FOmOsDcrc*4)7=Z{UUippY&j^Tegz_8Ky0ueO4I-W z5w#r^0y{TB0G^qQ8@Oa`p}P2w1mD$NX{IL;s^wI~0t!mcqu;*~ST1h|%PX9W9xN>R zo)l3`e!e(AaER;^Y_v`872bu}Dg0C->xpl7*}~Cf*hxZ#ZTUzB*aPHTAD#+^%&tq)6}ut zb3a%e*&^_%T}jVy*ehra(n(b1Gt96Bt&mp{xJ~BN`1n{re{~at8{TwR( zZ)C8YH+}EM$oQq1i-?7+Rv~CvP-UD1RJpTuHNmPiS*{c!ZLDo|ks_>t8S|yjx{UOw z6_;;<&5-&6hxo}{cZY{sW*{^-?-%%84Qim2ZC)qll7hf7uWLXWAW^P+ap*(4Q?}XO>JebTU z5VCah4|vT#Y@1(hn}68)@>p)0=Y2x+PrH@e>$d-ReESQ;bH~ftL(7absvA=FwfTqDP_Tfw`aZVG$Tx6MKuSF#ZLpnmN_NACqry^$Ea z`Y(>D|2<;SM(Y=CM~jXoJAue}!1&feu|ja$iN4MihpC*?ENqc3-0s*ejBzP$jq5J+ zL!z=;t+%kbF*NXJKj$e2=-UQqq7nCT-MB?$cYC3nQy+1J)U59_w;&G4ZRL9iktH0e zD;LVg$l8x`ix1O~71q+K7XAzx2DmVu>;>p65kEBpSi9M^A*V9=MsH(Jd)kNjQhw-Q~X@@>!-cvzQ+~K0U!#O4&ny$%RX}czOy=G zJ~vkPawc5(1+(!&Y&+G-brSbdeSnNQRJ*&lK^#(km?9_p5$@c#$=iQ$Gk)my=t*uD zNms4)iLNxAZ4Bf69F4=S-|tS5uTsORr52fwj7KrcB%@W`hlhhb5H+Om zy|s-brt_O;e~G(ADojqZbEr*e1BezWf42_g4#UQTl%&WRNK-sLL8W7;PxQIOk(Jvf z%_8tVF79aV6GtbH)`lg)Z=U@{=9W@?@wj+cz=%Etj{i`tL=d?Re}>W*ZOin6G<^%T zvX&5WmPMBG2>7RBPq?j`WIoCd{8rHPmJe$!Ul7(!xBXb@$m#W!b=p$(ZyZ7J>e@Pp z(7ZBaAtS2Uz;SR+8PUaC$8&QT&r?#&cz!Kp%%Ghnn<{LXMVp3aXBp3b+Ze*UGUK^F zax^n{P#@aS9b ztP}a-04_HB*Xn)g4}3hpnWCNxG{a)k)i?7&>ZNu0e1?+c1uVLpK57SX!kgy|#9~>S z-~F-cnGyM1Y!KYf8LIy?CIx#T;mHZz{vzFe??Yif9;^TDbbLds{tznn2MLYDOiWY1 z=OFHA4e)(_6WH}Dxyy}l<60R}jXMqTdze%8QCK}iTcjVHoOCr)0M1MRxZD`VKWdxC zz)_lRrDcJh`u{gizLMjam~MJsY2BX^vq-wC<}`KK&vZ45xv?)>J#<=@e&L>&a`Gi} z<|A=N74wdvvgVylE=@-)g={|Noi5}?P?jmJS@cP;Xu23u{on&$4^I*0-Pc@Fu)W{J zJ#0(Fo`Q#_<*qN%i&Nty-vi)8Z_1^x?fg4$ z1L(h0jyH-QLF~XabwdmI7CivXk3~_2Sv+PHvi8>cgNd zwZ@4X&uJj@WV!gWqZv;#bmuMT)uEdvG`0q(G%|F@En17mIP_$W9Xb!j&+x_4PrMMH zIiDq3>(&v70eac_g#jCoLo*CgA$1x#DR;&+VBHryy#7@>c?{Sb|vSLW6{%~Ae2MgyRjoQ z&BKCMS8~}@w~xBiv`!V`ljTWg=mu*uA|B8#4tDVrv1^($ zR$VcFx>iBGi|eb-p9LBzuaEQ8v-7npL%q;T)90n({hD*UDp(FW%_q3EHS%7=fd*%B zB{CxV=qGjL8O}7sbo?$ec2Bh*)n(?*ihijLjN)I-D7MHb-pwdVH6-t{1Nwpt=q)m! z0~lBaKSPdU0p*@b0mVQP>;x16ges#0-1FvT0M#nF74RY>V^?>xpw!!8F!xj#m);)_ z8SQ2xA~g@3o-k_W*w6}fEda{$%V7@EZ%vCN_3}{MaQPhT8T%3HERY zQ^Q*4HlwD8SZ-ydKTN8cjI(1kL|{c>0o>2aPU}{-2pyLnrbeJHxQVTMr-gPE-N5C< z9vX$bF9)@k)isis&TpRm6+iM=E75vm9Rh!wq%I|f5pb+x>msxNLtkSuh;t};p@H}# zA0}Fqd_Q@~iIkK(9@M!;`gRt6ifHv^fvBktR?#Z0{)JrNe8tD)S}KtY@M?;wTU}TZ z{N~wTVogXXzF2DDe8a-|Rr1z%q~x`xbsK9+U-!&I_oB8J3yR&c0sa8O__Q(}X{wDw z2f4sjuvJ`fHaR=tOp_&Ilz7Bh5yUmFR?@@K`q6Pb+zDZ^ox9XJw){^9*{e#| z$`M9HUa7WnhU{%|o{JxC22b|)u}28w$zL|Rn}tsEvx<#p)P^|etCv>RQ) z_S_7;t0mDMnJ}(#{5xPwo935lZ#_oxrZBsZ>3t za~PdtB*DkPPE0N3%1=SbRPSUC=){ZdqT8PpTZL{$1YU zj1ikpD(s=Hp<5qjwHU^B(dv_KiOLc>d>pE_%aJCZ2Bb*z*qGt6a}y`M8_V32elTMq z%$P^G6an!(#0~LG9dv4#x)}p-uTl;NcU#Zd3iU~Z7;HcO%J8+0V;CuQT?Q41J%hw`OYu)(Vf>zpj2h1681jfYz~@|tBttC`*TooC z5Ije};4mM*pIv(+3|*w;u(6Tm4zg<_ZCx%K8|n8YFx(||sZB6{+1C$gN> z*PXO)9H)|XVKqMcFt@hXQV1VKRSd?tb#She>!yq7xr&Aabh+NPH}9SjTkDhSwD*vD zY&)cv4TKy-q zGAP_s<%MLh*MUqK*1d(fo-U%%KM~0pkPhw6yJ!my4n%7!POyE#%|)Mu3^KOGNj(eu zyAYPFv4;Ds#lIFP`eRVylT+sta3rF|8MBHik3)A$H9?mDO5i%hyDak}0W9@%#5mv03JT>J-jCO%WK; z@pX8|6nR9nL}}_mKTh-X+toGNhpuFq;;U;Yepa0r4e06Yxf$0J|70k3Z`Fo{gu>^g z9N)1I*BTv1z%UpMWSMyzmS8WKQBa_-6w%hXl8IiYSh5#f<=wMhu>{3 zW4rcE9@n^ekX81*HsHF)Q#| zxe~QQW@wsJh9B98ZAdOOFULdwNcD*LLu8yT>QaMX?rPb|yo#~s{H%`J{EOSOvr*GY z&)TY+oe|>@6&Fd=Z8R4569nmSuFbBhrdMy`!l-Jq@(>|4 zy`$Ea=^h@bdw3dFb*4e>N%kFT9)SWxeCNE4z0bParh~Vcwx6MGf}!*Qf*`xD6&-iC z834wG)Rjc@(?Hw>!3q#7s%86gB{0zAw*pMEOm!SS01oG<{DcL_h*toTo`wt?n|_&w zhfDA8?~`SWBfL?3#58eXuQl;_yC$B}XiPoQ8HdAhZO))N>PWat9RZaqgjVnp(=U!B zU!o<1hX+|+=)L+GBw+i_rtCaUptgmtf`*3(ia8ANA>Y}l0&!04Gpd~34kSsfh&WD`kmfkQG-_t?G+%w?nD_}iA#oWOc5%E4&wVi&JSUY7N_0xzoV==foGuiz|W; zjP^z1YmtNh*5H+$)gnRc+7*efC7i5CJS^yIUaHOmZk#F92XEQa8C2e3*CJHc+^$S~ zeR37OIe3s)4P$U?DrOVAmNAGiXo5r0F3b~*k!o>vAeBW51P)-sA=lU+uMU&oe$C^c znj3--@NV1vg+Q9C<(i_-YI3%HPBOF&`-@^oadUN;=>X*|>C+^IS;ZhO3cqe-e02sE zore<^`D^?FvA|{`KRAQ;L7!aBdSu+ha89znF7t)}a$>coh=a5e{KagR2Z|c@)u?4N zVUepua=DzlN57McevkN?Q*UKcW5QcM>6^X;)hG`j=xIc;KI;FPP=3HSu%U@KdtghB zk4Usdvg21|tGVd|6s;v}T%|An-J82R-g zcB>awi^dRsMmSs1txAQ!@R62>hv9gU$;vn86jVM$rvDgD7T>9-@LrV>IzgJgodJT+ zzl_^_o|@)~i~E<;xcnT?^8;Caj#PCs#pr#MH-9xF8uAuO1dNrz)rK5l+8(&Y*=sb!;U-ZQX`YGfZw1~=-UKH_iL%};}AQg3jjuJqBc6%zp* zibWgk7UW6vUE>9hgW-9{XgdYm>9Cm;gZ33f8XwOBbZv!fjb?c^F}hC?UNIWOjqUpz z>C@#|T~}caGtQI%9+5a8crjDh zDc@WI7hLLn0!Fc^p>w=|)o{tfvazG3 zG~-9Qm7cFXsf|T|u>JtNH-vPS(dEuo-?-zxBO%;(ahYU}`R)@HC+l(NA#jXMbyqAF z@#!YUc;=jM*R=tj)$i;np9dNtRmDf1%o8RNq1TKv0oj)cbg!dtHPAg$Lx8qk2Ty|I z$T8&2+*1(vUi4W2k8-hkx3ajq0=v$mD6*2UEC%zxcgp~*M(=H$6%v!0P^fN^(a|E# z9-))q3t{KyoO5LbXKn8c+`$>L)EPM1%ulZ z#VgC{=N_SRs5avKyk4rU>b%;kO|@;*dgMB4-J4qTouA_aFE2QH&rX5ems%qLD~cSr zc1OSx{t*8Ad(;3(ED_k*s|Jr=Z{DN8(9kMpaFsJOb$6H%>lL%EeSXQu1D|mEC!+jcd_4@y=0R7m z+Hr949R?}`>-hpCoq$dY!Sp-VBHn|RsEjnJxH2ExD69x5-{n%v0O;y_VV76Aw`AbFGL_E;@rNez}+t|DDml z90GY2>R~z6sDjkzX;evlMDjN0Kpqub%Lt6Mx{5owmH~p*(^dJ-(6c$BGj^^^Aw&V< zuc2mvNaA#z3B1LU0}S$&+7{W3-pWDbHmHR92U(t0z$syk%gF0rZA{@j?szBMaR=5X2}iHj zr-wUTpYmCW>SGrogot%5MCY@l%0l#tUWg`Q;E=^yqXz+gjipxnYP8a0XzJzhb$p7y4K1LVqI*J)#g26#n_7*!gDb z#|B31oG8rFv!|@jL)2IP2E0JY3OQH~Nu4oEY_?niAB7JUQ|v6Hc2k7ay*G;J+S#oN z0zU+S0;ZU!i(q$s3R1uFQ89(;S6l!iU@73)Niu zfpA}xmH%c|{uhy1&qA?i@J-}wjec+^bBW0R$>WcB92Mhr#ej_(~3 zx?vT;1V_uk?)xHgUQ$a?wZW2hb|;~4oQjggd~oeTHidEr^>5e;OAXe$YPR4QEv>zu zeMVZ`+v(;lVSS~3np_R@ky_4>%W<7mW3G93)X3Jiu_*6-Y`BAzyymTM_4Rm5_*=2@ zW5)*E^+Lo3%?J&nlI83jG55JrjPKx^AIrnJ^1z$#?4nf<<7LadhO4DJ;yM2;IP{v7 zMrY4vXGc+qqvUAd)+WbBp9_Co!fQ#ebvsjb_n!+>Ttd5?&#jU4S)@^6e95vPEb=&1 zNx~toUC6st7*vdQCUf^s)E1}JHjoJOi*Yom>CWV^GfA2{LVx-Ld*RWt%RZyZ)b(X3 zOZ&LhB>S~E%TC=T=%3%2g|kAtpKFpGghXE z1F|dYGh&Qf%I$o89;~J|IYWOZNVIzVWM7|os(>0~s8B2nUbh)phk#evx@w_E3KYXC!(FC06qtd`2Gp{!qLRvoS2ac*&#}x%^+Qd*Ispe#Lr57LKe0*I{EF+Lx>3AE(WVgikf8dh9Pyv%hfZIp z2|N5O72Lg2gSH!`_pMSVw`-m!()+FcFuyJQ=F6{e*4ubJg3XpDig&n0jav#inW7T} z>lOJlX(#Z~T|*CZMs@@0D%d`D7ZCbx7RRwV82t3FqVnx77hwTv3t2zC|C&x4I)==Zg9781eWaZx)LMVt43JL-p8f z`uYuLSRHidG!5fkJ%@1@U|h3)Fg_~I6}ObGB^vK z=49REj9lXEcqOI9J1}5bEp_8#lRF~HRHA0Ne%8$#EHHbA*qqAP7?)Q52GSfO?8g_Vw z3NN+;kJ(1>{oImU{J}v5FqhiXRny zMhq|2b20XS*4Eqc0j-4eS-*2xIir?yS)E0JXoR@h@4mxR+9NVxk z3M;w=Q-gS2NqzUvGL|vx*Ljw~G~g@)x5VZw18cd#VtWGDj2>o$C1agu8RqE2izBD` zLGPVqbY1JHnO&z^M~tDl5)i9!6jrnjJ>y!9gpTx#s215EOor1=5}Ei2+0dNM1kjlL zQbG$#P%Vvy#j z>5Mp1fAonyOxL<-*21i=!{Z}~c(U!rJey&xBzYs7#66(K3^F!R}M=+I>?1k<958;IkC*DP(+9~Ud{t*`wX6Gc^q)7bE zNe;3SHd9`f7^qU(o+q^V*%A*XG?>QkZN!xj5#$*Z#72*&*9!D_945(8m&WbAoOQ|D zJuSM#Hdta*Yz7-CeWvnfaa3tizruoybz54&;{`{(i;Q)8d(3Hs*#~QG{Mc7$k6@Zak&h4j? zsry8Sh!lAX*1bml*376Y0=SsZYJ(-cebQDKhm0@F&RrEaHq4m5Gh~=BZUXSM@b@L)FLOUbj?zGIwF_NmYG8_p%6=8O()}Rq^+A zf;wz+sKVTcITI%yy?G%fD4Nc-xY?8oG5_(c4UmDN&R&S|fV;=NOmul7aIZ`B_0Wxu zldt4BjElmfn>!eMC)q4$`6 zM#>nZn=x3)81PI84BN|5>wt3<9?%5NW8+DMvzfOH&^Rh+3(HYWTC2(660M`sB?^jA zo7@*l(y1Pg-Kd04@tmYnBgOPbB-k0^KE)j>ab5;|_%X{$mI7Y7L)hN6fl-`5o`fHJ zl#E_3M z1smI_b0h3G8nBtLAWbKCu)2_|c5-m%Wg`jUW^HYN)#EEU(>sk@MY`jotc$cA-O*dh z8QWM(qc?Fxx}$`zs*>tnM(N;o+{-pJy0iN=cWTFKG|j{5wpUoLCTc7Y&mAXnsVxlX z*x*#t#d&dP(8Jj=8qno8a30%DG}tS;GPhztNmHM=pjdvp$v_FAU9?z{z?ORGy9G>d zkVi5?hGce@>*-kJ!%pU{g&0D1zVBkke3*=LNWI{4B|Xr)Fo{-)flH{;^k#nCC~q8M z-vzF`3(co7$JPdTVwxoYk9SMURnK?fKRqIMXm=r8Xmq`}zn3Kjfec3jhLbkINd>r< zT~6v^RtLdhy+8|57dxG#@ORvlmHe0~*{j)RULWDk>)TmZhjaB>Js*TyeOp~GW=3a; zH;FaXc#W`u0L1m$w(6ha4dK&jeUB3-C1`CV_v@g|wfk8%k!{iIoji#H|KTFyU4|b& ziH>p;8{u7Ho0l$-dIzh!rQVf9e$gjh=cKPCcZgcD2pf&Jt6^-{S+6*s1f-&|Y9-r1 zIk;M_L|Hn7IBt={0!QG0;auD@_dnO!?hL2@AIufvWc`HKe~YJ#BLt*oxd!?;YxHo_ zZvdg+Vsmo<@M@QHG5xlmP=S1+jR-GJ5ktRqVu3RK)#-iYic2T`kFVciLn7xT$A;Xf z5NsH;mnb%j4(DU-?+7!FK4B-L+zIAlBFPG6+pu1;li^3xL1Qc(h@peVhg{l-!G|4j zcy}9ytri~wm4^>b_2pn%#<>gqw>_3)8R;?VI(PhqNxf0+Ikb|K9vOGzGuQMK&)Iz# z%ulPeM&ex2?tNS>N*;9%gse6CpHyQ7DuZrEaCebDng=lGkC%Cvv0;>wVI~!d{1!)4 zF;iqCqXq*DgBx+`lYkuY&Hc|l=Dyo%ZWb978Ot(*q6|=E9GrcM*B%rm30T4?w_4&c zCBaII@xZjPup%s=>jdLrMf;NM5?U}C7hT-PICsODpO6m17uJ#;;sqM&E@CvJNzPC^ znMhVo7M(OQy*ptV+lraMihjb3hp5&?BFcIg7^@C$2v9(+#o?s9e_%0_>WwH1k7Hii z8?>k-U2|E1vcI}Sd(%l*mnE?67Gc{j!nWfe_&`JOtnlqS*`$nB_u_6*K)5krK)7_V ziO%w-=1+op?X2k2YVDHid~}K#Bb?wq!l=|W3uJD>Yj+pV8TSp4dE8%pUv3xsWYnmU z-YIwY!rLUQYVq9Hax+uLu5sBe_q6;Y`HE*rcOAnP-Yz$_lj1Ngr?4=f6$ zF>eZZ>s4<~0n<3Rq;Yo&SX`RMqr@+KXVWZM8xZ*(6GDV_kq-+vI8P&Ct=jM-U|RTK z5nh<0L!h~kf#F6RSPB)y55z`W7`uggcM)6%C$YT4BmA{7xc3>cNf%j#VrsYuQWr&J zmyWF9t_?<3cwli`H`WG@t-7-~xHALybur@tFi)Wj0+`PcT+AvVz>xnzrOCLspN5WQ zX))R{S+k=HM-SKRZQV@}F;UaekB6*MyvzC4TTi?4>zSYF!t)@0ba1Xc%?bIjKGnyX z3Gbr7wtrz;@5L9xUBJW@EIK3zY<}#%bvW9CCl|`T^=*8ddfK60%{Kd14-#?I$*y(R zSQ(3b$htSJz#X?giQU5pYhZtHQ!0f-=IS+xrvbA4gNey-+M@9KZ;FY+J+3K$ggI03yRQkZjMW@KKqjni0eOCl! z+hn|?Y$XIw$kL3^@naa1%5XhW-9#cwXyb}HyFYA)M!jur79XB}lI8#3>^=29k=dfD zGMPXr7b4m#8gy(9k;ADbR+S>ui4wtG4kC$46y1rN1KE_*LL|DEx8be;aE(CpCJ+q~ zZA!E4tyu{lSj=_36Y=DS^F=!u-0+DSvoZ32e2d8cx*|N(=@uD8T71^Dc)PT?!nAm& zZL!U+|CibpTPO-j-|B;=`|9~P+eE}i{D=8JYBuU`^?|^7Ly@))=D*pJOBkX}hIXU7 zvQtwuR2uors^rK|CJ*)62;hUfqajEt1eu0qAT;vX96pMELk~)7p4sxZBlHcA@U1V zEq=V1GMx`t57$V&*%Wrf?2cte8%eVZ&%3uS+uX!#M~m&(E>FTXJNHDLb^O}ZS=U5Z z2CwT}R;f+)s=QqTbafL&}sdS7x zyCyemY}~{hY#8;4WcEV-LR9k!|FUKe|<) z;>HVo9yeltM1y?m0@to%H@D2oZj9Iy<733`roNO2v6F8!C#Xvo^{z3;Zerg2iVXyN zF+C?kec%RyO?RRD%sn7o?ON361KxBjR-YGp2KRt>N!=zm;Z2uw)X(iX>PZ~(lA*qJ z4|#LkKD^^v1$~2U0@!qvIpoceVBrIuOluc*MK4*IET-tPSw2j9$I*U|ZGLivZniVW?=N%w z&a-NAkKZS_p#9q={kL7xH)JzG4Hv4>_IhIemKntSP0592{h&C2)D|2k#aj*Z*!*gO z(9^e;+P?&$WT-RT4Z8>SsZdm=XkWgnB}9^^W|6|nw6WP&v4piTvJKIC07CMHXy12< z*2U{N5+yRz8tI+U%hOS#?@KcsKM~v=oB-E18gX(m_NUrZ!d!`+6*faLMqa`@tU=cV zOqqVKZFVwUOD4XGon;%%lu4pQ{=tGW#gN{n10`Mk(SkBLDJUDq^e5Z1b0ajUH;Qov za2>t~3vD1RyU{~Ex_#GWwqJ{xeQ?`M%WW^;6x>$B{CCT32OHjSjAgc7 z59(c?{H^VJuu^*9F6RG1iN4X-3&%q0Q2mfn&FfOqN58y2$q-`W0T+Ei=V>7V?)t7*mdKQI(KjRkZ6|5_yf{`#b7q58_ zGQZS=1gq=E9@|)vZbY7wrml2hoa$txUa7&F3XGc?tgBqGEH8X8o)k7PiegraM3dVN zIZlT!gcUI<9#qy!*PF2yL$#L_f0_VJB@Iv-b8){Gm9AV*f`8r!@Sh)ES|14 z^WcsYI}s+j;?=D#JG~)Z448<_ETW&98$qlZg$Le{nqlpspCc}v^ryFO6-*TLF0)*7 zIk8O0z$Vm!dWZ|^X)dVG#)Eo@x=~9k-lYg+0rye_QlWbj!bUXhEuasP<%v+Kno-VN z8{k=u*b4GiEO$m2Q(RgeWrgqN_zl+-91t+;%=L_pFZC4m>ZP73vPIn95c2cv!+2J= zy8E!HF2o}&#P`KRJQann@Ck47g`$%$BwMnC+f+rp%Q{%}f@-9J{Y7Bs8Se;o8ve|M z{c>~VM_k}=qUdfZ0zaeh6M8fDZtP}k9oc5TvZq`3(?)eb{Ic5EV|FgVt1oojx5w7q ztJw*VeAHKz80rcZBks5V9i1#5z)*|7Z{n_a5N|EFF1*+%VHj)g$L*fw6|x(B9A^ZY za*oTGPWE={z6u<8s<(XE&e+eL5jaWO5ATtl1Sow_`Uy20 zDBIc3FxHcb-ynfq`>rSDJ z6z8YJ0Sd5%yIm17Ox=X^zOTAs!CEL-;#k?htcf2ud~lmu%LmK#2Mr5k|A&XA_Fp{e zYCGP>L}_2{Gc2iWbkgo~G9P!+K&l!^4jVWZZ+>?f$C2jX>xD4WkeO3aM8$2$||HfY48!R);ad zjdg@uRj=Y~H!XM|AAjYey1xPsJToV##7}|Q{^=p!kok!3Cmz0eA3o6J_h=thHQ=TMkP zaW)QfEKECqr#;%?Y11QcXW+^WT8FH$04E*o@$E=p!(cYw-#3oXG)d+=JHw%J8_X@R zjR$K4s+{iZ3~@#hn%=b|YW`_QFLvwb1>rC!g-j3IHPgGbtrrNLf%hjQ+Z{qGlq&wJ zxDdA$+H~}v@=DF2Ax7ug!-q-^A>_c4Dic?T$+=ov8?Go6DZK1DjVSbNW z_y_Cc!o)dh+vw*Xi($_v_!F9@&Pi#|DGM0}3}4m)Ct&82%96`gr*T5j-TwMV#?iKI zI9)gVv2OTWd~Zo=!!~>oPW{5WA0>}A&*yB}`?Cxzo~7ml|#1{~iX zgndO4ICfC?EXENdBcD_#-(YyT{?Lx#X&H+*NJmF3dlMrW`n?U_+g#E(>cX#5O`vF%n7JOmax|q&Vr)=cRiAJZ;h@! z-0C1|HO}L9ovuqJ7L+weFH*Xo+%pnab!C(qYp6A3id_qbphVmZ3G)L%Jns2bZpJ-mUDx~1ZuHg8Z_1uljlQUSY1#T zmal)OMI=$siHsCWC|yKDuMo)B-R^!qNV7Q0cvbTYZu4}? zFi^^MjbXqdDA+xQ0Y90qC!`UMGu2-S5HCyXRosvf6gLr$#m+j2^QOA|jmJJ>(9;S3 zFzD$X|5z8MV)zG63gh@k48nv3Ze9p;xry<#u`im<3u<)q9*KwL@`SE%6N}WYa+6*_ zipN_(s@{P$XvYE_EjZl&sEw-Vjb=V^YxZiF(9sp{k{lf!a+l2v9e2Bm??=+Pb0We; zCucrm)tj98j5yL6o4O?C+()kNU4qs?ScBPg_jr@ZRlCklf0DJ?!;R!R+eEt2+5k9& zJ@v6#0hAgKVXdd5uz7^GzL>qN1I%_=w3cD$cr&)nUdCcJrp?a9=N`7XQ7{{ORM|l% zH|T+72W@taSXpL!a!9(~Br6M8SD3*~&e)|+=FV~e-0b#H;<5bbu0KlGxma{G@wcuN zZ1d|00<)QEF?xBWxMBO=Tq$B$Oy_K^hx1{xo`ZS61*I55iQVHMeb9O_QC|kh{`lzu zq8udh&9SLrXVlqxul&~(Of-3`ZXuMhs7goSB<9#w{cah~VeKpZ-Id2S;wF3{7I+tP zI85B0uZShK&6Rq`d<(H-r0$oA*DaG*oX%63dJ$#s;P;(T_vjk0B2c-hk#+u#vM@!q z2@Qsi)MU$v^X(MjLS37uf@vAf6EAIa&dl-enzBzU0~ zS)BeSL`&#pC9WR3af_?RE7kRS>^3E?n!j$>4REG8Bdky!2XK=d)~vfr*U@Q6DlHZN zYy@b^B2v?I5{xcpdH%*qXXp{~qRHlSw2rX=-WL1I=PhRV#$AyYN%)=KyANNcFGqKziJhMy9NZ$)^xSE5PzoH&(QH+(&cRR zi##XuDcW^1PtxAu#pA^n68q=R#0R#5z0812b&&aPf+6ICIbb;zNC^w|y`|e-WoBlo zBOC^soyL5pi|b_$HmWvl-EmT1bA0`+`0roIc?d&vHHFhtpL9ZBB&ag}!j-XI@jRDx zq_ZoUpDdynEp!GZP6jCjnb+4~Mxy?t8j_dr>bb0U>iN8<)#$L%yDoJG@1Gpt&bxF^ zmrx_6sOO8tf|~P^p(d`L4pGy+dOAc+SF7m^HS4a!<0Q;cg1+sQBE-3jSvoZJ2xsst zevWqrU*QZrPF^>_0qUjLSZ#>gIYVg>YQ0wsWw%eg%o&-w$DYpiuL!5n-aR_xD>6M) zYYn$>MKD;F>fa?LIZts0&vUl*|8lT1*q_a0j%O#0uoLEEX7D;a_g1I-CtyDcJ2|VO zr2~F~yEWC{kCoaWRRJ=tt;rW2@u449Dd)D9M;O+$U!&$Unzv-C1291A3S%)Jb;4Lg zB8W1UHjlC7cZIRE#4(oqC}TOW8;k`XksWcCBQXZY&{h6LK32gM>j;#X--JZw`lr#uU;!#=fG=;HahT)-5}Wvb#8``to5mKTKT4f zoO{ig>dtbB*7y~n&9w+CQ~EIVtr7=)O=aFJ@BOSOe@H-PXY+qAjD%P=iBn!C*20IW zhXfMDAb%jIF4K`nR(o^a>Kb(?~UM-#SNL(%rMa^I+@qI1>bdM5~EPDs5Wpe2@Q$gMu z^A(#6^A@_MC}#1+ycfWM&WIM`KxaK~)72Z?0w7n5da8@LYHxfs?hd+bN1v(kqN%ZQ zTo>w-piT((5&VrAyuIGL-i^AmZX|(inz}Hcmj+q;B)Vg~BLf5SpW;2xX-66#aa&O$ z*0rD?ka%?W5Hv*C-e>*Hb3-N0EqMMUr0F#pV=Q%T4?+HM%zwHbFE?&R6KEYGRKh}o z_G1fJXxIq61T#2H-Bi0a>FSGTr!7%n9vQ;glzS%!U~t+3QC^;c%1Ir_>ZBTL+Snhj z7LD0`rCJ^KSSC>?_u@Kn>2$5x%VeW`H?Pp}KAmYy5O1sy1!0eGnRnF!A0Cpf{yw1o zRYvZ_x`@$_CCXi$ufz$%x~0fXNtpR&#A5y%W>diLaJ))nJH?FpMr}z`DhY9If&1vV zUTQyDWAK8%6z{gk;(4h@26)^PF+5MiAaxtDI5)OStyod%stThHdfWAl*F84aP9WJV z8j#m4!rE)zO|1qwwn|SZE z8A%A8ZbCYFsmIV&7$%kEJNftk-1xPl)=A`u(`mEW?OktSU8hYA+Frp1qc&;*7)Qmc zjU=E(glM@E>K%z3mrek_ffPs_#P1~fsVq?)-CKuEg4N7kgs&o<(|y$Iap{hx?|%Sb zwmUAj$2-;DWD`lt2?sbs)U`oz{bXJLHdjMfQFp8x#ouNuZS_z%*kboc`1MRv=W0c0 zhB~D$p&*8Fcg{&mZ58abaR!<6kZH@>zKn~m2_Em6N#@ORi#B>%)R1|23y2P zW{qEBLZ_)m`^d4SFQ`zMip9%kel$l7SOI;8`I$cG`Ism!qANUCY+o8`JhiGYw884a zd2#@>B$|z00&VNsK$njOlkoPms*?yX#l9_BGjj6~4o2Kl{}@YtY#$ALnO zkM-+-7_%t6S10FvTkhoD5*2buMUekfH|x`t3NwQ?-2v@pJB1MYp2K|S0P#?%-TJ*< z&fKxy6k#uisVg$LABdE~+x2s)sB5_}S_?83eie1@B^lPuVB*#wunR}N$CtO^=diBH zaJdb0oE;Un{<=$?1xT}VSY!01x7G2;Y!e+ojsPzVk)T9f-?tYIAT!kY1LUO21_?Q} zY?JM)I^ADvke8bHBkMu@-EeH#RqEd@mi*GxV|am({Xnw$kr85rla(*nB4JEr;gdyB zwm9ov^JHbDcGkUU?MJ(2V%unA#gKY5-ZS*kid_O*Z%ZS`^eTx2juywygN<$08#sRE zSzYHke)d2!ksU(n&P32QoKnC*wu6Ceg@x?)c92c6NV~#?OmAh5W-D`HY(TFAHvUe= zbYQCK!2N{t64XB8hV$}J`?wpI>1?+LCVtS->i@~8W11kR*u#y<)_iNhrP5kWMzxy} zvKjLvLl#_i|GnznTocL@HeS;Wc068dHy-b~!3F-AmZf`qIufv9Q`g-3iie#wkJu}S%+%n&}W!{XB#&v)iDeFPG^kgVK$qd@S zLnrjErXav(pPi2#&b5T!lHLEAZul(^&i7o84*zsxMR=-${bMu*m&ON++9;X=(}gxJ z?nsE8vl$NQ!l&+VcwM;94YG4-T#%guF#EX_8&M;iK8yv^##VIzZ-0C};3G*oa0l@^ z$WTwa@jAAg4m_4>r|mfbw(4G}sm(&)WT@zIZXU@X+`7$9CbvdA-XuHLJM* zRxcQSZN98v?p(EObv>=WlpS+!U8kC0-4AUGmRWeS?R z6KY#TT>f6t^`zNM|B!Bd{vqsI9M9`&W|qj#2T+1zUl3D z4v}{LArIMfdMxNwX%oHMq- z&t*u*wmPZr2i1{zBL3yz5HM2_1j$hgBTlN?xgn^2ohP?w1|r)HS7YV%QM?Wk$|I_arrb5VKlic+cJOw{8wpSU~i#~Teevn_#XzjX^tLIu6YX` zf$7%Xq#W(O^z4*uB8Ux8uce@;Z#S}Qvyr0C6vx^~r<2LqTrZ~=0Wm}6fM!0F&3ZQOZj0D5g( zB$^s-$->7ovAX<_=;ym~bM9h4to}e4*5WoHO^FVpaRzPj)y5#r>G4Cffk;!Eek714 zinklN)!j&(%e*ir(VB9Oi(tLl$T`&nGe`VC0jH~2G`hvjcSz37HwR9%tD%GDL^24f z)r)25^%}<5_qfjRA*KU$HtkZDWu*3yR&BN~kQ8OAf zXgqBa;9~9xBp%#y7bJNw=5Sz|D2lFkV=jB+^0uq^`nRi!FoN(j#7iv*vl53yI%8$U zQ3GqO%J3eKbyaC6bbG`Ny#3Dl8X|sVF=lAY@P{aMIHcCiS7qZhA+^=?b`X1cx^ht3t zMPnx?Ro?`R;g#0h$;^Myu|ds$W`Mk6e%uIXE2K4ka~0~*KDH;%RB??$3?LBQ*24fo z49a1#30$b3ddP)k>iWRa8^#zSHUO5H-5S5|_Q?{Hk1OV{1-b9KssInU@4H0tg{#hT zXYq-B>@4=KokeeD6G1mdsT;kB%|zB0v8DU!;`zO*v)8@(z*5VpmRkPRj#_SWH80o3 zYhI?Qms2g3YuL9nd?)rAxeLAQ3i{SV_*Jr-=To0? zUQx*96n+5LfuGK(56pn<{#h=Om$p^cL+k?(w?6D+o-df6t;>DX2ZhVob8#0+sG@O~O|L#TUmh5vodW2o%CCUz^MRytyvV*@gRIK1$wEmnTYj{2BHOs*_S$DK$)e zSBp4zJJB`pS@Mjp0h*sp0|(|IUE(O|{(ep9TGG^u3#sdKKq$mGO1gRjPZBa; z3Q&0*tgooG`q-X`L#hkJF6^8|d3?Yc`zrTqC8lL+#0zQJZ!~fR2Yay6HwjuHu4gU` zWm(5F+SgTtZ>jukt{Vi^vp&Fl8JAc6W$1`8=)Q*Ry-$L7UY4`oiQgm87BwTtZX%` z9_E~SLQsW~@q=nR^c%$yX9{7?C07f~hdo8QE$Sj=1^-Klocv{a*Mu z+ETRESl`v=2MU8~XIeQDhPb;ZJhRoI5hqC0UPbPkxY1)#90p6B)gqyQMv^LO5q-m` z`~=o|Ki;CCo>OYJveurhY#-r$PWw$yG?bC$hvEY8CwYNdLP#h=|ubu z2KP55fu=dYs^uR$IJ#(QlceP?=%-uIzY@?N+z_C@XFC~yH;01Ci2r!SuL0;r;1#pL`cVpMM7GGM6QN(G|xv}7lZ@~m!Y2kBp3E4Ay`TOWlFhBrK$$ltrY+1~c%9#r|i$Mo3Q+b?xSr(VubZ6Dk-7%^6&M&b0SpB3fonvHYyX{NJda2GTuY3fsE z4NtUewHyD{{lHq{Rc~$fJ>!7%e!>N0l;^GD;?qTal_3T>Y#v7@)Ve8_< zmNL2>cei~He=IX}OW`#3?tT1`+>d1t;suP3$!vYzv?t9Ui?|X`njQDOeGh*u;~w9` zA8|hf^q~52PQI;!&||L*o45GUG3V&rH|^)|md0t<2Vd>6^5f*r9rt}p>EVyJ9~)AB z>Ui9H_f323Z{;4zlxBo<9 zq!jVa^vT?Az`@{f)F0g#LeQR?HlBRD`Erro#c{{Awa5OJ#;rQ;d&h6Ke5`Ew zJ?waNJAU)y#md%|4QtYl2X^b5t=JKJ<2X8KKihvSlE>EBo;a3q1H1Jhfzr1kB-!cb zk7c%RNNvSd%2>at(thpOx^G%POm3yXWV~rBHEld<+B%o*ZM;n~6}Mu4EB3LU>h=Z9 z4Jj3ErO9M8xfLrv608)vx3yn&FVi0%XCM{Eb-~FJjlI~}UX6tS2W{x4_!n&*y~yH4z5zY{i|C8feLi2nSIXa% zl$3A#r^`=@Jn?T_QDMcbvT+r~vq~x>6${2yRuqk!RT7z9H6y#IZ0_zk#YIJva;Hw6 zIb&*Z(UjcrobfX!P00!8PAo2- zG-2|D8O6C%XHK3lrD)Q`!kI-gr{;twO)VZbr({M&A$TY%t0>mUD6N|7>t!TW&9NAo zTQ<|Cs(`g1iamcUDwWUI?ycZf`==S567UNpAD==vixfOV99P#MIqEq4`I~3q9_ea% z8V(XKpXc8#Mg1K|8UCPpxZ3~I6k7(rTYuE$g1l{kv3@6RmDAOUc+5$`#p9FnaC7lH zaYc*&8NLsuW~XL1iEEVaQX;yXv_4clH?LKoikHuekcqReiCO+J40a&kLj5@I zoc+$=keVA&!?RRa|1IKgg9>M<;SxGCU7e3dN(!le%r`xF1-35F=Pt-6T7rh;CR^ka zTja&yboCJI)qJMGjj6^wzY@$31PBlJmj!mBwS#I!uqoh3M_1bxk6)lO)DPZsgA|Zw zd_gwp>ONeMrSm?-K^oCp^YK+#9|Wy86ZAux+}-zxUc@m zot*)HPCbB5q~lz_#f}h0`+v-qyr8-|#T{yK21g5pW;bDV(+E?!T8I_@NrhsN@0X+kCg)QW0o%qwZI_IgUhuRXNK z4U)wgzN|c~O^?S~TQaQGyO~L`7VWKIE!CYp2Jh=Y8<0fNW~f)t-&M5nd1q+*mqpu4 z>qOhX@N6mweyKCG>7Wm|@u6oezHDbZ|8AMifE|Uj5KY`}cg{q1k7XjeCuJfM1_dV4 zNUbN<8s_liJcB2TOqfVsYF=|PCeo%y$TATbHUf)3j$hURcw!Q|n(k6g9wdIzd~dKi zhkB#4z67XYz^y(*<1YM2vxf8~s)42b?|p_rtzZzh>xg5t8^r9bgD6BJt5ff;UtJi) zyo5naXPon8IAt;h)l>fD>mSSZo3)$gvK5ok!Zir2zrXY8&;z2RY6pX$MF(-)y$H4B9J0}dIBcMm!%=3zOKPrdJ5hXPxGg) z)uZqsB7DHNXoCy#z2EKL*%kD3Yf)BS87t?5$I96y;fNi9ge?KPfEgwFU4W0w#-aT< z;of&uO|vryPv!rU@BAXD@}|QTbJWA3d>puEJ2^p>6_FI2Y4@P|Cr%R;?j=tbaeZZ^ zfs&1Vc~6MEh^$ORS$zTKl>uGwYxdZ7f;=mjG>mL;=uvieT2P4H-H{QuyR*-FcPBjWGj?~9w=&7@&c4^XyES@z zwz9wiqTH>bR7~Emv3hA zoZ?x9k>U;&Ql(`Ta|^r$ita|WS2IdV(U}#@DJz|2Klj9kL4=A7ss5=Ah~{{SAD!)_ z=c%K!ooqFRsF!TtBpe4wmRM_elHG4Q$lZl_sbS}*Pdd9S(Yw;C3ClwE2(_}B{p85K zoUAI=rP@^Ox&F44mM1HjnQMqTkj)C0uEQ4g%jS$=d_=1)(DRQ#m*XQKkGc>=1OdiA zVMpz!#2O`oxsN(`ahtPiP3{hI;ypw}$Y zFzqHmOhn(5u5y}#vevqt7^@a!IlHNCTAXoDI=h*U{Ks@8OPwmQu6?qT&7%eNiZ9~q z_>_3&1|b5%n*o7qclE;}G)ULh0mn!knB>Vy!obw!OMi}+IGsO8^mt%6IYs)Dt{zDx zR&9!tB?=7Pz?ZeUfiqFkNduqN#x*cO-LsemK4KFh4P2a(4=P8fS>*jtTknEmdMmqd z_A+-9t=9ijAeiBr-rl1UXo`8V_V7NVn>P8S{ zCg1s)8k+4)4Mv=u8yM(4WGo`_gDl!D8RIC-46O5OqIELP2Z5ozf};d`>PaQA>tS|& zl1g~le=th`{u0yLtbAvuabO80uS?k!-%Xve81x1koV+G=DHN)Q-AI7}#~t^9qJ&#W z;0CR85maYKao~&^!?;J#azH%K`ltU+Bl|v`GeA8-*e`8hoElQE)uPB}#=vo4K2N2|f-zcMRxSFxf$AXw zKl<@>|F!Vk|BHwQeKeHIvg1f#u5Z!X2UI^{I#Pyc<+y2YaE9J23&lBgLd}%AR0(U# zQZM3iTtZr%#r(vXK4+YA@|s72Rd!_X(Z$Y)Go9R{NJ?<&ov5;!>Ve{2nvoW+Abw0g z0#}nT`##Q47i~tCAouB#Jw%ESQVv5_|a1zu} zZ{RB-^=V3j*5r7b};B>IP-7dQELZ zpbwLDxjq5{W7S~w`&w3ITTIx)VD%P|6I>e{9ZL_M^)*|B-mKY$MrgA}=v_o^7lby! zNkQmeQb1^HZ5|1OP!!pSxHd3oa$_p4zpU)V+e$&ud#^zu8Xx zBMOi1@i}$Ue5!ib*Z5ybI{A7cbV5364bvcvK=)y=dVL+__I+)>s!vJHCgD*=d_8P%V zv&mfHWeU%+CA*RtJj=-#<>aKE#b+?2V5NrZTz{$wZs0=R4lr59pCKe*#@PaAYCZ7P zyYMyjB76dplYTZpN;}Oo6J{Iv1E1}->txF(jw6 zPivE31IKcIBlI|tsBHpAJs%9xTe;R`MVcw1*TJB=&w~1BO$?|Bna)Jy=ZI9fy`DEG z`NK)(b7n|=L*xCX#o?=7@Kq1K?7X?lFY~6i@TD=6d3FraT0q*9>qJ_ZQeWCq6;9@> zF~|yo*R=+xm#VPEX~(!RC6giy;7r|HvDOVT+ln>l(oX6Gvg#?Vv7ld3%Zkf(AMMU` zQSM|*0w!DKKWdOHk?E=9oQx;*EMJ*oA{ez>9NjvAQ+2k-pk9$ z^^!5E94|8`Ch28H6I0w?Oz~2ay;SZbFPRffMpF~L*Au){&Uh~wP37cznbA~Ej+Yrt zd0DwrCwriIshr7PGMdVr7{b_@RB*vq?b2! zk_&In6fYS~P4@C~Cwa+eYND4n!Ap(zQaQO^GMdWq@+46-r>wH7qId@{GiT~V7oglJ zUNV}R?B(T7@{&2xWHgmK(R&|FP4Mz^#(T+VDmT~5%!wwWshphX`)FzpFDVJPOJ3&G z32u+3c&XgUUNR?|%$?-rMpF~Lya`@vyqC(!^^(z4PL7uuO-YsuoA-L^co(*uDPA&~ z%AM?G=0uax)THR^iC!|A%AMe4MpNUxyqsJw8I#KKGIL^*(ab%(q?eeQ>-J)bm&%>& zC3B+5Xlj!8dZL$_;H7fLd&y`jC)dl2rpD)ZnbDMFxw!UT=T6OW!HlM+czL;#y<|=_ z8BOI*^4>>N6TQ5g30^Xq${p`z=0uaxR8Fq8F=Dbq}{> z&J-^hP32DZGIOHIXlj!8dZL$_;HAcUshnId8BOJQd6IC4fb^Wgg$sNol?CM$#gT|k z70)dvQ64TXFsWY_&cP19WKIdW#m820-btdGTL}e4h2@1sI=eDbGMD4ZnbE9BnJlg) zrL#DQtgKw%3s;oQEvSlwr`YGiNgkx%6qj<h3Ax&RV3t5NH-Q=vbv(Myr8J8e1VU;iujpX43K3D ze1)Y8e3iu!PH+onmX*%oAyPqqW-ag)%_*#`ED100%`2{uAA7o5SzK6AG`nENf`Vg; z7x*Hx>WKT|5c6J-5`8bID4a?01By%ObBtE-o-HW|UP_lvVp?$)8gGyX03;M$aLFYTy3+w+(ZF zrl7RgeU!0{d5TmBQllAjAq#mbVi>_s^hKnq9308Bfw!Wt+EB72ic5>iW)>Sdljm8* zk>b*M05NxNVJS2_k1?4GYz4>6^NBH^uV{90(J{tWfclE((Up?QD&KyEa|%m~m@501 zm4f1kuT=gNSJJ=Y0@EGIs4gst6zF+ZRuzFdeC36uB}E1H0jeQo3JFH#f#Z|XVmj(R zmlswX<2`7Kb>CD*X37VLnxDc-FwV#qFyvr)&K#YXSqzQnl%_d(S5jIMaSb5kxvCVJ znnMreAv)vb=~t2BieK~l%ToEfpB~EJ7Ki2GS7nFJDJc>f^6j@EQtUk#lwSyIR##xCh3B*3b2~+M%QdezCf5p{CCBrGn2eaz(he=xrd$N`Gt^xWE2(^74tKj z;jJhuGl}xq3o1*5Yv~+8Pgq`6z=ohU%^|?>OtPTvA~>#2z(XZv2+*eWeAa_iAjf*( zYJngE#OTL@Vm+Kb7>>Nv^_Q3FB=$1}vn5qjRZ#(Vk#V#?d@YlK_U4wCl}0lwnJrAr zXf~717C5wc)?6uAGE@HkO8<2yUS-t`kOzY0jr}zM6@=$9c{F#Fl<9}*pFHnZSab|r zuc-K!6@_z)e;Jp<1LRgUM@m&xloVGS!9@M7$?+y}xKIkrEH26o^IJT>B;qS50Hyqv zl+K39MzE$^FaumN0Vx%M=2)RZIuwRui)xR=U)j(~z+{^`~@LhS<1Yc1yYc_q9zsBUqhmFz<=(a3u zY6KDtp=8k!-fhcNO`1?3R!U+Y#Tr;v>gJEnO`5NplJ9*LWh|P-x-MC#AxhuelG3V5 z+6&7=`J8B)+GmxzFDUFL4cnB`rTjm9X8ECIuwLk{5V?kK8!mDv30qPx2{zZHp#kBZ z&;l%tUpvS2eA3j-s25kj-c63?C?>i8?5fgZDt{ppuRRCw^4f6#?@dw;;Jr=40puMx zLws0Jz(PpM04v;&70p+ z^JG@T0iv_JQr1*6y(@kDR?K1!l=5w*ndy~cUup?4hU;irH}DxYlrz<4F*&BRd+X+C z3TAHbB?6ZG>S?7@u80-Q79ux=Wx7=Q%8DYz{2;6q6<1dJ4za(5GYiXE|0;cQPZy4_ zE3ecPDf5!&d2mYK%re7RwJaM8x=3Uq$$|*|cZSQ33dqughfq|70lQdivR)&7G8hF5 zi@E;`N?3SA5I2v^{+ZDyX}5qv1tjEmb_A0P-@)a@r3aVGq?Pg1R5p)7+`%73+I=P9dqVkfto> zh}{68JCcyHZ&)bpi)tp0NwQ8s7y3g(7^V&^K}Ad~5HRg)vzo*fMNrqJWd|ZuUtL%+ zGd4?xH6|~zpd9cRI{t=b-C=l&=NFWg%s}F<^!-oq{NLDQWm#1P1m`Q9IS)y)xIl{? zf+q$QHiHZj)6Ifvqz)O^7$6u$%}JS;F>gJ1lD~F)(Ak&q@8%XqW|z_SZwpIj74Ike zH@Z|dhrcDI$lfxo3s_qUDym9Z`eqfFeH9aCByIa zHU=!pjt5p#p{aFWNifD`m9j}PT#ua;IIuaqlNW|p6fo|^^UHM(NqM0OKoaFum9uq@ z8S{kNbO|l1ODb9$z0w~UlF|*EjQ`Kwn>ELcvZHYxE48_7w;%2s`G!S_t;~ULc;{$yqU-CKA9nXl)gLkI z`sp0f_jX{J>km|R&0pOOX={T@p*j;LV!Lr7jq|Kp)ux}J)7pU=BX;<8k>8Q*FLnKoR@)!yvXL-{ZngU?+n&@Yt81`mKy7`v#vP z-<;aa7ATXryST?F<(z)!7T0?4afjk4zqr_aP=){Y;|+T;g9-(%p`Y^6 zHK@+))ndlWhN$-Zv!C3CEq&O(u)U4FPUn!UF@~R=Zq&uV4H01O@a6sZyXe^5jFawA z`bcKSvsYMAzt{umcP0s9+Qv!muIPcRShY@V!P=p&L^~8^z>d^%wL=tV5%^+C@j7S#lMkgz3U-Y;Rtg ziXj6alSFQCi!QB4^#5Bs(!Nz44EtSVF8aJ|zG86M7hRg+aiFi5&au5#k+7La) zpZ{Dezh?H;bnqAQ!`IiJ3xAO50fL9!i&@}4>5@CqN}fqtg`g;MtPk~J`x&7wo7=PN zVfbW6I>YQxf24m#o85H0JEH90jHRSzxM7pCSNGRE`|cATx=n33K#jt{=HPC3{j9&? zpKJbSS69T4kGA60Nvh#b1 z9@~=8!*>dazLsCSk%gj1VuQ56cUR=LtqS)P2C-CyPK_jGfnl`&GqgUIEp`CAp)i^-X%Zv$N;l< z)8Dfxg(n3rm`?uS|H`u(<~M7@x&-vnpGEbSHpY8}&0yt0Cw1p^O3OQtzzIac|MDxc3b}6^|>h zvS3y^L*&yGDLpkP2&R7o(`_#8q}MP&tsyZQ^`zh@@5CH;`iqS_`k)7{TQG`SriQe{Kl7#t)O{Ij zhv)LubOTdYMN6>R z8qe4R*?AZx`?H!YNR&GeOcs}H!FEdLrJT`CZ10?I%4_F7qxeo&&O<8l2aV(A=9{P_ z@3mZ9uQ)cR1civ#_35wpkY7g{w7}!4E?$EVETg`V2y$o zp$&^V7wWJK%I(Jsv&NW^X3$)qHE|A{Nlr1l`Jz^$Sy%FkK;0NDOl!ga^=D!V;Xe?~ zSaAON+_@kOuU*>;gYiQUVvm42v4lP*cqn_ieKr@OlzanaN4;QAX6v{|uzuX#U!ZNE zbYWR4zKvF4`qZ<(UF=%E+<|y7dl5>X*d-_ZMV1d9o6Se`7et$xO8Q0S_2Mk^z?(z% z2l>UpNj0Mm&hFjOuGgPV_qrAM9>YuaB6$-)VLMQiMwi*jPt;FhzYuLl5mS@`2IiA2 zvfFQ$NXSo2Ktv`VsCg=QpWS@nW#|d^#QQ5fw8`$isOsmB`HlX<`6%E1{H33{vY^cnDN?+zR6 ztdC;+%a;0qLo*Tlx7j()ZTKtCsDk(wwT>N-GlrksDt^mX+f>I!XP|u7HKe~}H_*>F za@j_(5cC867afH!w5{_Bg1a-G`V2+@A zw(E2(VfF_5VhV?RHGL!en>)tBG;LYH7x|@MK00{}+L6;Hm4mhwoRPmM8Y2gS!{`Zd z>B>qW=s-8s?94Aj4f60Ar1@^%Unp5MIL-QHnH>+!T{T@4?e{RCdA;u_6Jw-Zs3 z>^-H!^_%vz9_i!D4`du(^7$5#BcH#6D#$0};GSg?ju~6dBnN)y#7CA{}?TyWkuK7PC;6BU1KbgAB!fGzjvw zpe48R71jIxMvp`}>4|e0#OWkvgnFw?V&n4X5By1gz~}$cZ@QRti;^IhaeKoe5xs}) zmw1=`?+k;;h~O7!pus8g+1Q`?E$EmXPl81ksAK~);olof8FZ?b2ED&&6=baB-~uIVX?B zOJSCZ9<>cX{6-J2xBTS=Q}c}+sI`QP>x!8sCNL;FhoU;6<)WryX}T5#rPr_WNAvXS zR|bX{EBPH$T^!;1Boe~%Ozc)Ym{HYd?p>v|E1W0KI{jCaA3fmRk;I~DAam@L+UN3n z_f;p>{QX>i`m3~c`(^u||6Ev~is;nX0QQq_oD(~0|J+Oen{)k%`J6Sl$Y7s$5@%!^ z;+Ky+fOe=lDOBq9>?acNpcuusvv z<*URnsD*?Ea`jCSFZUO(uFH1zOddcF1mJ%qXUutqH~_HOiT6xb#r%E3h&&V|bFxE9 znzIdTL1d`TWTv6^fb5v!#F@U>fw|mdkFf9NHWF(|x7f;^er@qkb1;<6`Yf4ZhzI28#`uuxsWRuxK?_Xr{R-H+kNTTu6q{M>=?8!GMmLO>0C?r zeK;muYxw#%Jw&;%gExkY{>Go#IB&P@g)?~&vjUcb$=qK78}??(7>@4FNGO&6Bf&Fx zE8I7?>6ku;2F1mKnMx#P|4f}D|BxdryX%j*5EVq^yIS)mX%Ky!Kr+jRN)cXOj?vyO z=K~Yna{iTt@bUJ@(A({$>lB${BkoFc<7)zBf-ibjLI*C<zjW{Q zmQEq~WP7E!p^D>M`kFKDp{8%M&cj=ZUr+-zKF4#U#N>kMWgf^%y8y1^F?l=r94?w` zpkpSnU+{x0XuvQ*&N?1N(u00Cez;8AH7T&&&uFC5Im|P@u#d@DK(EbF5nl zrzX{qse+gW?ABg&hXR@S!_fW1_5;x4ok2_sbq%Rjjw)gy&E?(1X<$={~uwqK&&Y#RDvFsl`GM@Rm; z`GyC#H;=;`_r<$M%|rLh91}bfLK`6kSb|#d3=#HLKAqcwDSLg}5o^>v>n{YD+jY-= z@CSZF!)v2|FwB=V5qxtKB%IRtF|Im9==H~@CGf9v+KxaO&ZZ3j9=TA^9_%OJCzYQ5 zlz64w8GPu3060W~-~i$$wj(E`O(vFY&vHP}VS*gR>iP0dK03~*KbZ|{F%0rO7zX(| z4TF4{he5s(&Ov0;UGwZ0f8h4!jh;Q1)&7J0UF7AY$|6udTsF^s{_WL^pEqw_{QCOU z=GAZSe|`7t{rT&E{kZw%#oK@U`1aZ6U%#g8M#*+pc`;IRpn~Wo7JF80nVaW7zkB}s z^S`}&9;d3Vc_|c^AM>$I>#`fhwit(g9DnqU*4m$9jK{HUOsZH{-U{H_v`os5bdx%* zina@`P4Px$;uc88+c=U~{2%=PPyT<00JkQY7 zaWW)*+$Cw=xOd28Pb=Lx#Ys3|3DqUcAIim1msV+%B~3FVLmpn730hiceCTbZ$SJ!= z^;#fQ4pQDCSAmB^@%eq(KG%N`*_em}$Gx2BpGzONO;YDkm3C>;`dj45M*4!GKRXkU zR!!|fO(@=1E_mr>l&`nfiV-uHSSC+m-ePj6n6Un0QD!mR5 zYc0EqCcbcSF_OyFS7V=aL+&pwYJD8LCwtY|nY{7Ync~2|Px{v*pRdc3u8nEEOzSZV zXBAPZ1sE?|QGpW0N1W>>Yb%^S{l*iHP2DzCnlqsB5MItI$?37}t~l2S{!CCOE@;ap zV**!w-wbK$?pJ5wD~a~$UrKsf<`(_`PI~q5t?cD(?CmNUa~mT$lB+TS4diLNvMKYj z%Z9E`V|R0WH`2WIr~Ip+-`SZcSu|LEtqyOxI@DQKN8=b}an~iu)Ot8tz!|I`_3@pZ zp(o$no}InieyF~tkGw_Oq)k~xL(x=y!p&5E*m}-Yfp;$>MvFBm8vyszf5Mmq_zx&SKOWLT~juYxM16` zdGYG`3%RZe1Z_OleHNu$mv^PVxM2DFg*=(VjKE|Gt6}-bq3HW~h_ftjqc);qOwchl z5;+#Y@U<-UmeY9HEF&hCnI(T`p2~-t;;;4fMX($hoLVn(!nCZ5t}hB!UQyNTDLNUZ zp-Jn5p$R0I17vl;5mI9mmw8qu?U=S?giYI0dME@k6#`p=Wi)~&j`h0*`^pllqb7^< zwBR%GP3c3O5Yhy$oD|PhT6A$V)G6|`tAgi@qd6iYj!mt?tQmJH;L6En<2uUQawy5G zjSAmvk)IF?MfS*A9C zH9dd(ldRxJZAfXMER>K>d;7R)%=yp6)6&-ay6Dw+*aLCrG1B% zWzTb{Eui+?emgsRkL~rd9IB)9k&~wyt8VOuv`xv7_P3~tV5L}Z`|JW#M~U(|J9{M` z){C#6znsL}LVwbIho4GhnfxNx6O4W~AZyE{YHMVzzpDwlwFMLxdbOfST+O;phpexP ztVqV#b&DwSg~^GWeWfXwh{NKwGiTBC3R($Y`@%FRojWec75-ZT3TQ7LqP9%3E~@$_?Su9*+0`@I)GNQI7nVE0 zRefI;{aDp~5=V8n|1KpKproG_;6((})h}^Tos0e#$Cg>8&;iY4-B_1J+NUj@*SKcf zer{`apzcwn0>l_Dti}eK+Ps>Io=)N#BF>8^WnYreu}pbQ*vQd^el;b=oy)! zi7>eJcD4@`T+JI`1Ib66ISkDuph>rv5!!9jBpD`D=B~9_r22ef=EI~v?kVd@w3hr& zyXdA^%30hO7@&)GQ`Giayj5U0cQ>g`qPhK-Z?J^;qjrSu!G*0v8ck#LuC(b2q!S__ zkV^$FQ(R_ojjN7N6QQr3|0vU-5{ynzURq#>D&wxm`W)TEx8PPvu#9og3D|me_UrEI zUmU!Dw5~N&MUylwg0D=b8<_ej?#j}o`y{6COs_3}(`Uu{)@&G_wJT^Q&5{zOZA`xB zZR??qL~kiDo&Y_pzdXL9kzH|h2&(1w7uj?2g6$@&$GmO*<+kmiVda`tnHKutGJ$-& zmcZ|bQ;Fu%G<4o38R8CbqZ<0QFJt#Cxvhy6)sZ5iO7*A%I&!eO;%YpGEk9X2?GINYuW2z0& z*p{MCm}HDoo=Q{eP0b9Lz#G zlxNc~CJ9}efMzyvgLZ7QI*zJ5is}r2an?GHY3Jd}jxZm)bnMG6N9=}IFL16}aV|+_ zDGbS%8>8H{O`mmjPY3!pvlZ&(J)x@D=?Y?~do6q|`-vek##JKI)WL6c78PQDp+BUQ za&=2E`Y&m$%Z*mP9b!+aMT#?yHyuIP;x_J)Qsr2>r*TTggek|F1Qh7V+(;yLlK#wh z9kUw=#g^%=@bY|x7)W_j#a$C6Y<<3ElNBgNveOeN@*$2=BCw^)QREo0ATku|-$1MX^7M zRUB1_8ng}&aYTo^XK6CsM8X24)=nXE6QfMx4Cxh9OThAnFK9uyAb%acycXz?1r(?1 zuI5h~a?b7AI<4y@k1NRQy42mSHVNd^s(t8I#^Mj)wiVtm&7a}!NyS^nIfK>~RpRdc z2jyR`tBl6`lG4v*m6k1_+SIs73GFuErL!~fv4GnW-6Q)Vey}T3lNMI22_hkc3B*v3 z`IE8LHA5Al=-G5r34aK%t)T1~dS2Z|Q5w~3FYfZ#?cUPIZV>>Bo}Foq4UPy&va$Ym z_~@a~)U8xjl>B^mEe|Z$`|lb-@$@D#X@O3yizu%`6hY6f!jRk zyZ}&}e(-i^dg&*HL3v6{r7C9LWEhW?Z*^a!pKudKwhd#b$tE$hcqn=xwSKJQ-an^~ z@QTkaMUGS&{*H(3q;wq$;Pfu3>a1j%ySC>c(M=}ykAqGuqgcgJ+oESiV6Xm?+Kk(9 z+U=w9VegrASnigSS^A@f-pMpG7?aMG4lXQEh9>|GD6?o3^be=usSZ&mCiscPp9PEK zxDzvQc$$u({>#~&DS!7aO}v}#t&g|oouWVX9~8){jHu?*XI_SGj4HNjW@3-;%+2aR z(ikX(t46aG4|{QSZkK)311+P5XZZ2LaaC}pKrO*5AIJ8ID$vMG%gcfuZClo8lUDv& z^z};Tug9WO|NKG<#JPklvK?!Z1zs20iUyFA9Gf09I4!~_5KS!CnYB}lJQF2p;l=GLJj`R=q$yevJ`FR-t&cSv{IFM- zb5ry0*b(nlWk?DAI=QkskXO{Anynm{s=KF3c<-Ih#CKfz=x4gDU?YpLR5RT9S?n%Z zcq1Q)X{}C)qO9=#Cpmy!)Q(NC<)8u-mXwfd+CW?(eJ#>#iiqIx;ucLYN{XgME%yzW ztOy4v7xV1ap(|^qnjcAowT30iR5C0*1m0!sBf)fJev!VdN$PCN#UU5lT*?#if2Q1);>12E2`k%>A{I&GqKL2_J>q)CA$*@EO3W$iAA zqtGg{IXgq`gtQQd(OgRhzeY}JHy-xHa;nR>L!-sJII^hBD@?Km;HRnFQ#hA`_WOZe zbUtxN9Nu|#4Dv2&JKAmI+FKd^@a8S8|R<*2K$bneeMTgF#& z;n1e-D4=11m(gG7B0%m}A^~)X{siubF0G`Le;+Q0t(O_hZtW0xJYY0k0Z+d2*zzN3ILv+Nv;>Vx&bn>%gW}+ibdI@QGoTLBBTP%mHpYhXthwv=MWKr*DYdY zp|U<^Mx^kOa=W;K_!#kyM%TCgcB<|WdldgRlQiKu{=)Bbpx7#Ezzm6A^1qKW2_&0? z#*@!cuB>=54v0mdG%Wy*uH^I7;yGnH0sf(<4^@ZBx7WJlb}yTs z!n$;s|6uUaYs^00t27L+qEW)LsRuRT+<7JR0O`z9j3+P7_c8u+H|)=q-&4Was`X4jZg$Y*EmG=^-| zx`CVLtc`{)8v6pL4)ey3mrauKC~&W4-`UyUgwv+EuxJ74RjlMEBqr1M=v`wPMMY94 zU|R0>-yt75%=5f1M+SsAy=rfP3bd8dU->E|Z5x{dA49DM?u`Ga3E<$!G|JPlLZA^7 zm=BAapiWP4L@^?##va5M&4l>BP=VDo4=#Lm_Rr?#U}D%`1(rTLvp>?OF^J>DO+uH6 zzX|P_*d;(V-#p0j?Ccvctpi~mE(*OvC@WvwDoK&7cmFpJmFzbo(t!Ufa#57)d9qhP8Sc&ITcarzq7N_s^BFt_rHvdG7w?vQY4;x8=> zvh&;i3FqfxveBDvYV`;r_CA%j*Z2?PM+iXWa`Z6S} zG9}1l`5uEijv(JtcCD?9S6S6#1l*Byb(;FFnIPHeATE78y^NZL6iPw|;FMUnM2F=$ z0TmI3Rh@^UehjLeG4mL+xMAf-m}Hm@He(jy3x+CsMxSuO8F->loo3LVonhg;P|6(X zpEyFh#C#J<9C_CPkhCfL6i0L&yE{#aZyce}INDN_ts7;>@iZ`8oe`>B5}7^_tuc&c zFtbGfCVS3ev!&%3vSoxmErGKE*A`NuDXl+ zoLIfKl|?wXCtWOH7gG|)q>o_NiYHXzwYtT5A#rPU-?Z*R0PTHMLVz{fEo(tLG*8%o z4?Q$eN?w!*o4$^-CdMmQ(Rq`lL9EXH8cUmiQ+M?O4mDX?9LF?7MN)kUCrqE-g&L?KMA476Kk8 zJ?0gf6yI)-QJ-gojJg}`=|K6a8XM|B`(Zj;7idL-#>BP8&Biz(BBE*wg3Ez{gEez< zH|PoH8PmD|0R!ZAm##XD4>C#mF~`?eMqOFAY3eRTYyLxfxC=vmf~7sBeafh=67jK0TWh1@5t3-tFG z?K!b){P^HBIb*u}a6>XXSXBNIY^eoC$l+bMW?$us30*5dB+3TFk7N+-8k>>4;XcyD zDY~Qx_u-e zg)}$Ih@i>xoT-_BNxGZGu$Rf81$$8#9_t0zv>_a>SO;b}3sGbIUQ6V=w7M76q>pvr zU>$PSN?QVhnI;Eq1dbIb}<5#P>tbfIKD^rX2|_#%nsnxBVUAV)k^u4^>cl~oE)1Nq1No)obJ&j1P=IZy~mvx0QRKiNG&MnX3X_yeeo*5fpmzfL;Q2ZU_k_8n>_dmN!ZK~@iKB`4$?>A)C4rW>CfJtjeIC+23)x_I zg7N|87tz=?nDo?va+kWD(;iA_zXn#r~`Xi@V)e>CPp(NooAgarrPi2&C zWQ7rX5JRVgyeGGNJY5BOVNI4*JiTkrcDG{|Nfw>*#d$wmEu~a810FWIhk&cPElb=L zb=HjeJR!qS=XrAaTr@PurphwGF;OLh%f$9`xo_(UJUUr?&Y3Ljb0qeGg0}CJU_w-~ zl}PjjPhF+xjTi$X3n>q8PwreCXBFgc?}D%X1x}o_RiNn6t#)_RZ`OBdII$N7{?WnIr!`B`rJ14pAM&%cFh!83$5YZ zRwtvzT9+=Too2g~bV0mj8Q!JHH#-^rSt3CMi$I^FIxmgIIUe9$Xkq&j(U7OQa{hfvmv%BD>3to5d4rU+z!OK&LU8as+9}5)zSXR$7rD z#>4IsC}I!FK4&FOk$%*;>%o*!4f6y`An53areYXo7!$J95(gs9bo*Q>!P2!x{0=4G4xPMVWNJKAgxI7Y`9!<-{;i*mtD>&qu_hLg zC}83m?fu*wCiL_Vt@H$Z(&xL?{!r3lZl|}0F{c_`Yh|vcl^u4LUGkX4;k}_1lbJNHBqQroQl#_&^hF-dXO0sQy>yGR zhGx>MCnrUjg4#k5f-3}TcX2OCv2#&ewF~0fY1$Tv-(?FB6h}P}L-2Tv?oAxegz&d< zzQ_GY_hORdg+S6ZD3ZTi=EbSp$js$M3iLz{2fmD=&4~Zk?vVz}rXw;^CEFyz_cj;V zlVqTD5zjOQ6wQ>gyn)|qbP(xH8%$4X01wp^@_iiiaod%LM#mHlglf4>gfG}XvQ16a zw(L8#l*ZhULRHg61e0MMjA+k!LMP2{_;?e*N#i2QkkIY9lim~!nw-DKUYNXem32dcU$FEN;GPei2YFcN0lKot@=ce zd;vTtK0Hha=qj=jr(Ke;;fD>SVJMl4^;<-KH3NYUI9}-gC@I~g@nHZ-`39VjZ7$A? z23R;s;mcP8hRl0ma{&o2(#$pSupLU4+F$A!``!rCfBaKb4U9$Q-=M53y$xtrw*-VD zOFFP&n_&)@I-RXrLfkgHQ(|L+i2vV79R{gj7f?e$sX>&p zYgz^DgT^>3SGdn$yfTV0dB~BBw>lDB#nm?WYQiNe%))0z0Yy6}!qjC)L<7 zgnim60rth#nQ1`aq}73kn+l+=Op9W#5x0A}6p5*!gOLhxs;!w+E`|W~q)KB*efTf& zPgpJZkrZb9Q42wP-&^qRcCV-CSMVf3h|sq~j#^G0S zM9=6j$hB9GZh0w@!%6IGJc;IIL~bH*d>CStRu!S`lAQ+&o1eT-S6eF59@2vBZ#-e; z)Q)uKGE?D&W-Ppy_$lC8O;?B+3AilKBG4ulm&){&H54ZrPv*+Qmz+hMXatDl4-~+k zc%Y-jrJ0mNiBlsXYXu9Q7`m*+-AS_(v@rttEXsIki3;AP2uh#1A8jkhUX(cp(Oafh5HT4weZD67<#Xed`jwd`GbAt z%ACvPB%*X#7Ljv5R1ogi)OA?hHvV2L-P9Bu<7_+ruzXGtL}&vcNGHx8gE{#$*Ii!WDsk zgvf$PuulvRPTMamb{o}|vd?mN66}%zG@wH|`wM3ocLcJYaV^UQAzy?1UHCK7rmqQ~ zK75CIrb3(YB608uCo)e__mz->U=$0jlE41x+c8~HVh9k5if6g;?Z|fgC=(w~nAW$} zf+9Q?9w&CWp~#6=`@&l)y)1m@?hquEhE;`YD0ZU-J1o8#&#h$Ig_8vyx z79x5;roqruK|TX_ZrBLx>{#qg&aSN!r5@0H2=yT693<0U{q&xWaO=Q#gf|d3K3Mxa z;;Q{ygOjE=#ho1bI`HWwQHl*vWpM%})Zxr6ozyIG6;PI8$~wr%LB|U@ki>&TvkRTD zwQ*3bd8%fAxJLEwE(=0N$e9f|7YEew5_2u**{tCZTh~AsOF1O2Tna}YwjD;^g~VK} z)4J;F68$?7W|h5u+tVqwW;IQjS0;@B+-jJRl9d1J$hEN`owa@c4?10}d-n1%Kp%=6 zVlC)VAn@|NZo{pkyfB}hoX=9hAko#sIFcpAzk_y9=W{7 zSgN7pvrAX>l*$();dT+6X1H?6O(qMl_qQ`4%>ym_;la)q-VGt85-HcBE9J28l4nEy zzdeX<0mn8Vr%*I?g#?19k`xBwvx5sY4Ycy%-}{+^*U7}K{JgDv z`INZy^;1OGRdS?E{>H=Og3nO5nh1s!{B%KEPi6-590<^-!cj$jAGyLvIcrjMm^tKT zjt3(!#VQx@EYOEasBRY5b&VD@UpU83myV@Nz~-qQj(wx-E&JIw*Y`M~!8dIT8J(_^|VjoKCoqS~4P;@eDuu8c$PDSki>{ z2)q+D+d53`tMI9Uj6s3X>2MdXP+mM-{AjMh`Ea*#JF zU>{0>sTk_M*!9HeFCUONV}2;F?G59*;3P8fL^Sfy=Z$kU55*3yhHT zCTP}d*L=Fx(&oUfq&AScf+xtg^BvI;mAH)$!yzCKhMzPh>V?7szWG`Gd?=F&XDn=X z_|H4k8h5FWG}xEyG7oiI5(^vk<3uEo>@U!d(|PRJzHM)9XW~{VED|pw zo*-F88vl0lI>=^=i;gn2R6xSK00uFK9hm_&#RF25dcr#gw^-*@aKg`;nm3MF6Sr-X zHBb>z(>ZA6m{t-;yHA_hBu4B~7NI6i1YfOhV8KW71ho5riI0Y1GZNBBaDl-+o{9D; znwu~%SFp(^ZnLaNUag@)mg)**ZY?f6I?De~(f^cEh08{oi7F1D80S$85)zX-6lhy714B|K|)xyj#5-2WMEV2N6KlW zzV#>Q5E9f4P%MSsxh1Znq8Z7B0i49oYOn0fKGh!frS`cLRDGoA#%GST5fv@CN#z^Y z?T@H5tu!R4^CCIA++9&v@3UBVXzEeb=HR(djIq*9^^l1idU%r5g)vFurBu!GC9LG- z2-m>p(c?x)Ti-%$%8PrsnW|$wR`1|vL6*9v8%f@jt9T-6YnYNgkoJfNd!XzIK4SL* zAt=4Cnf*+9P1v=1bNSJvof#yLcE%hOB4`{uF@7Zgjf8|q?&Sv1wq3U^*$_$vZ(Ek4 z)*oos8s$4v_Q|{WC7CgFa1BuAVH_Gtl;}XXZj|Bhs=2ow$#b&^Qwuc>n1tT5`5lQe zUd0VEXhl(Mg@c)j4erim801Pn_}ee)*FRuKtlp`DPoW_%DrT}4)16E|wRe0mDbQSVyg2qu2Wz&T;!I-l{-|9my@NbsLK3giNkTMyi%_S# z1|02*LChCPQ+KV9*wOrar_6iP@LJAe5T26NA20HG`yE>La>gz1}e zR5-Sj#6eF^Ug)4-PR8lA_d_h8T%hb4e3u0&R;XO_PV`W^Nj>?B7y;0_4nGECPYMnE z)N>PpmI31JXDK<^4Ni5)#5%imX}PYUKB06Bivugxwfv|0tv$$sc}h4##;tRZhwz>L z8iFT@s3yaL+^?d;A2Bc8DIsb>6j{T6mqTd;WsMAk{X9O50Ck~m`L@TfqJwcslZHU# zP7jlR?yd{db0<^!x0A-SU|3=|Tl|2xplexzn~!FULYqLMDm?u>BJ;u?a{?fzgB2vQ zBAP*IZe&(KXdzKz0NoUB^e^ku`j2ed)Qo4x=3m)bW+MC*inm~=pDubWe9zN`>`5UU z!5dX0sIX~2*iy~OUAM6I(nYY(kU+rY{1`s+_vT${F*v8n(Iz--!zecC>C>+c- z?riKJH0{7ypi(5RXO@1UDj!!bG+65mZapTFrBlJTej|Q%5Hx%OSiR8E;KOx~r&4mS zI7%!D6C{%jH=pG~B3m1bDOj4&BH141drQo?Rs2dyt0DvGx7Q~~{Y_hq>G@$0p2K|UeDF@rdFC^lqHPFtGd z@*~6|eC1<+MS_3iqPgm@4Ip|XiC^=(CPKQ=%AM=Mp%LCa7sk-7Z|OOiiYa zHL>s&-@y|iX=k6pu75DuI``s=x~t|=~c}bfNT$QYtW)6;)AfT0Y%{R*(%1U18ctS|2-_w)0@k z#BqCpzKKq!pQfC>I_6$oU5o_zBq;YSX)y2&`Dd4HOasKDH^yK^5P5PTlMmZfJSjxn z5^r1k9$g^ChDL>~VTV@O17H*gKCU!M=vU6V0{+S0KxV^&k>6iSi3 zCih{Khnfsv0N`kxk&wR-zXtV=%^>`YLDINtIUZ4SLGTK!{W|OR2Ux*VJo8fgg#-Zb z7I1S4`%c@B>{Y)EcbFD;4YkeKthR6wQbLZ-pkyQTFDNOp{rZb0tYr!fj$^gl&+l&T zJL;NkhYPY#PE=}V|CAyMAWCBcHN5W=15l3`N>5oY5?PPpUn7C5G?|OTM&A8c(;BdpR=|0|H zDW_D-`phYl*N+(Wu1VSETvmgy6=+$y+a%JE%8j$q-0718Eo|c?isf zvmSdGY*l;YP*&LhuR^r1owcu~F&1&{Dj{jy2IUk}bU;#%@cJ++(?U4HVg;cBnd=BL z(ua{`$NGE)7l1PkFRD0;r_P3$xF%4yCz6)j4r@ziL1>TFW{$lE5ch>XYQWcw3IsLr z#>?wg(qEiEnSc-cAQgLU59@Atvy(}?gaNl?XVpE%KgiqMM+^HW``Fxm)X2EhrIP)f z6T=M(jZw!}$xy+onT`-hxkk#64&~Gap!33Urv7rTC`SP5OWF);m#{$ea7hKHqM5&q z>0RqtrZ@rBVKw=xi60VKM;<-|UvLPe1lYRAb%duZ2XYicMh5|-QBK4*J)D{=8y7%I z$1)?iCV{BBfxKAf-GKz~6i|t+HLYbSk{E5jqgW#qu8K1CS1(g_gBa{nVWJ1leS+w* z?kU;^06wr&nP9QaI;`xmaJ>clk#m-ocdWYjpJrf8XC13>Q)cFr*q!bN0CWH}rh zB+!!t>n{}Xg^frW7+UQ8Sc)5uoX;c?HsCE#9U}4m3N7toz=I+Yp((Lph14b=5K_6j zzfB_hx5C^|!6{>b^Ome;mUjXNeE6^eAk3B1V{jsg7h|fhFLGhoQRPRXWnd$q4y)_s z(Ajk$2`512aF(qIz&*JKtuGv4Ca@)Zi$|d13HV8eL?a_RagQ*G`%ENfDQW*umGJA9 zbej~28G`m+BE584Scep?R&$IK$Mv8z^TOK+MEs^C&NlJm}J!LY^ghizC4j-fvXhYuh<|8`l1(0I$ zM!vpjzKQDNGzl?o2Qo0IYFiT|WQ{rLtcDYsNcX8y*@NSbSBCBc(;3SJ&t&SaaB*5X zjl%Gn-y0F7|LcCZU)jqaFo}CgJV7*;*JQ~}H`#kfwg4ry-VinT>7=eqUOc>ODV_!Z zK6r$**CyA~bg-stCK7Q+zEv-rMf3m}+U#a2NnB7^Q0`!F&~05GrYlX*o~5}pAk`G_ zDH1qOr&f;06mUxJeoHJ3W{1Sso_t-Pe3F%WA|A0mAeypge7eYiB!sxh1ZFlWGlAC3 z?`rW07G$x`1ghifSdEp?SVBc7cUrjl?6DjJgF}Bz*0${IIsEaIel984j?yGezsu<3=xll*k0d|te-1oM&1U$XTP(B`f5(0r4aCGGEHh)4Uk(JL1_hzg zspFPOcu)Jm?Y=ijEB$2Nn)XN)20foYu);1|aeQ|45n1VD9r* zyDe8eFLCkGN_D?`?!t}ZQWmPzo4&u&vMXC5a>^31TPfN`W&i-j!DF0=ji+$(_6j-) z>ijh~-A5j8^J(~Ya)FWakEsPiOHBHvziXHjVV1!RZavaEXfhmHeO#1)@w=NhrbkvP%i)zbx{DMo4rDKj(!9`lk7IqecE$dCtJq`}+{ z>2x?pEtL9-q7Yp1?+qnzqz^h4D=ii12Gp^M$ZJR8bS;G$RyK&Cp}2^dS+(y9dLN^d zs_U$H->CDUx;@%`{Ow}bHW!E8@BaKkNDO@>5$uh~Pdy<|j)#`rni6$F#)_4y(?qrv z1y!>*VqNDOp<#R%Z_z+5(i&+Z|X z9u8hAWwjOY%i;4pDr$5lwZVQMj4AKo4az8pV|NYJf0yGjX|ryG456SB^X@kRBy=P_ zlCY=D!C-y?$}Ma|0tXFXJ5Uu75J4m;R6Nr_h$)>y_!h+BMoL=8zM}CE#NQHX2-y_O zt9%55aBOFn$aP$tYPhyw%qe+sDMjPhm4d66$P$5TA26H?WS5pemM-;SVLu^#>Q#(}rHNstjY|B8VV~AeFVnmC4#PH#h)k zPL*}sd;0nMSj_jnZx5)epk7iDw-kEz%}>bwem{GB#mLv&!Br*`ssnOmYOpH|ykctR z>DDkjQ)Ca55nr(XLcyi|I$;OX!5WAFgra5lE*e7BCa)C%2#}wErcu9$pyPR<0$_2y zsH`dtp2Xax?k>czVlm31DS*Kq(JiwvEVn_j22MN7CDM8;-cjF6yZM-C%{4tz=5foq zVMS6ukR%g#=~B-(G<^=R)d~?`J`%*mQ+?WA|1O6H3>*#Rur~br$~VyumNCaZh#PMc zkx#^e5pF~Aq2O)AAg@u%;nL(N-3w)W{_+h~ocN>mqxwdR-8ixd@t!HwYYTkuq@#{m zA2xcdi-Jh31}7Rb7%DUz6eNCW|1L5B7eNYQMmenHK@aWYx&t=~m5q?h8Rb#@&2@0s z@N)5N%dj>OdEiim{j;1d+H=`WC85{z%vRK&K;3~6ttGS#MU-NBVRtTYC384T+DG8i z4soSNflAX})lmQtX#%^I5W|GGmg!M~I_c!t3tE)P!Jp=-0Xvnj2{8Ln2?=sQM&a4D zpoVPG*GsF$R1_(Rp34C~TYu>S zLj!w(#}(B_K3{G>2p4grFT2qDLnKOQHW^R?TNX9{Q2k->>fn?FEAsckBc>5KDwOt} znTNMIKn`VugTW6&6GZmOpXbCe9!ef;8gO<)!UtO%!~}LwBUe}7QDjHppks`mK5`#& zHP9vUp2)g@Ln4$gb5<+dV+9@?;RzR_iSS3vv#F>C1y%YkYM^7#{|n))6@fFa>l8(}TPq_oz!{b>D!# ztiEEuh&{8IAghKUhP@=KQbd{(R5;R}u)RbHwe5f$BXq4|aVe@iS^Y~2eNNewY+B*P z+kVCXXN?MnUjm&!@dwa3hW8JJO=2Eaom&fv6C$vIzX%eL2(!dpu1crqHrZ75b3xAD zL2V`Vcw*dS;x3!tS;7phdTMTIpL^mhTw}0(g(l-P#|`fVZ>BCzOTVV%#JPJsJZuyi z`IMEGM-JVdX0En|TQ zT|{?D3?H!>Ey1&KP11BQqgnMch#W>N*2YhHcPCk(IFRC$RHrekNwRYdOiJ@~u%y$FTuU&gR3}u z_ht8c^UZ^CK>46)0!J{{71HH>Xa;dfN$E^T_!dne;HkK@p8%=5pV>n^%<%Q>>=*g? z+kL}U$~ZZ21wShl><49>nDZi4u;D*|Zk141fI#XHlk+e?|FP{Nt{_1XE)&;>t~^N& z<$6w4DvH<;z#2C62ejk{{{o02kwXnsRf|StV?vACxx7eqfZtAZc8-RFkNUpj(^ z0#(=HI`;sK224M6Be9(Q%|grHuvZJMnXK-^Tj)OFlrYb2&K_CgO-7{#pm*=#ND0GO zv)>O}(~WyV65_}*3q*HiwBQ--gaM8SwmSCh{?DqvmJ#re@=OUf!q6dJ&~>w@mSiU8 zY^D-%Bs3MDWo6D=#X{S$OCD#2NtIeis$uLVD7$kH;NaDp``fz?sFDoP4`LO6j<9Sc zSNF&`d0ZY5E$HP*j4K_9izSwV4V@TicW>FrQHy+8+Re>vef#aQ-AN1|`MO2`V`nxl z5r;fu=v=_whM`P-JI;=nkm0cM&^zzJdfbbMU{H#7!dqZ9<%w;af!1w)J%zvT`|J9Be{K9}arwWAd=u{aJ3L817N0X709Io* zu2y1iC>Z1#co3>_{_U7pWr-c@NioSO*`*7>5hg5++jXV>jfCOh$8vLyN1+%lj$Of@ z6B3YvcQJ<@aeKGBtBlfoADmB^$Vjq=06?fVM;MNK1Pg@~(wW(q(4A7jD-G5K=#fCv zUo}AB@52SD6uKSmh1B2|0EMiXniSge?bjjqh}q&NYEmp$^<&B6h%BPk4~%_?%GlrB zph}jg_=t{{V1SANM6ru8n2DD4{h|x%SWw;L$<%T7bVhs#gJcZ@M?t`Q4RNh?|ASL! zu5??&4MNx<33#N|`fFX+>R`=m^p@!UU*X}aP#=fOYtza~W zP&L7nM3Jtk=`aW9(G^pV79oS?g+RQbCrbk?q zkERChuQ_tKg|Rb-6eWh!!c75bSxg$BvIh(@Bk{C&RcC4`&l;#d1?GEV*uv(-M%nZB zZ{x(3rP{00Sx8Phg&7E6WCM21#D^p;o&+E%EcD>t_q#iiD2yMs$7KZTK1-F7Tq9T= zu15+y#jZJ#gO*iB%#o4C$*0RMJC!g<(9M7tfm)SP++mY*);-||uXh?vB2IOkh&)R} zIy2Re2nUjQ-Th~=U<@JWLyNrFYEE2RwA7O)dx;PR;%BW-52U!$^){LlC{anZ$lh)D zkKvnBC5V(5K(xtllyX;zn@YCT&&tDr=j*YEB~g@A$Rjucb%G*X)_fc-#W&kR2%fy# zEn(vLo9@A%4HARR<5ZX-o`k1 z4cqPx+!InFr>UVKjit1@f5NBB-(qCf99r;fn5BI?q36lWW2Dgb+HB+}x>5SHq2MuQ z19eh-`!WM5Ye9ItRF%6U8V;r_TujVy;@xY|)h;2sI3rqH^=6&13){&v@4oc*)K52% z7yLxhlC5UgL}{!fmXeHLDtAyR#W&`>Mb3Z%g(Bib#q7h$8{Y9@)&5i=7Qv;sDYr_a z7-MfJQWEURxpB{Jz>24IuzA^BeZw(-^-Zo$wkBgT>U%?jUq@1z)J=bI-aT?VDI{%B zHnbMI>u(#eCWXnG`{QgUMI?fuijsc54V|$iL5z~w6DRIqV+qpcBGUxv3cT(@=wxV! z)VZ|oAp$0DpV*3d07$QnC%S)vp}a137a%thmL2N|L|g#@_QSX}1s^4h@6_)19@?Pr3*jB1P!HjtI8_uGqhz zw~}nL@y7OMp{X$F!oY_kv4vQU0SpE`g_fE|fRb2eK_n)TO;(i%HE5Kwaa!=__E^fe?9|tCWtj zb|zz{`r*Q=Q#eHcE-XkCqzGXPC71hkXu>VW{!wvMD}~aCo`7-}PawquutV*kVyDfo zLSK7fkcVori8~TjCP99mxADCKJ#nF@sdPboVVox7kzD<$u_I zKEi}6rO_K0K0ZhQC?##{5lSiYVc1LEO?5du91`g^5jJgdRV58q*j2;J(LIh;=0f&e zY0fM~BekSZHjZP~LI(twGRzEavRG8jez?aD6bhsRef)gAjd@{{ZMtiy4 zcDKCgwK)A!*cIUKrzmrdyT|=Hj_ncFXWn;EEk9}&N-VuR5mamm?lbBX<+AGqa*8+B z)agCb?qGM2uJS(Pt&+{osHo&jlaIjsE{H)3n-B6cQ>MvqbGI2ALf>R*Kw#6rGEDqk z2j5o|J`}r0HQrx!605OR2AAWqx!smc|3M3K+BBy&>KJmZA8@ph@fFNanB{z3md~eqj9an z8)TUpX+0WB1g|2+Tq(`vn>Y|;Ff#1!@rO#09cFa>gMRx_zPxrGmHcKjlZwdrgz|ht z3JX5T9KqlUPE(mfU@w9r(9OctcYk$DJr3Pm$E)W*zj^-R`P(|YkPvXXcy}Y21^vdbs!c*)k2qwo zI0(>Vqw@`$0))t3@EgRHmi2|AO#=#iYFI^P8D&d}7mJ}NSab~UKZjUEihRAhzrFwr zA|XsGf0OeGk$40-zoeD^A3s=UIi4%)ALc-iB=)1Y zHGYMjkkIG#op&GItSEE`B?qar0Ls%HLOj{%z+WnR2*eJACLA{XfGtA)7McB3L=OXu zxL4Sd761KUbWMVqg3(X*GpZx;6VwY4wtNVK=hiQGdnSeCyIwI_qBs@0y>b>Y=4w3I8Y=SAqpi)kD2y&p!>XiDcI@Uy_ro;GO* z%NKQj7EjJ-l-04Wu(&W^(nNt+7bE7JAtH9R>xnkBAgapP~D&v){~fC0v6Rf`}z&>9!|dpJ3{7oh28x3 z*96E&A7oN|l$=i@W+YsK_k!C~*SZi*_6$TYeHesH6dm~$TzMlE*cdK&o5Ei`N>yC< zuVrAnI8$1To>pj|gIh}ooQ1!Ux{U}c2)L%)5rK^1+Z&z>E82*I0iM&v{-Ej2vyVFlA~Lp_pP+4tELG7jA$r(yOp)!%=3rI*Fi`_u? z2On+jQjg;pwe0@-dUt~Zi+(23FN3wIA2J+{{z7LdI5{^%XpelDkz&y?-A7$zRQ*La zGr~_w@^P6QO$w_LSppc!SgV5@lLw0q+b;(MkYD3HRgzJiO^av@Pl`?6< z#OpY=-H6M_T^w0i`PUq060CY!Ctz0v{li2l0ZiOImb>d7`WWo4%3A;T;j7L&FX9~+ zqMP{CGA=2!O%XsMurO$Bwd%|;LGj14q{ZRkx!oYBpp@}|g#@pmzun?>zKe)|p)(XD zrPSyoq@GmJQQIqdJk#l`!ocWxbH#>}efz;savum8T7rm?LrYL*d#%(4;xJ;Ch(|cZ zRRfp{h`&FAR(WVICY2a+sNO3GcSz}{QmPKhqL+@wTS?~K{Un46gVIE{Fhv5=!d65r2>irB?}i%H8Xg7x5W5hunNT@){!-INR-)OaLdCHo zVwvoIw`UzM>>Nluvw2jI{#T@#suj>J-w<|5wU%)+^jcs-%7{RyCFSX$9Q8wc7|Y=b z?oiPC1DP;*AW_q55K}3+f^(d-)OjdEa@>G{0`;UR@}j1W7cPIS9XCyvF$e+*QhWAV zJ|9@0M?=Vjj!NoPVI)HY=k77BqK6QNlTsNI9D<`VVKXC7VbL^3dtu3jIaw8Vw*?u8 z)z`E_d4ulpi*#2*B`wM9$Su1voPg^lztn9Y6ArRzyinw0>Wtm9ULEE?O))3v#4z`= z>)}-DEj|&?2Ox7~vRip#d>b_djz!IBh?5MT7iD7W7jGo6t^G2=SAY;>`SO94y_tNf9wO=U9*?X z6JM{z4pv%`3A$@Zjozpuj|M4PHInlN9X)uzZ*Z^w-Lf#CQPe}Oi^=iFkuYNB)g*3* z-Nr!gXM(tmd8SabEL@@V6c%7OV{=lYtPwZbsxm*2b#r7(QxPr38ao*Os)8n8<&i1D zPDB9?HDn}lUABKLkeL1b1G1N|Bqu%&>1in}PHM{l&wn{qi!K3&^ffGT|8+S9d%!U< z+1;;*tPZH}%`Gzf^!_9B_g`D}>AfH{UzueOAL=RI6ew?r(;?1+A;|qxr~rA`%{4K9 z(4SCmpd_O55EnDI@pR-8ygjB?L0SOtj(EmxT+9M;OMNB2@a1l|LPfM{0U^g)_#-k2 z5T!g@Fjr6DBVERj3P@7mtS5J15>DPhpTB|xq1XCik~}GsjA(gWwH1|VV6^iu6Hc;6 z2N18mi$sVJmxISYlL|$_y9mNk`pUpJyL%Y!?`7I&J#m$+R-E84<+&@I8TVbzMAQ_p zCz${MJrLTo1nP`16$H=n@Fa>8;YCAf-=G8vt1?kzc;Dc=>`RKyxrRgtt#DSy+}?9m z_bxaVPl?o?X166`(_jB5u=DwV9ZC&?ndR`$kX}s0l+9S1`6{=T(F@zFCj_pvB`gO+ zMYtaonP8~2w#^XQPdNI)r5+v10-HMr(S8No{eu+HCbCQlNowP!Hwen*5?<0hN5L}B zg#9z%*I<&Da4#lRPK2;)Fkbh{7>-xV?xSg$GVtI5eIJpABAMpyaz{&QOP@)N2Xc2M zSkc+pue+;%aqvFgLz=`*sX+a{KCrjhk9c{-&zPY$#kKF;u^dnikR zudQfcIm4_WR@-{^sQRoq$F;`eQp!RMZW5NkvWNsDsz?Y)b!3*7-JfiItau>_KOlm& z1AK?F%=cC(%WQw%3;bRioK;yyNCLT3&=})eVnw;x=)xS{{v<&)b8b;+xgE@Fa-$$C zh4DN>^7@usCa7Jwzo&+2f=5(|quMtHR-H7|KO~_m!C2I>s_eOS`A>B?4_{!pNuSJ8 z3R7v4X2b(W{7_oshx5Y`#=}VY2^NB=3s!hSY>RWzfes&JbwtpRNU6bxN#Hyp)s2Ys zpzJQkgTVmwn;w{ZBg<64FjA=~gWD#6q$t*lhPd%u5dcq%7TThEOIMC?Z%}ZdU;ZA! zG_h_-VKw0>fyFB#%piC^xR!58xr^(!`e{bhtLHzex-ZpU?mjAXj=xW|KT`6EF{MI= ziB}stxAtvPhv8U6zezGwDLoJ_>6!xZ0=WJggH#yJqq z!PX9xCDy5yM?>NYYa0DcP9JYWDV-eV?ZvgnRGjIyWOPU>66MYF80FRVNI0!5%t}nG zpWq! z5si;Y4!w73sgo=DB`m|_U6<> zxma90iAq1SZ1Xs=^U6#(2;s@014Y76B}sBG-BYe;Q-FEUF&mg43y>QVX4_CtXC6G<-7;D@{rK zGonN=L|HCVJ=si*0$KzBrKB7Iv!tqZv3s!G^jQHR77E3>f6}`rlPMw0oRc^mg~F7m zP^kH#^qSu}44_1-l#B{ARw+MlVFcSe7|CBPqMaZkXo(p%z4{T*Pn;U|BSL1>R}>Jb zB(bHX8Yeki*3$p1q|aVh^-8#aRP4A{s23LhBI@QBNv0PDwjclPsa<6BUroz(LGQpi z4kC7@3s|Mzerw2ktD6dHDJoWg(#}KacguR-q{XqT8e*ZFzIaA~a2m|~9v(W#0p0a~ zFnWE`amcWuz1m$U>aI zXvV%hd139b9J6-#8fT~v_zRggI+}Er`LM);72{`#2bfTU&H{S?{l%qBykO0NQmfp= z718SI#aGAL@1_RalA$gv-PcXG)wFk5Fd*L_sp(jgneAG2AuJN_IE6bdX718Ba4rgm9a*6wA)AbFe3C)^Tg0LLx^EROV%X{QSJF35>3sG4{kpta zj+%U9iMrG@Ig+asB9wdz5IW(ix;p8Hp$H5Pr%|jGvU}ar8$v4viWdX1iG$7Umqx%o zVOJ(_hEOnqHYi!F190dcD9?=)IlWV49NN`^a7(;C4VeeET~+_rJL;&>#Dr}jN2A6? z%LBOkFEY&k7-$M0n-O15wO3%Zsr|rUN7a!c;kRH-z77}5e5ox=rET{e$8Z#(5m3pF zs*a@lTJO!E+F=x(DU}xX`CcQTUs0-1B$Km1KR-kz1|25BS1bn-6-3X`A)anG$wY}n zhT9ni^sWX1wx5~8kz2irWU5!8l4Pz^!92pvPRbKi-HH}H2rOl>*j*yb{ng!8qtgkLXNizm*X7eCK9uosrh*S; z%r%IS_lwezIA_p77#CrWwZ~X9`fv!Q@rmpN+9SSkpgrYyMP;@29;OPF5-EFj&QZyQ zVTyh-P6^&-tc0BC$J!6kh%Sq*O_vasx9X_xf8wJ*X%CIArf!4w% zC4j_bN{%DU3S|9vBC$wYGp)#k_ILU7k*$mf%B%Pgcm_}+z_+ODNoguR}2W?}+t77101?HF|MaP>chMyK(-1iWO3b9x#{+fCV8W`uIAIkAfqi z3EnHIMwd`HjPfHS^sz%ywaePXwL7oo{T2Ke$?04ej}@MA;-#m1Q>r-PQv-gC@fHv6 zsgABlluF^-Kyz3UuAdyO|930@{&o{i1*X!;ckwgNY5?m5svHl=r_YqqB$U})H_%2= z4H%sO(2Qb|2eZh8)1O&1wN9w6frf+81AOi0997N4{4g`+z!l+XC?;l(a2nb*4>>)& z>nxzGu=f;=i@Kz7M_2}WHFOBpA%9i<6OvEBw?Xr#$pwl%=XbRrW9U(r>(`!fGS&PPa7zIbN;A&P^pXj$Q^LEn+^-Y^P`W>vT%KA=1rtm= zvlf4!(1~o&XJ>vPodZA7;=yUbD4o*h*{rbK2Z?FvDIkwJcz$(A~<#SH8i? zCH6-~iOsu3IYQ7il2HNZ+W|6Rf6M=C>k}u6aP173)RgK7-UDl9n`>x5`O0QNj3XQm zlEz(GnZ+y3xWjpYv!KB>MPb6kHBlNmprYXg|H{hQ55#dYMcK^HCFMl&I`Lpq`hw|X z5vojv9InzvtZlIM9Ov99HODBKHBa#{p{Tg|qNsfOi?Ou7{rzV^dZ#-=f&*GW#GBJ1)^0OD$9-}kR8f(U4!1ctKl1ojl6e0EitA@u(7 z>$Tp`?=D*#AD4nh>%PW{2pUH1EQ%? zfFHI1sl9GeK=;OnvE|G$*$cPG?nbzhc%+Q1PiXo(D(JbUTsWX@a<;$C0sSnvE%`sM z)F~yV#6~1DPkKF1)?0$w@O@TQp>llaJDpAr%*MQ%@fu3hebw zgjR(K2D`OAk~->epwUI*Ni$yC5|c*Hv0|~~ncgLpJO?sb>>{V^*i#<}q9^LIhjBRt z`5z@T$}DN392b2zCwi9<+3_;C_~EBp{OF-ozrwBuIU_|JwD17PkblEa0W#q`>2hqN zw*wR7<^W)|skAyD5{fBE1#RH9gqVCcne8symHbED(L`%RIXKGbWKl1aJ!fEO8h)9^ zH?89;UdZecmV?TZ9K`WCBx=pYyWOYZst`go-TFI1|4=W`<3a3j59@4w7{r#mo0Xk- z_2o%F5%#8$1o{SD)0&SD^+4~eP9Yl=!7drjFzzTr^i5TiPq?72(^2I`RV^hDtS zZVgWkWi%TK&m$gdP5)=h0j-4=fk=Xq+v%_&>jGo+dkS?tG0XU*F-O{-6qCx})1Zcf zdrZUdndSg|)O)(PgJp(w6;o~On*f0D16dU9$>vF!q5L4+m>Di)a)4}~2*?keId%T+ z_HMX*v!CDb&o&-!qJXXnaL4$c8K5pnGi|Z5THbC3fYs? z^L0-k^2qT(XD_`@bbj}Z=-NneU)@Y(tL};dwi(KHKrxc}=YRTcmr=`}C@BJtDE;Bv zaikr({DOc2;RE?$d-L+1OfjGV`&HKQ`$RdN^wGQPv$4 zTPNVd!1wU=8reV}0#(4>!9VP0uw~k{3d~GaXC_vsgq!+2A4qBlh^O#oL|}ox#;cY` zZLY`dP$Rj!8XHwuhwKJHYzCqthMP9bE#HR7)|!E=kbp}(#1l~%fw*LE##3~q~3Oww~f ztT_C^#FN_k*L$qHFY^8dRgo*Zp1!9ZK?Oxo+q)|t-b*i;7sn*Z{`!Wgn-XM@b=6o= zRBN2)g$Cx8$4sb2%7j}0QW8ScgNI0v2skEAy3fdG2UJ;h1R}4%s<_nM8c%gW99RNJ z12j#`_jVFE44QcdFg!CrEn@6eb%-pDih_6=!eszbT=SLb(bIN{Z(4%^mF(7{0kOLd zq5;DdK3#jr`x8|ZNyp(0fiyAm{+2$0dkWcF&E&qnlDZ6=Wl?g{VT6~c1XN%unH5Y&q5(9P^|I*<(8LNZY4)v><+0bm2E>Box!S8>V1hb}r@c3OoA&1-YQN zxi7WSOKLxc@ANnaQFVKL0V71SWa%U@Db2~pfjO=3kQKUGX5Dzb!Yno86Kb)w1d71? z=q~yzE83xzl59_=5cJ_`>>gl2dH86>_h>+0G-_c-N?(+aGNo=Ve#brwURA)UgQuRg z=h`_QXpM{&z%ZN?hbu6ybP9_|-vsI|^$IG8D`20M(kT8`3mz^erUL7-FHM3yyjeH{ z50aq3awz{oG%MNU*zdvm%)|yPFNeF2yZ&~+K#lxOR;p~Ls~2E<6w=+rgr# zwb)P)OToubk`sO$k(C4Mg1ZXDB2eh}feOW=zL4V%!gT&=d;Pl{s@jNveY37OE<+aN z+hI7Y2I4<5-3O>1wz-}du&~07tMdZC9$|8g!RwIP-=9yD_w-+N(!YS4jI|X zUAxE&RbgX~d@gJJ-Eeb>Gg!iQkugVJaeWUV*j`fdD+~?*W*gs_q6gB@Gz}lQi3rXt z#9aJb_ZTZSd!Re2N-vx8A=?EG{S3^pgh>ea%{@+S)|)=fse)18SuKiq6Qnwo7i2do zg5e?(&lsUX4^R1O&gkSaZ*b3gu@CIatfjox?NL2pd#qdwuWm2;!POJpv3y%Mp72-YGN>FxB zr6Z;r|s90 z?TGnO0g|A^<5E?1u}YWo>(8_H&IA%9SY*kUo{4zloRLcILL!mZeOY_0^aeXvYOUC_ z#P$XsAcPM-Jm&XBKP$4L5NR|0#grFi-Sp(>SsSuDAX=Jw7TiKdu7!8SQSyNnnS<2- z>#>Dm!$(I3sA57*_~OM#O=x!(*Qpu5+@#=M*_;#~maqpLcI#P*g^?6vi(GI6APHry zMsZXB*5_M45R6bEC5G4rJ*H&DIZ6q|2G`WE58M+RG+=``4cZ1p7vPog#Tv3x`)4Vc zx7!a2DMH18TMEDXdR1&Gk{+ztK~7Ew-6(Wh?n(Ib9J01eMePHw4Bs1`o9OvYx6Sj4 z`DXVKm_(v-h!O&~?&`Fw(-1^fvDbOKa)jVO_R7|*pjl^=uc1m_AjUg>rjx7HKzboGHu#Uj4|9$rN?ztjuHQczyI701vG6Awq7#$?j$<<{fdK3; zaC@`NLTlb91_w`w+1~)ILC<89B@Z71cD!zWclWVY?iP}LTf}h3Ki=)nUQ<{Xl-5%c zhMi9I-e2^m@`1Pacei^;hi(;up>hMt8cdCz`zF5LEfyxP5hWbhit7xL*_(gxgUmm( zNizW%CNd9XUY8Jyvtz3g?3sT_2qPXE1`-#4Hs4QI6By4I6)9q_p7}WmVUB|gukG20 zI}U+3Gn8VY*A84}7Tr%~kTr?p)j!De(YhR}JO5RJ$cftvR{6L%go2XQm$Ac}0kTqCULYxSI=exUR%bq83b!SD0O zGPLnm0Se(5sMcgi8t9pcqWTB?rI4KY5)GJhHw)YsXbDRcr@UWgSFyW_GuraC4kTEC zIwGiCYgHZ_@R{NEl<6J_5DvDuU9EGngG~HO-C(C2ll6Cu8-aDJ07eQkyd=)~zc;|h5(euqx;zyW@c$^@6YRX;{Q=YYU z=;NvETklVNb|XB)*0Ay9^Y0rPHIL8TSGZ4!1m476<@ z_k`HK=TDEWF=D4y-ho@T1o%Kc34~NlC?%bZrwMmjRsUbTCmE(A1bSq->o}%t!n6^c z0s{$dYxyE6W-gIay5IHUf`OnKOMDFy7b}D1IxdGm?lcQtw#ZdV?lk@GXk|or`Z2T9 zfNz9s7==1KB+fz+`}smj>NF0|k91&dFQtczt<}S-#SZ7N-5@9mQA9EMLW3jKD&z#q z*!th7qQZ}<$U?V2&k4L_{ev^2_8ww)$Rv~Dv&PSq{W;q;(?HyWDCwGdzk<9%9EPO$ z%#R*L6Q7fa=7NOBX-QmdO-4F2o1V_8&;5yPCmI+0nU1l$?6Zy>o-%}BK+vEO6$i6@ zJV>-BLehUeMFWG0w@sF{f)1o!lPO>Ono0(93a>$)H2q*(RQiqMtRIl0S|!tPpO8Hd z4eOQ|lV$}N6}pgfbpSbtfZ!SrJ2iF(aX6*XKPouZVgaHFQWEIEXLKXn?g1`>a^3U=k;z8M-tn z8F=XSzp3i6U+A_i=zIZ{pal8AR&ZsY81G@vz3pjVq z=)C_YQw3!wHTD#x68K)mX2TxwCy$^v-^($)tka^4TIuK^|AD%b&(V|c(!(t>JzCFa z!wZ6l5SIa{gVYqZR9pSCk-lv4-RIrIn+HWGSvJtl5C?$v4#ZRr2^;~iIDrmLJ9KKJ zLu*)_Q{!=D(@}Z>pctqVCjGVzZ?IK+D$F&OZNmT9aMlpaBr!?Q{F%q?F`l$7fYC5i zB!3DK&5R8`eg6)OFbtXG1r`YOK$)|puFu;D_JZy8SwH)i2}1Jl_uk%)9{JvGH4BEB zmu^89-Q7gbQ0U|TfpG;x8eSaAKj6IzzVbob>1f?ruwaOba|$UyZtpCxF9^Z)-93J$ z(EhLr5ssjarU(Cm^z*p3ly~qIV8F&_ z{j^fp>=>P5V`2t=WOa#z6xKNsM@TMaBvNx!)Qd@rPfy;I!5TKO>+7?Djy0@fCA4iY z(1V~$7YbYJWNO5K2R3dbZ+or+BqFIONtT%$yqR;f*urtjt1=uC0a1s6CU{&vLV*F2 z`OcxR2xK6 zTHcsojkIjUFgGClDXB*Igau+^Y3Vts(k6q;|DGIV$WK^ zRsF|ht)&=~(yy?ZiU7_`&($p z9a|rd5@qw>1l$FE!thD9k=hGX(KsD|quVO6;UoP7tK5F~VN-p;=GiaZS3d~j48Nob zO@0dkXu^D=E+RY0-`3ygPX$$1w_ETUnK_Uogq<1JWq~<{2om5>Xw1WVCRR+o-Iq#$wzg@x zwRAxNPld#eL}%TQ%SawexddC|5_C{T4DW|B#WnPIODc1E5j>&BJDj_tNDv&R-T&QP ze}Ss{_WEPLdDY!LP@`N~n(6HLu|v2-xwgn+q27|t8Ygo1WnSy`kMp-XAmGRW!tDj2 z7Q>sIYBPlmLmd8pMc@X^wQ6-TNDrGu{5C(z{*tl9fm&3UMXcK`YE#MF+97n1$ruZ} zhB*7)@GyiFmsL-lEMOevNyj7Qsk3a1(B1T+vL={Bv=BKb!n5796;{)sxP6K2UC5VO z;l2Iw(NvgU?BDMwjYul+L7-v8BV~l+zb51CYsk-7)rn3l%u8u{$wSd=sY!Jpqlt#G zMAL6K8>BM%HjbWYQpnx3>D8%!9YELAuXvQ6@a$gStU+#}1|_e{G00rJ(ZnGzNRd(t zhf#rVA9|-l=~4!yv&RFqcN9uf-v-wm^q^txpC9FIJ4!4XPB5~;EJ$zXDJnB7mOml1 zu5%SKi5_!%OW;^NeEQfhikZBMrs5Ibb2x0VUx@q>cBjq*GW1ItEf)!G&8z@j6!xqs zZ}Jp{sIdz?TF7eAybZ6hs|2T|wtAxbKr@iJO4fe#v#vg3Ri9y`fW!diOQI5JSJd$Z zcJ7?=XoG??%9&(%u}TqW=h-kzfu+V*XsnoIHN%g_pMitMa?;bCCa#6)9(ZQ87V``X zPmMSRjtXKa8i|D=6QkwUh(`^RQU(7jJO+)oB_Kx$Ez`vG-~EPIFV0-@2nd;D&Ic*u8ioI>+1KOsD5>+!M+ z#4X{hh7%P-0Xam~`Hu4_Ako3Lsm#}RGFt{q5zrFORtPSZ;Mp4Bp8bGziR!GA|hnWeBzSV>w@Rk^K<#v`+}(rsh-R zg%2=;WsS#7B$Zn3HM}h2bmOmINW{Ck z4B&60gZb*=5$R$+q=H*OVH4=Ak?{)8g_wyAK<&eWQi;alO5p(>1EZLMwWSbQoG;2p6WWv_R~+DpcookwQn#%T*de7ML0)9oU>QHz$4Shg6e)t6Um?6L<7X6FUzQv%=}%zW{YGD(T6&i$~Qz(z-z z@Sm_{%@jJKnV=dI;sQ=FEdHV0Kv;P=xRwSZKO_W-Fczmq_`v7`oW7v&g3L6vh_UN` zp}av^l4I&A*P|FqK(}!V3hq5r)FQ-WkaTEANkxTU3tVi6BXP(*`tttW412I&zK5fM z9xQhfgAV&yd`)&b_@6EA0MJu5^X2Y5nuP)>B2LP#1E9bivri?7G8VxNJs&g2CxCW| z|KvRMHV8A%YhmgCM8hU(dTv_w6Lol)Zn&b}i9Zz}9xnrKdcr!$$OsSsMX`N;5H_;j zyOiD=BMW&;Cgpeq+m7z;fgmbtvwFD~kIv|9dIR4+awADQK72Vg@#6|{Fa0h9u!fTW zwBLHU0R9-e;n%703*^7_Yc&~Q>7RI6Dqcf65Z+tLut;7Zo8e!f)4}pxS+1Iqo~ulk zB5xzbNT?mzco|qgE5_xW`c%zJ7oBMam7)b?1AS2}8cJLykC`iVGS*oPnB^;vc3Q0( zR6fKV$Q*Xb`?b9?-(TSFP5<1eZAxm(DC3}Xop{{Q6OoR2MG56<#s6QBtpJ}neivhL zDq#yt%pM&e_+^G0cuOdas27-ZGS|~~0F06BySoNC$3QA~ie@G{wpd!M!B^F{W{E0jUXRl5i4dtvM%0SdAb|@|2KD2LyjX$!1XU{Q6 z#3hEYg`%tF=P+8&4|I}ugg%-OVh;-%>@qfHDVIwM3L0q4jyrh@9kfOtLptdYpTJcV z+HW177y?C3&O9cm9eSgNa@|$X*1CYcuuJuCaMS{_=eT%L*kK_ z;EzlgKTd=aPtpU(o@yxqfGUpkLTG8CmML}OkPCuQ?@xljC1hFBq9Fo`rsuHfG7>+qzXkwbDma|7`zxLX2fN+1_j1J+)6 zq)qGRITv1t*6%)&X}U#zw4m*f-*S+tN0?1^z)RfAs{LQNJXpNdlvm+XOQ-{+R7PkJ z&msNPf~Du;+QBM6FcNKLQb=QKHl{CRxm$WdPirJAFrIabC|(ZrZD?MH{+PFfo-FW9 z)?4C)hW;gnwQ9QzmmL<_Vls>~*+50DD?x|9V`>?gsH5bFFae zpyDn{NQ1}~h12XJiWCW35mCNXfEbZ8acQ=iWl*g3b`8sSa<)znVE}v>icJYe2aJ>9 z7th3Co*}t{Rl@O1se2CM2Ek+NM-++h&4NeQ{=FcAbI2P3ND>=O7UJng>oGG<;E1+Q1-a_kxE=c^fr(>X(CvSoh zMoXz)PaqjNTB;w?t{CYCkzhkD*54i|+hon-&0V*HcLpN^I_!7u1c~pqEfL`+#<^+e>g>x^xYIgHqfVkB!A+j7iVf7li&PPegp9k{I3hu=0knWe^Wi{NTS zRYDn`v{e}A>S>WrI5T)J&Jwkrz=qRqvkwj-&0{Y9FpZA1J%%P)wDg7Wc-ju1zYNoz zm2W@Y{@Q&3vtv-n5V@qT0v%yE#5x$ zS4(;S5^U^>N^XETp{K!Ei>I#M!He93Nn0L&;bj`CY`6D)Z<;Gi2@KDK9F^ii0hCFM<{n=}wc;AWU^-xlmdly#)pnE(S>8w{6;y zxirpWW(9F`V6OtV2f7O2Lf{``LnqI$0Sxp17o`rKE7q5plw(n<=7$A{9Re_pn;7Q6 zaiJ8LP7%ZLljKUjxqZCZ>>Gjw4^ZSO7X{{%BVWcYqHxRbaN_;egZCRq;@DZHuXjAeXLq1Vu5PzmU>15yYCQKRVl;l>ADtvfJ^-nv^bue~Pi))g@ADzNuDS45v9)2KhacMOe#`Yp%vI08w2j+N^(*om@fo*e_;#HZ1=e;* znjF~Olfg-IU*SLr;a@njnM}$V%AQLunM)71EMyN}bzA;ae_Bd633DKK49iCx+33q1 z7GDOq=k(#7T>eu|40!Fgz4ooU$Q>fkrDksfF+9==- zNt@BvIq}XDnZdu`emdrm-+Bfu43FriNr@82gW75OhSBeF-}GSo&F^6ehkBiv8So?> zL3fHlWU{Vu#DbHdn7s|WcUifo>P2C=0Rj(fg_YU>rA2diXvZ(>IT~(TAGYD9q`pff zG)RFk-EfPdPrXH-uz`;wbj|kpPyk%uKrNw$4sIeOmf)*!YAGhCw$MK&wHPME2k*N* zaYnqdA$|1k{FjR(>j)DtSxttFCZv<$WnsFHaD2*U+Sdj;i8IXOWJOSULzufWR(b!B zV{dyfmlIx@A43HSUe84u@$vU%BOg_)ETu8CstGcH)`kGV&ay1*_;3+S#&kvXiaxdb zxRcxP;st2mFCuSv2C+oc+Ijs!*|kU(p@_gyEa7C7Wm)Gd$``5bK!yay8|!#rTfoZ$ zP)z_DNZ1X?4A`WP8crk8FE^V@Bhj3-V7&jF=_UV+uSp^wSW)CLR~@kw0&~=jCfynfYPqsH*ll43L;6>gL8LU{f>*wn zpkafD2sOv`FI97JUZSEFDAPsX$H!j~AaGJJVLHR!MmQS!dTnT1OCqLdZ>*KFb;ZzT}X8 zFVG<2Lta!+TmwQBb_HOw@t4!IvE_<6iwMY$g^<&dNjK6DtOSk-w+dkBhYO3EH1aX* zmvm0&1k{7WPC+WAr9j3A)Dlk}2VlT{5%5_5wy!wX`_C1oRsWe7k^UQBwXRE?5y1N- zoS=sev+#VonKcMx83eqlEIEP4Y0yyCUf>);WROtdY$5b6!qE7;b3kvhs})H8?L+x@ zl$*+Hmv35;;$aR}obSv-?6QXT=@QDc{*{soQI9PvnE9c2N{5=Yb28PIV<({i)!!S@ z0GQ7f^-ZWTN5FCs#S@nOPlTVng&I>-EueX0{~6LJ$z&`Fr-`(NFiN625DViot8yd!ZOBd_GQg9C`%CQqh_W=G$f0QDPi6ns3Bl6Akj}bW3oXDryuMOdZ37V=0 z{*RtA9ulA`c&=;?Cd^v?1xbS7T1K*xPyCP!z|XAe6L9#GmgWlgn%Z}=o0Lw1F15F( zBq4`c-qhF()?HL#dwcuCryHskWvVUgja)DW>*(E>r8-MoEa5F?M?HPgn89};*)%mO z%C5m@&*ch9qkl=dfMm}=L}f|-h`2j4oo%KL!I7($z$JC5obA~%w!QRq;oBgTYD{Ex zUhdbsT{>R=tNw;*;N@&$CIhJ4f$Nuoag*0mmW$BRCdww0}4|qDe#_+ci~ zo`cl8mZ1!C23jieVEwxf*j^SC0~TMGte`~=hBdSr0E+QI_ssSWcLq~BbEX~c6w$S> zYG`?(a>gDE>ol$Wm=rY`tAL-ICt2xdcVwTD^@iN20CJ9$gTE&@euvliXhdGN8JSuL zTi_hz7$F7?TxP|gV1 zfV_^62GC15iv(rxOCuh3AhwUc{q&^(7`MVaM`0Ezk?{2=QzKsDvMinvBT2meaEHu> zVJt#0A5VGpH?w~)W)xE{Nk{sq)Q)`=21aL z1y3r;qgFxaSikvy(!G}s^6>0w1TD&cZOfU5TuTPIiZ3%C=mE*nqE~yA_Q>pW2~l~q z*ou3VBM}xF)OKP!zMOC>q5M2#CH94KTu~>B*{tGMqwc}sMPc_ljx3OjuA)qhrMy9s z(@wwPSQ>r^Nst`g#54zyC;(h?Q-r4{fg5%4N--t!mhdRNctKS1Vr9Vk$8f!2lcwRfvDR?l+NCn4y=IZXtdgb@@PWfk$Mmp)A?P zhkTlduGTBU6BOe-fREbO-|XH|ACxVq#|wgYt$y6y0G?*iE|I21G7sttf+x^V*ys;U z9TL9~!nPYeFvdpoB?`yP99o(nUMFpM;2>bm7q(Tr_!{rMD0A?UQqgW9N;oy`GuKi} z`q|aE=zm)SJcR-Q%7uJr=IQ#62cr#p%b#xXA8a>Y($BK?i8?`70}~Z>fmJ$&UR$Ka zS4)MAkO)X4NycXWcZ8LxWDblIIblK$_~7F#P&Io4io?=O^Z5V4Qj>|MFAAw8J3^w* zG++}-Rhu$yybV=ogxpXfpd!lO7=kB00x8EDN5`*>*ZnVV1YOq9~P7NoWrsXnL??0!Z&oeHv~t0UkqOxl4veGt;p zD?t0XD7$=>xG)9`phvv$-yi|Rq{|yT`pFA9Qil3KDG~LbJ0L``+> z1C70g$C!-?Lm<3f@g3#5>L%afmuA*dO-?y_v|X(>JPrOAoRIuX9~nK@6IkON|%H(v7^;6Z?hLhbVqJB{b%CM*SmH9T0alFn}a#o z+^tb(g`kxPXG)1zR@8vuii{^xF-4}r*F^w9`V)XYIA84-pEjtM<<}U=3ckgZ5~a+X~yeA%KVMBMkEKX*+SB4yy&+ z_yWZKwa_`ShB6FpMJrDp2gF0tFDyw|$1 zsMgx9QM#lK*GA3_U>4;C=$={p3RgL&M1Zd#Dz%~dkTL~O1V}$lUolW?4@IdCkJoY6 zQNC6eWRa+IA!26_wuwinR1Rdd{D}*BY?d9FhIZOpBzBGsQ(cbsA^Bzyw}{CsYe*}@ zt0(cDqxA|5yzeXMi8v#TB72p}TTxwCRpMUA~K9pI5FKFStqAWdMA}s1%32;l>jlP9nEA4Y+ zd0ldt#gx+$j9jgxJMzfu?qG0Tn{Y7(FeUoM;L4_w;PcRNf4|vOXV~wv%BiDpYX@vMs=|0_$O^$9Gc*|p#0P^HD`rD9&I{9LkI&hI zYXNIzPN7-GWeeoPC)AD(&efoeRT;-{a%v1IYQ~!g8v;gX08$=JF;}vQ%warM{*sI4 zn?AUX*WDM)X@Sc0cW@PZAkQEdxhe7n2^ep-N{aIpedOcy*P91Oy*z;$sKAF&Im|8c zO8VTBBUuY(0UTmgBp*Ft;wggQ9taI$1xwRF*saBi#y>$g=)cn#x{~F3T~$P`sD?=z zql}}0c);qx9QdlDE$C)8WRT!@lVcRMOGA!QXu!nTIfR(}O#2U%HY$%!c~@BpECm>s@`7$J8zzoX#L zl@A@6e5vg=wMv%blN!1csH#@hqster@ zl}WZ_huRk+DX|R3%U+I8)8p-YcD_K@QxUu_AjzPZIvu`Kp@=}rSAqei-WFUe{9fpw zPRG3pfZ!=lk{P!VU!d!pnY6Enu^KljeUkWP#<^Wn97WBzu~Ns^1peG%OHbnNM|X^m z$~22i%am(VuUx|5uj-8O0qMQv)xRq^QFoTY@E?AKrz8Y4PQ2-WilU&-gW`JR9El#s z_gs*jw(xhg!#im%Jd>Oi`m3jf-j9Mh=eDvHsB+=4&y2zZ&IDl?C*a022iUG&a zH9grFY9EQLFJYbXxwk_n8kdg$s_#Du^Hu-!>)!?aqG*i!o>Xf9f`Jm)NQ4t*W2&5D z*PicHL3g6$=4MNH8f0R+6q$RSq9GJ?5J9ws@w3d`?>^s6*P)_liF?yF2+!mgTpW?` zo!MFsk{aR0VzqK6>EhAfmuyWfZur2#@le83k-SdE(e4HV1L7m>ukNYw<<}vlX_pkk z)S_x2aBAJ)mVN^HGf~O73;;7V$)3-R$%VIt>jE}a{Fm5ETdXn!m%){*aM1Vf`KYx5 z=){GnS!scJj%z77h1*sCPD-JMaCN5%9qJ$T&mX%l=p7SV+SxTO`Mwn_-?$d&l*gH} zIhuiDkELqGfqqk%)zi7wKQIP!_FXZrD|r16_k@{TSwKO$XJ>QGmNJX_3gE*wVr`X~ zgD{dxhn&cCG7CctHox6B?-9`@#inz)Cl`RQ4yRF9)bWARM^WjSqqEW6xj^~y?e3%P zE(8c@iqeCUS;N-ks2rM-J*en{wl5f5)oAJ7jyNfJl-5wffk}pkoKUOng~<^VEmiYx z+y2Ad18(WIcM zsG&7*1@FF8@9uZ|N7OTJ?>`{DzJGsvugo;VjNTb_T^&)kRZaQT*vHz}Mh1b${clnI zriof0(Rk*~e*SHa=8>ftA$G!Q`TBO23-V+VyeX863GD z3?!V=S08r!!2Wdg>Gpo3wba4zkIo113xar?_=ZJ_&Whj6rQ%3m&(rC!IvStfYZ|P% zkvBwqLE~e~gzk({_$C5(&Be$;EpwcRGyD2HxSc{Ds5l6fR0{&9!Aq#BECw47nU)u`@I^HzyVjo;Kkkw&nZP5CV4AaIt8es}E;+b5nZaBPoxIbAo z>vi3f+f%I3stl>X3h<`w?jMfaeB9)})cH;YY$&Qx;l3nPw1uf8JY~nvsaS`C$a{=l z9)|K?ywHdSQoJ*H*lNHX$aX+}fM7#LS)@|O$d-C92?Zxc)=`q#mD1r z0%<@)z?ROmbR=8{mI{g$09vcZb8cOqDQ9tD_z&}OUs3seUkq;M( z^<-+ikx2i5N?EJ2R9yui6*gG0)U@hmt0>f@TnDn=mgr4rAe36p`X9Es95=`+Lz(i2 zJ68*goVb0g0sQ5N4*aUl*)imM(m#g}mduufxOPP<0=M^EoD-4Ql>U zB^kfI=gQyT!Mt-k|Fe4@>Iq1ci474ef%JBqSGzm}^@GOoe)-D(CJ$*P5F0eaK>yS| z&L=rbe=4L(Z9$&Nkc>KGYv~?qxa*dOJSo7%3%SK<|K>n-NYuikvo31a9H)C-zN-I<}`>23-90SH?Ais;v-H=;#Lq~J2=Tosx$zqC zFbhsOir%UDf~D&GkyHwr%##Z|VxoQp^vv*qr%z7u>^WtJAE;{IQ+=q%fF|}`58W|X zvN}HI2gOWyFDQyszaJjLO89EZ`e5}A4^I@W?{C-r z9>zA9Yo+va>LfcbP*DydEdsgc8vlD}_v<ELi z1Uq?j3?I3qI<60#n$!ygU*9&{hAvqVaXv;^fT^mSurwf z4r^sn4^#f(ix=i54ib{~zh71(H2f+*goOU?29UnKGyWfgU9!Poc!KY=D=CCb`^ZIq zSlr?1#RRpGVx1)R$ax7pELKu%>MN2whxh`vI32}rAk7NhPs7axfN>m5pA(f$tl!^f zt^a*x&;soviW7Mp1U?-j{j^+SS%$~|HF%$GOEKw2#9S*h6GK;Yx1>mk^3wzAoq>6D z!Y+!fhcJ1M!Zpvv$K7ILRYh8IK){qo64AjfBxmZwH7O%D^V5vEAJz}ujHb-^3;!k= zh27eGO0Au0vwLTDCwzvYJd+l#G&=k((TSKd2`_dcC^2A&R4ERq1g&VB?%KoawzOkz zU{46oWNh{Kh36J97^rfnUSLgNeuZu)e3=%lGEDN@s5726J?yPvsX}4q**E});5JH> z1<+Gjg{Ff@yIUb{$HYh-+AY-0%AwjnRcmB(aah?2T`2ml(C`$X)VbwsjI@vj_2TLc zoBzhe1_PrtXqN?ULIVz$tWkK#mk$LYjzKKl4m>cxtX|}hAUaeM1(+|=>qwR@2&VxE zB{wtl=&3w=RtjlGEjQO*hz8|&q&a~l0xS(R$=*(K09WQ-7Y8-hcA|4cMG(CbKD!SA zmFdM66&Z;VmiY>FC)ADJ@QH}=l9S}a?ME~H*Yu?3j3oS-$H#oobV>$2nuygP%cfnT zbbWVsM|_ZshC!sj*^mxdL7`nNCas*oP*V%T5e6uXqJ$bRw15C7^gU(CKZ0)wH1PDg z%^HUkaIZ>eT2`W>ao7nWiXehYbUnUGD@zgi15ngduBgdYa3>ZGc|oF>U6?sfYYr8k zM;G+$^2SSFfj5Gd7X;YQlr|AbA2QcSj#xf>ceA~1Etidi;w`hb-*?7;L|_JnJ=hDe z$T54pFJD!@?ERbiac7fYFbhzr(G|eb2x!NlQ2%B84UVSxprmr85DmNry6U)}8i>Z$ ztW?g4qt$=Lna`U2-SzI_3Y&5e!O)yy(NIL#At;N8R@$mLoiJYI+v|s{0*jZjd1l2G zPUC)kzq2BJ8md?tJv?JzI>-~mVNJwazG58)ni7_wUO;GS1G zRBs8so?wZcO=*neKye)vJ1%OO+sKv0-~UVWVH(h6(2uf@fOt2dr<1$e7XFJDq#vw4 z1Dt30Dc$XU-OMdr#u&x{@;!)RsEThH-k}{n>#_DXD(ck9&=I}`&@PfWa0}_&s1B)= zMaysDkuuB_XpqjF{+6K_o0uNO=Zr8$Lo%%Cju=Oop=@}r^3#L9oh2ijJx9QMaddXD zry^>IE`m+`U@%eOdZ87rXhHBlI4WPf_@y^_9Jh%RlUf2z>lKjFEkz6QeUzLM>FxX|VByt2?f9g~T4d_9h)rJdSGICVX zLxz`*#8cU|rA{XDO&#SvO+{?*(?Avt{YT`{Po%Ch*wrP3yOj|UO1YA6b7$aQ-#Yp z7+YAR@y)NY&rUz|`joH&?rm3Q2=Q#NN7#1BSh9>q6~y9>no)8uO}U~bnHoBU4AWmf z6#xi0Qb4cR?aw)z`mq3Ve3WVBS2islzwEx+E@k}=}V|nX<;6R!Kdu0Uxdxd!%24m?* z-u>hLVT}nvTnPi`V2tJjsyChQXGCiJBY*Dji|Ok3!ZX zC+UUlVj@;KN!Be!E5zC924N%0IGPvCvCC%konx$dml>)-HXcK~UBKNAxJ(K9brTvl zA8orYC4{)tIepzrkgY`36u*GPKM08Qcc1j0;LM1w6K$ZM0mljKgs?-R`ksCaaTE$+ zU^k^I7zlwQ@eku92woQq2BkI>R1h#3Po-1G%&1)gcUOl|h+cveiqmK19@dogI{F!2 z56&{IJ66i@dxZ!6XObu>6TnjXf>%2oh+EEa@Ze+_3xJg2ZGUlcctAp|HxdKtxLCw8 zGWqnlh7K;r#5yws^}mA#(LNZKQHq}~$qB;zLGHP$hyf?FlBQITY1rqeR{@<9kA&C) z-!5%Q3s#Fg%hPbrlK(2mC<6}vx!_hueDNY-@Y6vE zzk}JATk!ID7Le<$@kbi}(i5I%CRFGZT|O%}bkL%lw3#zY+hhNJRg8XPlES|Mn^&=9sw& z$8b`7EZQC8qa6LQ60jumm!VO=q@o*$+c?UK9Lav$A5w-Kd|SFw6-uI<5+uzSS&vntY%*gM=6W2eK^F^G708%a%v2l zEM<;~#40w2DeyHqEfIYO1`{%Ul4b;{U@=KXRnA=opzzB|JKf##C(LR8vq5ABe4g;>`kS^;g8}Hr>2df7|}TB2&Oa(W)BKONpo$NKK)bY@n{kR z2vxuSxQRGsHh>4LYzUex2*M*F?EU&P;PBAZa|6|w$XG#}@S+K?hGUQ&+5t(HK|EfQ zbhylqlA|mH$z^K8+}fgAPMM`9R)ovmV-O;IqDRY``a2 zoh)E=RF20!V66exAXts=CQjtsJ~)gz{fR*oYJ6d+MQaDdSp$~E4(04Qp|>S)2voAk zdV}xAz;KHoao9{$Nax2OFAI~v7bWh32rAA9$OF9MRvEa^?hrzT()BQe9PBVvj9IK0;Kfn6 zm^l_t7b2krU~G^%aa1SeB}Zr7AAHWi!I0#MB59XuPxA^u2kaQJUz0MY@PRL-;`p7w zSEml2Y0^xF3-Sfq74$F&s!-GAb2J=3N3~(~=DvG(dt;2GcWBHkXrjdMUzS`gWJI&r zL%Yl^}E+3fQP zJFK2>^_Tv)x43g71Ng+9^YzVg(y!m%X?3HtH~f1*0vR|wyd(VeZ`Zdga2z~gb`=ql zcHL8mf}2Mo0!XjzI9&bfz`DEJtu_@bG|P*w$gEy01D4c$!D- z!M1en$6v6up|GrNQR^g)qtslPoNx|J&?YoKQ1}i%%#gY^ypejQoiOGr@VoFlNmmnN zF|;x)qIR>R>Pe`&{QJ8W9i9({Ea15srVA{poHA$D&Ez@FCE%jNovit?WuhbkU}jl! z-^3r&4^MBianXbCkpJ?x$K?u7jX$9IMJpJj$`Tq+`$I-B2@&$;)Y5ico)JJwdv-!* zDBJ(Gy9=xW8dnQP=fJ5;bZpb-71TL|C`8G>A^+wjh&`orOA?c` zPTZ|o*RjvfFPo$my2MgN{ea|iY$ryZyb5tr64Pkg+<9WH0G0`0m;?=}>-g-j9D}1@ zSY|yQL&tgbE&f!-^$0esT@oCfZr5x9Hq+su`>aM@5n5FhTyUgtQLzBl^qzV)3PMCj z630QS63p=aH%bKn4wqa+2~BUvt2I>HkzSOLsnS3G=8&;uiDw>T2RMACgsW@>7b6ZrO3+Yn~hArI1&8dbs&uSYsB zx)8h-a;#_ohN;p$@q`>#R>^PxW2|7%6)2~(F}o7EXexpV1Zb!z4zD>)KgI2x9UqNV8K;b}`N;W@5f5~hRn*}uF+5jy-DEbXSdjm1qPxhm( zDw77N{nzLeOk@q}(+gHD;~p9t4yH@w$wRsxq8Yfu$hvilp`9np|6<{pcOpLTIo}mF z1fF^0*{0oke}1tL*vkNy_eDb?*YlcM)Q&^1@FsB_ov& zGL}@qwbO0yzj8^se?r-c!Upt{u!2FRGrZLthlYzS!>k;K`xiRIW4(_b{D zxK}4@V~VH{F*iCHEMt;cRrtl=r^FB%fl<5x!D#;og*ebT9Ipf$@)8NB@W#J1f|<=a zlo`q!I)&IzAR;G2#sJh_Bp8Ey2dR)4m7gP((CEqGN%K*@WRCpi!@^)5i|7T&gh_{? zcuL_%7CM(+Oumr@`|Egp&c?7>3{oh8Duj>WrV7orDRsnQ{ALozMs`ha?2PyQHEZPO z;Y%kT<4N5RRk^NV=b;muBECN$RIGp|%Y(FlLpdCLO6}}Or5UfKC7R5!-8h<|cO_Mv6S|G}(3Hb!4p$deJoWiB8CUB^**zI&oTKCljO zBsJXju^p}Tn7IEMiFrq=$D|qvNp>d|Ao{!U6(^%-7IbZGK)|;P9asXSrxYECJ$%`# z(8a-y8h)5Fs7Nh}#s^7kVsbRK$Utpkv6D6@aFKrPWN|dUIDX_5V5)2x$2CG32AU#D z5|Tja(iWawLJo1=HF`N$UP->hW7P?zUUK!ytRPG)Wt?DWJF+ajxW?=}Uq?;XSs}^U z^8^@CPdvDTU=>c9@U{!@G&)Q48Le*=_|EqT`2O&C2Zy(xKFbO?B(#!C&^@G(lhfy9UKc=xXxBKj zD7PcSJGjkBt-`#XD3=F_VuErH_*x1Pz6qJjh{3V1wOXJc=vu#&pewt4C}BTqEI>7~ zTxaA=(fXzGEPT=P_y0Nv5MSrT0&th`Q{%a;^*rR=SJak3x==6JHxd&_evL3tjIL%a zkef)e#lc4$$%^bK-oxT!QP&N*?@=*3+MbqmTnP8b!z#%(;dTZz;f!Q8( zV2+KK0tn}hxY`q^)4q~K?6zAJBnlcn_^ZbZEIFeFy;+G630KoN81peT*g?@S90j|P zaiOxR%2h`KpGETgTud#LLS+r8?Z*dzOp~&`nnVt|Hy{>Bh)&u{AzTNn7{~Z6O8$B( zH9KWGD%^Jaq#!FZb!exad8WJioqV06li*o437L{V6|xVpN&{`lbvOMiX$ zB}R7u#lRRw7HUJ;jaA&^KD`%Q9jdru4UIKKQ=#F5q*;~=q8stCJheb;0vDqv@7F`^ z>QDLc$u1piWj{jx99#J~pDxQr=JKSZNcyxWSClL4IA|2Tr^7uz{NTELODfBWh$*$n z0aIZkl$3gax(&~r&2ayGSUYhNDJ*6T*ihh4=S{JFAHfT8OjL&M_aM?Ox& ziA8E^(Vw?%H@8H9N(TA!mlXY#Q19qK%a$7`h^b{%93nm*QN`H|*{2x*mc;tja|wiv zb?+=Ww;!n-r%g)Bh^P^-W{nhJL&wAIRA{4iRWhE1_o~%3vf|=I+{mA8lR%_Skr->D z&S=N&Eb8HVl-)_J{hfas#_|3Q|CZ_X>!EKlJ&VjRJ`gE9djNnapiGiOuIApPEPMu49v`Kk>kKDt-fIL1l+)Yb`o?bH)?DPBAD(=wMD9z|k8AON+ z=pF@6$W551y+1WQ)$MOCPX^P21VXt$5$s%qNB;+?;>qlUCKbvNBH-KHC**1WAcywk znrZ|5J}8S|G%#;=OtWX;|0&YH-@SV;P#caCh1oszg(Yc>_y#}ebiGb8Li43l{~mTq z^=Y>;KNC_z!dJwx$T(-Q&42Z1Vu+cr`q@nYS{7>7MN#Fb_foNJo8T{j`HAJM07AB+ zq`kr+v^UG$APx=Jz9%I)`{*+dsUj&v_rAkYsQ*cn^trYhUm-w$u4i!Es!Pu(}FE``TU{08_Es|DC}^x84V!o$I74skNy<`Kj)*(kEZ zF8Sz5gdX@a(k?(#;N(LjCz(L`vr7sJq@Eg9(r*2>o zK5URI_}c^7hlA{iRLe@|!}Qmi3-p>!CCsZFV^xxC zAREDG+EJQ@6b7&dFWKE5f5uU*3Vj0iq@Wsr9vydfzHc?6;G)avm zVOS7o-uYA~H-5G0p&p%*vvFMt&fp9rc>>2<2C++Wm5EGohAhEvGZOJwg!~ED0EMH; zbIP|AimT7@QkLM%tCqIL5AZ zo?9Hw2*P;1Kw*kMk5fJYBD$i<*{RNzPGd+qX5F9xj#R{<*t+d(5U?2oSajS!m z>79`}h=f<=OHeWNHNcU2+RP+U9w=gjI15=i?k4^t!Ix#ZUQFK4t%(tE2xGJ@IXU!Y zxSJWK&1w4*?zRO9CbW{O?Y2wCmA*i51)MUHPs{Dq;`XiOBNQ-?`p@x}LqA=Ohx8Ic z9cxGkNZUcg!8T7`K%c*o)OQ6rzj4@M7!zdiMs=Df`agr(Bcf_l7=_Ty(DE(UJrK3z zxfv2R&v9AS!!U{r)&dV0{ZkMI(uR)T@_dH`;1RtiSdKmtbll$kh`h5}s`MmH&J&wY zJNOahw&Qir5A=-2@Yl!>RXNfop~Zl=7#^Bf9^l!H zi%X9SzAC91p=2$NnU>JRWIrf_AR|GL3$iw1hRrg4N_JvSa&LC2ha8oxufcfq)p~SW z9T>Q8yz)S|R=SqMZ%vsePghnx=0JVOwZ%L~L*JX&jq*I&j;)6O%?u!y4ZdGui?GJj4m~DI_2m<<-Mgoo0N;?6^pFR8m7n04v$pEWOGT!@CdUO%mb`HP^K*P@2 za4n7CX3cA{!%hqkZf+_@u%)h{C^j2h+a*-qc0_8pQ{BrJsV?%R=m_ux*+m?-HLw7< zbhy&&36IGwL-k1pv6aarV?Ouy#%HHoB*AyIKw*@LPc_ehrcB+M$@iWFq`;{P_!YkS zZiz~8=<7^gc=2PmdAWfkxxXi7OpOlC)(|2(!p}1ZT!K_>!@tZq!A=PiqRD>hHXg9= z9>duJ^`p2419VH-@}v=F@Yt@%%&xfa|Bt&JOZ)|rl{HB|F3<4zkOCQg@LWhy>M9qc z<%+2hdKUUe@CBqB^uzl7qd`hh1_l64eKUzjXoUT{nuHGPRG2;u(a*+LhSS_)Fm{~J zGXe5Za5@&y1oV_BrK6HTJfd@I51dn(kefYKBygp(p09mKxRMuyt8$3K5CjO%+TrmO zt~g6@#mw!BvaxN6{xEf8@Cx}D1Tr-Hibw=%Ts1FVyu`}gKNB!5l_}WJC=eIzNgU@` z$ui8{3~(hc5n}}Zd$rx&^Zk~<9;OcrDWu@UoM5Xdh&tKcoJ$&!l$sU)#@m>Pf6oXM zVf;{O(R5oP^I3d{#@LGvD!W8RPB(3q2CDIba5y46aK(79^u)*{R*;cgZf>#eEgfI1 zo2@d}L`14S4^ITAC*FX5vJO-&r|-Ee-@x^OGx0$60uc50Fr{WyCJ+rmB(e43RLHU) zZ}$%z2(p_8lmpRLio=PDQ|m{D)xW`?!S(U6j2F+;R^@+w@dDRqa<>mPu7Sq1&nRrA zN|u}**@I+=QV4do7}H`|JEp{j{gxG zGq`wops!$5${@spCx_wj?@S@S(+I%s1|Gn9#!ten(Qs=d^>~E|$P03;eaL!X10g7i z?7A({KQU3(4tX-od`^`!q+^gsE(9*Omk+}+GN5HS6lfx$>EGRV3bzyU6*;L8fE6@H z{-Bm{YP@HepA0;>y`|3l@m|a#xUKgXuzEWS4{i!wg3NN#NQ_W%RPU}g&G3Ck`) zDOhb6D1srvm0Ywl70C+2<=L#|mE~0JKr4GiZ!8oKLV1HzOYs0Nh%MVNj5{)Goa@vg z_=@KDCR0Fi29kTkqL45z$Qk+w`UT;@#UpFPEEd>kP#@J#XD-kg0ZJMHO?k;G2|%p!w3XOfk&4t z6Mxh>6N)TA5g$4M^aK{ZVwCUkTR%mwtw+5B5`A#<5UgT`By%_zOYK;y`}S`EHaeqM zm8}6hfbRvIxFOW(P5sXJ+=MKLAPYJ=d9lIr9bRCo;^|U69bsn;Ch}A@*nySUm8oA% zh7>1_GryP!XC@qhgpoE|FhGdgQ^Oq|{4>z}F`!JS2CI&eI3%pM06CL00;{YE&fFfu z&s+uqd!d9`CF==YTh(#UNBif z>y^W1g~*4kvFrffm4Bq5i?jA0yA@&6J^K_;h>g;xI3brI#Mx2vi zp3;#zl_na~B@j~d*d;J{kT*ox$T!&YBUz9o!*0HWa*&G6*v{`YRm`mbhQ)Oakc+4m z0e;+pMQq=emoBi;Sm0Lzn>G)jYfRl*OS&HiIX)CbdQ}2_wDq4c`4kutE+x4}jHH8^ z)eo3sT2WYO4kH4yQ3b?p+Kd|0oI+Qq4ZeCJiWa;SFnmO&I%1TeUx~PZY{n2C^AJo$Z})<8-8 z?6Vcbh@FDd8KSrLVp zEyUk`6|smg+auD5WD77kKtJB^A-**HFcWCXmNFY~T}8MvM3{_VZCRoVMzI7i^K=}1 zH|x(UWkNv;>^{gnYd+81d$Ws=&=rK8;H(yCjiQ+_F24El3H;bzAdaiRP62?L=_PBS z03dn4)mETCYbBH++SfGXRIaFIw_Bd#GnyglL7fAMgz=SMi3-9ihSC}OElNoM5qg7K zTuF6MZAT(ZK8g%n?e0F-SJ-#=XU(n!PzGWrIuD_R32n!))8RT9!0KjVOi|qxhn;0R zKomfo4q`Zi?KigQPM;1PnL}I!4-N@LOMu}88{Kv_g(}FsBTAW$SaLFF#M|*^zyn}) zlEmjh=sq&RzBW`RBO{eQIKT(G&-~(w3@iRJ;2hY!<1Y?tb@;&}+qK8Cd8|MupkBk^ zM*$6FooV~iDru-uNz?Qwf1??L-o|v!hqMkD6|m}Hf*>KN(%&GNEpELVT_?l2>6((|mb9<}OP)j7*`~DL{=)&n}b0j=# z6-HEK6o%t!ukl2%&C5!bZ;fy|z>1O*%HK(Z)M1tAd~`!<|y!w-JQm0WNiS-(Uk z88HC2Kpn{ghb{4Z-UhOP(+IEF;UVP;;k31Co<)#Bx?nY9hwhNggr+`*cwq{~97yP{?txcI41vF_@bQQHUnzJA2W{ffdp~FGJ3<5n z1$dBCz!gRMVOS`#jVhoC@8#ZLIRWn{*1_sT*4=+AaJ&lOb@Z<3m>6!1;qE?tF9exB zIG8WQPPkQy8WnqGit7zZB;IhW-kM0mOU=hyCc9l!Px1bU1rQ=@_J2~iu1UQ5Tm zJTQJF1NKs7|03@?e%t(jO4k$40;22P7TejH{Y%+bhF~!Zw#rE#5D3bKt_0f@!|}ui z+0;#K)1=}MDt9?uq-%SikKyxvcZw(j1_VM>B(;VtrGY zi=S$6Z2+sIxB&7Y3QhfaI{^b$sQJ)8kV$$#mKi0gwkNLyp$LpYdHChwz#o2?@yUpM zo6`cbKRo3vjF}vxv4ykU4M=^3kb(aZtII&Ur{5~<$|2EJZOW_KmL&Zuxa11z%<;zC zWQ^vXYrwcbR``kg$d-AvAjEjEI2)JrkBR;@4n?2s_k&y!{lwTx`6e9rFiJ+>aN}37xx6i_6&-&sg0iaUh zqXq=|Df&s)Y&>$OIXv=*mc+Z>+3g{D6hbp#bg+-(W5Le1HJCDih&le$ib%oDXPp<4 zXjw)gO@&yb{KJ5xicNw_V13^zOMbKxtz%)i`v0hCH=mwL>2_to^-bvylsO8i5BK75 zN*Yb!@-^O8hb+<}@lUQcj}(?VV|RxZ8krF`4}kdCj<4)#tPNcWN`5=|$drvsUYJuA z(Nd|8R&@Z-aG2e6*Jp>R>ABK-tmvNX6AY++-=&pTaHU%GnHbrd-Cb7vq$=c@Iz!*J z=^W|&kqAhOnZxn~hv>~ug|jTz5nTi;Wb`=EtH1rITj_W)OwZrV?W4+>fZ>aK`dj{`91N&2%eZM05(1)F zb%l+|bx9fY+{1Eiv+V8q?(du~{f%N8ik#lwTz|RxShM7KHEM9IHKH-=*u-B#xzP0> zRm$xWmwZcYdzewDWg!H12qOsD00OM{$Z|g1YS}wUq?~N!i!?U68>+mA4NrQzSf!y| zKOR^I^@r|r5N1T)13j&#WB93_@b@=<TnK=qq#AZA=H@xjv% zm*ubIn-tvjx1vx*#eYN@QDp`0H9|6F{|j=XTd?ZycU$>pIdx*JIBLd-R3HmE4rlZ! z0$SrB>0w=*lRwQ<HwF0p znXQ!s6hy?I5!Zsij?EK#`Im;bC*&yE3M?76c1~C(AG$+8;{cMQDob7D?UmS?ZXb5U zKHpP@05uA*L6Lsf;ahwhE~N;BPH&(Hw8^B|mNIT|oDJzTEsA81oq1}`H1hl&vkR1i&92eoY z|I(?R=aHv!oH+x80MT?C`!y_IonWC3cg|QDPo;>zKt*f3<0~ahR1ybmG1SxP;0x7u zqR>2zJq)~~G|Fs3W88y;2VaBPMsUYw(+&q*km6x|_oN#_8EQ@>IU|f$Qx=?d=iFi4 z;2H8EyqbVXeDrI8NkU;d%!mjmnQ^XeRb7}{fydS~P9dDU=L#A7o#5GE7 z2w2X1&?c5wwAtPm7JA_uDnvvol5^s30LH(CP|=^xp1{2k@LRGI^cD^u z%wh^mlRkusEQc{1Tt!3FM!R1-|5+7Tsjj>E3rUbK93ZhEi;^cOXx9+vQmwEGy&E=O zS5xwBQ@-{7*6XM^{KXjtUR)W2aM(QmDk+e`TZ1#B z7;z0)BiVl#H?s#W!0Pe>VD;Gpg`yv{JrIW`=tDv_e1XRIbWMbCYlw_X<>f}j-_*My z8cDVh#sMI8-%1q#`x_!b zzi?e0FS+M<&qRMR*b2uYA?3oCKDis_B6Lx?OTLT)|d-j>yl^g;QlyAVQ$JQr@{3JhC z+#nDvUICDdRC_|tMLAvQ(*#!R?lhPGhaKDSr3+5^sTWHUb{qIGU{4>~_boKU zaQH#S)Em{vU&6|eEv)*0t92*)5=;s?(z>Spd)dZ!*x{Wl@_g}1OfmcKK6h&)8ns9O z2@Z_{cP{0^mB4ja1C`H=#x70&R}=vCpR@eGZa<3D58OikIXo`~Nq7mQ1p+f!c>e3E zU?yD2)J%YG2i6QYbZEC#l5j;H^`?NeD9gUb)ZeXk2Dvw@KOnmr(i7yysd44z-y|QU zAWgMaR;YQ;}!Nfi2vqj3Qk8%$4P zp0St@>yX9HZ)W^hhwOBX1-Al>Y=n1!G{t7JP>kxggY%mz61=Be(7l3Jr)Y*P#UdZe zkT@=2!-KmGl?rmqRv-;`!4Qp`vR}2r&HD@BSBn4H7^*cRN=-? zNQKglBAn?dHf)W<@FwrqFqfoMC`P87j%vC%%+J4=P!*#XdrkTk-pgfZrwXnk~w2flzfL-q#_J1Iz+he89)||i{VUw=Y}dak}XiVfGJ+}@Tq}MN*+&BH~|{f z3fSw`YuW!ZaBmvr=Gi-v5J`<@c?p3O1jgY#+WZPfdY#jdH65-$3+aA-xX5-Zo7Ec^)^wL17$N z=Fc-=x7p7k?_LAcr}B%Mm_9V`rZqQb27#Gfn(z$e*9zS;s!+Qjr3p^}v@_}FU~c>m zmXHS`iHI7^+8aIyqf^DlbEJFTaGZ3(F|4!CA}~mamCRIFt#we!K}yWOGwkdBpeI2xTj~= z31S;n4fxq;w>8xZ1P~0jxNOnhhAWK%5*R^4`=`0upkGo8GX4WK6D0_o+CSL|oJ5U= zzJ*`Y|DMnyRE#SE*RWKTlsAUghK+8th*_mv0|gF4@&Ti*Mk16%5ctS7j1kGK>J&Py z3S31(9r?k29wHMdmvDt>hXk&?sqp^hzXHnIi&s>wpoySx7?TbWI)qWU5^YKSsj-%b z`bR;cZE85=K$WlKn@>8h_1+kSL(c{$-mDRo7GI0yPT3qh$TS9-#48;dW>nB)EYkiN z7O0>nD$XUIWzYtQF3Dt2^NoP_GWO6$b12>M_ygleWEfZ+hz%`28e3 zhC~Ho*P>`42pFIF-Fz6n5+oXmQ-iUN@E?MRHm_0A)z4hpzW<8qu5G^pM2mM;DG-p3 z)v05w_EU^;=JMKX;EsG(75?OU0jUmE7yjU6F*II`^>BOE9$>O5;%Om#s=;L^Z4E#}41<&B1s~J**xQ*n zv*Xi#-Em&bY5I{O{YXws_1|mDYodbI!JS0v-M-&9`bhTsr;v;5YlpB%`}#(+X-gyE^|g_@R>rLO^p>Y2lk9Qesr z=_rf=I{EGHqfULvB&sLS+(XJskQSG_4Q&m0_Th*2EqM`h4}o?&ohXUz6)>N!CTLm3 zC-w1TjCcHrH=*OXZB>s>pk;$GX1xw7VcyG-%<#yB`=ai(=zKf+re_5(seK*%YZ2S!w@#-1$AcrQVQ}t;K=f!r0{xrhK7(8>EgLrJl57@?fVc$yvJh#oi#xE*-0cZ7fYO`QRP~{pwKIVgaB9FbPlOwyac@5u z75B7WEN{cMrAqkar=f}HlyPAE^mhu>vAXj;B_@o_<2 z403EIlRMK|jkBu|;wPf68`KxJKos&YH_!hDSe404QQNbDlYSN3(HuvHlh&?S#m2JS z98B&6`xnP!30p@a+ZSGw_;6aHX72KTz#}LMn`261J0L)TJ*lOPi$J^^TMspCMAiID zr)PFvXt=p6snmmMhSVO~N$+oOr3SFtQrk~)Kuun+ZNuXyP2K|NOY_kE)(4*nnjJ;6 zrJdJ;Wb~KMUAsJo>!+{!g-6v9izLd!&{Gev;3SnY=$wD_IXn6{#`b`BN*}b9yv`z-`+!Wg3+cBjafNU$XsUs}L;i}OB=q9x1A_@1R}G{Ow<1$_R5Pso zYx#CS_Ce5x7nL5xv7;X{Xa&JMCo zs#{wT8`a81AQpYL9FlCHVHD2UH65f3?Ck(C0kd>_VGQ_55u9&#GbLiru}<~@ zl8^*~!%MS;55^PI?BZa6i)1A~p~Z1YUnWOcv&cwmVEV!#S#Vp}DCh(*B!Y3MO=Kf* zSX$(GI)tzDz6-x^X57~ed1t!yU|2NoXbujPs}BYj@R5irdMq@&(t3pg8DK#*>C zH&?1Xr-lo{Zd^fp+RZXNH%-mSSiHX7@4viwp$Y%HeoU8?+mv(XE$tI(#_~sFoeE0Q zl0FXhUFRKrGBXs)B0RSS96ot=D1?}0__eP5j2`N}7`0QocI1`kcjz6(S|xf0h=vp; zMxFQWcNas{`}aUnblVHmy&x)0u`d>0Xg`G!2Wx{!>omUUV|vM|i?K8;0^*$TM-ynr zmk!(RNHW3sa@?*Lu9nO@&=IH~;g$n{93Kq8xjD0O-aAVd!9m4fPQDb7>!ttc?5oVR`%ELOpCKK%4I0|dMzFA*GSoE>ib0c#RPY;z( zEeUGSc+@zco}S00kSegu=BTp+4dj7U&ath$Ar!1oh0qd)+ z8*(1F7mJ<>tuTRFa8o<_KpcUrGut>YFtXhYHcGABlB*jf=kW0}AbECYk@JU36P%!t zqrt3%iNC0bOQ3iY8~jtl_bF7e5~DL!e+z-xV zxWC_es$DHUO%Py#@2~;*j*?^e=F^F*QS{_1M23bS#0vRBDs?E-<)-4!^5e-?w;-?C zJT}o>+}|*&U%WWs^2)wb_VJrr)3#u}0#v}%Uqg+_2@v1(v}Z%{#-BW;N?U%VUto98 zGiLp}%{!A|6~!YV&j*x>WQw35PI!yZ7Q|aUl^%n^IAUQ+VPPnHl(%Wtwgnfi0M+n( zP9;E%1X_)rCD<-)|3+rlh|U=LiS zo2vi?Aa23Z>hhKvO zgg=A0JoPC6x)-s<5EmW0yMqkjHAJ(D`JL+OG?;)&EEow=ZDyk|0~=~7@)nSUO6ALB z1_nQFf{n}C$Q?l&_{>HqK{E*UDY1eNhSWw8hc`7ulvpP_57rxg89|_5%YiwHF`ux= z$$LRI#h(OOfRiO7e99sZ=`S))Ie|skVBpq{4_e?fDXnW%S@-e*$fk+ng%mSR36y;q zN&$iZr|(pRE0HsSj*4I?>5v>>DE{J!09TRm?3(fe3jA-kZE`p& zJ@57SLyUa~ZjmiC6BdH3AH)TEJ1~<`*$~=!z72>Dc1PwC1RUw(p`Bw>1O+*Y?8(h& zbxM(_U#v6Ij!=-N-=G5?OvW?i-KoDqA4%061SJ2622s6MAuWj9hBB?t!;=?-7G))F zr7wB?!+QOAx9d0G>7P2o22UP>F|(h3`*=1C1^*E14#Ro_2oj#NVQq{ayHoZkh?}7_ zAU0Syu`%eA^#Ew;a6JUkU0AGE0z~aTdYODfy%K7IoJt);cauiO9B%W??p=|8E*CB7 zQdhHME;H)kTIwW}z+R!lWAC3D(C#{pxtK%J1C7$}C~P+}ix7H%j|YOICB;`ch^q8M z&X)M{AlO23$qa#1gY82m97n+coMhE3wR7scJGf73Acq|R5lR3k3`;vFU8W#R=hR`t z26iVhHAxTk>AXzQp=4s3g|-5Mw1$vzoQy2&YKGY^8LtX?#a&97+0DaQxL&BgF)uRk zp`JM44?kG+nNV^gPg!zBC2KRmDQC5=jDXcjG0I3n^OSLK1B^?bem)G}Q79z1RoFwJ z>w;wcVT*$t87u&hx{2tdqkO1Ox-IWÊZBG^HX>qs)dhCqt}wqVdCu*0A?>QC!x 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

-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

r+*06~BhX~FeclO$0 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

_BE7OQ2fMqxO&WW1m%SWWE-Pk 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 From f373f124710ed29a00bf098e83a849fad09d80d6 Mon Sep 17 00:00:00 2001 From: Itzik Date: Sun, 18 Sep 2022 22:25:45 +0300 Subject: [PATCH 46/67] Added KV store, added separate action in HW CI (so we can do cool stuff later and it's easier to find) Also added some allocate function call logs to see how shitty it is in HW mode --- azure-pipelines.yml | 13 +- .../src/contract_operations.rs | 2 - .../shared/contract-engine/src/gas.rs | 2 + .../shared/contract-engine/src/wasm3/mod.rs | 152 ++++++++++++++++-- deployment/ci/docker-compose.ci.yaml | 20 +++ deployment/ci/go-tests-bench.sh | 4 + deployment/ci/go-tests.sh | 2 +- deployment/dockerfiles/go-tests.Dockerfile | 2 + 8 files changed, 172 insertions(+), 25 deletions(-) create mode 100644 deployment/ci/go-tests-bench.sh diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 0b963ecd1..17fb267c4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,7 +29,7 @@ steps: arguments: --build-arg SGX_MODE=HW Dockerfile: deployment/dockerfiles/enclave-test.Dockerfile - task: Docker@2 - displayName: "Build base image" + displayName: "Compile and build" inputs: command: build repository: rust-go-base-image @@ -38,7 +38,7 @@ steps: arguments: --build-arg SGX_MODE=HW Dockerfile: deployment/dockerfiles/base.Dockerfile - task: Docker@2 - displayName: "Build release image" + displayName: "Build release container" inputs: command: build repository: build-release @@ -56,7 +56,7 @@ steps: arguments: --build-arg SGX_MODE=HW Dockerfile: deployment/dockerfiles/go-tests.Dockerfile - task: Docker@2 - displayName: "Build node" + displayName: "Build node from release" inputs: command: build repository: ci-enigma-sgx-node @@ -65,7 +65,7 @@ steps: arguments: --build-arg SECRET_LOCAL_NODE_TYPE=NODE --build-arg SGX_MODE=HW Dockerfile: deployment/dockerfiles/local-node.Dockerfile - task: Docker@2 - displayName: "Build bootstrap" + displayName: "Build bootstrap from release" inputs: command: build buildContext: . @@ -75,7 +75,10 @@ steps: Dockerfile: deployment/dockerfiles/local-node.Dockerfile - script: export DOCKER_CLIENT_TIMEOUT=120 && export COMPOSE_HTTP_TIMEOUT=120 && docker-compose --compatibility -f deployment/ci/docker-compose.ci.yaml up --exit-code-from base aesm base - displayName: "Run system tests" + displayName: "Run system tests (go tests)" + + - script: export DOCKER_CLIENT_TIMEOUT=120 && export COMPOSE_HTTP_TIMEOUT=120 && docker-compose --compatibility -f deployment/ci/docker-compose.ci.yaml up --exit-code-from bench aesm bench + displayName: "Run benchmarks" - script: docker-compose -f deployment/ci/docker-compose.ci.yaml --compatibility up --exit-code-from node aesm bootstrap node displayName: "Run integration tests" diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 956d4e2f7..cff21cff2 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -134,7 +134,6 @@ pub fn init( let output = result?; engine - .contract_instance .flush_cache() .map_err(|_| EnclaveError::FailedFunctionCall)?; @@ -274,7 +273,6 @@ pub fn handle( let mut output = result?; engine - .contract_instance .flush_cache() .map_err(|_| EnclaveError::FailedFunctionCall)?; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs index bf62f8bdc..91ec69a8f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs @@ -1,6 +1,8 @@ pub use pwasm_utils::{inject_gas_counter, rules}; pub const OCALL_BASE_GAS: u64 = 2_000_000; +pub const WRITE_BASE_GAS: u64 = 200_000; +pub const READ_BASE_GAS: u64 = 100_000; /// Wasm cost table pub struct WasmCosts { diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index ede343bdd..1cad83136 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -14,11 +14,14 @@ use enclave_crypto::{sha_256, Ed25519PublicKey, WasmApiCryptoError}; use enclave_ffi_types::{Ctx, EnclaveError}; use crate::contract_validation::ContractKey; +#[cfg(not(feature = "query-only"))] +use crate::db::encrypt_key; + use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] -use crate::db::{remove_encrypted_key, write_encrypted_key}; +use crate::db::{remove_encrypted_key, write_encrypted_key, write_multiple_keys}; use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngineResult}; -use crate::gas::WasmCosts; +use crate::gas::{WasmCosts, OCALL_BASE_GAS, READ_BASE_GAS, WRITE_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::contract::api_marker; @@ -35,6 +38,7 @@ use std::time::{Duration, Instant}; type Wasm3RsError = wasm3::Error; type Wasm3RsResult = Result; +use enclave_utils::kv_cache::KvCache; use std::collections::HashMap; lazy_static! { @@ -101,7 +105,7 @@ pub struct Context { contract_key: ContractKey, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, - + kv_cache: KvCache, last_error: Option, } @@ -273,6 +277,8 @@ impl Engine { .clone() }; + let kv_cache = KvCache::new(); + let context = Context { context, gas_limit, @@ -281,6 +287,7 @@ impl Engine { contract_key, user_nonce, user_public_key, + kv_cache, last_error: None, }; @@ -586,6 +593,55 @@ impl Engine { Ok(output) }) } + + #[cfg(feature = "query-only")] + pub fn flush_cache(&mut self) -> Result<(), EnclaveError> { + Ok(()) + } + + #[cfg(not(feature = "query-only"))] + pub fn flush_cache(&mut self) -> Result<(), EnclaveError> { + let keys: Vec<(Vec, Vec)> = self + .context + .kv_cache + .flush() + .into_iter() + .map(|(k, v)| { + let (enc_key, _, enc_v) = + encrypt_key(&k, &v, &self.context.context, &self.context.contract_key).unwrap(); + + (enc_key.to_vec(), enc_v) + }) + // todo: fix + // .map_err(|_| + // { + // debug!( + // "addr_validate() error while trying to parse human address from bytes to string: {:?}", + // err + // ); + // return Ok(Some(RuntimeValue::I32( + // self.write_to_memory(b"Input is not valid UTF-8")? as i32, + // ))); + // } + // )? + .collect(); + + let used_gas = write_multiple_keys(&self.context.context, keys).map_err(|err| { + debug!( + "write_db() error while trying to write the value to state: {:?}", + err + ); + + EnclaveError::from(err) + })?; + + self.with_instance(|instance, context| { + use_gas(instance, used_gas)?; + Ok(vec![]) + })?; + + Ok(()) + } } struct CWMemory<'m> { @@ -707,10 +763,25 @@ fn read_from_memory( instance: &wasm3::Instance, region_ptr: u32, ) -> WasmEngineResult> { + let mut start = Instant::now(); let runtime = instance.runtime(); - runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { + let mut duration = start.elapsed(); + println!( + "read_from_memory: Time elapsed in instance.runtime(): {:?}", + duration + ); + + let mut start = Instant::now(); + let res = runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { CWMemory::new(memory).extract_vector(region_ptr) - })? + })?; + let mut duration = start.elapsed(); + println!( + "read_from_memory: Time elapsed in runtime.try_with_memory_or(): {:?}", + duration + ); + + res } fn decode_sections_from_memory( @@ -724,14 +795,28 @@ fn decode_sections_from_memory( } fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngineResult { + let mut start = Instant::now(); let region_ptr = (|| { let alloc_fn = instance.find_function::("allocate")?; alloc_fn.call(buffer.len() as u32) })() .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; + let mut duration = start.elapsed(); + println!( + "write_to_memory: Time elapsed in allocate function call: {:?}", + duration + ); + + let mut start = Instant::now(); + let res = write_to_allocated_memory(instance, region_ptr, buffer); + let mut duration = start.elapsed(); + println!( + "write_to_memory: Time elapsed in write_to_allocated_memory: {:?}", + duration + ); - write_to_allocated_memory(instance, region_ptr, buffer) + res } fn write_to_allocated_memory( @@ -781,15 +866,38 @@ fn host_read_db( instance: &wasm3::Instance, state_key_region_ptr: i32, ) -> WasmEngineResult { + // todo: time this + use_gas(instance, READ_BASE_GAS)?; + let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_read failed to extract vector from state_key_region_ptr: {err}"), )?; debug!("db_read reading key {}", show_bytes(&state_key_name)); - let (value, used_gas) = - read_encrypted_key(&state_key_name, &context.context, &context.contract_key) - .map_err(debug_err!("db_read failed to read key from storage"))?; + let value = context.kv_cache.read(&state_key_name); + + if let Some(unwrapped) = value { + debug!("Got value from cache"); + let ptr_to_region_in_wasm_vm = write_to_memory(instance, &unwrapped).map_err(|err| { + debug!( + "read_db() error while trying to allocate {} bytes for the value", + unwrapped.len(), + ); + err + })?; + + return Ok(ptr_to_region_in_wasm_vm as i32); + } + + debug!("Missed value in cache"); + let (value, used_gas) = read_encrypted_key( + &state_key_name, + &context.context, + &context.contract_key, + &mut context.kv_cache, + ) + .map_err(debug_err!("db_read failed to read key from storage"))?; use_gas(instance, used_gas)?; debug!( @@ -842,12 +950,20 @@ fn host_write_db( return Err(WasmEngineError::UnauthorizedWrite); } + use_gas(instance, WRITE_BASE_GAS)?; + + let mut start = Instant::now(); let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), )?; let value = read_from_memory(instance, value_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), )?; + let mut duration = start.elapsed(); + println!( + "host_write_db: Time elapsed in read_from_memory x2: {:?}", + duration + ); debug!( "db_write writing key: {}, value: {}", @@ -855,14 +971,16 @@ fn host_write_db( show_bytes(&value) ); - let used_gas = write_encrypted_key( - &state_key_name, - &value, - &context.context, - &context.contract_key, - ) - .map_err(debug_err!("db_write failed to write key to storage",))?; - use_gas(instance, used_gas)?; + context.kv_cache.write(&state_key_name, &value); + + // let used_gas = write_encrypted_key( + // &state_key_name, + // &value, + // &context.context, + // &context.contract_key, + // ) + // .map_err(debug_err!("db_write failed to write key to storage",))?; + // use_gas(instance, used_gas)?; Ok(()) } diff --git a/deployment/ci/docker-compose.ci.yaml b/deployment/ci/docker-compose.ci.yaml index 3b9451dbf..aaa572060 100644 --- a/deployment/ci/docker-compose.ci.yaml +++ b/deployment/ci/docker-compose.ci.yaml @@ -33,6 +33,26 @@ services: cpus: "1" memory: "4g" + bench: + image: tests-base-image + depends_on: + - aesm + devices: + - /dev/sgx/enclave + - /dev/sgx/provision + volumes: + - /tmp/aesmd:/var/run/aesmd + - /tmp/secretd:/root/.secretd + - /tmp/secretcli:/root/.secretcli + stdin_open: true + entrypoint: ["/bin/bash", "go-tests-bench.sh"] + tty: true + deploy: + resources: + limits: + cpus: "2" + memory: "4g" + bootstrap: image: ci-enigma-sgx-bootstrap container_name: bootstrap diff --git a/deployment/ci/go-tests-bench.sh b/deployment/ci/go-tests-bench.sh new file mode 100644 index 000000000..0138e0e11 --- /dev/null +++ b/deployment/ci/go-tests-bench.sh @@ -0,0 +1,4 @@ +set -euv + +# Run bench mark tests +go test -count 1 -v ./x/compute/internal/... -run "TestRunBenchmarks" diff --git a/deployment/ci/go-tests.sh b/deployment/ci/go-tests.sh index f01bcc25f..0caa9697e 100644 --- a/deployment/ci/go-tests.sh +++ b/deployment/ci/go-tests.sh @@ -1,4 +1,4 @@ set -euv # Run go system tests for compute module -go test -p 1 -v ./x/compute/internal/... +LOG_LEVEL=ERROR go test -p 1 -v ./x/compute/internal/... diff --git a/deployment/dockerfiles/go-tests.Dockerfile b/deployment/dockerfiles/go-tests.Dockerfile index 1c775e13f..8c90d2179 100644 --- a/deployment/dockerfiles/go-tests.Dockerfile +++ b/deployment/dockerfiles/go-tests.Dockerfile @@ -22,7 +22,9 @@ RUN make build-test-contract # RUN cp /go/src/github.com/enigmampc/SecretNetwork/go-cosmwasm/librust_cosmwasm_enclave.signed.so /usr/lib/librust_cosmwasm_enclave.signed.so COPY deployment/ci/go-tests.sh . +COPY deployment/ci/go-tests-bench.sh . RUN chmod +x go-tests.sh +RUN chmod +x go-tests-bench.sh ENTRYPOINT ["/bin/bash", "go-tests.sh"] From 1a24f5922eeb5ebc9837b3c8d2e6534ac2349e85 Mon Sep 17 00:00:00 2001 From: Itzik Date: Sun, 18 Sep 2022 23:46:49 +0300 Subject: [PATCH 47/67] Integrate ffi changes from master Fix enclave tests missing clang Remove mut from all timing stuff --- .../src/contract_operations.rs | 38 ++++---- .../src/contract_validation.rs | 16 ++-- .../contract-engine/src/wasm/contract.rs | 14 +-- .../shared/contract-engine/src/wasm3/mod.rs | 89 ++++++++++--------- .../enclaves/shared/crypto/src/secp256k1.rs | 24 ++--- cosmwasm/packages/sgx-vm/src/wasmi/exports.rs | 1 - .../dockerfiles/enclave-test.Dockerfile | 6 ++ 7 files changed, 98 insertions(+), 90 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index b778b1b85..97bb17fc7 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -55,21 +55,21 @@ pub fn init( ) -> Result { trace!("Starting init"); - let mut start = Instant::now(); + let start = Instant::now(); let contract_code = ContractCode::new(contract); let contract_hash = contract_code.hash(); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in ContractCode::new is: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let base_env: BaseEnv = extract_base_env(env)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in extract_base_env is: {:?}", duration); let query_depth = extract_query_depth(env)?; - let mut start = Instant::now(); + let start = Instant::now(); let (sender, contract_address, block_height, sent_funds) = base_env.get_verification_params(); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in get_verification_paramsis: {:?}", duration); let canonical_contract_address = to_canonical(contract_address)?; @@ -87,7 +87,7 @@ pub fn init( let secret_msg = SecretMessage::from_slice(msg)?; - let mut start = Instant::now(); + let start = Instant::now(); verify_params( &parsed_sig_info, &sent_funds, @@ -95,23 +95,23 @@ pub fn init( &contract_address, &secret_msg, )?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in verify_params: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let decrypted_msg = secret_msg.decrypt()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in decrypt: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let ValidatedMessage { validated_msg, reply_params, } = validate_msg(&decrypted_msg, &contract_hash, None, None)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in validate_msg: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let mut engine = start_engine( context, gas_limit, @@ -122,16 +122,16 @@ pub fn init( secret_msg.nonce, secret_msg.user_public_key, )?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in start_engine: {:?}", duration); let mut versioned_env = base_env.into_versioned_env(&engine.get_api_version()); versioned_env.set_contract_hash(&contract_hash); - let mut start = Instant::now(); + let start = Instant::now(); let result = engine.init(&versioned_env, validated_msg); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in engine.init: {:?}", duration); *used_gas = engine.gas_used(); @@ -144,7 +144,7 @@ pub fn init( // TODO: copy cosmwasm's structures to enclave // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/init_handle.rs#L129 // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/query.rs#L13 - let mut start = Instant::now(); + let start = Instant::now(); let output = encrypt_output( output, &secret_msg, @@ -155,7 +155,7 @@ pub fn init( false, false, )?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in encrypt_output: {:?}", duration); // todo: can move the key to somewhere in the output message if we want @@ -415,9 +415,9 @@ fn start_engine( contract_code, *contract_key, operation, - query_depth, nonce, user_public_key, + query_depth, ) } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs index 7ad2fbdfc..0795fa50d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs @@ -250,12 +250,12 @@ pub fn verify_params( ) -> Result<(), EnclaveError> { debug!("Verifying message signatures for: {:?}", sig_info); - let mut start = Instant::now(); + let start = Instant::now(); // If there's no callback signature - it's not a callback and there has to be a tx signer + signature if let Some(callback_sig) = &sig_info.callback_sig { return verify_callback_sig(callback_sig.as_slice(), sender, msg, sent_funds); } - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_params: Time elapsed in verify_callback_sig: {:?}", duration @@ -266,9 +266,9 @@ pub fn verify_params( String::from_utf8_lossy(sig_info.sign_bytes.as_slice()) ); - let mut start = Instant::now(); + let start = Instant::now(); let (sender_public_key, messages) = get_signer_and_messages(sig_info, sender)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_params: Time elapsed in get_signer_and_messages: {:?}", duration @@ -281,7 +281,7 @@ pub fn verify_params( trace!("sender signature is: {:?}", sig_info.signature); trace!("sign bytes are: {:?}", sig_info.sign_bytes); - let mut start = Instant::now(); + let start = Instant::now(); sender_public_key .verify_bytes( sig_info.sign_bytes.as_slice(), @@ -292,13 +292,13 @@ pub fn verify_params( warn!("Signature verification failed: {:?}", err); EnclaveError::FailedTxVerification })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_params: Time elapsed in verify_bytes: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); if verify_message_params( &messages, sender, @@ -310,7 +310,7 @@ pub fn verify_params( info!("Parameters verified successfully"); return Ok(()); } - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_params: Time elapsed in verify_message_params: {:?}", duration diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 754cfd80b..11128863e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -16,9 +16,9 @@ use enclave_crypto::{sha_256, Ed25519PublicKey, WasmApiCryptoError}; use enclave_utils::kv_cache::KvCache; use crate::contract_validation::ContractKey; -use crate::db::read_encrypted_key; +use crate::db::{encrypt_key, read_encrypted_key}; // #[cfg(not(feature = "query-only"))] -use crate::db::{remove_encrypted_key, /* write_encrypted_key, */, write_multiple_keys}; +use crate::db::{remove_encrypted_key, /* write_encrypted_key, */ write_multiple_keys}; use crate::errors::WasmEngineError; use crate::gas::{WasmCosts, OCALL_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; @@ -522,12 +522,12 @@ impl WasmiApi for ContractInstance { Ok(None) } - #[cfg(feature = "query-only")] - fn flush_cache(&mut self) -> Result, Trap> { - Ok(None) - } + // #[cfg(feature = "query-only")] + // fn flush_cache(&mut self) -> Result, Trap> { + // Ok(None) + // } - #[cfg(not(feature = "query-only"))] + //#[cfg(not(feature = "query-only"))] fn flush_cache(&mut self) -> Result, Trap> { let keys: Vec<(Vec, Vec)> = self .kv_cache diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 1cad83136..bb059e1b9 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -101,7 +101,7 @@ pub struct Context { gas_costs: WasmCosts, #[cfg_attr(feature = "query-only", allow(unused))] operation: ContractOperation, - + query_depth: u32, contract_key: ContractKey, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, @@ -196,6 +196,7 @@ impl Engine { operation: ContractOperation, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, + query_depth: u32, ) -> Result { let found = W3_MODULE_CACHE .read() @@ -203,12 +204,12 @@ impl Engine { .contains_key(&contract_code.hash()); let (code, cosmwasm_api_version) = if !found { - let mut start = Instant::now(); + let start = Instant::now(); let mut module = walrus::ModuleConfig::new() .generate_producers_section(false) .parse(contract_code.code()) .map_err(|_| EnclaveError::InvalidWasm)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "Time elapsed in walrus::ModuleConfig::new() is: {:?}", duration @@ -238,9 +239,9 @@ impl Engine { return Err(EnclaveError::InvalidWasm); }; - let mut start = Instant::now(); + let start = Instant::now(); validation::validate_memory(&mut module)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in validate_memory is: {:?}", duration); if let ContractOperation::Init = operation { @@ -250,14 +251,14 @@ impl Engine { } } - let mut start = Instant::now(); + let start = Instant::now(); gas::add_metering(&mut module, &gas_costs); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in add_metering() is: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let code = module.emit_wasm(); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in module.emit_wasm() is: {:?}", duration); let mut write_cache = W3_MODULE_CACHE.write().unwrap(); @@ -281,6 +282,7 @@ impl Engine { let context = Context { context, + query_depth, gas_limit, gas_costs, operation, @@ -292,10 +294,10 @@ impl Engine { }; debug!("setting up runtime"); - let mut start = Instant::now(); + let start = Instant::now(); let environment = wasm3::Environment::new().to_enclave_result()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in Environment::new() is: {:?}", duration); debug!("initialized environment"); @@ -313,48 +315,48 @@ impl Engine { where F: FnOnce(&mut wasm3::Instance, &mut Context) -> Result, EnclaveError>, { - let mut start = Instant::now(); + let start = Instant::now(); let runtime = self .environment .new_runtime::(1024 * 60, Some(192 /* 12 MiB */)) .to_enclave_result()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in environment.new_runtime is: {:?}", duration); debug!("initialized runtime"); - let mut start = Instant::now(); + let start = Instant::now(); let module = self .environment .parse_module(&self.code) .to_enclave_result()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "Time elapsed in environment.parse_module is: {:?}", duration ); debug!("parsed module"); - let mut start = Instant::now(); + let start = Instant::now(); let mut instance = runtime.load_module(module).to_enclave_result()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in runtime.load_module is: {:?}", duration); debug!("created instance"); - let mut start = Instant::now(); + let start = Instant::now(); gas::set_gas_limit(&instance, self.gas_limit)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in set_gas_limit is: {:?}", duration); debug!("set gas limit"); - let mut start = Instant::now(); + let start = Instant::now(); Self::link_host_functions(&mut instance).to_enclave_result()?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in link_host_functions is: {:?}", duration); debug!("linked functions"); - let mut start = Instant::now(); + let start = Instant::now(); let result = func(&mut instance, &mut self.context); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Instance: elapsed time for running func is: {:?}", duration); debug!("function returned {:?}", result); @@ -427,17 +429,17 @@ impl Engine { let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; - let mut start = Instant::now(); + let start = Instant::now(); let env_ptr = write_to_memory(instance, &env_bytes)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "Time elapsed in env_bytes write_to_memory is: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); let msg_ptr = write_to_memory(instance, &msg)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in msg write_to_memory is: {:?}", duration); let result = match api_version { @@ -459,9 +461,9 @@ impl Engine { .to_enclave_result()?, (env_ptr, msg_info_ptr, msg_ptr), ); - let mut start = Instant::now(); + let start = Instant::now(); let res = init.call_with_context(context, args); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in call_with_context is: {:?}", duration); res } @@ -469,14 +471,14 @@ impl Engine { return Err(EnclaveError::InvalidWasm); } }; - let mut start = Instant::now(); + let start = Instant::now(); let output_ptr = check_execution_result(instance, context, result)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in check_execution_result is: {:?}", duration); - let mut start = Instant::now(); + let start = Instant::now(); let output = read_from_memory(instance, output_ptr)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("Time elapsed in read_from_memory is: {:?}", duration); Ok(output) @@ -763,19 +765,19 @@ fn read_from_memory( instance: &wasm3::Instance, region_ptr: u32, ) -> WasmEngineResult> { - let mut start = Instant::now(); + let start = Instant::now(); let runtime = instance.runtime(); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "read_from_memory: Time elapsed in instance.runtime(): {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); let res = runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { CWMemory::new(memory).extract_vector(region_ptr) })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "read_from_memory: Time elapsed in runtime.try_with_memory_or(): {:?}", duration @@ -795,22 +797,22 @@ fn decode_sections_from_memory( } fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngineResult { - let mut start = Instant::now(); + let start = Instant::now(); let region_ptr = (|| { let alloc_fn = instance.find_function::("allocate")?; alloc_fn.call(buffer.len() as u32) })() .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "write_to_memory: Time elapsed in allocate function call: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); let res = write_to_allocated_memory(instance, region_ptr, buffer); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "write_to_memory: Time elapsed in write_to_allocated_memory: {:?}", duration @@ -952,14 +954,14 @@ fn host_write_db( use_gas(instance, WRITE_BASE_GAS)?; - let mut start = Instant::now(); + let start = Instant::now(); let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), )?; let value = read_from_memory(instance, value_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), )?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "host_write_db: Time elapsed in read_from_memory x2: {:?}", duration @@ -1189,6 +1191,7 @@ fn host_query_chain( let mut used_gas: u64 = 0; let answer = encrypt_and_query_chain( &query_buffer, + context.query_depth, &context.context, context.user_nonce, context.user_public_key, diff --git a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs index 8b638e24d..f6d439bdf 100644 --- a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs +++ b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs @@ -33,64 +33,64 @@ impl VerifyingKey for Secp256k1PubKey { ) -> Result<(), CryptoError> { // Signing ref: https://docs.cosmos.network/master/spec/_ics/ics-030-signed-messages.html#preliminary - let mut start = Instant::now(); + let start = Instant::now(); let sign_bytes_hash = if sign_mode == SignMode::SIGN_MODE_EIP_191 { Keccak256::digest(bytes) } else { Sha256::digest(bytes) }; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_bytes: Time elapsed in Sha256::digest: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); //let verifying_key = VerifyingKey let msg = secp256k1::Message::from_slice(sign_bytes_hash.as_slice()).map_err(|err| { warn!("Failed to create a secp256k1 message from tx: {:?}", err); CryptoError::VerificationError })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_bytes: Time elapsed in Message::from_slice: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); let verifier = Secp256k1::verification_only(); - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_bytes: Time elapsed in Secp256k1::verification_only: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); // Create `secp256k1`'s types let sec_signature = secp256k1::ecdsa::Signature::from_compact(sig).map_err(|err| { warn!("Malformed signature: {:?}", err); CryptoError::VerificationError })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_bytes: Time elapsed in Signature::from_compact: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); let sec_public_key = secp256k1::PublicKey::from_slice(self.0.as_slice()).map_err(|err| { warn!("Malformed public key: {:?}", err); CryptoError::VerificationError })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!( "verify_bytes: Time elapsed in PublicKey from_slice: {:?}", duration ); - let mut start = Instant::now(); + let start = Instant::now(); verifier .verify_ecdsa(&msg, &sec_signature, &sec_public_key) .map_err(|err| { @@ -100,7 +100,7 @@ impl VerifyingKey for Secp256k1PubKey { ); CryptoError::VerificationError })?; - let mut duration = start.elapsed(); + let duration = start.elapsed(); println!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); trace!("successfully verified this signature: {:?}", sig); Ok(()) diff --git a/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs b/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs index 5b411ac41..b7d589032 100644 --- a/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs +++ b/cosmwasm/packages/sgx-vm/src/wasmi/exports.rs @@ -1,5 +1,4 @@ use std::ffi::c_void; -use std::ops::Index; use sgx_types::SgxResult; diff --git a/deployment/dockerfiles/enclave-test.Dockerfile b/deployment/dockerfiles/enclave-test.Dockerfile index d76773677..60617680c 100644 --- a/deployment/dockerfiles/enclave-test.Dockerfile +++ b/deployment/dockerfiles/enclave-test.Dockerfile @@ -1,5 +1,11 @@ FROM baiduxlab/sgx-rust:2004-1.1.3 +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + #### Base utilities #### + clang \ + rm -rf /var/lib/apt/lists/* + ENV PATH="/root/.cargo/bin:$PATH" ARG SGX_MODE=SW ENV SGX_MODE=${SGX_MODE} From b71cd6ac04d8135da47d0f9aa6b759b13f3f1180 Mon Sep 17 00:00:00 2001 From: Itzik Date: Mon, 19 Sep 2022 00:55:34 +0300 Subject: [PATCH 48/67] Added test with disabled logs to see performance closer to real-world as well --- .../src/contract_operations.rs | 18 ++++---- .../src/contract_validation.rs | 8 ++-- .../shared/contract-engine/src/wasm3/mod.rs | 46 +++++++++---------- .../enclaves/shared/crypto/src/secp256k1.rs | 12 ++--- deployment/ci/docker-compose.ci.yaml | 2 +- deployment/ci/go-tests-bench.sh | 1 + 6 files changed, 44 insertions(+), 43 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 97bb17fc7..98528308c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -59,18 +59,18 @@ pub fn init( let contract_code = ContractCode::new(contract); let contract_hash = contract_code.hash(); let duration = start.elapsed(); - println!("Time elapsed in ContractCode::new is: {:?}", duration); + trace!("Time elapsed in ContractCode::new is: {:?}", duration); let start = Instant::now(); let base_env: BaseEnv = extract_base_env(env)?; let duration = start.elapsed(); - println!("Time elapsed in extract_base_env is: {:?}", duration); + trace!("Time elapsed in extract_base_env is: {:?}", duration); let query_depth = extract_query_depth(env)?; let start = Instant::now(); let (sender, contract_address, block_height, sent_funds) = base_env.get_verification_params(); let duration = start.elapsed(); - println!("Time elapsed in get_verification_paramsis: {:?}", duration); + trace!("Time elapsed in get_verification_paramsis: {:?}", duration); let canonical_contract_address = to_canonical(contract_address)?; @@ -96,12 +96,12 @@ pub fn init( &secret_msg, )?; let duration = start.elapsed(); - println!("Time elapsed in verify_params: {:?}", duration); + trace!("Time elapsed in verify_params: {:?}", duration); let start = Instant::now(); let decrypted_msg = secret_msg.decrypt()?; let duration = start.elapsed(); - println!("Time elapsed in decrypt: {:?}", duration); + trace!("Time elapsed in decrypt: {:?}", duration); let start = Instant::now(); let ValidatedMessage { @@ -109,7 +109,7 @@ pub fn init( reply_params, } = validate_msg(&decrypted_msg, &contract_hash, None, None)?; let duration = start.elapsed(); - println!("Time elapsed in validate_msg: {:?}", duration); + trace!("Time elapsed in validate_msg: {:?}", duration); let start = Instant::now(); let mut engine = start_engine( @@ -123,7 +123,7 @@ pub fn init( secret_msg.user_public_key, )?; let duration = start.elapsed(); - println!("Time elapsed in start_engine: {:?}", duration); + trace!("Time elapsed in start_engine: {:?}", duration); let mut versioned_env = base_env.into_versioned_env(&engine.get_api_version()); @@ -132,7 +132,7 @@ pub fn init( let start = Instant::now(); let result = engine.init(&versioned_env, validated_msg); let duration = start.elapsed(); - println!("Time elapsed in engine.init: {:?}", duration); + trace!("Time elapsed in engine.init: {:?}", duration); *used_gas = engine.gas_used(); let output = result?; @@ -156,7 +156,7 @@ pub fn init( false, )?; let duration = start.elapsed(); - println!("Time elapsed in encrypt_output: {:?}", duration); + trace!("Time elapsed in encrypt_output: {:?}", duration); // todo: can move the key to somewhere in the output message if we want diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs index 0795fa50d..48348274d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs @@ -256,7 +256,7 @@ pub fn verify_params( return verify_callback_sig(callback_sig.as_slice(), sender, msg, sent_funds); } let duration = start.elapsed(); - println!( + trace!( "verify_params: Time elapsed in verify_callback_sig: {:?}", duration ); @@ -269,7 +269,7 @@ pub fn verify_params( let start = Instant::now(); let (sender_public_key, messages) = get_signer_and_messages(sig_info, sender)?; let duration = start.elapsed(); - println!( + trace!( "verify_params: Time elapsed in get_signer_and_messages: {:?}", duration ); @@ -293,7 +293,7 @@ pub fn verify_params( EnclaveError::FailedTxVerification })?; let duration = start.elapsed(); - println!( + trace!( "verify_params: Time elapsed in verify_bytes: {:?}", duration ); @@ -311,7 +311,7 @@ pub fn verify_params( return Ok(()); } let duration = start.elapsed(); - println!( + trace!( "verify_params: Time elapsed in verify_message_params: {:?}", duration ); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index bb059e1b9..f7a80390c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -210,7 +210,7 @@ impl Engine { .parse(contract_code.code()) .map_err(|_| EnclaveError::InvalidWasm)?; let duration = start.elapsed(); - println!( + trace!( "Time elapsed in walrus::ModuleConfig::new() is: {:?}", duration ); @@ -242,7 +242,7 @@ impl Engine { let start = Instant::now(); validation::validate_memory(&mut module)?; let duration = start.elapsed(); - println!("Time elapsed in validate_memory is: {:?}", duration); + trace!("Time elapsed in validate_memory is: {:?}", duration); if let ContractOperation::Init = operation { if module.has_floats() { @@ -254,12 +254,12 @@ impl Engine { let start = Instant::now(); gas::add_metering(&mut module, &gas_costs); let duration = start.elapsed(); - println!("Time elapsed in add_metering() is: {:?}", duration); + trace!("Time elapsed in add_metering() is: {:?}", duration); let start = Instant::now(); let code = module.emit_wasm(); let duration = start.elapsed(); - println!("Time elapsed in module.emit_wasm() is: {:?}", duration); + trace!("Time elapsed in module.emit_wasm() is: {:?}", duration); let mut write_cache = W3_MODULE_CACHE.write().unwrap(); @@ -298,7 +298,7 @@ impl Engine { let environment = wasm3::Environment::new().to_enclave_result()?; let duration = start.elapsed(); - println!("Time elapsed in Environment::new() is: {:?}", duration); + trace!("Time elapsed in Environment::new() is: {:?}", duration); debug!("initialized environment"); Ok(Self { @@ -321,7 +321,7 @@ impl Engine { .new_runtime::(1024 * 60, Some(192 /* 12 MiB */)) .to_enclave_result()?; let duration = start.elapsed(); - println!("Time elapsed in environment.new_runtime is: {:?}", duration); + trace!("Time elapsed in environment.new_runtime is: {:?}", duration); debug!("initialized runtime"); let start = Instant::now(); @@ -330,7 +330,7 @@ impl Engine { .parse_module(&self.code) .to_enclave_result()?; let duration = start.elapsed(); - println!( + trace!( "Time elapsed in environment.parse_module is: {:?}", duration ); @@ -339,25 +339,25 @@ impl Engine { let start = Instant::now(); let mut instance = runtime.load_module(module).to_enclave_result()?; let duration = start.elapsed(); - println!("Time elapsed in runtime.load_module is: {:?}", duration); + trace!("Time elapsed in runtime.load_module is: {:?}", duration); debug!("created instance"); let start = Instant::now(); gas::set_gas_limit(&instance, self.gas_limit)?; let duration = start.elapsed(); - println!("Time elapsed in set_gas_limit is: {:?}", duration); + trace!("Time elapsed in set_gas_limit is: {:?}", duration); debug!("set gas limit"); let start = Instant::now(); Self::link_host_functions(&mut instance).to_enclave_result()?; let duration = start.elapsed(); - println!("Time elapsed in link_host_functions is: {:?}", duration); + trace!("Time elapsed in link_host_functions is: {:?}", duration); debug!("linked functions"); let start = Instant::now(); let result = func(&mut instance, &mut self.context); let duration = start.elapsed(); - println!("Instance: elapsed time for running func is: {:?}", duration); + trace!("Instance: elapsed time for running func is: {:?}", duration); debug!("function returned {:?}", result); self.used_gas = @@ -432,7 +432,7 @@ impl Engine { let start = Instant::now(); let env_ptr = write_to_memory(instance, &env_bytes)?; let duration = start.elapsed(); - println!( + trace!( "Time elapsed in env_bytes write_to_memory is: {:?}", duration ); @@ -440,7 +440,7 @@ impl Engine { let start = Instant::now(); let msg_ptr = write_to_memory(instance, &msg)?; let duration = start.elapsed(); - println!("Time elapsed in msg write_to_memory is: {:?}", duration); + trace!("Time elapsed in msg write_to_memory is: {:?}", duration); let result = match api_version { CosmWasmApiVersion::V010 => { @@ -464,7 +464,7 @@ impl Engine { let start = Instant::now(); let res = init.call_with_context(context, args); let duration = start.elapsed(); - println!("Time elapsed in call_with_context is: {:?}", duration); + trace!("Time elapsed in call_with_context is: {:?}", duration); res } CosmWasmApiVersion::Invalid => { @@ -474,12 +474,12 @@ impl Engine { let start = Instant::now(); let output_ptr = check_execution_result(instance, context, result)?; let duration = start.elapsed(); - println!("Time elapsed in check_execution_result is: {:?}", duration); + trace!("Time elapsed in check_execution_result is: {:?}", duration); let start = Instant::now(); let output = read_from_memory(instance, output_ptr)?; let duration = start.elapsed(); - println!("Time elapsed in read_from_memory is: {:?}", duration); + trace!("Time elapsed in read_from_memory is: {:?}", duration); Ok(output) }) @@ -497,10 +497,10 @@ impl Engine { debug!("starting handle"); let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; - let env_ptr = write_to_memory(instance, &env_bytes)?; - debug!("handle written env"); let msg_ptr = write_to_memory(instance, &msg)?; debug!("handle written msg"); + let env_ptr = write_to_memory(instance, &env_bytes)?; + debug!("handle written env"); let result = match api_version { CosmWasmApiVersion::V010 => { @@ -768,7 +768,7 @@ fn read_from_memory( let start = Instant::now(); let runtime = instance.runtime(); let duration = start.elapsed(); - println!( + trace!( "read_from_memory: Time elapsed in instance.runtime(): {:?}", duration ); @@ -778,7 +778,7 @@ fn read_from_memory( CWMemory::new(memory).extract_vector(region_ptr) })?; let duration = start.elapsed(); - println!( + trace!( "read_from_memory: Time elapsed in runtime.try_with_memory_or(): {:?}", duration ); @@ -805,7 +805,7 @@ fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngin .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; let duration = start.elapsed(); - println!( + trace!( "write_to_memory: Time elapsed in allocate function call: {:?}", duration ); @@ -813,7 +813,7 @@ fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngin let start = Instant::now(); let res = write_to_allocated_memory(instance, region_ptr, buffer); let duration = start.elapsed(); - println!( + trace!( "write_to_memory: Time elapsed in write_to_allocated_memory: {:?}", duration ); @@ -962,7 +962,7 @@ fn host_write_db( debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), )?; let duration = start.elapsed(); - println!( + trace!( "host_write_db: Time elapsed in read_from_memory x2: {:?}", duration ); diff --git a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs index f6d439bdf..cf3919e7a 100644 --- a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs +++ b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs @@ -40,7 +40,7 @@ impl VerifyingKey for Secp256k1PubKey { Sha256::digest(bytes) }; let duration = start.elapsed(); - println!( + trace!( "verify_bytes: Time elapsed in Sha256::digest: {:?}", duration ); @@ -52,7 +52,7 @@ impl VerifyingKey for Secp256k1PubKey { CryptoError::VerificationError })?; let duration = start.elapsed(); - println!( + trace!( "verify_bytes: Time elapsed in Message::from_slice: {:?}", duration ); @@ -61,7 +61,7 @@ impl VerifyingKey for Secp256k1PubKey { let verifier = Secp256k1::verification_only(); let duration = start.elapsed(); - println!( + trace!( "verify_bytes: Time elapsed in Secp256k1::verification_only: {:?}", duration ); @@ -73,7 +73,7 @@ impl VerifyingKey for Secp256k1PubKey { CryptoError::VerificationError })?; let duration = start.elapsed(); - println!( + trace!( "verify_bytes: Time elapsed in Signature::from_compact: {:?}", duration ); @@ -85,7 +85,7 @@ impl VerifyingKey for Secp256k1PubKey { CryptoError::VerificationError })?; let duration = start.elapsed(); - println!( + trace!( "verify_bytes: Time elapsed in PublicKey from_slice: {:?}", duration ); @@ -101,7 +101,7 @@ impl VerifyingKey for Secp256k1PubKey { CryptoError::VerificationError })?; let duration = start.elapsed(); - println!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); + trace!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); trace!("successfully verified this signature: {:?}", sig); Ok(()) } diff --git a/deployment/ci/docker-compose.ci.yaml b/deployment/ci/docker-compose.ci.yaml index aaa572060..75a4c9e65 100644 --- a/deployment/ci/docker-compose.ci.yaml +++ b/deployment/ci/docker-compose.ci.yaml @@ -30,7 +30,7 @@ services: deploy: resources: limits: - cpus: "1" + cpus: "2" memory: "4g" bench: diff --git a/deployment/ci/go-tests-bench.sh b/deployment/ci/go-tests-bench.sh index 0138e0e11..5d9554139 100644 --- a/deployment/ci/go-tests-bench.sh +++ b/deployment/ci/go-tests-bench.sh @@ -2,3 +2,4 @@ set -euv # Run bench mark tests go test -count 1 -v ./x/compute/internal/... -run "TestRunBenchmarks" +LOG_LEVEL=ERROR go test -count 1 -v ./x/compute/internal/... -run "TestRunBenchmarks" \ No newline at end of file From 35d3d4c3796d42f61f867731eb1e71a0fbe6d3a8 Mon Sep 17 00:00:00 2001 From: Itzik Date: Mon, 19 Sep 2022 01:01:33 +0300 Subject: [PATCH 49/67] Fix enclave test --- deployment/dockerfiles/enclave-test.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/dockerfiles/enclave-test.Dockerfile b/deployment/dockerfiles/enclave-test.Dockerfile index 60617680c..e8550de31 100644 --- a/deployment/dockerfiles/enclave-test.Dockerfile +++ b/deployment/dockerfiles/enclave-test.Dockerfile @@ -3,7 +3,7 @@ FROM baiduxlab/sgx-rust:2004-1.1.3 RUN apt-get update && \ apt-get install -y --no-install-recommends \ #### Base utilities #### - clang \ + clang && \ rm -rf /var/lib/apt/lists/* ENV PATH="/root/.cargo/bin:$PATH" From 23aaf3017a2ef9d73728565b694e12d3eaf2285a Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Wed, 31 Aug 2022 13:07:46 +0300 Subject: [PATCH 50/67] removed unused fields from WasmCosts --- .../shared/contract-engine/src/gas.rs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs index bf62f8bdc..a009aabc7 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs @@ -12,22 +12,22 @@ pub struct WasmCosts { pub mul: u32, /// Memory (load/store) operations multiplier. pub mem: u32, - /// General static query of U256 value from env-info - pub static_u256: u32, - /// General static query of Address value from env-info - pub static_address: u32, + // /// General static query of U256 value from env-info + // pub static_u256: u32, + // /// General static query of Address value from env-info + // pub static_address: u32, /// Memory stipend. Amount of free memory (in 64kb pages) each contract can use for stack. pub initial_mem: u32, /// Grow memory cost, per page (64kb) pub grow_mem: u32, - /// Memory copy cost, per byte - pub memcpy: u32, - /// Max stack height (native WebAssembly stack limiter) - pub max_stack_height: u32, - /// Cost of wasm opcode is calculated as TABLE_ENTRY_COST * `opcodes_mul` / `opcodes_div` - pub opcodes_mul: u32, - /// Cost of wasm opcode is calculated as TABLE_ENTRY_COST * `opcodes_mul` / `opcodes_div` - pub opcodes_div: u32, + // /// Memory copy cost, per byte + // pub memcpy: u32, + // /// Max stack height (native WebAssembly stack limiter) + // pub max_stack_height: u32, + // /// Cost of wasm opcode is calculated as TABLE_ENTRY_COST * `opcodes_mul` / `opcodes_div` + // pub opcodes_mul: u32, + // /// Cost of wasm opcode is calculated as TABLE_ENTRY_COST * `opcodes_mul` / `opcodes_div` + // pub opcodes_div: u32, /// Cost invoking humanize_address from WASM pub external_humanize_address: u32, /// Cost invoking canonicalize_address from WASM @@ -57,14 +57,14 @@ impl Default for WasmCosts { div: 16, mul: 4, mem: 2, - static_u256: 64, - static_address: 40, + // static_u256: 64, + // static_address: 40, initial_mem: 8192, grow_mem: 8192, - memcpy: 1, - max_stack_height: 64 * 1024, // Assaf: I don't think that this goes anywhere - opcodes_mul: 3, - opcodes_div: 8, + // memcpy: 1, + // max_stack_height: 64 * 1024, + // opcodes_mul: 3, + // opcodes_div: 8, external_humanize_address: 8192, external_canonicalize_address: 8192, external_addr_validate: 8192, From fa0fb0eb251ef2ef47adbcfd6c7e416d27abfe22 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Wed, 28 Sep 2022 19:40:36 +0300 Subject: [PATCH 51/67] fixed wasm3 impl to support new query depth tracking --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index d02f5721f..7567a9344 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -84,6 +84,7 @@ pub struct Context { context: Ctx, gas_limit: u64, gas_costs: WasmCosts, + query_depth: u32, #[cfg_attr(feature = "query-only", allow(unused))] operation: ContractOperation, @@ -179,6 +180,7 @@ impl Engine { contract_code: ContractCode, contract_key: ContractKey, operation: ContractOperation, + query_depth: u32, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, ) -> Result { @@ -229,6 +231,7 @@ impl Engine { context, gas_limit, gas_costs, + query_depth, operation, contract_key, user_nonce, @@ -979,6 +982,7 @@ fn host_query_chain( let mut used_gas: u64 = 0; let answer = encrypt_and_query_chain( &query_buffer, + context.query_depth, &context.context, context.user_nonce, context.user_public_key, From 2ff3ac1168f4837bdf2d033b1ae17f3732b201e5 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Wed, 28 Sep 2022 21:36:12 +0300 Subject: [PATCH 52/67] added module cache for wasm3 code modification and analysis with walrus --- .../src/contract_operations.rs | 8 +- .../contract-engine/src/external/ecalls.rs | 2 +- .../contract-engine/src/module_cache.rs | 1 + .../shared/contract-engine/src/wasm3/mod.rs | 52 +------ .../contract-engine/src/wasm3/module_cache.rs | 128 ++++++++++++++++++ 5 files changed, 141 insertions(+), 50 deletions(-) create mode 100644 cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 3fd8dc5cd..54ae871a2 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -94,7 +94,7 @@ pub fn init( let mut engine = start_engine( context, gas_limit, - contract_code, + &contract_code, &contract_key, ContractOperation::Init, query_depth, @@ -226,7 +226,7 @@ pub fn handle( let mut engine = start_engine( context, gas_limit, - contract_code, + &contract_code, &contract_key, ContractOperation::Handle, query_depth, @@ -327,7 +327,7 @@ pub fn query( let mut engine = start_engine( context, gas_limit, - contract_code, + &contract_code, &contract_key, ContractOperation::Query, query_depth, @@ -361,7 +361,7 @@ pub fn query( fn start_engine( context: Ctx, gas_limit: u64, - contract_code: ContractCode, + contract_code: &ContractCode, contract_key: &ContractKey, operation: ContractOperation, query_depth: u32, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/external/ecalls.rs b/cosmwasm/enclaves/shared/contract-engine/src/external/ecalls.rs index 857d885e2..a0bf5d8fb 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/external/ecalls.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/external/ecalls.rs @@ -114,7 +114,7 @@ fn ecall_configure_runtime_impl(config: RuntimeConfiguration) -> sgx_status_t { "inside ecall_configure_runtime: {}", config.module_cache_size ); - crate::module_cache::configure_module_cache(config.module_cache_size as usize); + crate::wasm3::module_cache::configure_module_cache(config.module_cache_size as usize); sgx_status_t::SGX_SUCCESS } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs index c37663a9d..5a0fa448a 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs @@ -23,6 +23,7 @@ lazy_static! { SgxRwLock::new(LruCache::new(0)); } +#[allow(dead_code)] pub fn configure_module_cache(cap: usize) { debug!("configuring module cache: {}", cap); MODULE_CACHE.write().unwrap().resize(cap) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 7567a9344..e64eb0c00 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -21,11 +21,13 @@ use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngine use crate::gas::WasmCosts; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; -use crate::wasm::contract::api_marker; use crate::wasm::ContractOperation; -use crate::wasm3::gas::{get_exhausted_amount, get_remaining_gas, use_gas}; + +use gas::{get_exhausted_amount, get_remaining_gas, use_gas}; +use module_cache::create_module_instance; mod gas; +pub mod module_cache; mod validation; type Wasm3RsError = wasm3::Error; @@ -177,55 +179,15 @@ impl Engine { context: Ctx, gas_limit: u64, gas_costs: WasmCosts, - contract_code: ContractCode, + contract_code: &ContractCode, contract_key: ContractKey, operation: ContractOperation, query_depth: u32, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, ) -> Result { - let mut module = walrus::ModuleConfig::new() - .generate_producers_section(false) - .parse(contract_code.code()) - .map_err(|_| EnclaveError::InvalidWasm)?; - - for import in module.imports.iter() { - eprintln!("import {:?}", import) - } - for export in module.exports.iter() { - eprintln!("export {:?}", export) - } - - let cosmwasm_api_version = if let Some(export) = module - .exports - .iter() - .find(|&exp| exp.name == api_marker::V0_10 || exp.name == api_marker::V1) - { - if export.name == api_marker::V0_10 { - CosmWasmApiVersion::V010 - } else if export.name == api_marker::V1 { - CosmWasmApiVersion::V1 - } else { - error!("Invalid cosmwasm api version"); - return Err(EnclaveError::InvalidWasm); - } - } else { - error!("Invalid cosmwasm api version2"); - return Err(EnclaveError::InvalidWasm); - }; - - validation::validate_memory(&mut module)?; - - if let ContractOperation::Init = operation { - if module.has_floats() { - debug!("contract was found to contain floating point operations"); - return Err(EnclaveError::WasmModuleWithFP); - } - } - - gas::add_metering(&mut module, &gas_costs); - - let code = module.emit_wasm(); + let (code, cosmwasm_api_version) = + create_module_instance(contract_code, &gas_costs, operation)?; let context = Context { context, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs new file mode 100644 index 000000000..8c0542e29 --- /dev/null +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs @@ -0,0 +1,128 @@ +use std::sync::SgxRwLock; + +use lazy_static::lazy_static; +use log::*; +use lru::LruCache; + +use cw_types_generic::CosmWasmApiVersion; + +use enclave_ffi_types::EnclaveError; + +use enclave_cosmos_types::types::ContractCode; +use enclave_crypto::HASH_SIZE; + +use super::{gas, validation}; +use crate::gas::WasmCosts; +use crate::wasm::contract::api_marker; +use crate::wasm::ContractOperation; + +lazy_static! { + static ref MODULE_CACHE: SgxRwLock, CosmWasmApiVersion)>> = + SgxRwLock::new(LruCache::new(0)); +} + +pub fn configure_module_cache(cap: usize) { + debug!("configuring module cache: {}", cap); + MODULE_CACHE.write().unwrap().resize(cap) +} + +pub fn create_module_instance( + contract_code: &ContractCode, + gas_costs: &WasmCosts, + operation: ContractOperation, +) -> Result<(Vec, CosmWasmApiVersion), EnclaveError> { + debug!("fetching module from cache"); + let cache = MODULE_CACHE.read().unwrap(); + + // If the cache is disabled, don't try to use it and just compile the module. + if cache.cap() == 0 { + debug!("cache is disabled, building module"); + return analyze_module(contract_code, gas_costs, operation); + } + debug!("cache is enabled"); + + // Try to fetch a cached instance + let mut code = None; + let mut api_version = CosmWasmApiVersion::Invalid; + debug!("peeking in cache"); + let peek_result = cache.peek(&contract_code.hash()); + if let Some((cached_code, cached_ver)) = peek_result { + debug!("found instance in cache!"); + code = Some(cached_code.clone()); + api_version = *cached_ver; + } + + drop(cache); // Release read lock + + // if we couldn't find the code in the cache, analyze it now + if code.is_none() { + debug!("code not found in cache! analyzing now"); + let (new_code, new_api_version) = analyze_module(contract_code, gas_costs, operation)?; + code = Some(new_code); + api_version = new_api_version; + } + + // If we analyzed the code in the previous step, insert it to the LRU cache + debug!("updating cache"); + let mut cache = MODULE_CACHE.write().unwrap(); + if let Some(code) = code.clone() { + debug!("storing code in cache"); + cache.put(contract_code.hash(), (code, api_version)); + } else { + // Touch the cache to update the LRU value + debug!("updating LRU without storing anything"); + cache.get(&contract_code.hash()); + } + + let code = code.unwrap(); + + debug!("returning built instance"); + Ok((code, api_version)) +} + +pub fn analyze_module( + contract_code: &ContractCode, + gas_costs: &WasmCosts, + operation: ContractOperation, +) -> Result<(Vec, CosmWasmApiVersion), EnclaveError> { + let mut module = walrus::ModuleConfig::new() + .generate_producers_section(false) + .parse(contract_code.code()) + .map_err(|_| EnclaveError::InvalidWasm)?; + + for import in module.imports.iter() { + trace!("import {:?}", import) + } + for export in module.exports.iter() { + trace!("export {:?}", export) + } + + use walrus::Export; + let mut exports = module.exports.iter(); + let marker_export = + exports.find(|&exp| exp.name == api_marker::V0_10 || exp.name == api_marker::V1); + let cosmwasm_api_version = match marker_export { + Some(Export { name, .. }) if name == api_marker::V0_10 => CosmWasmApiVersion::V010, + Some(Export { name, .. }) if name == api_marker::V1 => CosmWasmApiVersion::V1, + _ => { + error!("Invalid cosmwasm api version2"); + return Err(EnclaveError::InvalidWasm); + } + }; + drop(exports); + + validation::validate_memory(&mut module)?; + + if let ContractOperation::Init = operation { + if module.has_floats() { + debug!("contract was found to contain floating point operations"); + return Err(EnclaveError::WasmModuleWithFP); + } + } + + gas::add_metering(&mut module, gas_costs); + + let code = module.emit_wasm(); + + Ok((code, cosmwasm_api_version)) +} From e2ce69447a25551763be66a404e4e52b538198cb Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 2 Oct 2022 16:17:44 +0300 Subject: [PATCH 53/67] correctly track externally used gas in wasm3 to avoid double charging users --- .../shared/contract-engine/src/wasm3/mod.rs | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index e64eb0c00..5a0193f0c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -85,6 +85,7 @@ impl<'env, C> Wasm3RuntimeEx for wasm3::Runtime<'env, C> { pub struct Context { context: Ctx, gas_limit: u64, + gas_used_externally: u64, gas_costs: WasmCosts, query_depth: u32, #[cfg_attr(feature = "query-only", allow(unused))] @@ -98,6 +99,14 @@ pub struct Context { } impl Context { + pub fn use_gas_externally(&mut self, amount: u64) { + self.gas_used_externally = self.gas_used_externally.saturating_add(amount); + } + + pub fn get_gas_used_externally(&self) -> u64 { + self.gas_used_externally + } + pub fn take_last_error(&mut self) -> Option { self.last_error.take() } @@ -192,6 +201,7 @@ impl Engine { let context = Context { context, gas_limit, + gas_used_externally: 0, gas_costs, query_depth, operation, @@ -243,8 +253,11 @@ impl Engine { let result = func(&mut instance, &mut self.context); debug!("function returned {:?}", result); - self.used_gas = - self.gas_limit - get_remaining_gas(&instance) + get_exhausted_amount(&instance); + self.used_gas = self + .gas_limit + .saturating_sub(get_remaining_gas(&instance)) + .saturating_sub(self.context.get_gas_used_externally()) + .saturating_add(get_exhausted_amount(&instance)); result } @@ -663,7 +676,7 @@ fn host_read_db( let (value, used_gas) = read_encrypted_key(&state_key_name, &context.context, &context.contract_key) .map_err(debug_err!("db_read failed to read key from storage"))?; - use_gas(instance, used_gas)?; + context.use_gas_externally(used_gas); debug!( "db_read received value {:?}", @@ -699,7 +712,7 @@ fn host_remove_db( debug!("db_remove removing key {}", show_bytes(&state_key_name)); let used_gas = remove_encrypted_key(&state_key_name, &context.context, &context.contract_key)?; - use_gas(instance, used_gas)?; + context.use_gas_externally(used_gas); Ok(()) } @@ -735,7 +748,7 @@ fn host_write_db( &context.contract_key, ) .map_err(debug_err!("db_write failed to write key to storage",))?; - use_gas(instance, used_gas)?; + context.use_gas_externally(used_gas); Ok(()) } @@ -842,7 +855,6 @@ fn host_addr_validate( let human = read_from_memory(instance, addr_to_validate as u32) .map_err(debug_err!(err => "humanize_address failed to extract vector from canonical_region_ptr: {err}"))?; - use_gas(instance, used_gas)?; trace!( "addr_validate() was called from WASM code with {:?}", @@ -952,7 +964,7 @@ fn host_query_chain( get_remaining_gas(instance), )?; - use_gas(instance, used_gas)?; + context.use_gas_externally(used_gas); write_to_memory(instance, &answer).map(|region_ptr| region_ptr as i32) } From 8acf0dc2efa9091ae099df40bc55e3ec8db6afbf Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 2 Oct 2022 16:29:46 +0300 Subject: [PATCH 54/67] New type VersionedCode in wasm3/module_cache.rs --- .../shared/contract-engine/src/wasm3/mod.rs | 7 ++-- .../contract-engine/src/wasm3/module_cache.rs | 35 +++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 5a0193f0c..94e17935e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -195,8 +195,7 @@ impl Engine { user_nonce: IoNonce, user_public_key: Ed25519PublicKey, ) -> Result { - let (code, cosmwasm_api_version) = - create_module_instance(contract_code, &gas_costs, operation)?; + let versioned_code = create_module_instance(contract_code, &gas_costs, operation)?; let context = Context { context, @@ -220,8 +219,8 @@ impl Engine { gas_limit, used_gas: 0, environment, - code, - api_version: cosmwasm_api_version, + code: versioned_code.code, + api_version: versioned_code.version, }) } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs index 8c0542e29..06aa0068c 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs @@ -16,8 +16,19 @@ use crate::gas::WasmCosts; use crate::wasm::contract::api_marker; use crate::wasm::ContractOperation; +pub struct VersionedCode { + pub code: Vec, + pub version: CosmWasmApiVersion, +} + +impl VersionedCode { + pub fn new(code: Vec, version: CosmWasmApiVersion) -> Self { + Self { code, version } + } +} + lazy_static! { - static ref MODULE_CACHE: SgxRwLock, CosmWasmApiVersion)>> = + static ref MODULE_CACHE: SgxRwLock> = SgxRwLock::new(LruCache::new(0)); } @@ -30,7 +41,7 @@ pub fn create_module_instance( contract_code: &ContractCode, gas_costs: &WasmCosts, operation: ContractOperation, -) -> Result<(Vec, CosmWasmApiVersion), EnclaveError> { +) -> Result { debug!("fetching module from cache"); let cache = MODULE_CACHE.read().unwrap(); @@ -46,7 +57,11 @@ pub fn create_module_instance( let mut api_version = CosmWasmApiVersion::Invalid; debug!("peeking in cache"); let peek_result = cache.peek(&contract_code.hash()); - if let Some((cached_code, cached_ver)) = peek_result { + if let Some(VersionedCode { + code: cached_code, + version: cached_ver, + }) = peek_result + { debug!("found instance in cache!"); code = Some(cached_code.clone()); api_version = *cached_ver; @@ -57,9 +72,9 @@ pub fn create_module_instance( // if we couldn't find the code in the cache, analyze it now if code.is_none() { debug!("code not found in cache! analyzing now"); - let (new_code, new_api_version) = analyze_module(contract_code, gas_costs, operation)?; - code = Some(new_code); - api_version = new_api_version; + let versioned_code = analyze_module(contract_code, gas_costs, operation)?; + code = Some(versioned_code.code); + api_version = versioned_code.version; } // If we analyzed the code in the previous step, insert it to the LRU cache @@ -67,7 +82,7 @@ pub fn create_module_instance( let mut cache = MODULE_CACHE.write().unwrap(); if let Some(code) = code.clone() { debug!("storing code in cache"); - cache.put(contract_code.hash(), (code, api_version)); + cache.put(contract_code.hash(), VersionedCode::new(code, api_version)); } else { // Touch the cache to update the LRU value debug!("updating LRU without storing anything"); @@ -77,14 +92,14 @@ pub fn create_module_instance( let code = code.unwrap(); debug!("returning built instance"); - Ok((code, api_version)) + Ok(VersionedCode::new(code, api_version)) } pub fn analyze_module( contract_code: &ContractCode, gas_costs: &WasmCosts, operation: ContractOperation, -) -> Result<(Vec, CosmWasmApiVersion), EnclaveError> { +) -> Result { let mut module = walrus::ModuleConfig::new() .generate_producers_section(false) .parse(contract_code.code()) @@ -124,5 +139,5 @@ pub fn analyze_module( let code = module.emit_wasm(); - Ok((code, cosmwasm_api_version)) + Ok(VersionedCode::new(code, cosmwasm_api_version)) } From 9b1f3faa2604cd1e5496dae5340c7e057474cadc Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 2 Oct 2022 16:35:19 +0300 Subject: [PATCH 55/67] fixed go.mod --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index f400d7c93..4e1b2036d 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,6 @@ require ( github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 // indirect github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect - github.com/stretchr/objx v0.3.0 // indirect github.com/pelletier/go-toml/v2 v2.0.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) From 766381f8f7c458fe0ac535096aca090a83bdc020 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Sun, 2 Oct 2022 17:15:44 +0300 Subject: [PATCH 56/67] simplified HandleType::get_export_name --- .../shared/contract-engine/src/wasm3/mod.rs | 4 ++-- .../enclaves/shared/cosmos-types/src/types.rs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 94e17935e..f31f8e3fd 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -395,7 +395,7 @@ impl Engine { let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; let (handle, args) = ( instance - .find_function::<(u32, u32, u32), u32>(&export_name) + .find_function::<(u32, u32, u32), u32>(export_name) .to_enclave_result()?, (env_ptr, msg_info_ptr, msg_ptr), ); @@ -403,7 +403,7 @@ impl Engine { } else { let (handle, args) = ( instance - .find_function::<(u32, u32), u32>(&export_name) + .find_function::<(u32, u32), u32>(export_name) .to_enclave_result()?, (env_ptr, msg_ptr), ); diff --git a/cosmwasm/enclaves/shared/cosmos-types/src/types.rs b/cosmwasm/enclaves/shared/cosmos-types/src/types.rs index e6df1ef92..f6a666b47 100644 --- a/cosmwasm/enclaves/shared/cosmos-types/src/types.rs +++ b/cosmwasm/enclaves/shared/cosmos-types/src/types.rs @@ -179,16 +179,16 @@ impl HandleType { } } - pub fn get_export_name(h: &HandleType) -> String { + pub fn get_export_name(h: &HandleType) -> &'static str { match h { - HandleType::HANDLE_TYPE_EXECUTE => "execute".to_string(), - HandleType::HANDLE_TYPE_REPLY => "reply".to_string(), - HandleType::HANDLE_TYPE_IBC_CHANNEL_OPEN => "ibc_channel_open".to_string(), - HandleType::HANDLE_TYPE_IBC_CHANNEL_CONNECT => "ibc_channel_connect".to_string(), - HandleType::HANDLE_TYPE_IBC_CHANNEL_CLOSE => "ibc_channel_close".to_string(), - HandleType::HANDLE_TYPE_IBC_PACKET_RECEIVE => "ibc_packet_receive".to_string(), - HandleType::HANDLE_TYPE_IBC_PACKET_ACK => "ibc_packet_ack".to_string(), - HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => "ibc_packet_timeout".to_string(), + HandleType::HANDLE_TYPE_EXECUTE => "execute", + HandleType::HANDLE_TYPE_REPLY => "reply", + HandleType::HANDLE_TYPE_IBC_CHANNEL_OPEN => "ibc_channel_open", + HandleType::HANDLE_TYPE_IBC_CHANNEL_CONNECT => "ibc_channel_connect", + HandleType::HANDLE_TYPE_IBC_CHANNEL_CLOSE => "ibc_channel_close", + HandleType::HANDLE_TYPE_IBC_PACKET_RECEIVE => "ibc_packet_receive", + HandleType::HANDLE_TYPE_IBC_PACKET_ACK => "ibc_packet_ack", + HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => "ibc_packet_timeout", } } } From 4b6676ac08faa3c014187b3b8c1623bfc36ec360 Mon Sep 17 00:00:00 2001 From: Reuven Podmazo Date: Wed, 5 Oct 2022 18:33:02 +0300 Subject: [PATCH 57/67] fixed go tests --- .../test-compute-contract/src/contract.rs | 53 +++++-------- .../src/contract_operations.rs | 4 +- .../shared/contract-engine/src/wasm3/mod.rs | 79 ++++++++++++++++++- .../internal/keeper/secret_contracts_test.go | 2 +- 4 files changed, 100 insertions(+), 38 deletions(-) diff --git a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs index 96dfb6571..3c7340ee5 100644 --- a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs +++ b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs @@ -2455,66 +2455,53 @@ fn pass_null_pointer_to_imports_should_throw(deps: DepsMut, pass_type: String) - fn test_canonicalize_address_errors(deps: DepsMut) -> StdResult { match deps.api.addr_canonicalize("") { - Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: Input is empty") { - return Err(StdError::generic_err( - "empty address should have failed with 'addr_canonicalize errored: Input is empty'", - )); - } + Err(StdError::GenericErr { msg }) + if msg == String::from("addr_canonicalize errored: Input is empty") => + { // all is good, continue } - _ => { + other => { return Err(StdError::generic_err( - "empty address should have failed with 'addr_canonicalize errored: Input is empty'", + format!("empty address should have failed with 'addr_canonicalize errored: Input is empty', instead was {:?}", other), )) } } match deps.api.addr_canonicalize(" ") { - Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: invalid length") { - return Err(StdError::generic_err( - "empty trimmed address should have failed with 'addr_canonicalize errored: invalid length'", - )); - } + Err(StdError::GenericErr { msg }) + if msg == String::from("addr_canonicalize errored: invalid length") => + { // all is good, continue } - _ => { + other => { return Err(StdError::generic_err( - "empty trimmed address should have failed with 'addr_canonicalize errored: invalid length'", + format!("empty trimmed address should have failed with 'addr_canonicalize errored: invalid length', instead was: {:?}", other), )) } } match deps.api.addr_canonicalize("cosmos1h99hrcc54ms9lxxxx") { - Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: invalid checksum") { - return Err(StdError::generic_err( - "bad bech32 should have failed with 'addr_canonicalize errored: invalid checksum'", - )); - } + Err(StdError::GenericErr { msg }) + if msg == String::from("addr_canonicalize errored: invalid checksum") => + { // all is good, continue } - _ => { + other => { return Err(StdError::generic_err( - "bad bech32 should have failed with 'addr_canonicalize errored: invalid checksum'", + format!("bad bech32 should have failed with 'addr_canonicalize errored: invalid checksum', instead was {:?}", other), )) } } match deps.api.addr_canonicalize("cosmos1h99hrcc54ms9luwpex9kw0rwdt7etvfdyxh6gu") { - Err(StdError::GenericErr { msg }) => { - if msg != String::from("addr_canonicalize errored: wrong address prefix: \"cosmos\"") - { - return Err(StdError::generic_err( - "bad prefix should have failed with 'addr_canonicalize errored: wrong address prefix: \"cosmos\"'", - )); - } + Err(StdError::GenericErr { msg }) + if msg == String::from("addr_canonicalize errored: wrong address prefix: \"cosmos\"") => + { // all is good, continue } - _ => { + other => { return Err(StdError::generic_err( - "bad prefix should have failed with 'addr_canonicalize errored: wrong address prefix: \"cosmos\"'", + format!("bad prefix should have failed with 'addr_canonicalize errored: wrong address prefix: \"cosmos\"', instead was {:?}", other), )) } } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 54ae871a2..92cc8c012 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -335,10 +335,12 @@ pub fn query( secret_msg.user_public_key, )?; - let versioned_env = base_env + let mut versioned_env = base_env .clone() .into_versioned_env(&engine.get_api_version()); + versioned_env.set_contract_hash(&contract_hash); + let result = engine.query(&versioned_env, validated_msg); *used_gas = engine.gas_used(); let output = result?; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index f31f8e3fd..3731acffb 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -269,7 +269,7 @@ impl Engine { link_fn(instance, "humanize_address", host_humanize_address)?; link_fn(instance, "query_chain", host_query_chain)?; - link_fn(instance, "addr_canonicalize", host_canonicalize_address)?; + link_fn(instance, "addr_canonicalize", host_addr_canonicalize)?; link_fn(instance, "addr_humanize", host_humanize_address)?; link_fn(instance, "addr_validate", host_addr_validate)?; link_fn(instance, "debug_print", host_debug_print)?; @@ -844,6 +844,79 @@ fn host_canonicalize_address( Ok(0) } +fn host_addr_canonicalize( + context: &mut Context, + instance: &wasm3::Instance, + (human_region_ptr, canonical_region_ptr): (i32, i32), +) -> WasmEngineResult { + let used_gas = context.gas_costs.external_canonicalize_address as u64; + use_gas(instance, used_gas)?; + + let human = read_from_memory(instance, human_region_ptr as u32) + .map_err(debug_err!(err => "addr_canonicalize failed to extract vector from human_region_ptr: {err}"))?; + + let human_addr_str = match std::str::from_utf8(&human) { + Ok(addr) => addr, + Err(_err) => { + debug!( + "addr_canonicalize input was not valid UTF-8: {}", + show_bytes(&human) + ); + return write_to_memory(instance, b"input is not valid UTF-8") + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")); + } + }; + if human_addr_str.is_empty() { + debug!("addr_canonicalize input was empty"); + return write_to_memory(instance, b"Input is empty") + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")); + } + + debug!("addr_canonicalize was called with {:?}", human_addr_str); + + let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { + Ok(ret) => ret, + Err(err) => { + debug!( + "addr_canonicalize failed to parse input as bech32: {:?}", + err + ); + return write_to_memory(instance, err.to_string().as_bytes()) + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")); + } + }; + + if decoded_prefix != BECH32_PREFIX_ACC_ADDR { + debug!("addr_canonicalize was called with an unexpected address prefix"); + return write_to_memory( + instance, + format!("wrong address prefix: {:?}", decoded_prefix).as_bytes(), + ) + .map(|n| n as i32) + .map_err(debug_err!("failed to write error message to contract")); + } + + let canonical = Vec::::from_base32(&data).map_err(|err| { + // Assaf: From reading https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#607 + // and https://docs.rs/bech32/0.7.2/src/bech32/lib.rs.html#228 I don't think this can fail that way + debug!("addr_canonicalize failed to parse base32: {}", err); + WasmEngineError::Base32Error + })?; + + debug!( + "addr_canonicalize returning address {}", + hex::encode(human_addr_str) + ); + + write_to_allocated_memory(instance, canonical_region_ptr as u32, &canonical)?; + + // return 0 == ok + Ok(0) +} + fn host_addr_validate( context: &mut Context, instance: &wasm3::Instance, @@ -876,7 +949,7 @@ fn host_addr_validate( Ok(x) => x, }; - let canonical_address = match bech32::decode(&source_human_address) { + let canonical_address = match bech32::decode(source_human_address) { Err(err) => { debug!( "addr_validate() error while trying to decode human address {:?} as bech32: {:?}", @@ -912,7 +985,7 @@ fn host_humanize_address( instance: &wasm3::Instance, (canonical_region_ptr, human_region_ptr): (i32, i32), ) -> WasmEngineResult { - let used_gas = context.gas_costs.external_canonicalize_address as u64; + let used_gas = context.gas_costs.external_humanize_address as u64; use_gas(instance, used_gas)?; let canonical = read_from_memory(instance, canonical_region_ptr as u32) diff --git a/x/compute/internal/keeper/secret_contracts_test.go b/x/compute/internal/keeper/secret_contracts_test.go index 9075f1be1..e1fa0eb2b 100644 --- a/x/compute/internal/keeper/secret_contracts_test.go +++ b/x/compute/internal/keeper/secret_contracts_test.go @@ -6513,7 +6513,7 @@ func TestEnv(t *testing.T) { queryRes, qErr := queryHelper(t, keeper, ctx, contractAddress, `{"get_env":{}}`, true, false, math.MaxUint64) require.Empty(t, qErr) - require.Equal(t, queryRes, expectedV1Env) + require.Equal(t, expectedV1Env, queryRes) } else { // no env or msg info in v0.10 query } From d9b7aab0d2b89c3389ae0bd7918f9ee9a12bca77 Mon Sep 17 00:00:00 2001 From: Itzik Date: Mon, 24 Oct 2022 09:26:52 +0300 Subject: [PATCH 58/67] Merged all the stuff from the old wasm3 branch --- cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index aaf3754b1..8a847befd 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -105,7 +105,6 @@ pub struct Context { query_depth: u32, #[cfg_attr(feature = "query-only", allow(unused))] operation: ContractOperation, - query_depth: u32, contract_key: ContractKey, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, @@ -206,12 +205,12 @@ impl Engine { contract_code: &ContractCode, contract_key: ContractKey, operation: ContractOperation, - query_depth: u32, user_nonce: IoNonce, user_public_key: Ed25519PublicKey, + query_depth: u32, ) -> Result { let versioned_code = create_module_instance(contract_code, &gas_costs, operation)?; - + let kv_cache = KvCache::new(); let context = Context { context, query_depth, From 119fa619c6ddbc4c661198cfd8809044b02d8539 Mon Sep 17 00:00:00 2001 From: Itzik Date: Mon, 24 Oct 2022 19:51:20 +0300 Subject: [PATCH 59/67] Fix tests --- .../v1/compute-tests/test-compute-contract/src/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs index 7dc304cfd..1dddfac41 100644 --- a/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs +++ b/cosmwasm/contracts/v1/compute-tests/test-compute-contract/src/contract.rs @@ -2472,9 +2472,9 @@ fn test_canonicalize_address_errors(deps: DepsMut) -> StdResult { match deps.api.addr_canonicalize(" ") { Err(StdError::GenericErr { msg }) => { - if !msg.to_lowercase().contains("input is empty") { + if !msg.to_lowercase().contains("invalid length") { return Err(StdError::generic_err(format!( - "empty trimmed address should have failed with 'addr_canonicalize errored: Input is empty; got {:?}'", + "empty trimmed address should have failed with 'addr_canonicalize errored: invalid length; got {:?}'", msg))); } // all is good, continue From 2d45374cb21c9580c437a97e2c1035cd71c0bc93 Mon Sep 17 00:00:00 2001 From: Itzik Date: Tue, 25 Oct 2022 10:33:02 +0300 Subject: [PATCH 60/67] Added test for large read/write to storage --- Makefile | 4 ++++ .../bench-contract/src/benches/mod.rs | 3 +++ .../src/benches/read_storage.rs | 9 +++++++++ .../src/benches/write_storage.rs | 9 +++++++++ .../bench-contract/src/contract.rs | 15 +++++++++++---- x/compute/internal/keeper/bench_test.go | 14 ++++++++++++-- .../keeper/testdata/bench_contract.wasm | Bin 172243 -> 696708 bytes 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 578929edd..c32375ea0 100644 --- a/Makefile +++ b/Makefile @@ -331,6 +331,10 @@ callback-sanity-test: cp ./$(EXECUTE_ENCLAVE_PATH)/librust_cosmwasm_enclave.signed.so . SGX_MODE=SW ./cosmwasm/testing/callback-test.sh +build-bench-contract: + $(MAKE) -C $(TEST_CONTRACT_V1_PATH)/bench-contract + cp $(TEST_CONTRACT_V1_PATH)/bench-contract/*.wasm $(TEST_COMPUTE_MODULE_PATH)/ + build-test-contract: # echo "" | sudo add-apt-repository ppa:hnakamur/binaryen # sudo apt update diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs index 7b9f1eb72..a21313b0e 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/mod.rs @@ -2,3 +2,6 @@ pub(crate) mod allocate; pub(crate) mod cpu; pub(crate) mod read_storage; pub(crate) mod write_storage; + +// 2048 bytes +pub const LARGE_VALUE: &[u8] = b"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs index aabfa72fe..141603184 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs @@ -19,3 +19,12 @@ pub fn bench_read_storage_different_key(deps: Deps, keys: u64) -> StdResult<()> Ok(()) } + +pub fn bench_read_large_key_from_storage(deps: DepsMut, keys: u64) -> StdResult<()> { + deps.storage.set(b"test.key", crate::benches::LARGE_VALUE); + for _ in 1..keys { + deps.storage.get(b"test.key"); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs index 2f60b21cb..28e6f8d0c 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/write_storage.rs @@ -16,3 +16,12 @@ pub fn bench_write_storage_different_key(deps: DepsMut, keys: u64) -> StdResult< Ok(()) } + +pub fn bench_write_large_storage_key(deps: DepsMut, keys: u64) -> StdResult<()> { + for i in 1..keys { + deps.storage + .set(&i.to_be_bytes(), crate::benches::LARGE_VALUE); + } + + Ok(()) +} diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs index 6b023066e..e8be581bd 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs @@ -2,8 +2,12 @@ use benches::cpu::do_cpu_loop; use crate::benches; use crate::benches::allocate::do_allocate_large_memory; -use crate::benches::read_storage::bench_read_storage_same_key; -use crate::benches::write_storage::bench_write_storage_different_key; +use crate::benches::read_storage::{ + bench_read_large_key_from_storage, bench_read_storage_same_key, +}; +use crate::benches::write_storage::{ + bench_write_large_storage_key, bench_write_storage_different_key, +}; use cosmwasm_std::{ entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdResult, }; @@ -33,8 +37,11 @@ pub fn execute( ExecuteMsg::BenchReadStorage {} => bench_read_storage_same_key(deps, 100), ExecuteMsg::BenchWriteStorage {} => bench_write_storage_different_key(deps, 100), ExecuteMsg::BenchAllocate {} => do_allocate_large_memory(), - ExecuteMsg::BenchReadLargeItemFromStorage { .. } => Ok(()), - ExecuteMsg::BenchWriteLargeItemToStorage { .. } => Ok(()), + // start with running large item bench once, otherwise cache will skew performance numbers + ExecuteMsg::BenchReadLargeItemFromStorage { .. } => { + bench_read_large_key_from_storage(deps, 2) + } + ExecuteMsg::BenchWriteLargeItemToStorage { .. } => bench_write_large_storage_key(deps, 2), }; Ok(Response::default()) diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index cd5668035..7ee06455b 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -22,7 +22,7 @@ const ( BenchWriteStorage = "bench_write_storage" BenchAllocate = "bench_allocate" BenchReadLargeItemFromStorage = "bench_read_large_item_from_storage" - BenchWriteLargeItemToStorage Bench = "bench_write_large_item_from_storage" + BenchWriteLargeItemToStorage Bench = "bench_write_large_item_to_storage" ) func buildBenchMessage(bench Bench) []byte { @@ -183,6 +183,16 @@ func TestRunBenchmarks(t *testing.T) { bench: BenchAllocate, loops: 10, }, + "Read large item from storage": { + gasLimit: 5_000_000, + bench: BenchReadLargeItemFromStorage, + loops: 10, + }, + "Write large item to storage": { + gasLimit: 100_000_000, + bench: BenchWriteLargeItemToStorage, + loops: 10, + }, } contractAddr, creator, creatorPriv, ctx, keeper := initBenchContract(t) @@ -190,7 +200,7 @@ func TestRunBenchmarks(t *testing.T) { // *** Measure baseline timer := NewBenchTimer("base contract execution", Noop) // make sure we set a limit before calling - ctx = ctx.WithGasMeter(sdk.NewGasMeter(1_000_000)) + ctx = ctx.WithGasMeter(sdk.NewGasMeter(100_000_000)) require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) msg := buildBenchMessage(Noop) diff --git a/x/compute/internal/keeper/testdata/bench_contract.wasm b/x/compute/internal/keeper/testdata/bench_contract.wasm index 2e1be8bd8624b602e2e36e275d9e5e73c9fae585..f4cb921187cb31f5b856a9f818d7465e4c126e3b 100644 GIT binary patch literal 696708 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 zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0;r=LqBr`O06XJ7URLELJEM=O%(eZu(&E z;M~D#__h>eCl8h@#ZvZA5PovBl&=KKKg!O`6m!{1Er8o)CR;ib98}2JgHxsA?DFto z6m>x=#VCN%@klK_U(;)|*1xUS)Aahk^?JHqTQVK7Hob1p>lVFUq}R=Q?J8Bvm0Z_U zFfh^6H#s=mGu1l~1cUuU{S!g&$mCG}aBgrQJDHmt>6scF3A$$T6QykFSXZuC3cAXr zT$fT?>dH=L=k!|c3JTTPpro_vER|!g*D-F_F}k%hYN`LrR&Q!~Y*7OrmlY;~rRpPM;$LZI^%E~CY+!v$I{)UsVmix&HAhn7w)U0SmK75Vbq zO!kb0pa@S=mEESquYAX zDR#*f3zbqfS6STY^4bR{-EAUY&?Oul-Q`{{xx^gJ%NDy8YWOZ&PZ?|6*LZ7`- z+g8_wsTK|wibo6nk!&fSEmRcCc0bA*zQTQ=7XFiZwLDkv*st}j>EdkAHBp@C>dfiR zE_RiILwV(gV=iMHQkJhybmoe)J9>g#Zm@S`WO8C8$PM@QbxmZ;x(9c3clPvkcDvA% zfk}qv`a>Ph&h>9~B4_J0T7P84`afvBwQl=kE4F`g#rFTPV*9_Y*#3hR+y8CF_9s?s zUs$m{6J{4yW~#;h>dJ?5b;4!-6Uv9kC82Z-X`lM_bL!TU+HTh_ z+P+!qmJg!!3s!8m^|f`|J6CMC^=)-TE`NZe@J5eM;-~=W~zN>z(h@dj0WVqV+TC_J4)ed$hiHcCM(qNVoB*KdWlO zFBVh^PiKz=ezz6e!+yRnSFQLH$0|Wt@BNvq0_CQ4-)s*rMxm&Wk7Q@^lm1LlI8>P~ zf1s@+c2nK4-lSvIpZnXjUZ2+YYu(OuU#)KNk4^^#KbM`!RcBOy>kcngD=rb$si~k; zJIs>BYqf8amZ$SxRCOQTi+gM5cJobphINejRpEVU_x>g=Rz4n5nxcB`#I#R@i7w}# z6V&Z*dEBm#UBjq;8_@d?s0_8gh%_uEM*VBsJ7Vqn{DgB<5!02M4swTOR92N8RyRBP z2Zo1(iILu(so|-~si3zj7#tZM9LaXgWpjtsWGQ#4LJBJ{RfDP|%VD`QspH(K<5*s{ z7VWhu}d zrB;ZgW+Kq7mA5n~DfMU6>EBfJ=Sszju7=y$onfU^tXd7L+raWzLAP9Br#hdJRMn1B)S*h9-&8)avi<4Lk7~Q=0$O(b;b|SQ zJCx^2TCBVXOQK4#=+9XGu+vt%vUJcDJ`!5C5;j5Bz56lQdb zx;W}TsEg+lif5zZabc#bv)O`nsN4RX+HtN6%4Oxtn~Fu3k6p298DTm*Hy0Fir43mB z&+7I#q^ssG-YwU4X4Z7Xtc;1ydzH#XS0~gQw%68cMbcH-^7Ni!X;vBi7d}L6TF2N~ zcZ@x?ICr~dv6Xp#uNrr{J12cLu5!U*{_xdO88~&~73W73_gG!ryH}*&>a6EAJ*&bS|8D3K)No_k-Z^!((Y$-b%=yulKyI59* zrP`>fTq{<3I@JbW+YuYA+rOMYRLJTnMr~Pl$#2qjt0|)RrVd50`_ml>!Lu!Hc zhheS>j)jrw*+m*-FmgQK(x;;_k^$%=~dcp=W}IH(D~*T<)-zy<+a*H^yjJ*b}bfR=e6D1 zvUWjDDBAE)ZNFO-+mt;h)m@H1);4<%T)I$^ep$6wZdpDWQn>J%?K*awu2_8@v+^w3 zv;K3t-wxESTA+&<#(L1M$87nKvSHai)m?ZfsJKtBFIM*0B~cYMSp&McGBsR#dxdxp zNH?-w_MA4VV};bU&>?J%QHQC)?RRckSNQt0?zFUqc5Y++wu`i_-p>NmZ@<{~ot`-` zUD{tfdR=wqKy_kla#zhG#Ui&V)f3*H~eQxcGUD--*I=nk#AJ=Er z$5x9k%o<_Y<$~$__Z`-MzNc_jwtQc&3B7Jr`p?m_S<6{kHfrh6V)bIw&flf?musp2 z>=I}t!}%rn)_}Y3q>s= zm0N25+F{*ctYxoHtzBcSfA_dFY3)gsi93cn_f6boEmSs$sD z_x4v8{^b2t*DF2K!9D)ify?*qU3ucMSQO`PD=sT{|AWqdwm2C+>+ko&XZ>?@tVS)- z`t$XEOWpc$y|;ehU13j#?&m4jh<;T2|3{@$SFkHgsJk6wKi09Htu%Z^i=}n(5#Ch- zPu?#*vpMXS{<+sj@z(#^$%99&G=-!ON0H3 z{bA9*mVc~m9IgM6-urdyAJltm6Ghu?-SU65{_lEkHBq$wgx*_!RsFj4eMRd()q8uE zs9)b)w|=@8j?qNhZQZV6w7zD=dh?3#wq75;RqNJ9i1u$;vE81V>%*_EtuOU;s!wJ% ztA=DydgvKpJ2#3e>i3P-cSie0U7S_{mygX(sN_-=F*RkqT%EDl*J|-Ru2(zu|JJK^ zjqQ#q#^9dC`qK5TX8pk(6M5?$s->hew&t7;H@+2Bb=K$VD~_x5xwTJL#vQc{PwaCH z>rCroay_-K!a{4?s`k~VoxbLbwc(EII@WL4xarKZ&i37vT&P{jg&l&i z5aAVFSkN^c-FeZ%!o`aKb;$^JM9m~#s!^ZIZmh#5(v+p1HwLJf&)2$`HWyM)9oo^Um+BaU{Uy(T;s5pXzv?{o*J%07xgD_=X}L;E#@=73zeUw{8KoC;oAJ*blSaSNluvt?%P&dbPGr^y;2~$CuVKJHkG# zX!}!dgoMv^J)Ihg=#S=1)E*Pm^QR6UHK^t^ER&0E(=n}0@~=8E8*|vFC0Sec>-7dL zH)_$S&y0pT#`n!xzuM?%wQ#hQo!fT4&cTNL#`VY+jE6lg;h=(Fo6}`|rShot{!Xcb zC74v>=j%GIJxBgful8&d&83P)TixDz{94ml>%XtHFIR?hXJNx}3VV^lT6=qsux&0# zw0@=5&(it$tgebi57pmaoA|Y+E1ZM#-IjF>dxp7LaXUK=7+Zg_y6lQ2H<@Aid5tTqdz92` z{rP6KUTaMsEmk$nNZma)Dq%@=gTijb`m1W8YOS7It6RbFj@naKpvnfO4((q%-#N?(qKnCGvRekj~fs?0%ls z@`xPm&mNZUv3VGl=_jnCraT(gE( z$4C9e_&1V*|NL!D+qR$IbbEcAvkG@-lp_`= zlPN=VNnM$u`yNgD?CI|9?(6RF9_SwI9_k+M9_i`s>FMe1>Feq58R!}88R{AC8R_lr z?dk39?d$FD9q1kG9qJwK9qH@t>*?$5>+9?98|WMC8|oYG8|m-v@9FRD@9XdHALzFU zmBalb1Kk5X1HA)%1N{R71A_xY1H%I&gWZEYgS~@&gZ+a8gM))ZgPMvl)IHQQ)H~ES z)IT&ZG&nRgG(0pi+&$bg+&kPi+&?@pJUBcwJUl!yq9l&!@FR+PM7xdXqik6vp&PCV z3!YK`f}FZ+{Y(6wkyz}7vfL<(Z|Nf1eN}H%(0WnJoR(6ypxF~)FKKvvqYE5vu`FIz zq3R0$aBh$PzTWU!{<&VaD2@}j-40zYI=c^lsBl(h*?bvGOBi$D`uQxQoYNQf^GEST z;rG_UhsO_7w=^j0a+@M?Beb!b6o-v(-KAH1PLATRGR%(Y{U`q^3BTfB{7L^3EB=!9 zS9in{uTdrHT)Vxqv-3{Z&rr(%x^b7?-U(@fP2Be=wgisO#0jG&G}*Xgk4A*f*4mBFc8*_r|H$wxmK@MKdp?@@~K_F=or>7 zxkJm+h=O(ZhozAwyYBR@w6(sDvJD^m+rl|(=etvg(m$5bl|_}Ody#D$3+&7EF%q9@+#y)FKZ_&byD%KV@B zPf|aP|17c4`0jg-z4Yb3+kNXZU;46FZu-ZzRo7hmlP5a6F1_Q`q7Vl^3$LD{8#_ss@MPN-+bzGpWl1^zFVL5?1L|U z#e?tvqYr-U&p!3(udH6X?)E$W?caa4Fh6_uKYhLJ>_TzVnFpW$g7>`l-Vc9d?Ygth z-gD*k`<{8*9nXHjz5nf#U;6Ub9{>K2O63PD)z_Za+4Z*fe(+`L}0(+Mx#kY3%if7NN}o70Kprl!V3CXr6W zb@Q|&Q;FsVukDP~_34f2ThsA|wXOS;mnU{4yyWVJRV|~*GtWKf&nE9Wcm6Y}``(w> z&~V>R6VFPoZR}`V)3T=Ju7;+D4GqsqUzpm{v_099^b$SI+mjm_niKPXpiNyp*CpoP zlDR0cDsfSIICEj@zJ=8tnXc745}Q|TUN!%+|7c=kVpVIb!Si%- z@l-k;&tw|oO{wO1Te96-9X~B~`sy{_8S!=T^{tyyXJ*dv?n)kxzc=xb_~+wajDM-+ z%Z+~*|4RI;-lM6<;@?hwC;nak@#K%=%BWt;)}5DJzwf~}zxlsD_oc6S?eG5KhkoPz z4e7?gi!Zt52VeMNa!tqJ&@H##`_A{g_fH2NJ?%GN{E9a(=0wYg*YBGQ?)ak*Zrqg4 zG&QeTH#jo-_IEt;_l-lZeAV02O*=1{%0Kw(;=zx7_j|WZ{P2l|H@va4YwNa~-}KPK zzxS56z5U%E`p735np@5|bM(^PH@x+2fBiQPrPpuRa_%LUe*0g(xA4hNCH-fdd)~Ib z;nAzEzIOisbvP>1jpu@?!{vLPfA34)^3M0Z@8e&1&wC5S*F1a6b5n`rj>J^L>*}1p z@61Hcs!hpr8qZ2yn7Sg_cES8R8_r3dliZf+Z@&KW<3o*Wn=&0ccaJ1;na1w5sm+Ov zDeto37_N6;BO~=o>@%n9<3)XHpZ_}D} zjo0e{SG2BAH#J<9+1glbzI5z@hMlRVh8r5ZRC^*d|I&%GuF5pczxCN$b~iUQw4OfN z&@{L`xo-YXE}A^ha#dr~p4}U-${c9jdpy0T>CD8HdxsKjnWl!3bkp&{_46O}R`s^t z|Hi3m^ZX}Xa&4~lfvyL?c;A%||H*wL=?ju~G@RG8r)gX2^!wg-dvHy1B)$4F%LA|b zapr-)yP)xRzkR%KM`Cp{bNpp5P99FRCK}W2uO7d$v2xM;zcrOJb7$Wl~WpFRKBh4WwDk=T%oAHVGE)uSozfk)^6{rqc_P09HEtFO5B;`u+n zsKHC#oZ8qQKi;-IIoWbc)BJme&urbEY*fB)n193lkLaXZ6P1={rF9prYDo_3WVU6t zTz~wgmNOEmM7r_JM02X4si`5OQg!~X&TV?2;gkh*t)M<=GjGB&y1KK&&DpkR+-+K- zb$ceVIxSka=R%tsVN*u!`OiHwEIvGhlN+jY2P;MQz;IA4qvdU^yR~mD5sTfQ^kc6| zjmPdh{h`=t>-@7@{PDBDxBa0DFX;BS7vK8m_W0Y!cbxT;@y^)K{J}Rbj1T_Qdu-5a z+B|el>tjRjYRisvbv!)Mz3H(le{k03YahSsv3>iBoA_+o6U}T>tZ~YVJOx-3wH(#p7P` z8QxhNZ*LxLZ1g&kUZcu^)P;$QG8c4s{*ZP^W>kQso8o7Bqqci8qaaQ34PHDxq5>ls zSAprB6;F80ww_V|Z%uryiW7xa+!-&OXo{cZ?bN<4+H;$tSFE~tUNRkTcClKLbkMl1 zZ;Fp7ebG_Q^se%f>YVnxjCX?u!ym)h?r()cz#LMwc>g68OXw_<+Y(9d_Z5FE{@cwx$>(~5tIpS1HYIu#W7@ko zaZbw1T;jFF`x|wKc?S~)+2B3oB{F9?RnJ@NwWSlOzsT5$tTRzvCky4p|EJQ`px2G@ zn=|&wU1p)JK|&Wa6>Ie3KhjlKZtz~Iqa{7RXav)3Y4Qep-x*)0M!1F?GMRY#tmJPcVnfN^jMwI^O?j&n(`pw>N;%fM nI2lXNreovtkH=g)?M&TD)?SO2Lwc6HTFW_Fex_$rdp`ZY7ym9Z delta 14363 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 From aade7ce2e5b8c19987dacc384ae290640bf03879 Mon Sep 17 00:00:00 2001 From: Itzik Date: Tue, 25 Oct 2022 11:59:03 +0300 Subject: [PATCH 61/67] Merge 1.1.5 to wasm3-cw1 Moved wasmi to a feature flag instead of deleting all the code for now --- .../shared/contract-engine/Cargo.toml | 9 +++-- .../src/contract_operations.rs | 33 ++----------------- .../contract-engine/src/cosmwasm_config.rs | 31 +++++++++++++++++ .../shared/contract-engine/src/errors.rs | 6 ++-- .../shared/contract-engine/src/gas.rs | 3 +- .../shared/contract-engine/src/lib.rs | 5 +-- .../contract-engine/src/wasm/contract.rs | 32 ------------------ .../contract-engine/src/{ => wasm}/memory.rs | 1 - .../shared/contract-engine/src/wasm/mod.rs | 13 ++++++++ .../src/{ => wasm}/module_cache.rs | 4 +-- .../shared/contract-engine/src/wasm3/mod.rs | 2 +- .../contract-engine/src/wasm3/module_cache.rs | 4 +-- cosmwasm/enclaves/shared/utils/src/lib.rs | 3 ++ cosmwasm/packages/sgx-vm/src/cache.rs | 7 ++-- 14 files changed, 73 insertions(+), 80 deletions(-) create mode 100644 cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs rename cosmwasm/enclaves/shared/contract-engine/src/{ => wasm}/memory.rs (98%) rename cosmwasm/enclaves/shared/contract-engine/src/{ => wasm}/module_cache.rs (98%) diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 4498d5a46..97e8d5557 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -5,10 +5,12 @@ authors = ["Cashmaney "] edition = "2018" [features] +default = ["wasm3"] query-only = [] debug-print = [] test = [] - +wasm3 = [] +wasmi-engine = ["wasmi", "parity-wasm", "pwasm-utils"] # This annotation is here to trick the IDE into showing us type information about this crate. # We always compile to the "sgx" target, so this will always be false. @@ -42,8 +44,8 @@ derive_more = "0.99" sha2 = "0.8.1" bech32 = "0.7.2" -pwasm-utils = { version = "0.12.0", default-features = false } -parity-wasm = { version = "0.41.0", default-features = false } +pwasm-utils = { version = "0.12.0", default-features = false, optional = true } +parity-wasm = { version = "0.41.0", default-features = false, optional = true } wasm3 = { git = "https://github.com/scrtlabs/wasm3-rs", rev = "ad1c868" } walrus = { version = "0.19.0", git = "https://github.com/scrtlabs/walrus", rev = "c5777d4" } @@ -58,4 +60,5 @@ rand_chacha = { version = "0.2.1", default-features = false } git = "https://github.com/paritytech/wasmi" rev = "84d2764594d80425373bf4949a58fa3df3d624c3" default-features = false +optional = true features = ["core"] diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index d6a27fdde..95709856d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -11,10 +11,11 @@ use enclave_ffi_types::{Ctx, EnclaveError}; use log::*; use std::time::Instant; +use crate::cosmwasm_config::ContractOperation; + use crate::contract_validation::{ReplyParams, ValidatedMessage}; use crate::external::results::{HandleSuccess, InitSuccess, QuerySuccess}; use crate::message::{is_ibc_msg, parse_message, ParsedMessage}; -use crate::wasm::traits::WasmiApi; use super::contract_validation::{ generate_encryption_key, validate_contract_key, validate_msg, verify_params, ContractKey, @@ -26,7 +27,6 @@ use super::io::{ }; //use super::module_cache::create_module_instance; use super::types::{IoNonce, SecretMessage}; -use super::wasm::ContractOperation; // use super::wasm::{ContractInstance, Engine}; /* @@ -421,35 +421,6 @@ fn start_engine( ) } -// TODO remove once the new engine works well -// fn _start_engine( -// context: Ctx, -// gas_limit: u64, -// contract_code: ContractCode, -// contract_key: &ContractKey, -// operation: ContractOperation, -// nonce: IoNonce, -// user_public_key: Ed25519PublicKey, -// ) -> Result { -// let module = create_module_instance(contract_code, operation)?; -// -// // Set the gas costs for wasm op-codes (there is an inline stack_height limit in WasmCosts) -// let wasm_costs = WasmCosts::default(); -// -// let contract_instance = ContractInstance::new( -// context, -// module.clone(), -// gas_limit, -// wasm_costs, -// *contract_key, -// operation, -// nonce, -// user_public_key, -// )?; -// -// Ok(Engine::new(contract_instance, module)) -// } - fn extract_base_env(env: &[u8]) -> Result { serde_json::from_slice(env) .map_err(|err| { diff --git a/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs b/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs new file mode 100644 index 000000000..d2b6210a4 --- /dev/null +++ b/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs @@ -0,0 +1,31 @@ +/// api_marker is based on this compatibility chart: +/// https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/README.md#compatibility +pub mod api_marker { + pub const V0_10: &str = "cosmwasm_vm_version_3"; + pub const V1: &str = "interface_version_8"; +} + +/// Right now ContractOperation is used to detect queris and prevent state changes +#[derive(Clone, Copy, Debug)] +pub enum ContractOperation { + Init, + Handle, + Query, +} + +#[allow(unused)] +impl ContractOperation { + pub fn is_init(&self) -> bool { + matches!(self, ContractOperation::Init) + } + + pub fn is_handle(&self) -> bool { + matches!(self, ContractOperation::Handle) + } + + pub fn is_query(&self) -> bool { + matches!(self, ContractOperation::Query) + } +} + +pub const MAX_LOG_LENGTH: usize = 8192; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index aed6d3ec6..d982e77bf 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -1,6 +1,7 @@ use derive_more::Display; use log::*; +#[cfg(feature = "wasmi-engine")] use wasmi::{Error as InterpreterError, HostError, TrapKind}; use wasm3::Error as Wasm3RsError; @@ -38,6 +39,7 @@ pub enum WasmEngineError { pub type WasmEngineResult = Result; +#[cfg(feature = "wasmi-engine")] impl HostError for WasmEngineError {} impl From for EnclaveError { @@ -140,7 +142,7 @@ where } } -#[allow(dead_code)] +#[cfg(feature = "wasmi-engine")] pub fn wasmi_error_to_enclave_error(wasmi_error: InterpreterError) -> EnclaveError { wasmi_error .try_into_host_error() @@ -158,7 +160,7 @@ pub fn wasmi_error_to_enclave_error(wasmi_error: InterpreterError) -> EnclaveErr }) } -#[allow(dead_code)] +#[cfg(feature = "wasmi-engine")] fn trap_kind_to_enclave_error(kind: TrapKind) -> EnclaveError { match kind { TrapKind::Unreachable => EnclaveError::ContractPanicUnreachable, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs index db0c1d175..992c43c3e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "wasmi-engine")] pub use pwasm_utils::{inject_gas_counter, rules}; pub const OCALL_BASE_GAS: u64 = 2_000_000; @@ -81,7 +82,7 @@ impl Default for WasmCosts { } } -#[allow(dead_code)] +#[cfg(feature = "wasmi-engine")] pub fn gas_rules(wasm_costs: &WasmCosts) -> rules::Set { rules::Set::new(wasm_costs.regular, { let mut vals = ::std::collections::BTreeMap::new(); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs index ff46c0efd..4774dde1d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/lib.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/lib.rs @@ -10,17 +10,18 @@ extern crate sgx_types; mod contract_operations; mod contract_validation; +mod cosmwasm_config; mod db; mod errors; pub mod external; mod gas; mod io; -mod memory; mod message; -pub(crate) mod module_cache; mod query_chain; pub(crate) mod types; +#[cfg(feature = "wasmi-engine")] mod wasm; +#[cfg(feature = "wasm3")] mod wasm3; pub use contract_operations::{handle, init, query}; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs index 38d6fabe9..bb8d9b802 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/contract.rs @@ -25,38 +25,6 @@ use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use crate::wasm::traits::WasmiApi; -/// api_marker is based on this compatibility chart: -/// https://github.com/CosmWasm/cosmwasm/blob/v1.0.0-beta5/packages/vm/README.md#compatibility -pub mod api_marker { - pub const V0_10: &str = "cosmwasm_vm_version_3"; - pub const V1: &str = "interface_version_8"; -} - -/// Right now ContractOperation is used to detect queris and prevent state changes -#[derive(Clone, Copy, Debug)] -pub enum ContractOperation { - Init, - Handle, - Query, -} - -#[allow(unused)] -impl ContractOperation { - pub fn is_init(&self) -> bool { - matches!(self, ContractOperation::Init) - } - - pub fn is_handle(&self) -> bool { - matches!(self, ContractOperation::Handle) - } - - pub fn is_query(&self) -> bool { - matches!(self, ContractOperation::Query) - } -} - -const MAX_LOG_LENGTH: usize = 8192; - /// SecretContract maps function index to implementation /// When instantiating a module we give it the SecretNetworkImportResolver resolver /// When invoking a function inside the module we give it this runtime which is the actual functions implementation () diff --git a/cosmwasm/enclaves/shared/contract-engine/src/memory.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/memory.rs similarity index 98% rename from cosmwasm/enclaves/shared/contract-engine/src/memory.rs rename to cosmwasm/enclaves/shared/contract-engine/src/wasm/memory.rs index 01359a963..4136e3a6f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/memory.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/memory.rs @@ -4,7 +4,6 @@ use log::*; use enclave_ffi_types::EnclaveError; -#[allow(dead_code)] pub fn validate_memory(p_modlue: &mut Module) -> Result<(), EnclaveError> { let memory_section = p_modlue .memory_section_mut() diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs index 52f1f4795..7422db716 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/mod.rs @@ -1,10 +1,23 @@ +#[cfg(feature = "wasmi-engine")] pub(crate) mod contract; +#[cfg(feature = "wasmi-engine")] mod engine; +#[cfg(feature = "wasmi-engine")] mod externals; +#[cfg(feature = "wasmi-engine")] mod import_resolver; +#[cfg(feature = "wasmi-engine")] +mod memory; +#[cfg(feature = "wasmi-engine")] +pub(crate) mod module_cache; +#[cfg(feature = "wasmi-engine")] pub mod traits; +#[cfg(feature = "wasmi-engine")] pub use contract::{ContractInstance, ContractOperation}; +#[cfg(feature = "wasmi-engine")] pub use cw_types_generic::CosmWasmApiVersion; +#[cfg(feature = "wasmi-engine")] pub use engine::Engine; +#[cfg(feature = "wasmi-engine")] pub use import_resolver::{create_builder, WasmiImportResolver}; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm/module_cache.rs similarity index 98% rename from cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs rename to cosmwasm/enclaves/shared/contract-engine/src/wasm/module_cache.rs index 5a0fa448a..8a3df7768 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/module_cache.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm/module_cache.rs @@ -13,10 +13,10 @@ use enclave_ffi_types::EnclaveError; use enclave_cosmos_types::types::ContractCode; use enclave_crypto::HASH_SIZE; -use super::gas::{gas_rules, WasmCosts}; -use super::memory::validate_memory; use super::wasm::create_builder; use super::wasm::{ContractOperation, WasmiImportResolver}; +use crate::gas::{gas_rules, WasmCosts}; +use crate::wasm::memory::validate_memory; lazy_static! { static ref MODULE_CACHE: SgxRwLock> = diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 8a847befd..0c55cd18d 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -17,6 +17,7 @@ use crate::contract_validation::ContractKey; #[cfg(not(feature = "query-only"))] use crate::db::encrypt_key; +use crate::cosmwasm_config::ContractOperation; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] use crate::db::{remove_encrypted_key, write_encrypted_key, write_multiple_keys}; @@ -24,7 +25,6 @@ use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngine use crate::gas::{WasmCosts, OCALL_BASE_GAS, READ_BASE_GAS, WRITE_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; -use crate::wasm::ContractOperation; use gas::{get_exhausted_amount, get_remaining_gas, use_gas}; use module_cache::create_module_instance; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs index 06aa0068c..f2be03864 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/module_cache.rs @@ -13,8 +13,8 @@ use enclave_crypto::HASH_SIZE; use super::{gas, validation}; use crate::gas::WasmCosts; -use crate::wasm::contract::api_marker; -use crate::wasm::ContractOperation; +use crate::cosmwasm_config::api_marker; +use crate::cosmwasm_config::ContractOperation; pub struct VersionedCode { pub code: Vec, diff --git a/cosmwasm/enclaves/shared/utils/src/lib.rs b/cosmwasm/enclaves/shared/utils/src/lib.rs index e223c3014..ea65873b3 100644 --- a/cosmwasm/enclaves/shared/utils/src/lib.rs +++ b/cosmwasm/enclaves/shared/utils/src/lib.rs @@ -1,9 +1,12 @@ +#![feature(btree_drain_filter)] + extern crate sgx_trts; extern crate sgx_types; #[cfg(not(target_env = "sgx"))] extern crate sgx_tstd as std; +pub mod kv_cache; pub mod logger; pub mod macros; pub mod oom_handler; diff --git a/cosmwasm/packages/sgx-vm/src/cache.rs b/cosmwasm/packages/sgx-vm/src/cache.rs index a68adff8f..b68f5e4de 100644 --- a/cosmwasm/packages/sgx-vm/src/cache.rs +++ b/cosmwasm/packages/sgx-vm/src/cache.rs @@ -1,18 +1,18 @@ +use parity_wasm::elements::deserialize_buffer; use std::collections::HashSet; use std::fs::{create_dir_all, File, OpenOptions}; use std::io::{Read, Write}; use std::marker::PhantomData; use std::path::PathBuf; use std::sync::Mutex; -use parity_wasm::elements::{deserialize_buffer}; /* use crate::backends::{backend, compile}; */ use crate::checksum::Checksum; use crate::compatability::{check_wasm, check_wasm_exports, REQUIRED_IBC_EXPORTS}; -use crate::features::required_features_from_module; use crate::errors::{VmError, VmResult}; +use crate::features::required_features_from_module; use crate::instance::Instance; /* use crate::modules::FileSystemCache; @@ -24,6 +24,7 @@ const WASM_DIR: &str = "wasm"; const MODULES_DIR: &str = "modules"; */ +#[allow(dead_code)] #[derive(Debug, Default, Clone)] struct Stats { hits_module: u32, @@ -143,7 +144,7 @@ where let has_ibc_entry_points = match check_wasm_exports(&module, REQUIRED_IBC_EXPORTS) { Ok(_) => true, - Err(_) => false + Err(_) => false, }; Ok(AnalysisReport { From f6381484e5c8757d32515b7961ab8f8a090d524e Mon Sep 17 00:00:00 2001 From: Itzik Date: Tue, 25 Oct 2022 12:44:22 +0300 Subject: [PATCH 62/67] Set submodule to new branch --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index ae089b324..83ff3a2d0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "third_party/incubator-teaclave-sgx-sdk"] path = third_party/incubator-teaclave-sgx-sdk url = https://github.com/scrtlabs/incubator-teaclave-sgx-sdk - branch = secret-1.1.5 + branch = master From c159a3e407601565680a797b9bfc2b8aea096b4d Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Tue, 25 Oct 2022 13:39:06 +0300 Subject: [PATCH 63/67] clang10 needs to be installed, yo --- deployment/dockerfiles/base.Dockerfile | 6 ++++++ third_party/incubator-teaclave-sgx-sdk | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/deployment/dockerfiles/base.Dockerfile b/deployment/dockerfiles/base.Dockerfile index e2e87f2ce..6211bcaeb 100644 --- a/deployment/dockerfiles/base.Dockerfile +++ b/deployment/dockerfiles/base.Dockerfile @@ -4,6 +4,12 @@ ARG SCRT_BASE_IMAGE_ENCLAVE=baiduxlab/sgx-rust:2004-1.1.3 FROM $SCRT_BASE_IMAGE_ENCLAVE AS compile-enclave +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + clang-10 && \ + rm -rf /var/lib/apt/lists/* + + ENV PATH="/root/.cargo/bin:$PATH" # Set working directory for the build diff --git a/third_party/incubator-teaclave-sgx-sdk b/third_party/incubator-teaclave-sgx-sdk index 662909964..bd5a84d3d 160000 --- a/third_party/incubator-teaclave-sgx-sdk +++ b/third_party/incubator-teaclave-sgx-sdk @@ -1 +1 @@ -Subproject commit 662909964e5a666d3c537835e7dab2554be3725c +Subproject commit bd5a84d3d8d01dd24730115b0f60f55eea5be194 From 3fb32e49d7b89994af1fea0b28f6e1e0c0df5aa8 Mon Sep 17 00:00:00 2001 From: Cashmaney Date: Wed, 26 Oct 2022 18:27:42 +0300 Subject: [PATCH 64/67] Wasm3 cw1 test read write (#1231) Added better tests for read large item and write large item storage --- .../src/benches/read_storage.rs | 10 +++-- .../bench-contract/src/contract.rs | 4 +- .../compute-tests/bench-contract/src/msg.rs | 1 + cosmwasm/enclaves/test/Cargo.lock | 12 ++--- x/compute/internal/keeper/bench_test.go | 41 +++++++++++++++++- .../keeper/testdata/bench_contract.wasm | Bin 696708 -> 697826 bytes 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs index 141603184..7b7751e0f 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/benches/read_storage.rs @@ -1,5 +1,7 @@ use cosmwasm_std::{Deps, DepsMut, StdResult}; +// as long as keys is > 10 the single write shouldn't produce high enough variance +// if anyone wants to they can set up test.key in the go side of things to make it more accurate pub fn bench_read_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { deps.storage.set(b"test.key", b"test.value"); @@ -10,9 +12,8 @@ pub fn bench_read_storage_same_key(deps: DepsMut, keys: u64) -> StdResult<()> { Ok(()) } -#[allow(dead_code)] -/// call this test only after the bench of write storage, so the keys are populated -pub fn bench_read_storage_different_key(deps: Deps, keys: u64) -> StdResult<()> { +/// call this test only after setting up the test with write storage, so the keys are populated +pub fn bench_read_storage_different_key(deps: DepsMut, keys: u64) -> StdResult<()> { for i in 1..keys { deps.storage.get(&i.to_be_bytes()).unwrap(); } @@ -20,8 +21,9 @@ pub fn bench_read_storage_different_key(deps: Deps, keys: u64) -> StdResult<()> Ok(()) } +/// call this test only after setting up the test with write storage, so the keys are populated pub fn bench_read_large_key_from_storage(deps: DepsMut, keys: u64) -> StdResult<()> { - deps.storage.set(b"test.key", crate::benches::LARGE_VALUE); + // deps.storage.set(b"test.key", crate::benches::LARGE_VALUE); for _ in 1..keys { deps.storage.get(b"test.key"); } diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs index e8be581bd..782dc9b03 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/contract.rs @@ -3,7 +3,8 @@ use benches::cpu::do_cpu_loop; use crate::benches; use crate::benches::allocate::do_allocate_large_memory; use crate::benches::read_storage::{ - bench_read_large_key_from_storage, bench_read_storage_same_key, + bench_read_large_key_from_storage, bench_read_storage_different_key, + bench_read_storage_same_key, }; use crate::benches::write_storage::{ bench_write_large_storage_key, bench_write_storage_different_key, @@ -36,6 +37,7 @@ pub fn execute( ExecuteMsg::BenchCPU {} => do_cpu_loop(5000), ExecuteMsg::BenchReadStorage {} => bench_read_storage_same_key(deps, 100), ExecuteMsg::BenchWriteStorage {} => bench_write_storage_different_key(deps, 100), + ExecuteMsg::BenchReadStorageMultipleKeys {} => bench_read_storage_different_key(deps, 100), ExecuteMsg::BenchAllocate {} => do_allocate_large_memory(), // start with running large item bench once, otherwise cache will skew performance numbers ExecuteMsg::BenchReadLargeItemFromStorage { .. } => { diff --git a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs index db4128c9e..95cf0dc68 100644 --- a/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs +++ b/cosmwasm/contracts/v1/compute-tests/bench-contract/src/msg.rs @@ -23,6 +23,7 @@ pub enum ExecuteMsg { BenchCPU {}, BenchReadStorage {}, BenchWriteStorage {}, + BenchReadStorageMultipleKeys {}, BenchAllocate {}, BenchReadLargeItemFromStorage {}, BenchWriteLargeItemToStorage {}, diff --git a/cosmwasm/enclaves/test/Cargo.lock b/cosmwasm/enclaves/test/Cargo.lock index afdd7cc94..057b2b8a7 100644 --- a/cosmwasm/enclaves/test/Cargo.lock +++ b/cosmwasm/enclaves/test/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "ansi_term" version = "0.11.0" @@ -426,7 +428,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "secret-cosmwasm-std" -version = "0.10.0" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4b8fed972d924458d9c3c0e6c9fbf6c4c5e30655571e3d2b78be056d316e9" dependencies = [ "base64 0.11.0", "schemars", @@ -488,13 +492,11 @@ dependencies = [ [[package]] name = "sgx_types" -version = "1.1.3" -source = "git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269#a37ffb9449ba6d5b6e4a9d586bbab864ae732269" +version = "1.1.5" [[package]] name = "sgx_urts" -version = "1.1.3" -source = "git+https://github.com/apache/teaclave-sgx-sdk.git?rev=a37ffb9449ba6d5b6e4a9d586bbab864ae732269#a37ffb9449ba6d5b6e4a9d586bbab864ae732269" +version = "1.1.5" dependencies = [ "libc", "sgx_types", diff --git a/x/compute/internal/keeper/bench_test.go b/x/compute/internal/keeper/bench_test.go index 7ee06455b..a2d9e8eec 100644 --- a/x/compute/internal/keeper/bench_test.go +++ b/x/compute/internal/keeper/bench_test.go @@ -19,6 +19,7 @@ const ( Noop Bench = "noop" BenchCPU = "bench_c_p_u" BenchReadStorage = "bench_read_storage" + BenchReadStorageMultipleKeys = "bench_read_storage_multiple_keys" BenchWriteStorage = "bench_write_storage" BenchAllocate = "bench_allocate" BenchReadLargeItemFromStorage = "bench_read_large_item_from_storage" @@ -193,17 +194,53 @@ func TestRunBenchmarks(t *testing.T) { bench: BenchWriteLargeItemToStorage, loops: 10, }, + "Bench read storage multiple keys": { + gasLimit: 10_000_000, + bench: BenchReadStorageMultipleKeys, + loops: 10, + }, } contractAddr, creator, creatorPriv, ctx, keeper := initBenchContract(t) - + // this is here so read multiple keys works without setup + msg := buildBenchMessage(BenchWriteStorage) + _, _, _, _, _, _ = execHelper( + t, + keeper, + ctx, + contractAddr, + creator, + creatorPriv, + string(msg), + false, + true, + 10_000_000, + 0, + false, + ) + // this is here so read large keys works without setup + msg = buildBenchMessage(BenchWriteLargeItemToStorage) + _, _, _, _, _, _ = execHelper( + t, + keeper, + ctx, + contractAddr, + creator, + creatorPriv, + string(msg), + false, + true, + 10_000_000, + 0, + false, + ) // *** Measure baseline timer := NewBenchTimer("base contract execution", Noop) // make sure we set a limit before calling ctx = ctx.WithGasMeter(sdk.NewGasMeter(100_000_000)) require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed()) - msg := buildBenchMessage(Noop) + msg = buildBenchMessage(Noop) for i := uint64(1); i < 10; i++ { start := time.Now() diff --git a/x/compute/internal/keeper/testdata/bench_contract.wasm b/x/compute/internal/keeper/testdata/bench_contract.wasm index f4cb921187cb31f5b856a9f818d7465e4c126e3b..84888b2a101ac1e1a86ff3cb64a70ab0f20e54be 100644 GIT binary patch delta 21073 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 Date: Thu, 27 Oct 2022 12:16:45 +0300 Subject: [PATCH 65/67] Fix clippy stuff --- .../enclaves/execute/src/registration/cert.rs | 1 - .../src/contract_operations.rs | 2 +- .../src/contract_validation.rs | 2 +- .../contract-engine/src/cosmwasm_config.rs | 2 +- .../enclaves/shared/contract-engine/src/db.rs | 2 +- .../shared/contract-engine/src/errors.rs | 2 ++ .../shared/contract-engine/src/gas.rs | 2 +- .../shared/contract-engine/src/message.rs | 2 +- .../shared/contract-engine/src/wasm3/gas.rs | 2 +- .../shared/contract-engine/src/wasm3/mod.rs | 25 ++++++------------- .../enclaves/shared/utils/src/kv_cache.rs | 14 +++-------- 11 files changed, 20 insertions(+), 36 deletions(-) diff --git a/cosmwasm/enclaves/execute/src/registration/cert.rs b/cosmwasm/enclaves/execute/src/registration/cert.rs index 79bd7fd2a..8e9322a5e 100644 --- a/cosmwasm/enclaves/execute/src/registration/cert.rs +++ b/cosmwasm/enclaves/execute/src/registration/cert.rs @@ -3,7 +3,6 @@ use std::io::BufReader; use std::str; use std::time::{SystemTime, UNIX_EPOCH}; -use std::untrusted::time::SystemTimeEx; use sgx_tcrypto::SgxEccHandle; use sgx_types::{ diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 95709856d..24a53b533 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -387,7 +387,7 @@ pub fn query( output, &secret_msg, &CanonicalAddr(Binary(Vec::new())), // Not used for queries (can't init a new contract from a query) - &"".to_string(), // Not used for queries (can't call a sub-message from a query), + "", // Not used for queries (can't call a sub-message from a query), None, // Not used for queries (Query response is not replied to the caller), &CanonicalAddr(Binary(Vec::new())), // Not used for queries (used only for replies) true, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs index 3a42df153..572b64e55 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs @@ -1,7 +1,7 @@ use cw_types_v1::ibc::IbcPacketReceiveMsg; use cw_types_v1::results::REPLY_ENCRYPTION_MAGIC_BYTES; use log::*; -use std::time::{Duration, Instant}; +use std::time::Instant; use cw_types_v010::types::{CanonicalAddr, Coin, HumanAddr}; use enclave_cosmos_types::traits::CosmosAminoPubkey; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs b/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs index d2b6210a4..5ae23ef1e 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/cosmwasm_config.rs @@ -28,4 +28,4 @@ impl ContractOperation { } } -pub const MAX_LOG_LENGTH: usize = 8192; +//pub const MAX_LOG_LENGTH: usize = 8192; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/db.rs b/cosmwasm/enclaves/shared/contract-engine/src/db.rs index 2d3b93d70..c3baba161 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/db.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/db.rs @@ -62,7 +62,7 @@ pub fn write_encrypted_key( // Get the state key from the key manager let (scrambled_field_name, ad_used_gas, db_data) = - encrypt_key(key, value, &context, contract_key)?; + encrypt_key(key, value, context, contract_key)?; // Write the new data as concat(ad, encrypted_val) let write_used_gas = write_db(context, &scrambled_field_name, &db_data).map_err(|err| { diff --git a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs index d982e77bf..0f9ec1ed5 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/errors.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/errors.rs @@ -1,4 +1,6 @@ use derive_more::Display; + +#[cfg(feature = "wasmi-engine")] use log::*; #[cfg(feature = "wasmi-engine")] diff --git a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs index 992c43c3e..c640807e5 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/gas.rs @@ -1,7 +1,7 @@ #[cfg(feature = "wasmi-engine")] pub use pwasm_utils::{inject_gas_counter, rules}; -pub const OCALL_BASE_GAS: u64 = 2_000_000; +//pub const OCALL_BASE_GAS: u64 = 2_000_000; pub const WRITE_BASE_GAS: u64 = 200_000; pub const READ_BASE_GAS: u64 = 100_000; diff --git a/cosmwasm/enclaves/shared/contract-engine/src/message.rs b/cosmwasm/enclaves/shared/contract-engine/src/message.rs index 1dff1b656..6232993b6 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/message.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/message.rs @@ -453,7 +453,7 @@ pub fn parse_message( | HandleType::HANDLE_TYPE_IBC_PACKET_TIMEOUT => { trace!( "parsing {} msg (Should always be plaintext): {:?}", - HandleType::get_export_name(&handle_type), + HandleType::get_export_name(handle_type), base64::encode(&message) ); diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs index 0b1a6bf80..7cd3ea32f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/gas.rs @@ -178,7 +178,7 @@ fn inject_metering( new_instrs.append(seq.instrs_mut()); let block = func.block_mut(block_id); - new_instrs.extend_from_slice(&block); + new_instrs.extend_from_slice(block); block.instrs = new_instrs; } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 0c55cd18d..902b8ed24 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -20,33 +20,24 @@ use crate::db::encrypt_key; use crate::cosmwasm_config::ContractOperation; use crate::db::read_encrypted_key; #[cfg(not(feature = "query-only"))] -use crate::db::{remove_encrypted_key, write_encrypted_key, write_multiple_keys}; +use crate::db::{remove_encrypted_key, write_multiple_keys}; use crate::errors::{ToEnclaveError, ToEnclaveResult, WasmEngineError, WasmEngineResult}; -use crate::gas::{WasmCosts, OCALL_BASE_GAS, READ_BASE_GAS, WRITE_BASE_GAS}; +use crate::gas::{WasmCosts, READ_BASE_GAS, WRITE_BASE_GAS}; use crate::query_chain::encrypt_and_query_chain; use crate::types::IoNonce; use gas::{get_exhausted_amount, get_remaining_gas, use_gas}; use module_cache::create_module_instance; -use std::sync::SgxRwLock; - mod gas; pub mod module_cache; mod validation; -use lazy_static::lazy_static; -use std::time::{Duration, Instant}; +use std::time::Instant; type Wasm3RsError = wasm3::Error; type Wasm3RsResult = Result; use enclave_utils::kv_cache::KvCache; -use std::collections::HashMap; - -lazy_static! { - static ref W3_MODULE_CACHE: SgxRwLock, CosmWasmApiVersion)>> = - SgxRwLock::new(HashMap::new()); -} macro_rules! debug_err { ($message: literal) => { @@ -448,7 +439,7 @@ impl Engine { handle.call_with_context(context, args) } CosmWasmApiVersion::V1 => { - let export_name = HandleType::get_export_name(&handle_type); + let export_name = HandleType::get_export_name(handle_type); if handle_type == &HandleType::HANDLE_TYPE_EXECUTE { let msg_info_ptr = write_to_memory(instance, &msg_info_bytes)?; @@ -572,7 +563,7 @@ impl Engine { EnclaveError::from(err) })?; - self.with_instance(|instance, context| { + self.with_instance(|instance, _context| { use_gas(instance, used_gas)?; Ok(vec![]) })?; @@ -839,7 +830,7 @@ fn host_read_db( debug!( "db_read received value {:?}", - value.as_ref().map(|v| show_bytes(&v)) + value.as_ref().map(|v| show_bytes(v)) ); let value = match value { @@ -973,7 +964,7 @@ fn host_canonicalize_address( //debug!("canonicalize_address was called with {:?}", human_addr_str); - let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { + let (decoded_prefix, data) = match bech32::decode(human_addr_str) { Ok(ret) => ret, Err(err) => { debug!( @@ -1046,7 +1037,7 @@ fn host_addr_canonicalize( debug!("addr_canonicalize was called with {:?}", human_addr_str); - let (decoded_prefix, data) = match bech32::decode(&human_addr_str) { + let (decoded_prefix, data) = match bech32::decode(human_addr_str) { Ok(ret) => ret, Err(err) => { debug!( diff --git a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs index 0a04f882a..b141def51 100644 --- a/cosmwasm/enclaves/shared/utils/src/kv_cache.rs +++ b/cosmwasm/enclaves/shared/utils/src/kv_cache.rs @@ -11,12 +11,7 @@ pub struct KvCache(BTreeMap, Vec>, BTreeMap, Vec>); impl KvCache { pub fn new() -> Self { - Self { - // 0 is cache that we need to write at the end of the tx (new keys) - 0: Default::default(), - // 1 is just used for a read cache (for reading multiple keys in a row) - 1: Default::default(), - } + Self(Default::default(), Default::default()) } pub fn write(&mut self, k: &[u8], v: &[u8]) -> Option> { @@ -36,11 +31,8 @@ impl KvCache { Some(value.clone()) } // if no hit in the writeable cache, try the readable one - else if let Some(value) = self.1.get(key) { - Some(value.clone()) - } else { - // trace!("************ Cache miss ***********"); - None + else { + self.1.get(key).cloned() } } From fc67795234a8c3bb19b63890fab60731a5e47aec Mon Sep 17 00:00:00 2001 From: Itzik Date: Tue, 8 Nov 2022 11:56:16 +0200 Subject: [PATCH 66/67] Removed debug prints --- cosmwasm/enclaves/query/Cargo.toml | 3 +- .../shared/contract-engine/Cargo.toml | 3 +- .../src/contract_operations.rs | 60 +++---- .../src/contract_validation.rs | 50 +++--- .../shared/contract-engine/src/wasm3/mod.rs | 169 +++++++++--------- .../enclaves/shared/crypto/src/secp256k1.rs | 68 +++---- third_party/incubator-teaclave-sgx-sdk | 2 +- 7 files changed, 178 insertions(+), 177 deletions(-) diff --git a/cosmwasm/enclaves/query/Cargo.toml b/cosmwasm/enclaves/query/Cargo.toml index 052775f19..90439a9a2 100644 --- a/cosmwasm/enclaves/query/Cargo.toml +++ b/cosmwasm/enclaves/query/Cargo.toml @@ -21,8 +21,7 @@ debug-print = ["enclave_contract_engine/debug-print"] # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_tstd = { rev = "d2d339cbb005f676bb700059bd51dc689c025f6b", git = "https://github.com/apache/teaclave-sgx-sdk.git", features = [ - "backtrace", - "untrusted_time" + "backtrace" ] } sgx_types = { rev = "d2d339cbb005f676bb700059bd51dc689c025f6b", git = "https://github.com/apache/teaclave-sgx-sdk.git" } diff --git a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml index 97e8d5557..237faf144 100644 --- a/cosmwasm/enclaves/shared/contract-engine/Cargo.toml +++ b/cosmwasm/enclaves/shared/contract-engine/Cargo.toml @@ -17,8 +17,7 @@ wasmi-engine = ["wasmi", "parity-wasm", "pwasm-utils"] # when compiling to the "sgx" target, we pull this from the target root with an "extern crate" directive [target.'cfg(not(target_env = "sgx"))'.dependencies] sgx_tstd = { path = "../../../../third_party/incubator-teaclave-sgx-sdk/sgx_tstd", features = [ - "backtrace", - "untrusted_time" + "backtrace" ] } sgx_types = { path = "../../../../third_party/incubator-teaclave-sgx-sdk/sgx_types" } diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs index 24a53b533..947996077 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_operations.rs @@ -9,7 +9,7 @@ use enclave_cosmos_types::types::{ContractCode, HandleType, SigInfo}; use enclave_crypto::Ed25519PublicKey; use enclave_ffi_types::{Ctx, EnclaveError}; use log::*; -use std::time::Instant; +// use std::time::Instant; use crate::cosmwasm_config::ContractOperation; @@ -55,22 +55,22 @@ pub fn init( ) -> Result { trace!("Starting init"); - let start = Instant::now(); + //let start = Instant::now(); let contract_code = ContractCode::new(contract); let contract_hash = contract_code.hash(); - let duration = start.elapsed(); - trace!("Time elapsed in ContractCode::new is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in ContractCode::new is: {:?}", duration); - let start = Instant::now(); + //let start = Instant::now(); let base_env: BaseEnv = extract_base_env(env)?; - let duration = start.elapsed(); - trace!("Time elapsed in extract_base_env is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in extract_base_env is: {:?}", duration); let query_depth = extract_query_depth(env)?; - let start = Instant::now(); + //let start = Instant::now(); let (sender, contract_address, block_height, sent_funds) = base_env.get_verification_params(); - let duration = start.elapsed(); - trace!("Time elapsed in get_verification_paramsis: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in get_verification_paramsis: {:?}", duration); let canonical_contract_address = to_canonical(contract_address)?; @@ -87,7 +87,7 @@ pub fn init( let secret_msg = SecretMessage::from_slice(msg)?; - let start = Instant::now(); + //let start = Instant::now(); verify_params( &parsed_sig_info, sent_funds, @@ -95,23 +95,23 @@ pub fn init( contract_address, &secret_msg, )?; - let duration = start.elapsed(); - trace!("Time elapsed in verify_params: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in verify_params: {:?}", duration); - let start = Instant::now(); + //let start = Instant::now(); let decrypted_msg = secret_msg.decrypt()?; - let duration = start.elapsed(); - trace!("Time elapsed in decrypt: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in decrypt: {:?}", duration); - let start = Instant::now(); + //let start = Instant::now(); let ValidatedMessage { validated_msg, reply_params, } = validate_msg(&decrypted_msg, &contract_hash, None, None)?; - let duration = start.elapsed(); - trace!("Time elapsed in validate_msg: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in validate_msg: {:?}", duration); - let start = Instant::now(); + //let start = Instant::now(); let mut engine = start_engine( context, gas_limit, @@ -122,17 +122,17 @@ pub fn init( secret_msg.nonce, secret_msg.user_public_key, )?; - let duration = start.elapsed(); - trace!("Time elapsed in start_engine: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in start_engine: {:?}", duration); let mut versioned_env = base_env.into_versioned_env(&engine.get_api_version()); versioned_env.set_contract_hash(&contract_hash); - let start = Instant::now(); + //let start = Instant::now(); let result = engine.init(&versioned_env, validated_msg); - let duration = start.elapsed(); - trace!("Time elapsed in engine.init: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in engine.init: {:?}", duration); *used_gas = engine.gas_used(); let output = result?; @@ -144,7 +144,7 @@ pub fn init( // TODO: copy cosmwasm's structures to enclave // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/init_handle.rs#L129 // TODO: ref: https://github.com/CosmWasm/cosmwasm/blob/b971c037a773bf6a5f5d08a88485113d9b9e8e7b/packages/std/src/query.rs#L13 - let start = Instant::now(); + //let start = Instant::now(); let output = encrypt_output( output, &secret_msg, @@ -155,8 +155,8 @@ pub fn init( false, false, )?; - let duration = start.elapsed(); - trace!("Time elapsed in encrypt_output: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in encrypt_output: {:?}", duration); // todo: can move the key to somewhere in the output message if we want @@ -387,8 +387,8 @@ pub fn query( output, &secret_msg, &CanonicalAddr(Binary(Vec::new())), // Not used for queries (can't init a new contract from a query) - "", // Not used for queries (can't call a sub-message from a query), - None, // Not used for queries (Query response is not replied to the caller), + "", // Not used for queries (can't call a sub-message from a query), + None, // Not used for queries (Query response is not replied to the caller), &CanonicalAddr(Binary(Vec::new())), // Not used for queries (used only for replies) true, false, diff --git a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs index 572b64e55..6f502cf20 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/contract_validation.rs @@ -1,7 +1,7 @@ use cw_types_v1::ibc::IbcPacketReceiveMsg; use cw_types_v1::results::REPLY_ENCRYPTION_MAGIC_BYTES; use log::*; -use std::time::Instant; +// use std::time::Instant; use cw_types_v010::types::{CanonicalAddr, Coin, HumanAddr}; use enclave_cosmos_types::traits::CosmosAminoPubkey; @@ -287,29 +287,29 @@ pub fn verify_params( ) -> Result<(), EnclaveError> { debug!("Verifying message signatures for: {:?}", sig_info); - let start = Instant::now(); + //let start = Instant::now(); // If there's no callback signature - it's not a callback and there has to be a tx signer + signature if let Some(callback_sig) = &sig_info.callback_sig { return verify_callback_sig(callback_sig.as_slice(), sender, msg, sent_funds); } - let duration = start.elapsed(); - trace!( - "verify_params: Time elapsed in verify_callback_sig: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_params: Time elapsed in verify_callback_sig: {:?}", + // duration + // ); trace!( "Sign bytes are: {:?}", String::from_utf8_lossy(sig_info.sign_bytes.as_slice()) ); - let start = Instant::now(); + //let start = Instant::now(); let (sender_public_key, messages) = get_signer_and_messages(sig_info, sender)?; - let duration = start.elapsed(); - trace!( - "verify_params: Time elapsed in get_signer_and_messages: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_params: Time elapsed in get_signer_and_messages: {:?}", + // duration + // ); trace!( "sender canonical address is: {:?}", @@ -318,7 +318,7 @@ pub fn verify_params( trace!("sender signature is: {:?}", sig_info.signature); trace!("sign bytes are: {:?}", sig_info.sign_bytes); - let start = Instant::now(); + //let start = Instant::now(); sender_public_key .verify_bytes( sig_info.sign_bytes.as_slice(), @@ -329,13 +329,13 @@ pub fn verify_params( warn!("Signature verification failed: {:?}", err); EnclaveError::FailedTxVerification })?; - let duration = start.elapsed(); - trace!( - "verify_params: Time elapsed in verify_bytes: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_params: Time elapsed in verify_bytes: {:?}", + // duration + // ); - let start = Instant::now(); + // let start = Instant::now(); if verify_message_params( &messages, sender, @@ -347,11 +347,11 @@ pub fn verify_params( info!("Parameters verified successfully"); return Ok(()); } - let duration = start.elapsed(); - trace!( - "verify_params: Time elapsed in verify_message_params: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_params: Time elapsed in verify_message_params: {:?}", + // duration + // ); warn!("Parameter verification failed"); Err(EnclaveError::FailedTxVerification) diff --git a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs index 902b8ed24..505c7c20f 100644 --- a/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs +++ b/cosmwasm/enclaves/shared/contract-engine/src/wasm3/mod.rs @@ -32,7 +32,7 @@ use module_cache::create_module_instance; mod gas; pub mod module_cache; mod validation; -use std::time::Instant; +// use std::time::Instant; type Wasm3RsError = wasm3::Error; type Wasm3RsResult = Result; @@ -217,11 +217,11 @@ impl Engine { }; debug!("setting up runtime"); - let start = Instant::now(); + // let start = Instant::now(); let environment = wasm3::Environment::new().to_enclave_result()?; - let duration = start.elapsed(); - trace!("Time elapsed in Environment::new() is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in Environment::new() is: {:?}", duration); debug!("initialized environment"); Ok(Self { @@ -238,49 +238,49 @@ impl Engine { where F: FnOnce(&mut wasm3::Instance, &mut Context) -> Result, EnclaveError>, { - let start = Instant::now(); + // let start = Instant::now(); let runtime = self .environment .new_runtime::(1024 * 60, Some(192 /* 12 MiB */)) .to_enclave_result()?; - let duration = start.elapsed(); - trace!("Time elapsed in environment.new_runtime is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in environment.new_runtime is: {:?}", duration); debug!("initialized runtime"); - let start = Instant::now(); + // let start = Instant::now(); let module = self .environment .parse_module(&self.code) .to_enclave_result()?; - let duration = start.elapsed(); - trace!( - "Time elapsed in environment.parse_module is: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "Time elapsed in environment.parse_module is: {:?}", + // duration + // ); debug!("parsed module"); - let start = Instant::now(); + // let start = Instant::now(); let mut instance = runtime.load_module(module).to_enclave_result()?; - let duration = start.elapsed(); - trace!("Time elapsed in runtime.load_module is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in runtime.load_module is: {:?}", duration); debug!("created instance"); - let start = Instant::now(); + // let start = Instant::now(); gas::set_gas_limit(&instance, self.gas_limit)?; - let duration = start.elapsed(); - trace!("Time elapsed in set_gas_limit is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in set_gas_limit is: {:?}", duration); debug!("set gas limit"); - let start = Instant::now(); + // let start = Instant::now(); Self::link_host_functions(&mut instance).to_enclave_result()?; - let duration = start.elapsed(); - trace!("Time elapsed in link_host_functions is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in link_host_functions is: {:?}", duration); debug!("linked functions"); - let start = Instant::now(); + // let start = Instant::now(); let result = func(&mut instance, &mut self.context); - let duration = start.elapsed(); - trace!("Instance: elapsed time for running func is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Instance: elapsed time for running func is: {:?}", duration); debug!("function returned {:?}", result); self.used_gas = self @@ -355,18 +355,18 @@ impl Engine { let (env_bytes, msg_info_bytes) = env.get_wasm_ptrs()?; - let start = Instant::now(); + // let start = Instant::now(); let env_ptr = write_to_memory(instance, &env_bytes)?; - let duration = start.elapsed(); - trace!( - "Time elapsed in env_bytes write_to_memory is: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "Time elapsed in env_bytes write_to_memory is: {:?}", + // duration + // ); - let start = Instant::now(); + // let start = Instant::now(); let msg_ptr = write_to_memory(instance, &msg)?; - let duration = start.elapsed(); - trace!("Time elapsed in msg write_to_memory is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in msg write_to_memory is: {:?}", duration); let result = match api_version { CosmWasmApiVersion::V010 => { @@ -387,25 +387,26 @@ impl Engine { .to_enclave_result()?, (env_ptr, msg_info_ptr, msg_ptr), ); - let start = Instant::now(); - let res = init.call_with_context(context, args); - let duration = start.elapsed(); - trace!("Time elapsed in call_with_context is: {:?}", duration); - res + // let start = Instant::now(); + // let res = + init.call_with_context(context, args) + // let duration = start.elapsed(); + // trace!("Time elapsed in call_with_context is: {:?}", duration); + // res } CosmWasmApiVersion::Invalid => { return Err(EnclaveError::InvalidWasm); } }; - let start = Instant::now(); + // let start = Instant::now(); let output_ptr = check_execution_result(instance, context, result)?; - let duration = start.elapsed(); - trace!("Time elapsed in check_execution_result is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in check_execution_result is: {:?}", duration); - let start = Instant::now(); + // let start = Instant::now(); let output = read_from_memory(instance, output_ptr)?; - let duration = start.elapsed(); - trace!("Time elapsed in read_from_memory is: {:?}", duration); + // let duration = start.elapsed(); + // trace!("Time elapsed in read_from_memory is: {:?}", duration); Ok(output) }) @@ -691,25 +692,26 @@ fn read_from_memory( instance: &wasm3::Instance, region_ptr: u32, ) -> WasmEngineResult> { - let start = Instant::now(); + // let start = Instant::now(); let runtime = instance.runtime(); - let duration = start.elapsed(); - trace!( - "read_from_memory: Time elapsed in instance.runtime(): {:?}", - duration - ); - - let start = Instant::now(); - let res = runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { + // let duration = start.elapsed(); + // trace!( + // "read_from_memory: Time elapsed in instance.runtime(): {:?}", + // duration + // ); + + // let start = Instant::now(); + // let res = + runtime.try_with_memory_or(WasmEngineError::MemoryReadError, |memory| { CWMemory::new(memory).extract_vector(region_ptr) - })?; - let duration = start.elapsed(); - trace!( - "read_from_memory: Time elapsed in runtime.try_with_memory_or(): {:?}", - duration - ); + })? + // let duration = start.elapsed(); + // trace!( + // "read_from_memory: Time elapsed in runtime.try_with_memory_or(): {:?}", + // duration + // ); - res + // res } fn decode_sections_from_memory( @@ -723,28 +725,29 @@ fn decode_sections_from_memory( } fn write_to_memory(instance: &wasm3::Instance, buffer: &[u8]) -> WasmEngineResult { - let start = Instant::now(); + // let start = Instant::now(); let region_ptr = (|| { let alloc_fn = instance.find_function::("allocate")?; alloc_fn.call(buffer.len() as u32) })() .map_err(debug_err!(err => "failed to allocate {} bytes in contract: {err}", buffer.len())) .map_err(|_| WasmEngineError::MemoryAllocationError)?; - let duration = start.elapsed(); - trace!( - "write_to_memory: Time elapsed in allocate function call: {:?}", - duration - ); - - let start = Instant::now(); - let res = write_to_allocated_memory(instance, region_ptr, buffer); - let duration = start.elapsed(); - trace!( - "write_to_memory: Time elapsed in write_to_allocated_memory: {:?}", - duration - ); - - res + // let duration = start.elapsed(); + // trace!( + // "write_to_memory: Time elapsed in allocate function call: {:?}", + // duration + // ); + + // let start = Instant::now(); + // let res = + write_to_allocated_memory(instance, region_ptr, buffer) + // let duration = start.elapsed(); + // trace!( + // "write_to_memory: Time elapsed in write_to_allocated_memory: {:?}", + // duration + // ); + + //res } fn write_to_allocated_memory( @@ -880,18 +883,18 @@ fn host_write_db( use_gas(instance, WRITE_BASE_GAS)?; - let start = Instant::now(); + // let start = Instant::now(); let state_key_name = read_from_memory(instance, state_key_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from state_key_region_ptr: {err}"), )?; let value = read_from_memory(instance, value_region_ptr as u32).map_err( debug_err!(err => "db_write failed to extract vector from value_region_ptr: {err}"), )?; - let duration = start.elapsed(); - trace!( - "host_write_db: Time elapsed in read_from_memory x2: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "host_write_db: Time elapsed in read_from_memory x2: {:?}", + // duration + // ); debug!( "db_write writing key: {}, value: {}", diff --git a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs index cf3919e7a..e26e28b9c 100644 --- a/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs +++ b/cosmwasm/enclaves/shared/crypto/src/secp256k1.rs @@ -11,7 +11,7 @@ use secp256k1::Secp256k1; use sha2::{Digest as Sha2Digest, Sha256}; use sha3::Keccak256; -use std::time::Instant; +// use std::time::Instant; pub const SECP256K1_PREFIX: [u8; 4] = [235, 90, 233, 135]; @@ -33,64 +33,64 @@ impl VerifyingKey for Secp256k1PubKey { ) -> Result<(), CryptoError> { // Signing ref: https://docs.cosmos.network/master/spec/_ics/ics-030-signed-messages.html#preliminary - let start = Instant::now(); + //let start = Instant::now(); let sign_bytes_hash = if sign_mode == SignMode::SIGN_MODE_EIP_191 { Keccak256::digest(bytes) } else { Sha256::digest(bytes) }; - let duration = start.elapsed(); - trace!( - "verify_bytes: Time elapsed in Sha256::digest: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_bytes: Time elapsed in Sha256::digest: {:?}", + // duration + // ); - let start = Instant::now(); + //let start = Instant::now(); //let verifying_key = VerifyingKey let msg = secp256k1::Message::from_slice(sign_bytes_hash.as_slice()).map_err(|err| { warn!("Failed to create a secp256k1 message from tx: {:?}", err); CryptoError::VerificationError })?; - let duration = start.elapsed(); - trace!( - "verify_bytes: Time elapsed in Message::from_slice: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_bytes: Time elapsed in Message::from_slice: {:?}", + // duration + // ); - let start = Instant::now(); + //let start = Instant::now(); let verifier = Secp256k1::verification_only(); - let duration = start.elapsed(); - trace!( - "verify_bytes: Time elapsed in Secp256k1::verification_only: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_bytes: Time elapsed in Secp256k1::verification_only: {:?}", + // duration + // ); - let start = Instant::now(); + //let start = Instant::now(); // Create `secp256k1`'s types let sec_signature = secp256k1::ecdsa::Signature::from_compact(sig).map_err(|err| { warn!("Malformed signature: {:?}", err); CryptoError::VerificationError })?; - let duration = start.elapsed(); - trace!( - "verify_bytes: Time elapsed in Signature::from_compact: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_bytes: Time elapsed in Signature::from_compact: {:?}", + // duration + // ); - let start = Instant::now(); + //let start = Instant::now(); let sec_public_key = secp256k1::PublicKey::from_slice(self.0.as_slice()).map_err(|err| { warn!("Malformed public key: {:?}", err); CryptoError::VerificationError })?; - let duration = start.elapsed(); - trace!( - "verify_bytes: Time elapsed in PublicKey from_slice: {:?}", - duration - ); + // let duration = start.elapsed(); + // trace!( + // "verify_bytes: Time elapsed in PublicKey from_slice: {:?}", + // duration + // ); - let start = Instant::now(); + //let start = Instant::now(); verifier .verify_ecdsa(&msg, &sec_signature, &sec_public_key) .map_err(|err| { @@ -100,8 +100,8 @@ impl VerifyingKey for Secp256k1PubKey { ); CryptoError::VerificationError })?; - let duration = start.elapsed(); - trace!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); + // let duration = start.elapsed(); + // trace!("verify_bytes: Time elapsed in verify_ecdsa: {:?}", duration); trace!("successfully verified this signature: {:?}", sig); Ok(()) } diff --git a/third_party/incubator-teaclave-sgx-sdk b/third_party/incubator-teaclave-sgx-sdk index bd5a84d3d..662909964 160000 --- a/third_party/incubator-teaclave-sgx-sdk +++ b/third_party/incubator-teaclave-sgx-sdk @@ -1 +1 @@ -Subproject commit bd5a84d3d8d01dd24730115b0f60f55eea5be194 +Subproject commit 662909964e5a666d3c537835e7dab2554be3725c From fbd4c0316b455f9343f30814be593e6d79aa1fc3 Mon Sep 17 00:00:00 2001 From: Itzik Date: Tue, 8 Nov 2022 11:59:09 +0200 Subject: [PATCH 67/67] Updated submodule to latest in scrtlabs --- third_party/incubator-teaclave-sgx-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/incubator-teaclave-sgx-sdk b/third_party/incubator-teaclave-sgx-sdk index 662909964..5bf3100b7 160000 --- a/third_party/incubator-teaclave-sgx-sdk +++ b/third_party/incubator-teaclave-sgx-sdk @@ -1 +1 @@ -Subproject commit 662909964e5a666d3c537835e7dab2554be3725c +Subproject commit 5bf3100b741851af240a50673e49f89f243e122e

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ÊZBG^HX>qs)dhCqt}wqVdCu*0A?>QC!x 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