From d59cffc9a238c4f71a154653b219b0bfb42d0146 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 13:09:16 +0900 Subject: [PATCH 01/55] feat: Add pallet-cosmwasm to runtime --- Cargo.toml | 2 +- frame/cosmos/src/lib.rs | 8 ++- frame/cosmos/types/Cargo.toml | 2 +- frame/cosmos/types/src/address.rs | 9 +-- frame/cosmos/x/auth/src/fee.rs | 2 +- frame/cosmos/x/bank/src/msgs.rs | 2 +- frame/cosmwasm/src/lib.rs | 12 +--- primitives/account/src/lib.rs | 16 +++++- template/runtime/Cargo.toml | 92 ++++++++++++++++--------------- template/runtime/src/accounts.rs | 67 ++++++++++++++++++++++ template/runtime/src/assets.rs | 26 ++++++++- template/runtime/src/denom.rs | 32 ----------- template/runtime/src/lib.rs | 72 +++++++++++++++++++++++- 13 files changed, 241 insertions(+), 101 deletions(-) create mode 100644 template/runtime/src/accounts.rs delete mode 100644 template/runtime/src/denom.rs diff --git a/Cargo.toml b/Cargo.toml index b8debaf9..44d5a2ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ members = [ [workspace.dependencies] array-bytes = "6.2.2" base64ct = { version = "1.6.0", default-features = false } -bech32 = { version = "0.9.1", default-features = false } +bech32 = { version = "0.11.0", default-features = false } clap = { version = "4.5.16", features = ["derive"] } cosmos-sdk-proto = { version = "0.24.0", default-features = false } futures = "0.3.28" diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index fe93ab34..520f5ba9 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -195,6 +195,7 @@ pub mod pallet { pub ChainId: &'static str = "dev"; pub const TxSigLimit: u64 = 7; pub const MaxDenomLimit: u32 = 128; + pub const AddressPrefix: &'static str = "cosmos"; } #[frame_support::register_default_impl(TestDefaultConfig)] @@ -212,6 +213,7 @@ pub mod pallet { type WeightToGas = WeightToGas; type TxSigLimit = TxSigLimit; type MaxDenomLimit = MaxDenomLimit; + type AddressPrefix = AddressPrefix; } } @@ -283,9 +285,13 @@ pub mod pallet { type WeightInfo: WeightInfo; /// A way to convert from cosmos coin denom to asset id. #[pallet::no_default] - type DenomToAsset: Convert>; + type AssetToDenom: Convert> + + Convert; #[pallet::constant] type MaxDenomLimit: Get; + /// The chain ID. + #[pallet::constant] + type AddressPrefix: Get<&'static str>; } #[pallet::genesis_config] diff --git a/frame/cosmos/types/Cargo.toml b/frame/cosmos/types/Cargo.toml index 4693e6b7..aebd641b 100644 --- a/frame/cosmos/types/Cargo.toml +++ b/frame/cosmos/types/Cargo.toml @@ -11,7 +11,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] cosmos-sdk-proto = { workspace = true, default-features = false } -bech32 = { workspace = true, default-features = false } +bech32 = { workspace = true, default-features = false, features = ["alloc"] } parity-scale-codec = { workspace = true, default-features = false, features = [ "derive", ], optional = true } diff --git a/frame/cosmos/types/src/address.rs b/frame/cosmos/types/src/address.rs index 28bf68b1..fdd5a728 100644 --- a/frame/cosmos/types/src/address.rs +++ b/frame/cosmos/types/src/address.rs @@ -15,18 +15,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -use bech32::FromBase32; use sp_core::H160; -use sp_std::vec::Vec; #[derive(Clone, PartialEq, Eq, Debug)] pub enum AddressError { - Bech32Error(bech32::Error), + Bech32Error(bech32::DecodeError), } pub fn address_from_bech32(address: &str) -> Result { - let (_prefix, data, _variant) = bech32::decode(address).map_err(AddressError::Bech32Error)?; - let address = Vec::::from_base32(&data).map_err(AddressError::Bech32Error)?; + let (_prefix, data) = bech32::decode(address).map_err(AddressError::Bech32Error)?; - Ok(H160::from_slice(&address)) + Ok(H160::from_slice(&data)) } diff --git a/frame/cosmos/x/auth/src/fee.rs b/frame/cosmos/x/auth/src/fee.rs index 8059d4a1..e991447a 100644 --- a/frame/cosmos/x/auth/src/fee.rs +++ b/frame/cosmos/x/auth/src/fee.rs @@ -133,7 +133,7 @@ where // TODO: Resolve imbalance } else { - let asset_id = T::DenomToAsset::convert(amt.denom.clone()) + let asset_id = T::AssetToDenom::convert(amt.denom.clone()) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Call))?; let _imbalance = T::Assets::withdraw( diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 88d2aced..10150613 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -121,7 +121,7 @@ where pallet_balances::weights::SubstrateWeight::::transfer_keep_alive(), ); } else { - let asset_id = T::DenomToAsset::convert(amt.denom.clone()).map_err(|_| { + let asset_id = T::AssetToDenom::convert(amt.denom.clone()).map_err(|_| { MsgHandlerErrorInfo { weight: total_weight, error: RootError::InvalidCoins.into(), diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index 6cae4325..b5dd6c8e 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -203,7 +203,7 @@ pub mod pallet { /// Max number of frames a contract is able to push, a.k.a recursive calls. const MAX_FRAMES: u8; - #[allow(missing_docs)] + #[pallet::event] type RuntimeEvent: From> + IsType<::RuntimeEvent>; type AccountIdExtended: Parameter @@ -322,11 +322,6 @@ pub mod pallet { /// Weight implementation. type WeightInfo: WeightInfo; - /// account which execute relayer calls IBC exported entry points - type IbcRelayerAccount: Get>; - - type IbcRelayer: ibc_primitives::IbcHandler>; - /// A hook into the VM execution semantic, allowing the runtime to hook into a contract /// execution. type PalletHook: PalletHook; @@ -379,13 +374,12 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { - pub contracts: sp_std::vec::Vec<(T::AccountIdExtended, ContractCodeOf)>, + pub contracts: alloc::vec::Vec<(T::AccountIdExtended, ContractCodeOf)>, } - #[cfg(feature = "std")] impl Default for GenesisConfig { fn default() -> Self { - Self { contracts: vec![] } + Self { contracts: Default::default() } } } diff --git a/primitives/account/src/lib.rs b/primitives/account/src/lib.rs index e4705c8c..ef50134c 100644 --- a/primitives/account/src/lib.rs +++ b/primitives/account/src/lib.rs @@ -24,7 +24,7 @@ use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{de, Deserializer, Serializer}; use serde::{Deserialize, Serialize}; -use sp_core::{ecdsa, H160}; +use sp_core::{crypto::UncheckedFrom, ecdsa, H160, H256}; use sp_io::hashing::sha2_256; use sp_runtime::traits::IdentifyAccount; @@ -87,6 +87,20 @@ impl EcdsaExt for CosmosSigner { } } +impl UncheckedFrom for CosmosSigner { + fn unchecked_from(t: H256) -> Self { + let mut buf = [0u8; 33]; + buf[1..33].copy_from_slice(&t.0); + buf.into() + } +} + +impl AsRef<[u8]> for CosmosSigner { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + #[derive(Eq, PartialEq, Clone, Encode, Decode, sp_core::RuntimeDebug, TypeInfo)] pub struct CosmosSignature(pub [u8; 64]); diff --git a/template/runtime/Cargo.toml b/template/runtime/Cargo.toml index 84c87627..e6bfc057 100644 --- a/template/runtime/Cargo.toml +++ b/template/runtime/Cargo.toml @@ -9,59 +9,61 @@ build = "build.rs" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true, features = ["cosmwasm"] } -parity-scale-codec = { workspace = true } -scale-info = { workspace = true } -serde_json = { workspace = true } +bech32 = { workspace = true, default-features = false } +cosmos-sdk-proto = { workspace = true, default-features = false, features = ["cosmwasm"] } +parity-scale-codec = { workspace = true, default-features = false } +ripemd = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false } +serde_json = { workspace = true, default-features = false } # Substrate -sp-api = { workspace = true } -sp-block-builder = { workspace = true } -sp-consensus-aura = { workspace = true, features = ["serde"] } -sp-core = { workspace = true } -sp-genesis-builder = { workspace = true } -sp-inherents = { workspace = true } -sp-offchain = { workspace = true } -sp-runtime = { workspace = true } -sp-session = { workspace = true } -sp-std = { workspace = true } -sp-transaction-pool = { workspace = true } -sp-version = { workspace = true } +sp-api = { workspace = true, default-features = false } +sp-block-builder = { workspace = true, default-features = false } +sp-consensus-aura = { workspace = true, default-features = false, features = ["serde"] } +sp-core = { workspace = true, default-features = false } +sp-genesis-builder = { workspace = true, default-features = false } +sp-inherents = { workspace = true, default-features = false } +sp-offchain = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +sp-session = { workspace = true, default-features = false } +sp-std = { workspace = true, default-features = false } +sp-transaction-pool = { workspace = true, default-features = false } +sp-version = { workspace = true, default-features = false } # Substrate FRAME -frame-executive = { workspace = true } -frame-support = { workspace = true } -frame-system = { workspace = true } -frame-system-rpc-runtime-api = { workspace = true } -pallet-aura = { workspace = true } -pallet-assets = { workspace = true } -pallet-balances = { workspace = true } -pallet-grandpa = { workspace = true } -pallet-sudo = { workspace = true } -pallet-transaction-payment = { workspace = true } -pallet-transaction-payment-rpc-runtime-api = { workspace = true } -pallet-timestamp = { workspace = true } +frame-executive = { workspace = true, default-features = false } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +frame-system-rpc-runtime-api = { workspace = true, default-features = false } +pallet-aura = { workspace = true, default-features = false } +pallet-assets = { workspace = true, default-features = false } +pallet-balances = { workspace = true, default-features = false } +pallet-grandpa = { workspace = true, default-features = false } +pallet-sudo = { workspace = true, default-features = false } +pallet-transaction-payment = { workspace = true, default-features = false } +pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } # Frontier -fp-self-contained = { workspace = true, features = ["serde"] } +fp-self-contained = { workspace = true, default-features = false, features = ["serde"] } # Horizon -hp-account = { workspace = true } -hp-crypto = { workspace = true } -hp-io = { workspace = true } -hp-rpc = { workspace = true } -pallet-cosmos = { workspace = true } -pallet-cosmos-accounts = { workspace = true } -pallet-cosmos-types = { workspace = true, features = ["with-codec"] } -pallet-cosmos-x-auth = { workspace = true } -pallet-cosmos-x-auth-migrations = { workspace = true } -pallet-cosmos-x-auth-signing = { workspace = true } -pallet-cosmos-x-bank = { workspace = true } -pallet-cosmos-x-bank-types = { workspace = true } -pallet-cosmos-x-wasm = { workspace = true } -pallet-cosmos-x-wasm-types = { workspace = true } +hp-account = { workspace = true, default-features = false } +hp-crypto = { workspace = true, default-features = false } +hp-io = { workspace = true, default-features = false } +hp-rpc = { workspace = true, default-features = false } +pallet-cosmos = { workspace = true, default-features = false } +pallet-cosmos-accounts = { workspace = true, default-features = false } +pallet-cosmos-types = { workspace = true, default-features = false, features = ["with-codec"] } +pallet-cosmos-x-auth = { workspace = true, default-features = false } +pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } +pallet-cosmos-x-auth-signing = { workspace = true, default-features = false } +pallet-cosmos-x-bank = { workspace = true, default-features = false } +pallet-cosmos-x-bank-types = { workspace = true, default-features = false } +pallet-cosmos-x-wasm = { workspace = true, default-features = false } +pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } -pallet-cosmwasm = { workspace = true } +pallet-cosmwasm = { workspace = true, default-features = false } [dev-dependencies] base64ct = { workspace = true } @@ -73,9 +75,11 @@ substrate-wasm-builder = { workspace = true, optional = true } [features] default = ["std"] std = [ + "bech32/std", "cosmos-sdk-proto/std", "parity-scale-codec/std", "scale-info/std", + "serde_json/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", diff --git a/template/runtime/src/accounts.rs b/template/runtime/src/accounts.rs new file mode 100644 index 00000000..e305af76 --- /dev/null +++ b/template/runtime/src/accounts.rs @@ -0,0 +1,67 @@ +// This file is part of Hrozion. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use alloc::{string::String, vec::Vec}; +use bech32::{Bech32, Hrp}; +use core::str; +use hp_crypto::EcdsaExt; +use pallet_cosmos::AddressMapping; +use pallet_cosmos_types::address::address_from_bech32; +use sp_core::Get; +use sp_runtime::traits::Convert; + +pub struct AccountToAddr(sp_std::marker::PhantomData); + +impl Convert for AccountToAddr +where + T: pallet_cosmos::Config, + T::AccountId: EcdsaExt, +{ + fn convert(account: T::AccountId) -> String { + // TODO: Handle errors + let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); + let address = account.to_cosm_address().unwrap(); + + bech32::encode::(hrp, address.as_bytes()).unwrap() + } +} + +impl Convert> for AccountToAddr +where + T: pallet_cosmos::Config, +{ + fn convert(address: String) -> Result { + let address = address_from_bech32(&address).map_err(|_| ())?; + + Ok(T::AddressMapping::into_account_id(address)) + } +} + +impl Convert, Result> for AccountToAddr +where + T: pallet_cosmos::Config, +{ + fn convert(address_raw: Vec) -> Result { + let address = str::from_utf8(&address_raw) + .map(address_from_bech32) + .map_err(|_| ())? + .map_err(|_| ())?; + + Ok(T::AddressMapping::into_account_id(address)) + } +} diff --git a/template/runtime/src/assets.rs b/template/runtime/src/assets.rs index 940514bc..751bef49 100644 --- a/template/runtime/src/assets.rs +++ b/template/runtime/src/assets.rs @@ -16,8 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::string::String; use frame_support::{ensure, traits::fungibles::metadata::Inspect}; -use sp_runtime::BoundedVec; +use sp_runtime::{traits::Convert, BoundedVec}; pub struct AssetsCallback(sp_std::marker::PhantomData); impl pallet_assets::AssetsCallback for AssetsCallback @@ -49,3 +50,26 @@ where Ok(()) } } + +pub struct AssetToDenom(sp_std::marker::PhantomData); +impl Convert> for AssetToDenom +where + T: pallet_cosmos::Config, +{ + fn convert(denom: String) -> Result { + let denom = BoundedVec::::try_from(denom.as_bytes().to_vec()) + .map_err(|_| ())?; + pallet_cosmos::DenomAssetRouter::::get(denom).ok_or(()) + } +} + +impl Convert for AssetToDenom +where + T: pallet_cosmos::Config, +{ + fn convert(asset_id: T::AssetId) -> String { + // TODO: Handle option + let denom = pallet_cosmos::AssetDenomRouter::::get(asset_id).unwrap().to_vec(); + String::from_utf8(denom).unwrap() + } +} diff --git a/template/runtime/src/denom.rs b/template/runtime/src/denom.rs deleted file mode 100644 index 8b987e21..00000000 --- a/template/runtime/src/denom.rs +++ /dev/null @@ -1,32 +0,0 @@ -// This file is part of Hrozion. - -// Copyright (C) 2023 Haderech Pte. Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -use cosmos_sdk_proto::prost::alloc::string::String; -use sp_runtime::{traits::Convert, BoundedVec}; - -pub struct DenomToAsset(sp_std::marker::PhantomData); -impl Convert> for DenomToAsset -where - T: pallet_cosmos::Config, -{ - fn convert(denom: String) -> Result { - let denom = BoundedVec::::try_from(denom.as_bytes().to_vec()) - .map_err(|_| ())?; - pallet_cosmos::DenomAssetRouter::::get(denom).ok_or(()) - } -} diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 3441dc0c..18f915ad 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -26,10 +26,12 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +extern crate alloc; + +mod accounts; mod ante; mod assets; mod compat; -mod denom; mod msgs; mod sig_verifiable_tx; mod sign_mode_handler; @@ -40,7 +42,7 @@ use cosmos_sdk_proto::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, MsgUpdateAdmin, }, - prost::{alloc::string::String, Message}, + prost::Message, Any, }; use frame_support::{ @@ -56,6 +58,7 @@ use frame_support::{ constants::{RocksDbWeight as RuntimeDbWeight, WEIGHT_REF_TIME_PER_MILLIS}, IdentityFee, Weight, }, + PalletId, }; use frame_system::EnsureRoot; use hp_account::CosmosSigner; @@ -65,6 +68,7 @@ use pallet_cosmos::AddressMapping; use pallet_cosmos_types::tx::Gas; use pallet_cosmos_x_auth::sigverify::SECP256K1_TYPE_URL; use pallet_cosmos_x_auth_signing::any_match; +use pallet_cosmwasm::instrument::CostRules; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, }; @@ -368,6 +372,7 @@ parameter_types! { pub ChainId: &'static str = "dev"; pub const TxSigLimit: u64 = 7; pub const MaxDenomLimit: u32 = 128; + pub const AddressPrefix: &'static str = "cosmos"; } impl pallet_cosmos::Config for Runtime { @@ -409,9 +414,11 @@ impl pallet_cosmos::Config for Runtime { type WeightInfo = pallet_cosmos::weights::CosmosWeight; - type DenomToAsset = denom::DenomToAsset; + type AssetToDenom = assets::AssetToDenom; type MaxDenomLimit = MaxDenomLimit; + + type AddressPrefix = AddressPrefix; } impl pallet_cosmos_accounts::Config for Runtime { @@ -421,6 +428,64 @@ impl pallet_cosmos_accounts::Config for Runtime { type WeightInfo = pallet_cosmos_accounts::weights::HorizonWeight; } +parameter_types! { + pub const CosmwasmPalletId: PalletId = PalletId(*b"cosmwasm"); + pub const MaxContractLabelSize: u32 = 64; + pub const MaxContractTrieIdSize: u32 = Hash::len_bytes() as u32; + pub const MaxInstantiateSaltSize: u32 = 128; + pub const MaxFundsAssets: u32 = 32; + pub const CodeTableSizeLimit: u32 = 4096; + pub const CodeGlobalVariableLimit: u32 = 256; + pub const CodeParameterLimit: u32 = 128; + pub const CodeBranchTableSizeLimit: u32 = 256; + pub const CodeStorageByteDeposit: u32 = 1_000_000; + pub const ContractStorageByteReadPrice: u32 = 1; + pub const ContractStorageByteWritePrice: u32 = 1; + pub WasmCostRules: CostRules = Default::default(); +} + +impl pallet_cosmwasm::Config for Runtime { + const MAX_FRAMES: u8 = 64; + type RuntimeEvent = RuntimeEvent; + type AccountIdExtended = AccountId; + type PalletId = CosmwasmPalletId; + type MaxCodeSize = ConstU32<{ 1024 * 1024 }>; + type MaxInstrumentedCodeSize = ConstU32<{ 2 * 1024 * 1024 }>; + type MaxMessageSize = ConstU32<{ 64 * 1024 }>; + type AccountToAddr = accounts::AccountToAddr; + type AssetToDenom = assets::AssetToDenom; + type Balance = Balance; + type AssetId = AssetId; + type Assets = Assets; + type NativeAsset = Balances; + type ChainId = ChainId; + type MaxContractLabelSize = MaxContractLabelSize; + type MaxContractTrieIdSize = MaxContractTrieIdSize; + type MaxInstantiateSaltSize = MaxInstantiateSaltSize; + type MaxFundsAssets = MaxFundsAssets; + + type CodeTableSizeLimit = CodeTableSizeLimit; + type CodeGlobalVariableLimit = CodeGlobalVariableLimit; + type CodeStackLimit = ConstU32<{ u32::MAX }>; + + type CodeParameterLimit = CodeParameterLimit; + type CodeBranchTableSizeLimit = CodeBranchTableSizeLimit; + type CodeStorageByteDeposit = CodeStorageByteDeposit; + type ContractStorageByteReadPrice = ContractStorageByteReadPrice; + type ContractStorageByteWritePrice = ContractStorageByteWritePrice; + + type WasmCostRules = WasmCostRules; + type UnixTime = Timestamp; + type WeightInfo = pallet_cosmwasm::weights::SubstrateWeight; + + // TODO: Add precompile to use execute or query pallet + type PalletHook = (); + + type UploadWasmOrigin = frame_system::EnsureSigned; + + type ExecuteWasmOrigin = frame_system::EnsureSigned; +} + impl pallet_sudo::Config for Runtime { type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; @@ -436,6 +501,7 @@ construct_runtime!( Aura: pallet_aura, Cosmos: pallet_cosmos, CosmosAccounts: pallet_cosmos_accounts, + Cosmwasm: pallet_cosmwasm, Grandpa: pallet_grandpa, Sudo: pallet_sudo, Timestamp: pallet_timestamp, From 40036d63c34e6d28d56e8579cd1decb5f36666bf Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 13:21:01 +0900 Subject: [PATCH 02/55] refactor: directly depend on String from alloc --- frame/cosmos/src/lib.rs | 9 ++++----- frame/cosmos/types/src/coin.rs | 6 ++---- frame/cosmos/types/src/lib.rs | 2 ++ frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs | 3 +-- frame/cosmos/x/auth/migrations/src/lib.rs | 2 ++ frame/cosmos/x/auth/signing/src/lib.rs | 2 ++ frame/cosmos/x/auth/signing/src/sign_mode_handler.rs | 3 +-- frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs | 4 ++-- frame/cosmos/x/auth/src/lib.rs | 2 ++ frame/cosmos/x/auth/src/sigverify.rs | 3 ++- frame/cosmos/x/bank/src/lib.rs | 2 ++ frame/cosmos/x/bank/src/msgs.rs | 2 +- frame/cosmos/x/bank/types/src/lib.rs | 2 ++ frame/cosmos/x/bank/types/src/msgs.rs | 8 ++++---- frame/cosmos/x/wasm/types/src/lib.rs | 2 ++ frame/cosmos/x/wasm/types/src/tx.rs | 2 +- frame/cosmwasm/src/lib.rs | 7 +++---- template/runtime/src/sig_verifiable_tx.rs | 3 ++- template/runtime/src/sign_mode_handler.rs | 2 +- 19 files changed, 38 insertions(+), 28 deletions(-) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 520f5ba9..2d3e9820 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -19,15 +19,14 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod weights; pub use self::pallet::*; use crate::weights::WeightInfo; -use cosmos_sdk_proto::{ - cosmos::tx::v1beta1::Tx, - prost::{alloc::string::String, Message}, - Any, -}; +use alloc::string::String; +use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message, Any}; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchInfo, PostDispatchInfo}, pallet_prelude::{DispatchResultWithPostInfo, InvalidTransaction, Pays}, diff --git a/frame/cosmos/types/src/coin.rs b/frame/cosmos/types/src/coin.rs index 1e960f3f..ba762a2d 100644 --- a/frame/cosmos/types/src/coin.rs +++ b/frame/cosmos/types/src/coin.rs @@ -15,10 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use cosmos_sdk_proto::{ - cosmos::base::v1beta1::Coin, - prost::alloc::string::{String, ToString}, -}; +use alloc::string::{String, ToString}; +use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; pub fn amount_to_string(amount: &[Coin]) -> String { let mut ret = "".to_string(); diff --git a/frame/cosmos/types/src/lib.rs b/frame/cosmos/types/src/lib.rs index 57e0e923..fe917116 100644 --- a/frame/cosmos/types/src/lib.rs +++ b/frame/cosmos/types/src/lib.rs @@ -17,6 +17,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod address; pub mod coin; pub mod errors; diff --git a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs index 8d339d72..f9b80246 100644 --- a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs +++ b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs @@ -16,10 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use cosmos_sdk_proto::prost::alloc::string::String; +use alloc::{string::String, vec::Vec}; use serde::{Deserialize, Serialize}; use serde_json::Value; -use sp_std::vec::Vec; #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct StdSignDoc { diff --git a/frame/cosmos/x/auth/migrations/src/lib.rs b/frame/cosmos/x/auth/migrations/src/lib.rs index ff18ef05..972863ad 100644 --- a/frame/cosmos/x/auth/migrations/src/lib.rs +++ b/frame/cosmos/x/auth/migrations/src/lib.rs @@ -19,4 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod legacytx; diff --git a/frame/cosmos/x/auth/signing/src/lib.rs b/frame/cosmos/x/auth/signing/src/lib.rs index 4a249d99..e0cf0950 100644 --- a/frame/cosmos/x/auth/signing/src/lib.rs +++ b/frame/cosmos/x/auth/signing/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod macros; pub mod sign_mode_handler; pub mod sign_verifiable_tx; diff --git a/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs b/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs index ccddf57f..d11dda78 100644 --- a/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs +++ b/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs @@ -16,12 +16,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::{ cosmos::tx::v1beta1::{ModeInfo, Tx}, - prost::alloc::string::String, Any, }; -use sp_std::vec::Vec; #[derive(Clone)] pub struct SignerData { diff --git a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs index 7b46ada4..2fb266e6 100644 --- a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs +++ b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs @@ -16,8 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::alloc::string::String}; -use sp_std::vec::Vec; +use alloc::{string::String, vec::Vec}; +use cosmos_sdk_proto::cosmos::tx::v1beta1::Tx; #[derive(Clone, PartialEq, Eq, Debug)] pub enum SigVerifiableTxError { diff --git a/frame/cosmos/x/auth/src/lib.rs b/frame/cosmos/x/auth/src/lib.rs index 1349b4de..16b2d7b7 100644 --- a/frame/cosmos/x/auth/src/lib.rs +++ b/frame/cosmos/x/auth/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod basic; pub mod fee; pub mod msg; diff --git a/frame/cosmos/x/auth/src/sigverify.rs b/frame/cosmos/x/auth/src/sigverify.rs index 139744c0..dacd9df8 100644 --- a/frame/cosmos/x/auth/src/sigverify.rs +++ b/frame/cosmos/x/auth/src/sigverify.rs @@ -16,12 +16,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::string::ToString; use cosmos_sdk_proto::{ cosmos::{ crypto::{multisig::LegacyAminoPubKey, secp256k1}, tx::v1beta1::{ModeInfo, SignerInfo, Tx}, }, - prost::{alloc::string::ToString, Message}, + prost::Message, Any, }; use hp_io::cosmos::secp256k1_ecdsa_verify; diff --git a/frame/cosmos/x/bank/src/lib.rs b/frame/cosmos/x/bank/src/lib.rs index 516bec19..54f82a7e 100644 --- a/frame/cosmos/x/bank/src/lib.rs +++ b/frame/cosmos/x/bank/src/lib.rs @@ -19,4 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod msgs; diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 10150613..173ce1b4 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -16,9 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::string::String; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, base::v1beta1::Coin}, - prost::alloc::string::String, traits::Message, Any, }; diff --git a/frame/cosmos/x/bank/types/src/lib.rs b/frame/cosmos/x/bank/types/src/lib.rs index bfbf918a..cb5f7d0c 100644 --- a/frame/cosmos/x/bank/types/src/lib.rs +++ b/frame/cosmos/x/bank/types/src/lib.rs @@ -17,5 +17,7 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod events; pub mod msgs; diff --git a/frame/cosmos/x/bank/types/src/msgs.rs b/frame/cosmos/x/bank/types/src/msgs.rs index 2815bcd1..852ca0fd 100644 --- a/frame/cosmos/x/bank/types/src/msgs.rs +++ b/frame/cosmos/x/bank/types/src/msgs.rs @@ -16,12 +16,12 @@ // limitations under the License. pub mod msg_send { - use cosmos_sdk_proto::{ - cosmos::bank::v1beta1::MsgSend, - prost::alloc::string::{String, ToString}, + use alloc::{ + string::{String, ToString}, + vec::Vec, }; + use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; use serde_json::{Map, Value}; - use sp_std::vec::Vec; const AMINO_NAME: &str = "cosmos-sdk/MsgSend"; diff --git a/frame/cosmos/x/wasm/types/src/lib.rs b/frame/cosmos/x/wasm/types/src/lib.rs index 256ae610..b3b5dcc0 100644 --- a/frame/cosmos/x/wasm/types/src/lib.rs +++ b/frame/cosmos/x/wasm/types/src/lib.rs @@ -17,4 +17,6 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod tx; diff --git a/frame/cosmos/x/wasm/types/src/tx.rs b/frame/cosmos/x/wasm/types/src/tx.rs index 95e3bfd8..b9297b5d 100644 --- a/frame/cosmos/x/wasm/types/src/tx.rs +++ b/frame/cosmos/x/wasm/types/src/tx.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use cosmos_sdk_proto::prost::alloc::string::{String, ToString}; +use alloc::string::{String, ToString}; use serde_json::{Map, Value}; use sp_std::{vec, vec::Vec}; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index b5dd6c8e..f8082ca2 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -71,6 +71,7 @@ use alloc::{ collections::{btree_map::Entry, BTreeMap}, format, string::String, + vec::Vec, }; use composable_support::abstractions::utils::increment::Increment; use cosmwasm_std::{ @@ -100,7 +101,6 @@ use frame_support::{ ReversibleStorageHasher, StorageHasher, }; use sp_runtime::traits::SaturatedConversion; -use sp_std::vec::Vec; use wasmi::AsContext; use wasmi_validation::PlainValidator; @@ -111,7 +111,7 @@ pub mod pallet { instrument::CostRules, pallet_hook::PalletHook, runtimes::vm::InitialStorageMutability, types::*, weights::WeightInfo, }; - use alloc::{string::String, vec}; + use alloc::{string::String, vec::Vec}; use composable_support::abstractions::{ nonce::Nonce, utils::{increment::SafeIncrement, start_at::ZeroInit}, @@ -132,7 +132,6 @@ pub mod pallet { use frame_system::{ensure_signed, pallet_prelude::OriginFor}; use sp_core::crypto::UncheckedFrom; use sp_runtime::traits::{Convert, MaybeDisplay}; - use sp_std::vec::Vec; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] @@ -374,7 +373,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { - pub contracts: alloc::vec::Vec<(T::AccountIdExtended, ContractCodeOf)>, + pub contracts: Vec<(T::AccountIdExtended, ContractCodeOf)>, } impl Default for GenesisConfig { diff --git a/template/runtime/src/sig_verifiable_tx.rs b/template/runtime/src/sig_verifiable_tx.rs index 6d0119c5..902b8d79 100644 --- a/template/runtime/src/sig_verifiable_tx.rs +++ b/template/runtime/src/sig_verifiable_tx.rs @@ -16,13 +16,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::string::String; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, cosmwasm::wasm::v1::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, MsgUpdateAdmin, }, - prost::{alloc::string::String, Message}, + prost::Message, }; use pallet_cosmos_x_auth_signing::{any_match, sign_verifiable_tx::SigVerifiableTxError}; use pallet_cosmos_x_bank_types::msgs::msg_send; diff --git a/template/runtime/src/sign_mode_handler.rs b/template/runtime/src/sign_mode_handler.rs index 902bbe4e..9a171e00 100644 --- a/template/runtime/src/sign_mode_handler.rs +++ b/template/runtime/src/sign_mode_handler.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::string::ToString; use cosmos_sdk_proto::{ cosmos::{ bank::v1beta1::MsgSend, @@ -28,7 +29,6 @@ use cosmos_sdk_proto::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, MsgUpdateAdmin, }, - prost::alloc::string::ToString, traits::Message, }; use pallet_cosmos_x_auth_migrations::legacytx::stdsign::StdSignDoc; From f0f30df68660aea406112b9dc406d825619a6442 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 13:36:13 +0900 Subject: [PATCH 03/55] refactor: Remove sp-std dependencies --- Cargo.toml | 1 - composable/composable-support/Cargo.toml | 2 -- frame/accounts/Cargo.toml | 17 ++++++----------- frame/accounts/src/lib.rs | 4 +++- frame/cosmos/Cargo.toml | 2 -- frame/cosmos/src/lib.rs | 4 ++-- frame/cosmos/src/weights.rs | 2 +- frame/cosmos/types/Cargo.toml | 2 -- frame/cosmos/types/src/events.rs | 6 ++++-- frame/cosmos/types/src/msgservice.rs | 4 ++-- frame/cosmos/x/auth/Cargo.toml | 2 -- frame/cosmos/x/auth/migrations/Cargo.toml | 4 +--- frame/cosmos/x/auth/signing/Cargo.toml | 7 +------ frame/cosmos/x/auth/src/basic.rs | 2 +- frame/cosmos/x/auth/src/fee.rs | 6 +++--- frame/cosmos/x/auth/src/msg.rs | 2 +- frame/cosmos/x/auth/src/sigverify.rs | 6 +++--- frame/cosmos/x/bank/Cargo.toml | 2 -- frame/cosmos/x/bank/src/msgs.rs | 7 +++---- frame/cosmos/x/bank/types/Cargo.toml | 3 --- frame/cosmos/x/bank/types/src/msgs.rs | 2 +- frame/cosmos/x/wasm/Cargo.toml | 16 ++++++---------- frame/cosmos/x/wasm/src/lib.rs | 2 ++ frame/cosmos/x/wasm/src/msgs.rs | 3 ++- frame/cosmos/x/wasm/types/Cargo.toml | 13 +++++-------- frame/cosmos/x/wasm/types/src/tx.rs | 7 +++++-- frame/cosmwasm/Cargo.toml | 2 -- frame/cosmwasm/src/crypto.rs | 2 +- frame/cosmwasm/src/ibc.rs | 2 +- frame/cosmwasm/src/runtimes/vm.rs | 3 +-- frame/cosmwasm/src/weights.rs | 2 +- primitives/account/Cargo.toml | 2 -- primitives/account/src/lib.rs | 4 ++-- primitives/io/Cargo.toml | 12 ++++++------ primitives/rpc/Cargo.toml | 2 -- primitives/rpc/src/lib.rs | 4 +++- template/runtime/Cargo.toml | 2 -- template/runtime/src/accounts.rs | 2 +- template/runtime/src/assets.rs | 4 ++-- template/runtime/src/compat/cosm.rs | 2 +- template/runtime/src/lib.rs | 3 ++- template/runtime/src/msgs.rs | 3 ++- template/runtime/src/sig_verifiable_tx.rs | 3 +-- template/runtime/src/sign_mode_handler.rs | 3 +-- 44 files changed, 77 insertions(+), 108 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 44d5a2ef..f97aa2cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -96,7 +96,6 @@ sp-offchain = { git = "https://github.com/paritytech/polkadot-sdk", branch = "re sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } sp-runtime-interface = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } -sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } sp-timestamp = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } sp-transaction-pool = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } sp-version = { git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.9.0", default-features = false } diff --git a/composable/composable-support/Cargo.toml b/composable/composable-support/Cargo.toml index 80c69318..4a376469 100644 --- a/composable/composable-support/Cargo.toml +++ b/composable/composable-support/Cargo.toml @@ -22,7 +22,6 @@ schemars = { optional = true, default-features = false, workspace = true } frame-support = { default-features = false, workspace = true } sp-arithmetic = { default-features = false, workspace = true } sp-runtime = { default-features = false, workspace = true } -sp-std = { default-features = false, workspace = true } [features] default = ["std"] @@ -33,6 +32,5 @@ std = [ "frame-support/std", "sp-arithmetic/std", "sp-runtime/std", - "sp-std/std", "schemars/std", ] diff --git a/frame/accounts/Cargo.toml b/frame/accounts/Cargo.toml index 7c081d66..d1307ee4 100644 --- a/frame/accounts/Cargo.toml +++ b/frame/accounts/Cargo.toml @@ -9,19 +9,14 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -parity-scale-codec = { workspace = true } -scale-info = { workspace = true } +parity-scale-codec = { workspace = true, default-features = false } +scale-info = { workspace = true, default-features = false } -# Substrate FRAME -frame-support = { workspace = true } -frame-system = { workspace = true } +frame-support = { workspace = true, default-features = false } +frame-system = { workspace = true, default-features = false } +sp-core = { workspace = true, default-features = false } -# Substrate -sp-core = { workspace = true } -sp-std = { workspace = true } - -# Horizon -hp-crypto = { workspace = true } +hp-crypto = { workspace = true, default-features = false } [features] default = ["std"] diff --git a/frame/accounts/src/lib.rs b/frame/accounts/src/lib.rs index b29188c5..4705cc8c 100644 --- a/frame/accounts/src/lib.rs +++ b/frame/accounts/src/lib.rs @@ -19,15 +19,17 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod weights; use crate::weights::WeightInfo; +use alloc::vec::Vec; #[cfg(feature = "std")] use frame_support::traits::BuildGenesisConfig; use hp_crypto::EcdsaExt; pub use pallet::*; use sp_core::H160; -use sp_std::vec::Vec; #[frame_support::pallet] pub mod pallet { diff --git a/frame/cosmos/Cargo.toml b/frame/cosmos/Cargo.toml index dfd828a8..975320c6 100644 --- a/frame/cosmos/Cargo.toml +++ b/frame/cosmos/Cargo.toml @@ -21,7 +21,6 @@ pallet-balances = { workspace = true, default-features = false } sp-core = { workspace = true, default-features = false } sp-io = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } # Horizon hp-io = { workspace = true, default-features = false } @@ -44,7 +43,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "hp-io/std", "pallet-cosmos-x-auth-signing/std", "pallet-cosmos-types/std", diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 2d3e9820..55d85bd2 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -25,7 +25,8 @@ pub mod weights; pub use self::pallet::*; use crate::weights::WeightInfo; -use alloc::string::String; +use alloc::{string::String, vec::Vec}; +use core::marker::PhantomData; use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message, Any}; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchInfo, PostDispatchInfo}, @@ -58,7 +59,6 @@ use sp_runtime::{ }, RuntimeDebug, }; -use sp_std::{marker::PhantomData, vec::Vec}; #[derive(Clone, Eq, PartialEq, RuntimeDebug, Encode, Decode, MaxEncodedLen, TypeInfo)] pub enum RawOrigin { diff --git a/frame/cosmos/src/weights.rs b/frame/cosmos/src/weights.rs index 3e70bc21..7bf0ffff 100644 --- a/frame/cosmos/src/weights.rs +++ b/frame/cosmos/src/weights.rs @@ -16,9 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use core::marker::PhantomData; use frame_support::{dispatch::DispatchClass, weights::Weight}; use sp_core::Get; -use sp_std::marker::PhantomData; pub trait WeightInfo { fn default_weight() -> Weight; diff --git a/frame/cosmos/types/Cargo.toml b/frame/cosmos/types/Cargo.toml index aebd641b..073e14d8 100644 --- a/frame/cosmos/types/Cargo.toml +++ b/frame/cosmos/types/Cargo.toml @@ -29,7 +29,6 @@ impl-trait-for-tuples = { workspace = true } sp-core = { workspace = true, default-features = false } sp-runtime-interface = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } [dev-dependencies] array-bytes = { workspace = true } @@ -48,7 +47,6 @@ std = [ "sp-core/std", "sp-runtime-interface/std", "sp-runtime/std", - "sp-std/std", ] with-codec = ["parity-scale-codec", "scale-info"] with-serde = ["serde"] diff --git a/frame/cosmos/types/src/events.rs b/frame/cosmos/types/src/events.rs index dbabb269..ad25b533 100644 --- a/frame/cosmos/types/src/events.rs +++ b/frame/cosmos/types/src/events.rs @@ -15,14 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. +extern crate alloc; + +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; #[cfg(feature = "with-codec")] use parity_scale_codec::{Decode, Encode}; #[cfg(feature = "with-codec")] use scale_info::TypeInfo; #[cfg(feature = "with-serde")] use serde::{Deserialize, Serialize}; -#[cfg(not(feature = "std"))] -use sp_std::vec::Vec; pub const EVENT_TYPE_TX: &str = "tx"; diff --git a/frame/cosmos/types/src/msgservice.rs b/frame/cosmos/types/src/msgservice.rs index 2ae4dfc0..b5e47af9 100644 --- a/frame/cosmos/types/src/msgservice.rs +++ b/frame/cosmos/types/src/msgservice.rs @@ -16,9 +16,9 @@ // limitations under the License. use crate::{errors::CosmosError, events::CosmosEvent}; +use alloc::{boxed::Box, vec::Vec}; use cosmos_sdk_proto::Any; use frame_support::weights::Weight; -use sp_std::vec::Vec; pub struct MsgHandlerErrorInfo { pub weight: Weight, @@ -30,5 +30,5 @@ pub trait MsgHandler { } pub trait MsgServiceRouter { - fn route(msg: &Any) -> Option>; + fn route(msg: &Any) -> Option>; } diff --git a/frame/cosmos/x/auth/Cargo.toml b/frame/cosmos/x/auth/Cargo.toml index 53eab987..05206c12 100644 --- a/frame/cosmos/x/auth/Cargo.toml +++ b/frame/cosmos/x/auth/Cargo.toml @@ -16,7 +16,6 @@ frame-support = { workspace = true, default-features = false } frame-system = { workspace = true, default-features = false } sp-core = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } hp-io = { workspace = true, default-features = false } pallet-cosmos = { workspace = true, default-features = false } @@ -32,7 +31,6 @@ std = [ "frame-support/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", "hp-io/std", "pallet-cosmos/std", "pallet-cosmos-types/std", diff --git a/frame/cosmos/x/auth/migrations/Cargo.toml b/frame/cosmos/x/auth/migrations/Cargo.toml index 11c8b6d1..34f7f41e 100644 --- a/frame/cosmos/x/auth/migrations/Cargo.toml +++ b/frame/cosmos/x/auth/migrations/Cargo.toml @@ -13,8 +13,6 @@ cosmos-sdk-proto = { workspace = true, default-features = false } serde = { workspace = true, default-features = false } serde_json = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } - [features] default = ["std"] -std = ["cosmos-sdk-proto/std", "sp-std/std", "serde/std", "serde_json/std"] +std = ["cosmos-sdk-proto/std", "serde/std", "serde_json/std"] diff --git a/frame/cosmos/x/auth/signing/Cargo.toml b/frame/cosmos/x/auth/signing/Cargo.toml index 98cbe1ca..74c997d7 100644 --- a/frame/cosmos/x/auth/signing/Cargo.toml +++ b/frame/cosmos/x/auth/signing/Cargo.toml @@ -11,11 +11,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] cosmos-sdk-proto = { workspace = true } -sp-std = { workspace = true } - [features] default = ["std"] -std = [ - "cosmos-sdk-proto/std", - "sp-std/std", -] +std = ["cosmos-sdk-proto/std"] diff --git a/frame/cosmos/x/auth/src/basic.rs b/frame/cosmos/x/auth/src/basic.rs index 0e775689..ef85ce57 100644 --- a/frame/cosmos/x/auth/src/basic.rs +++ b/frame/cosmos/x/auth/src/basic.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use core::marker::PhantomData; use cosmos_sdk_proto::cosmos::tx::v1beta1::Tx; use pallet_cosmos_types::handler::AnteDecorator; use sp_runtime::{ @@ -25,7 +26,6 @@ use sp_runtime::{ }, SaturatedConversion, }; -use sp_std::marker::PhantomData; pub struct ValidateBasicDecorator(PhantomData); diff --git a/frame/cosmos/x/auth/src/fee.rs b/frame/cosmos/x/auth/src/fee.rs index e991447a..4de9aa52 100644 --- a/frame/cosmos/x/auth/src/fee.rs +++ b/frame/cosmos/x/auth/src/fee.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use core::marker::PhantomData; use cosmos_sdk_proto::cosmos::tx::v1beta1::{Fee, Tx}; use frame_support::{ pallet_prelude::InvalidTransaction, @@ -41,7 +42,6 @@ use sp_runtime::{ transaction_validity::{TransactionValidity, TransactionValidityError, ValidTransaction}, SaturatedConversion, }; -use sp_std::marker::PhantomData; pub struct DeductFeeDecorator(PhantomData); @@ -99,10 +99,10 @@ where Self::deduct_fees(&deduct_fees_from_acc, fee)?; } - pallet_cosmos::Pallet::::deposit_event(pallet_cosmos::Event::AnteHandled(sp_std::vec![ + pallet_cosmos::Pallet::::deposit_event(pallet_cosmos::Event::AnteHandled(alloc::vec![ CosmosEvent { r#type: EVENT_TYPE_TX.into(), - attributes: sp_std::vec![ + attributes: alloc::vec![ EventAttribute { key: ATTRIBUTE_KEY_FEE.into(), value: amount_to_string(&fee.amount).into() diff --git a/frame/cosmos/x/auth/src/msg.rs b/frame/cosmos/x/auth/src/msg.rs index df3f27f9..9a0682d0 100644 --- a/frame/cosmos/x/auth/src/msg.rs +++ b/frame/cosmos/x/auth/src/msg.rs @@ -23,7 +23,7 @@ use sp_runtime::transaction_validity::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }; -pub struct KnownMsgDecorator(sp_std::marker::PhantomData); +pub struct KnownMsgDecorator(core::marker::PhantomData); impl AnteDecorator for KnownMsgDecorator where diff --git a/frame/cosmos/x/auth/src/sigverify.rs b/frame/cosmos/x/auth/src/sigverify.rs index dacd9df8..211ec64b 100644 --- a/frame/cosmos/x/auth/src/sigverify.rs +++ b/frame/cosmos/x/auth/src/sigverify.rs @@ -17,6 +17,7 @@ // along with this program. If not, see . use alloc::string::ToString; +use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmos::{ crypto::{multisig::LegacyAminoPubKey, secp256k1}, @@ -37,7 +38,6 @@ use sp_core::{sha2_256, Get, H160}; use sp_runtime::transaction_validity::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }; -use sp_std::marker::PhantomData; pub const SECP256K1_TYPE_URL: &str = "/cosmos.crypto.secp256k1.PubKey"; @@ -152,7 +152,7 @@ where } } -pub struct ValidateSigCountDecorator(sp_std::marker::PhantomData); +pub struct ValidateSigCountDecorator(core::marker::PhantomData); impl AnteDecorator for ValidateSigCountDecorator where @@ -191,7 +191,7 @@ impl ValidateSigCountDecorator { } } -pub struct IncrementSequenceDecorator(sp_std::marker::PhantomData); +pub struct IncrementSequenceDecorator(core::marker::PhantomData); impl AnteDecorator for IncrementSequenceDecorator where diff --git a/frame/cosmos/x/bank/Cargo.toml b/frame/cosmos/x/bank/Cargo.toml index cf9a8ab3..66ce2c64 100644 --- a/frame/cosmos/x/bank/Cargo.toml +++ b/frame/cosmos/x/bank/Cargo.toml @@ -17,7 +17,6 @@ pallet-assets = { workspace = true, default-features = false } pallet-balances = { workspace = true, default-features = false } sp-core = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } hp-io = { workspace = true, default-features = false } pallet-cosmos = { workspace = true, default-features = false } @@ -34,7 +33,6 @@ std = [ "pallet-balances/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", "hp-io/std", "pallet-cosmos/std", "pallet-cosmos-types/std", diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 173ce1b4..3984387b 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::string::String; +use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, base::v1beta1::Coin}, traits::Message, @@ -38,7 +38,6 @@ use pallet_cosmos_types::{ }; use pallet_cosmos_x_bank_types::events::{ATTRIBUTE_KEY_RECIPIENT, EVENT_TYPE_TRANSFER}; use sp_runtime::{traits::Convert, SaturatedConversion}; -use sp_std::vec::Vec; pub struct MsgSendHandler(PhantomData); @@ -146,7 +145,7 @@ where let msg_event = pallet_cosmos_types::events::CosmosEvent { r#type: EVENT_TYPE_TRANSFER.into(), - attributes: sp_std::vec![ + attributes: alloc::vec![ EventAttribute { key: ATTRIBUTE_KEY_SENDER.into(), value: from_address.into() }, EventAttribute { key: ATTRIBUTE_KEY_RECIPIENT.into(), value: to_address.into() }, EventAttribute { @@ -156,6 +155,6 @@ where ], }; - Ok((total_weight, sp_std::vec![msg_event])) + Ok((total_weight, alloc::vec![msg_event])) } } diff --git a/frame/cosmos/x/bank/types/Cargo.toml b/frame/cosmos/x/bank/types/Cargo.toml index 4a62300a..ac20ad55 100644 --- a/frame/cosmos/x/bank/types/Cargo.toml +++ b/frame/cosmos/x/bank/types/Cargo.toml @@ -16,8 +16,6 @@ parity-scale-codec = { workspace = true, features = [ scale-info = { workspace = true, optional = true } serde_json = { workspace = true } -sp-std = { workspace = true } - pallet-cosmos-types = { workspace = true, features = ["with-codec"] } [features] @@ -26,7 +24,6 @@ std = [ "cosmos-sdk-proto/std", "parity-scale-codec/std", "scale-info/std", - "sp-std/std", "pallet-cosmos-types/std", ] with-codec = ["parity-scale-codec", "scale-info"] diff --git a/frame/cosmos/x/bank/types/src/msgs.rs b/frame/cosmos/x/bank/types/src/msgs.rs index 852ca0fd..c20dad1f 100644 --- a/frame/cosmos/x/bank/types/src/msgs.rs +++ b/frame/cosmos/x/bank/types/src/msgs.rs @@ -49,6 +49,6 @@ pub mod msg_send { } pub fn get_signers(msg: &MsgSend) -> Vec { - sp_std::vec![msg.from_address.clone()] + alloc::vec![msg.from_address.clone()] } } diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index caec99c0..899f4fb4 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -9,18 +9,14 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true, features = ["cosmwasm"] } +cosmos-sdk-proto = { workspace = true, default-features = false, features = [ + "cosmwasm", +] } -frame-support = { workspace = true } -sp-std = { workspace = true } +frame-support = { workspace = true, default-features = false } -pallet-cosmos-types = { workspace = true } +pallet-cosmos-types = { workspace = true, default-features = false } [features] default = ["std"] -std = [ - "cosmos-sdk-proto/std", - "frame-support/std", - "sp-std/std", - "pallet-cosmos-types/std", -] +std = ["cosmos-sdk-proto/std", "frame-support/std", "pallet-cosmos-types/std"] diff --git a/frame/cosmos/x/wasm/src/lib.rs b/frame/cosmos/x/wasm/src/lib.rs index 516bec19..54f82a7e 100644 --- a/frame/cosmos/x/wasm/src/lib.rs +++ b/frame/cosmos/x/wasm/src/lib.rs @@ -19,4 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +extern crate alloc; + pub mod msgs; diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 15d5424c..1c4217f9 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -16,6 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::vec::Vec; +use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmwasm::wasm::v1::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, @@ -28,7 +30,6 @@ use frame_support::weights::Weight; use pallet_cosmos_types::{ errors::RootError, events::CosmosEvent, msgservice::MsgHandlerErrorInfo, }; -use sp_std::{marker::PhantomData, vec::Vec}; pub struct MsgStoreCodeHandler(PhantomData); diff --git a/frame/cosmos/x/wasm/types/Cargo.toml b/frame/cosmos/x/wasm/types/Cargo.toml index b310a00e..8c3ffad7 100644 --- a/frame/cosmos/x/wasm/types/Cargo.toml +++ b/frame/cosmos/x/wasm/types/Cargo.toml @@ -9,14 +9,11 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true, features = ["cosmwasm"] } -serde_json = { workspace = true } - -sp-std = { workspace = true } +cosmos-sdk-proto = { workspace = true, default-features = false, features = [ + "cosmwasm", +] } +serde_json = { workspace = true, default-features = false } [features] default = ["std"] -std = [ - "cosmos-sdk-proto/std", - "sp-std/std", -] +std = ["cosmos-sdk-proto/std", "serde_json/std"] diff --git a/frame/cosmos/x/wasm/types/src/tx.rs b/frame/cosmos/x/wasm/types/src/tx.rs index b9297b5d..858fc356 100644 --- a/frame/cosmos/x/wasm/types/src/tx.rs +++ b/frame/cosmos/x/wasm/types/src/tx.rs @@ -15,9 +15,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use alloc::string::{String, ToString}; +use alloc::{ + string::{String, ToString}, + vec, + vec::Vec, +}; use serde_json::{Map, Value}; -use sp_std::{vec, vec::Vec}; pub mod msg_store_code { use super::*; diff --git a/frame/cosmwasm/Cargo.toml b/frame/cosmwasm/Cargo.toml index 4a4b7194..0cf610bb 100644 --- a/frame/cosmwasm/Cargo.toml +++ b/frame/cosmwasm/Cargo.toml @@ -40,7 +40,6 @@ sp-arithmetic = { default-features = false, workspace = true } sp-core = { default-features = false, workspace = true } sp-io = { default-features = false, workspace = true } sp-runtime = { default-features = false, workspace = true } -sp-std = { default-features = false, workspace = true } composable-support = { workspace = true, default-features = false } composable-traits = { workspace = true, default-features = false } @@ -85,7 +84,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "composable-support/std", "composable-traits/std", "cosmwasm-std/std", diff --git a/frame/cosmwasm/src/crypto.rs b/frame/cosmwasm/src/crypto.rs index 6304fc51..ce1d9e13 100644 --- a/frame/cosmwasm/src/crypto.rs +++ b/frame/cosmwasm/src/crypto.rs @@ -1,5 +1,5 @@ use crate::{Config, Pallet, SUBSTRATE_ECDSA_SIGNATURE_LEN}; -use sp_std::{vec, vec::Vec}; +use alloc::{vec, vec::Vec}; use sp_core::{ecdsa, ed25519}; impl Pallet { diff --git a/frame/cosmwasm/src/ibc.rs b/frame/cosmwasm/src/ibc.rs index 4534e0ad..7ebb6de2 100644 --- a/frame/cosmwasm/src/ibc.rs +++ b/frame/cosmwasm/src/ibc.rs @@ -124,7 +124,7 @@ impl AsEntryName for IbcPacketAckCall { } pub struct NoRelayer { - _marker: sp_std::marker::PhantomData, + _marker: core::marker::PhantomData, } impl ibc_primitives::IbcHandler> for NoRelayer { diff --git a/frame/cosmwasm/src/runtimes/vm.rs b/frame/cosmwasm/src/runtimes/vm.rs index 8f89dfeb..1156c4b3 100644 --- a/frame/cosmwasm/src/runtimes/vm.rs +++ b/frame/cosmwasm/src/runtimes/vm.rs @@ -2,7 +2,7 @@ use super::abstraction::{CanonicalCosmwasmAccount, CosmwasmAccount, Gas}; use crate::{ prelude::*, runtimes::abstraction::GasOutcome, types::*, weights::WeightInfo, Config, Pallet, }; -use alloc::{borrow::ToOwned, string::String}; +use alloc::{borrow::ToOwned, collections::btree_map::BTreeMap, string::String, vec::Vec}; use composable_traits::cosmwasm::CosmwasmSubstrateError; use core::marker::{Send, Sync}; use cosmwasm_std::{CodeInfoResponse, Coin, ContractInfoResponse, Empty, Env, MessageInfo}; @@ -19,7 +19,6 @@ use cosmwasm_vm_wasmi::{ }; use frame_support::traits::tokens::Preservation; use sp_runtime::DispatchError; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; use wasmi::{core::HostError, Instance, Memory}; /// Different type of contract runtimes. A contract might either be dynamically loaded or statically diff --git a/frame/cosmwasm/src/weights.rs b/frame/cosmwasm/src/weights.rs index 8a41b539..7a1748ac 100644 --- a/frame/cosmwasm/src/weights.rs +++ b/frame/cosmwasm/src/weights.rs @@ -27,7 +27,7 @@ #![allow(non_snake_case)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions needed for cosmwasm. pub trait WeightInfo { diff --git a/primitives/account/Cargo.toml b/primitives/account/Cargo.toml index b5836ef1..07042ab1 100644 --- a/primitives/account/Cargo.toml +++ b/primitives/account/Cargo.toml @@ -18,7 +18,6 @@ ripemd = { workspace = true, default-features = false } sp-core = { workspace = true, default-features = false } sp-io = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } # Horizon hp-crypto = { workspace = true, default-features = false } @@ -36,7 +35,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", "hp-crypto/std", "hp-io/std", ] diff --git a/primitives/account/src/lib.rs b/primitives/account/src/lib.rs index ef50134c..ed56bfba 100644 --- a/primitives/account/src/lib.rs +++ b/primitives/account/src/lib.rs @@ -71,8 +71,8 @@ impl std::fmt::Display for CosmosSigner { } } -impl sp_std::fmt::Debug for CosmosSigner { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for CosmosSigner { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}", self.0) } } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 01cceb52..186be3ad 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -9,18 +9,18 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { workspace = true } -sp-std = { workspace = true } -sp-runtime-interface = { workspace = true } +sp-core = { workspace = true, default-features = false } +sp-runtime-interface = { workspace = true, default-features = false } -pallet-cosmos-types = { workspace = true, features = ["with-codec"] } -hp-crypto = { workspace = true } +pallet-cosmos-types = { workspace = true, default-features = false, features = [ + "with-codec", +] } +hp-crypto = { workspace = true, default-features = false } [features] default = ["std"] std = [ "sp-core/std", - "sp-std/std", "sp-runtime-interface/std", "pallet-cosmos-types/std", "hp-crypto/std", diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index ca8706ff..24a081bf 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -15,7 +15,6 @@ scale-info = { workspace = true, default-features = false } sp-api = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } pallet-cosmos-types = { workspace = true, features = [ "with-codec", @@ -29,7 +28,6 @@ std = [ "scale-info/std", "sp-api/std", "sp-runtime/std", - "sp-std/std", "pallet-cosmos-types/std", "serde/std", ] diff --git a/primitives/rpc/src/lib.rs b/primitives/rpc/src/lib.rs index f641430b..6791d8c2 100644 --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -18,12 +18,14 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::too_many_arguments)] +extern crate alloc; + +use alloc::vec::Vec; use pallet_cosmos_types::events::CosmosEvent; use parity_scale_codec::{Decode, Encode}; use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_runtime::traits::Block as BlockT; -use sp_std::vec::Vec; #[derive(Clone, Decode, Encode, Debug, TypeInfo, Serialize, Deserialize)] pub struct GasInfo { diff --git a/template/runtime/Cargo.toml b/template/runtime/Cargo.toml index e6bfc057..e1d91135 100644 --- a/template/runtime/Cargo.toml +++ b/template/runtime/Cargo.toml @@ -26,7 +26,6 @@ sp-inherents = { workspace = true, default-features = false } sp-offchain = { workspace = true, default-features = false } sp-runtime = { workspace = true, default-features = false } sp-session = { workspace = true, default-features = false } -sp-std = { workspace = true, default-features = false } sp-transaction-pool = { workspace = true, default-features = false } sp-version = { workspace = true, default-features = false } @@ -87,7 +86,6 @@ std = [ "sp-genesis-builder/std", "sp-offchain/std", "sp-runtime/std", - "sp-std/std", "sp-transaction-pool/std", "sp-version/std", "frame-executive/std", diff --git a/template/runtime/src/accounts.rs b/template/runtime/src/accounts.rs index e305af76..6f4918d8 100644 --- a/template/runtime/src/accounts.rs +++ b/template/runtime/src/accounts.rs @@ -25,7 +25,7 @@ use pallet_cosmos_types::address::address_from_bech32; use sp_core::Get; use sp_runtime::traits::Convert; -pub struct AccountToAddr(sp_std::marker::PhantomData); +pub struct AccountToAddr(core::marker::PhantomData); impl Convert for AccountToAddr where diff --git a/template/runtime/src/assets.rs b/template/runtime/src/assets.rs index 751bef49..25db7f5e 100644 --- a/template/runtime/src/assets.rs +++ b/template/runtime/src/assets.rs @@ -20,7 +20,7 @@ use alloc::string::String; use frame_support::{ensure, traits::fungibles::metadata::Inspect}; use sp_runtime::{traits::Convert, BoundedVec}; -pub struct AssetsCallback(sp_std::marker::PhantomData); +pub struct AssetsCallback(core::marker::PhantomData); impl pallet_assets::AssetsCallback for AssetsCallback where T: pallet_cosmos::Config, @@ -51,7 +51,7 @@ where } } -pub struct AssetToDenom(sp_std::marker::PhantomData); +pub struct AssetToDenom(core::marker::PhantomData); impl Convert> for AssetToDenom where T: pallet_cosmos::Config, diff --git a/template/runtime/src/compat/cosm.rs b/template/runtime/src/compat/cosm.rs index 19cb1492..72cfe55c 100644 --- a/template/runtime/src/compat/cosm.rs +++ b/template/runtime/src/compat/cosm.rs @@ -18,11 +18,11 @@ //! Adapter types for Cosmos pallet compatibility. +use core::marker::PhantomData; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::AddressMapping; use sp_core::{ecdsa, Hasher, H160, H256}; -use sp_std::marker::PhantomData; /// Hashed address mapping. pub struct HashedAddressMapping(PhantomData<(T, H)>); diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 18f915ad..a91ab533 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -36,6 +36,8 @@ mod msgs; mod sig_verifiable_tx; mod sign_mode_handler; +use alloc::{boxed::Box, vec::Vec}; +use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, cosmwasm::wasm::v1::{ @@ -85,7 +87,6 @@ use sp_runtime::{ transaction_validity::{TransactionSource, TransactionValidity, TransactionValidityError}, ApplyExtrinsicResult, ExtrinsicInclusionMode, Perbill, }; -use sp_std::{marker::PhantomData, prelude::*}; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; diff --git a/template/runtime/src/msgs.rs b/template/runtime/src/msgs.rs index d72aeb64..50a12d98 100644 --- a/template/runtime/src/msgs.rs +++ b/template/runtime/src/msgs.rs @@ -16,6 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::boxed::Box; +use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmos::bank::v1beta1::MsgSend, cosmwasm::wasm::v1::{ @@ -31,7 +33,6 @@ use pallet_cosmos_x_wasm::msgs::{ MsgExecuteContractHandler, MsgInstantiateContract2Handler, MsgMigrateContractHandler, MsgStoreCodeHandler, MsgUpdateAdminHandler, }; -use sp_std::{boxed::Box, marker::PhantomData}; pub struct MsgServiceRouter(PhantomData); impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter diff --git a/template/runtime/src/sig_verifiable_tx.rs b/template/runtime/src/sig_verifiable_tx.rs index 902b8d79..90ce3201 100644 --- a/template/runtime/src/sig_verifiable_tx.rs +++ b/template/runtime/src/sig_verifiable_tx.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::string::String; +use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, cosmwasm::wasm::v1::{ @@ -31,7 +31,6 @@ use pallet_cosmos_x_wasm_types::tx::{ msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, msg_update_admin, }; -use sp_std::vec::Vec; pub struct SigVerifiableTx; diff --git a/template/runtime/src/sign_mode_handler.rs b/template/runtime/src/sign_mode_handler.rs index 9a171e00..fda026be 100644 --- a/template/runtime/src/sign_mode_handler.rs +++ b/template/runtime/src/sign_mode_handler.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::string::ToString; +use alloc::{string::ToString, vec::Vec}; use cosmos_sdk_proto::{ cosmos::{ bank::v1beta1::MsgSend, @@ -42,7 +42,6 @@ use pallet_cosmos_x_wasm_types::tx::{ msg_update_admin, }; use serde_json::{Map, Value}; -use sp_std::vec::Vec; pub struct SignModeHandler; From fd449456f5c7ce60ef268b34cc6b29ad8cd5b7c8 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 14:44:54 +0900 Subject: [PATCH 04/55] feat: Implement MsgStoreCodeHandler --- frame/cosmos/x/auth/src/fee.rs | 13 ++--- frame/cosmos/x/bank/src/msgs.rs | 8 ++-- frame/cosmos/x/bank/types/src/msgs.rs | 3 +- frame/cosmos/x/wasm/Cargo.toml | 12 ++++- frame/cosmos/x/wasm/src/msgs.rs | 50 +++++++++++++++++--- frame/cosmos/x/wasm/types/Cargo.toml | 4 +- frame/cosmos/x/wasm/types/src/errors.rs | 63 +++++++++++++++++++++++++ frame/cosmos/x/wasm/types/src/events.rs | 21 +++++++++ frame/cosmos/x/wasm/types/src/lib.rs | 2 + frame/cosmwasm/src/lib.rs | 14 ++++-- template/runtime/src/msgs.rs | 2 +- 11 files changed, 167 insertions(+), 25 deletions(-) create mode 100644 frame/cosmos/x/wasm/types/src/errors.rs create mode 100644 frame/cosmos/x/wasm/types/src/events.rs diff --git a/frame/cosmos/x/auth/src/fee.rs b/frame/cosmos/x/auth/src/fee.rs index 4de9aa52..f629386c 100644 --- a/frame/cosmos/x/auth/src/fee.rs +++ b/frame/cosmos/x/auth/src/fee.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use alloc::vec; use core::marker::PhantomData; use cosmos_sdk_proto::cosmos::tx::v1beta1::{Fee, Tx}; use frame_support::{ @@ -99,17 +100,17 @@ where Self::deduct_fees(&deduct_fees_from_acc, fee)?; } - pallet_cosmos::Pallet::::deposit_event(pallet_cosmos::Event::AnteHandled(alloc::vec![ + pallet_cosmos::Pallet::::deposit_event(pallet_cosmos::Event::AnteHandled(vec![ CosmosEvent { r#type: EVENT_TYPE_TX.into(), - attributes: alloc::vec![ + attributes: vec![ EventAttribute { key: ATTRIBUTE_KEY_FEE.into(), - value: amount_to_string(&fee.amount).into() + value: amount_to_string(&fee.amount).into(), }, EventAttribute { key: ATTRIBUTE_KEY_FEE_PAYER.into(), value: fee_payer.into() }, - ] - } + ], + }, ])); Ok(ValidTransaction::default()) @@ -131,7 +132,7 @@ where ) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Payment))?; - // TODO: Resolve imbalance + // TODO: Resolve imbalance } else { let asset_id = T::AssetToDenom::convert(amt.denom.clone()) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Call))?; diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 3984387b..20980dcc 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::{string::String, vec::Vec}; +use alloc::{string::String, vec, vec::Vec}; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, base::v1beta1::Coin}, traits::Message, @@ -145,16 +145,16 @@ where let msg_event = pallet_cosmos_types::events::CosmosEvent { r#type: EVENT_TYPE_TRANSFER.into(), - attributes: alloc::vec![ + attributes: vec![ EventAttribute { key: ATTRIBUTE_KEY_SENDER.into(), value: from_address.into() }, EventAttribute { key: ATTRIBUTE_KEY_RECIPIENT.into(), value: to_address.into() }, EventAttribute { key: ATTRIBUTE_KEY_AMOUNT.into(), - value: amount_to_string(&amount).into() + value: amount_to_string(&amount).into(), }, ], }; - Ok((total_weight, alloc::vec![msg_event])) + Ok((total_weight, vec![msg_event])) } } diff --git a/frame/cosmos/x/bank/types/src/msgs.rs b/frame/cosmos/x/bank/types/src/msgs.rs index c20dad1f..1ce7f3f9 100644 --- a/frame/cosmos/x/bank/types/src/msgs.rs +++ b/frame/cosmos/x/bank/types/src/msgs.rs @@ -18,6 +18,7 @@ pub mod msg_send { use alloc::{ string::{String, ToString}, + vec, vec::Vec, }; use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; @@ -49,6 +50,6 @@ pub mod msg_send { } pub fn get_signers(msg: &MsgSend) -> Vec { - alloc::vec![msg.from_address.clone()] + vec![msg.from_address.clone()] } } diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index 899f4fb4..1f462c22 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -15,8 +15,18 @@ cosmos-sdk-proto = { workspace = true, default-features = false, features = [ frame-support = { workspace = true, default-features = false } +pallet-cosmos = { workspace = true, default-features = false } pallet-cosmos-types = { workspace = true, default-features = false } +pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } +pallet-cosmwasm = { workspace = true, default-features = false } [features] default = ["std"] -std = ["cosmos-sdk-proto/std", "frame-support/std", "pallet-cosmos-types/std"] +std = [ + "cosmos-sdk-proto/std", + "frame-support/std", + "pallet-cosmos/std", + "pallet-cosmos-types/std", + "pallet-cosmos-x-wasm-types/std", + "pallet-cosmwasm/std", +] diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 1c4217f9..1faebf10 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::vec::Vec; +use alloc::{string::ToString, vec, vec::Vec}; use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmwasm::wasm::v1::{ @@ -26,9 +26,17 @@ use cosmos_sdk_proto::{ prost::Message, Any, }; -use frame_support::weights::Weight; +use frame_support::{weights::Weight, BoundedVec}; +use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ - errors::RootError, events::CosmosEvent, msgservice::MsgHandlerErrorInfo, + address::address_from_bech32, + errors::RootError, + events::{CosmosEvent, EventAttribute}, + msgservice::MsgHandlerErrorInfo, +}; +use pallet_cosmos_x_wasm_types::{ + errors::WasmError, + events::{ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, EVENT_TYPE_STORE_CODE}, }; pub struct MsgStoreCodeHandler(PhantomData); @@ -39,18 +47,46 @@ impl Default for MsgStoreCodeHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgStoreCodeHandler { +impl pallet_cosmos_types::msgservice::MsgHandler for MsgStoreCodeHandler +where + T: pallet_cosmos::Config + pallet_cosmwasm::Config, +{ fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { let total_weight = Weight::zero(); - let MsgStoreCode { sender: _, wasm_byte_code: _, instantiate_permission: _ } = + let MsgStoreCode { sender, wasm_byte_code, instantiate_permission: _ } = MsgStoreCode::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into(), })?; - // TODO: Implements store wasm code with pallet_cosmwasm - Err(MsgHandlerErrorInfo { weight: total_weight, error: RootError::UnknownRequest.into() }) + let address = address_from_bech32(&sender).map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + let who = T::AddressMapping::into_account_id(address); + + let code = BoundedVec::::try_from(wasm_byte_code).map_err(|_| { + MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } + })?; + + let (code_hash, code_id) = + pallet_cosmwasm::Pallet::::do_upload(&who, code).map_err(|_| { + MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } + })?; + + let msg_event = CosmosEvent { + r#type: EVENT_TYPE_STORE_CODE.into(), + attributes: vec![ + EventAttribute { key: ATTRIBUTE_KEY_CHECKSUM.into(), value: code_hash.0.to_vec() }, + EventAttribute { + key: ATTRIBUTE_KEY_CODE_ID.into(), + value: code_id.to_string().into(), + }, + ], + }; + + Ok((total_weight, vec![msg_event])) } } diff --git a/frame/cosmos/x/wasm/types/Cargo.toml b/frame/cosmos/x/wasm/types/Cargo.toml index 8c3ffad7..99b19ad9 100644 --- a/frame/cosmos/x/wasm/types/Cargo.toml +++ b/frame/cosmos/x/wasm/types/Cargo.toml @@ -14,6 +14,8 @@ cosmos-sdk-proto = { workspace = true, default-features = false, features = [ ] } serde_json = { workspace = true, default-features = false } +pallet-cosmos-types = { workspace = true, default-features = false } + [features] default = ["std"] -std = ["cosmos-sdk-proto/std", "serde_json/std"] +std = ["cosmos-sdk-proto/std", "serde_json/std", "pallet-cosmos-types/std"] diff --git a/frame/cosmos/x/wasm/types/src/errors.rs b/frame/cosmos/x/wasm/types/src/errors.rs new file mode 100644 index 00000000..07417548 --- /dev/null +++ b/frame/cosmos/x/wasm/types/src/errors.rs @@ -0,0 +1,63 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use pallet_cosmos_types::errors::CosmosError; + +pub const WASM_CODESPACE: u8 = 1; + +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum WasmError { + CreateFailed = 2, +} + +impl From for CosmosError { + fn from(error: WasmError) -> Self { + CosmosError { codespace: WASM_CODESPACE, code: error as u8 } + } +} + +#[cfg(test)] +mod tests { + use super::{CosmosError, WasmError}; + use crate::errors::WASM_CODESPACE; + + #[test] + fn wasm_error_test() { + let error: CosmosError = WasmError::CreateFailed.into(); + assert_eq!( + error, + CosmosError { codespace: WASM_CODESPACE, code: WasmError::CreateFailed as u8 } + ); + } +} diff --git a/frame/cosmos/x/wasm/types/src/events.rs b/frame/cosmos/x/wasm/types/src/events.rs new file mode 100644 index 00000000..dd0f2763 --- /dev/null +++ b/frame/cosmos/x/wasm/types/src/events.rs @@ -0,0 +1,21 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub const EVENT_TYPE_STORE_CODE: &str = "store_code"; + +pub const ATTRIBUTE_KEY_CODE_ID: &str = "code_id"; +pub const ATTRIBUTE_KEY_CHECKSUM: &str = "code_checksum"; diff --git a/frame/cosmos/x/wasm/types/src/lib.rs b/frame/cosmos/x/wasm/types/src/lib.rs index b3b5dcc0..24ef5ebd 100644 --- a/frame/cosmos/x/wasm/types/src/lib.rs +++ b/frame/cosmos/x/wasm/types/src/lib.rs @@ -19,4 +19,6 @@ extern crate alloc; +pub mod errors; +pub mod events; pub mod tx; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index f8082ca2..c596d0fc 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -40,6 +40,7 @@ extern crate alloc; use alloc::string::ToString; pub use pallet::*; +use sp_core::H256; pub mod crypto; pub mod dispatchable_call; pub mod ibc; @@ -386,7 +387,7 @@ pub mod pallet { impl BuildGenesisConfig for GenesisConfig { fn build(&self) { for (who, code) in self.contracts.clone() { - >::do_upload(&who, code).expect("contracts in genesis are valid") + >::do_upload(&who, code).expect("contracts in genesis are valid"); } } } @@ -410,7 +411,9 @@ pub mod pallet { pub fn upload(origin: OriginFor, code: ContractCodeOf) -> DispatchResult { T::UploadWasmOrigin::ensure_origin(origin.clone())?; let who = ensure_signed(origin)?; - Self::do_upload(&who, code) + Self::do_upload(&who, code)?; + + Ok(()) } /// Instantiate a previously uploaded code resulting in a new contract being generated. @@ -927,7 +930,10 @@ impl Pallet { } } - pub(crate) fn do_upload(who: &AccountIdOf, code: ContractCodeOf) -> DispatchResult { + pub fn do_upload( + who: &AccountIdOf, + code: ContractCodeOf, + ) -> Result<(H256, u64), DispatchError> { let code_hash = sp_io::hashing::sha2_256(&code); ensure!(!CodeHashToId::::contains_key(code_hash), Error::::CodeAlreadyExists); let deposit = code.len().saturating_mul(T::CodeStorageByteDeposit::get() as _); @@ -951,7 +957,7 @@ impl Pallet { }, ); Self::deposit_event(Event::::Uploaded { code_hash, code_id }); - Ok(()) + Ok((H256::from(code_hash), code_id)) } #[allow(clippy::too_many_arguments)] diff --git a/template/runtime/src/msgs.rs b/template/runtime/src/msgs.rs index 50a12d98..ab2ea9cb 100644 --- a/template/runtime/src/msgs.rs +++ b/template/runtime/src/msgs.rs @@ -37,7 +37,7 @@ use pallet_cosmos_x_wasm::msgs::{ pub struct MsgServiceRouter(PhantomData); impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter where - T: frame_system::Config + pallet_cosmos::Config, + T: frame_system::Config + pallet_cosmos::Config + pallet_cosmwasm::Config, { fn route(msg: &Any) -> Option> { any_match!( From 6686799c25608a4dcd286eb131592f5ecb77eb4c Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 15:55:11 +0900 Subject: [PATCH 05/55] fix: Fix query all balances bug --- sidecar/src/services/balance.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sidecar/src/services/balance.ts b/sidecar/src/services/balance.ts index 3c815976..86df97b0 100644 --- a/sidecar/src/services/balance.ts +++ b/sidecar/src/services/balance.ts @@ -22,7 +22,7 @@ export class BalanceService implements ApiService { public async balances(address: string): Promise { const originRaw = await this.accountService.origin(address); - let amount = "0"; + let amount = '0'; let origin = originRaw.toString(); if (!origin) { origin = this.accountService.interim(address); @@ -44,12 +44,17 @@ export class BalanceService implements ApiService { if (asset) { const denom = value.toHuman()['symbol']; - const amount = BigInt(asset.toJSON()['balance']).toString(); + const amount = asset.toJSON() ? BigInt(asset.toJSON()['balance']).toString() : '0'; assets.push({ denom, amount }); } } + console.debug([ + nativeBalance, + ...assets, + ]); + return { balances: [ nativeBalance, From 784016e47c9b1f2cff6a9ddc195a5ff345e13485 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 18:38:45 +0900 Subject: [PATCH 06/55] feat: Add code_hash and code_id tuple return to do_upload --- frame/cosmwasm/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index c596d0fc..cfd07d96 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -194,6 +194,7 @@ pub mod pallet { QueryDeserialize, ExecuteSerialize, Xcm, + IncrementFailed, } #[pallet::config] @@ -933,7 +934,7 @@ impl Pallet { pub fn do_upload( who: &AccountIdOf, code: ContractCodeOf, - ) -> Result<(H256, u64), DispatchError> { + ) -> Result<(H256, u64), Error> { let code_hash = sp_io::hashing::sha2_256(&code); ensure!(!CodeHashToId::::contains_key(code_hash), Error::::CodeAlreadyExists); let deposit = code.len().saturating_mul(T::CodeStorageByteDeposit::get() as _); @@ -942,7 +943,7 @@ impl Pallet { let module = Self::do_load_module(&code)?; let ibc_capable = Self::do_check_ibc_capability(&module); let instrumented_code = Self::do_instrument_code(module)?; - let code_id = CurrentCodeId::::increment()?; + let code_id = CurrentCodeId::::increment().map_err(|_| Error::::IncrementFailed)?; CodeHashToId::::insert(code_hash, code_id); PristineCode::::insert(code_id, code); InstrumentedCode::::insert(code_id, instrumented_code); From 191d4549ea9fb8ea7a768c4c944322f241cb69f6 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 28 Aug 2024 22:10:10 +0900 Subject: [PATCH 07/55] feat: Add decode wasm_byte_code by libflate --- Cargo.toml | 2 ++ frame/cosmos/x/wasm/Cargo.toml | 4 ++++ frame/cosmos/x/wasm/src/msgs.rs | 14 +++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f97aa2cb..046eb106 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,12 +31,14 @@ array-bytes = "6.2.2" base64ct = { version = "1.6.0", default-features = false } bech32 = { version = "0.11.0", default-features = false } clap = { version = "4.5.16", features = ["derive"] } +core2 = { version = "0.4.0", default-features = false } cosmos-sdk-proto = { version = "0.24.0", default-features = false } futures = "0.3.28" hex = { version = "0.4.3", default-features = false } hex-literal = "0.4.1" impl-trait-for-tuples = "0.2.2" jsonrpsee = "0.22.5" +libflate = { version = "2.1.0", default-features = false } log = { version = "0.4.21", default-features = false } num = { version = "0.4.3", default-features = false } parity-scale-codec = { version = "3.2.0", default-features = false } diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index 1f462c22..a66bdd79 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -12,6 +12,8 @@ targets = ["x86_64-unknown-linux-gnu"] cosmos-sdk-proto = { workspace = true, default-features = false, features = [ "cosmwasm", ] } +core2 = { workspace = true, default-features = false, features = ["alloc"] } +libflate = { workspace = true, default-features = false } frame-support = { workspace = true, default-features = false } @@ -24,6 +26,8 @@ pallet-cosmwasm = { workspace = true, default-features = false } default = ["std"] std = [ "cosmos-sdk-proto/std", + "core2/std", + "libflate/std", "frame-support/std", "pallet-cosmos/std", "pallet-cosmos-types/std", diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 1faebf10..5f415b42 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -18,6 +18,7 @@ use alloc::{string::ToString, vec, vec::Vec}; use core::marker::PhantomData; +use core2::io::Read; use cosmos_sdk_proto::{ cosmwasm::wasm::v1::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, @@ -27,6 +28,7 @@ use cosmos_sdk_proto::{ Any, }; use frame_support::{weights::Weight, BoundedVec}; +use libflate::gzip::Decoder; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ address::address_from_bech32, @@ -66,7 +68,17 @@ where })?; let who = T::AddressMapping::into_account_id(address); - let code = BoundedVec::::try_from(wasm_byte_code).map_err(|_| { + let mut decoder = Decoder::new(&wasm_byte_code[..]).map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::CreateFailed.into(), + })?; + let mut decoded_code = Vec::new(); + decoder.read_to_end(&mut decoded_code).map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::CreateFailed.into(), + })?; + + let code = BoundedVec::::try_from(decoded_code).map_err(|_| { MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } })?; From c2a763751a7482ad294d51935031743dacbe4231 Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 29 Aug 2024 14:54:21 +0900 Subject: [PATCH 08/55] fix: Fix store code events --- frame/cosmos/x/wasm/Cargo.toml | 2 + frame/cosmos/x/wasm/src/msgs.rs | 5 +- sidecar/src/app.ts | 12 +++- sidecar/src/services/tx.ts | 118 +++++++++++++++++++------------- 4 files changed, 86 insertions(+), 51 deletions(-) diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index a66bdd79..8d946f36 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -13,6 +13,7 @@ cosmos-sdk-proto = { workspace = true, default-features = false, features = [ "cosmwasm", ] } core2 = { workspace = true, default-features = false, features = ["alloc"] } +hex = { workspace = true, default-features = false } libflate = { workspace = true, default-features = false } frame-support = { workspace = true, default-features = false } @@ -27,6 +28,7 @@ default = ["std"] std = [ "cosmos-sdk-proto/std", "core2/std", + "hex/std", "libflate/std", "frame-support/std", "pallet-cosmos/std", diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 5f415b42..e2129616 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -90,11 +90,14 @@ where let msg_event = CosmosEvent { r#type: EVENT_TYPE_STORE_CODE.into(), attributes: vec![ - EventAttribute { key: ATTRIBUTE_KEY_CHECKSUM.into(), value: code_hash.0.to_vec() }, EventAttribute { key: ATTRIBUTE_KEY_CODE_ID.into(), value: code_id.to_string().into(), }, + EventAttribute { + key: ATTRIBUTE_KEY_CHECKSUM.into(), + value: hex::encode(&code_hash.0).into(), + }, ], }; diff --git a/sidecar/src/app.ts b/sidecar/src/app.ts index 3c4bbb0d..219002b0 100644 --- a/sidecar/src/app.ts +++ b/sidecar/src/app.ts @@ -325,7 +325,17 @@ export class App { if (hash.includes("'")) { hash = hash.replace(/'/gi, ""); } - return this.services.get("tx").searchTx(hash); + const txs = this.services.get("tx").searchTx(hash); + txs.forEach(tx => { + tx.tx_result.events.forEach(event => { + event.attributes = this.services.get("tx").encodeAttributes(event.attributes, 'utf8', 'base64'); + }); + }); + + return { + txs, + total_count: txs.length.toString(), + }; }); this.server.get( diff --git a/sidecar/src/services/tx.ts b/sidecar/src/services/tx.ts index 56c912ee..347c07eb 100644 --- a/sidecar/src/services/tx.ts +++ b/sidecar/src/services/tx.ts @@ -10,7 +10,7 @@ import Long from "long"; import { createHash } from "crypto"; import { Tx } from "cosmjs-types/cosmos/tx/v1beta1/tx.js"; -type TransactResult = { codespace: string, code: number; gasUsed: number }; +type TransactResult = { codespace: string, code: number; gasUsed: number, events: any[] }; export class TxService implements ApiService { chainApi: ApiPromise; @@ -29,29 +29,44 @@ export class TxService implements ApiService { console.debug(`txHash: ${txHash.toLowerCase()}`); - return { - txResponse: { - height: Long.ZERO, - txhash: txHash.toUpperCase(), - codespace: '', - code: 0, - data: '', - rawLog: '', - logs: [], - info: '', - gasWanted: Long.ZERO, - gasUsed: Long.ZERO, - tx: { - typeUrl: '', - value: new Uint8Array(), - }, - timestamp: '', - events: [], - }, - }; + const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + + while (true) { + const txs = this.searchTx(txHash); + console.debug(`txs: ${JSON.stringify(txs)}`); + + if (txs.length > 0) { + const tx = txs.at(0); + + return { + txResponse: { + height: Long.fromString(tx.height), + txhash: txHash.toUpperCase(), + codespace: tx.tx_result.codespace, + code: tx.tx_result.code, + data: tx.tx_result.data, + rawLog: '', + logs: [], + info: tx.tx_result.info, + gasWanted: Long.fromString(tx.tx_result.gas_wanted), + gasUsed: Long.fromString(tx.tx_result.gas_used), + tx: { + typeUrl: '', + value: new Uint8Array(), + }, + timestamp: '', + events: tx.tx_result.events, + }, + }; + } else { + console.debug('Waiting for events...'); + + await sleep(1000); + } + } } - public searchTx(hash: string): ResultTxSearch { + public searchTx(hash: string): ResultTx[] { if (hash.startsWith('0x')) { hash = hash.slice(2); } @@ -63,10 +78,7 @@ export class TxService implements ApiService { if (resultTx) { txs.push(resultTx); } - return { - txs, - total_count: txs.length.toString(), - }; + return txs; } public async saveTransactResult( @@ -80,7 +92,7 @@ export class TxService implements ApiService { const txHash = createHash('sha256').update(Buffer.from(txRaw, 'hex')).digest('hex'); - const { codespace, code, gasUsed } = await this.checkResult(header, extrinsicIndex); + const { codespace, code, gasUsed, events } = await this.checkResult(header, extrinsicIndex); const txResult: ResultTx = { hash: `${txHash.toUpperCase()}`, height: header.number.toString(), @@ -92,7 +104,7 @@ export class TxService implements ApiService { info: '', gas_wanted: gasLimit.toString(), gas_used: gasUsed.toString(), - events: [], + events, codespace, }, tx: txBytes.toString('base64'), @@ -124,7 +136,11 @@ export class TxService implements ApiService { console.debug(`gasUsed: ${gas_used}`); console.debug(`events: ${JSON.stringify(events)}`); - return { codespace: '', code: 0, gasUsed: gas_used }; + const cosmosEvents = this.encodeEvents(events, 'hex', 'utf8'); + + console.debug(`cosmosEvents: ${JSON.stringify(cosmosEvents)}`) + + return { codespace: '', code: 0, gasUsed: gas_used, events: cosmosEvents }; } else { console.debug(JSON.parse(data)); const [{ module: { index, error } }, info] = JSON.parse(data); @@ -136,13 +152,13 @@ export class TxService implements ApiService { const weight = info.weight.refTime; // TODO: codespace and gasUsed will be transformed proper values - return { codespace: 'sdk', code, gasUsed: weight }; + return { codespace: 'sdk', code, gasUsed: weight, events: [] }; } }); return result[0]; } - convert(str: string, from: BufferEncoding, to: BufferEncoding) { + convert(str: string, from: BufferEncoding, to: BufferEncoding): string { if (from === 'hex') { str = str.startsWith('0x') ? str.slice(2) : str; } @@ -154,24 +170,7 @@ export class TxService implements ApiService { const { gas_info, events } = (await this.chainApi.rpc['cosm']['simulate'](txRaw)).toJSON(); - const cosmosEvents = events.map(({ type, attributes }) => { - const eventType = this.convert(type, 'hex', 'utf8'); - - const eventAttributes = attributes.map(({ key, value }) => { - const eventKey = this.convert(key, 'hex', 'utf8'); - const eventValue = this.convert(value, 'hex', 'utf8'); - - return { - key: eventKey, - value: eventValue, - } - }); - - return { - type: eventType, - attributes: eventAttributes, - } - }); + const cosmosEvents = this.encodeEvents(events, 'hex', 'utf8'); console.debug(`gasInfo: ${JSON.stringify(gas_info)}`); console.debug(`events: ${JSON.stringify(cosmosEvents)}`); @@ -189,4 +188,25 @@ export class TxService implements ApiService { }, }; } + + public encodeEvents(events, from: BufferEncoding, to: BufferEncoding) { + return events.map((event) => { + return { + type: this.convert(event.type ? event.type : event['r#type'], from, to), + attributes: this.encodeAttributes(event.attributes, from, to), + } + }); + } + + public encodeAttributes(attributes, from: BufferEncoding, to: BufferEncoding) { + return attributes.map(({ key, value }) => { + const eventKey = this.convert(key, from, to); + const eventValue = this.convert(value, from, to); + + return { + key: eventKey, + value: eventValue, + } + }); + } } From 6fdc071705cb6366cd084b070486a65915c97217 Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 29 Aug 2024 15:01:51 +0900 Subject: [PATCH 09/55] chore: Add todo to MsgStoreCode handler --- frame/cosmos/x/wasm/src/msgs.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index e2129616..ea00c76d 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -54,6 +54,7 @@ where T: pallet_cosmos::Config + pallet_cosmwasm::Config, { fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { + // TODO: Apply actual weights let total_weight = Weight::zero(); let MsgStoreCode { sender, wasm_byte_code, instantiate_permission: _ } = From 706b4063306abfc45d6b6ef29ef80601247bed07 Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 29 Aug 2024 18:50:22 +0900 Subject: [PATCH 10/55] feat: Implement MsgInstantiateContract2 handler --- frame/cosmos/x/wasm/Cargo.toml | 6 + frame/cosmos/x/wasm/src/msgs.rs | 165 +++++++++++++++++++++--- frame/cosmos/x/wasm/types/src/errors.rs | 2 + frame/cosmos/x/wasm/types/src/events.rs | 2 + frame/cosmwasm/src/lib.rs | 10 +- template/runtime/src/msgs.rs | 2 + 6 files changed, 161 insertions(+), 26 deletions(-) diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index 8d946f36..dc92ca2b 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -9,6 +9,7 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] +bech32 = { workspace = true, default-features = false } cosmos-sdk-proto = { workspace = true, default-features = false, features = [ "cosmwasm", ] } @@ -17,7 +18,9 @@ hex = { workspace = true, default-features = false } libflate = { workspace = true, default-features = false } frame-support = { workspace = true, default-features = false } +sp-runtime = { workspace = true, default-features = false } +hp-crypto = { workspace = true, default-features = false } pallet-cosmos = { workspace = true, default-features = false } pallet-cosmos-types = { workspace = true, default-features = false } pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } @@ -26,11 +29,14 @@ pallet-cosmwasm = { workspace = true, default-features = false } [features] default = ["std"] std = [ + "bech32/std", "cosmos-sdk-proto/std", "core2/std", "hex/std", "libflate/std", "frame-support/std", + "sp-runtime/std", + "hp-crypto/std", "pallet-cosmos/std", "pallet-cosmos-types/std", "pallet-cosmos-x-wasm-types/std", diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index ea00c76d..6a7bda78 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -17,7 +17,8 @@ // along with this program. If not, see . use alloc::{string::ToString, vec, vec::Vec}; -use core::marker::PhantomData; +use bech32::{Bech32, Hrp}; +use core::{marker::PhantomData, str::FromStr}; use core2::io::Read; use cosmos_sdk_proto::{ cosmwasm::wasm::v1::{ @@ -27,7 +28,8 @@ use cosmos_sdk_proto::{ prost::Message, Any, }; -use frame_support::{weights::Weight, BoundedVec}; +use frame_support::{traits::Get, weights::Weight}; +use hp_crypto::EcdsaExt; use libflate::gzip::Decoder; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ @@ -38,8 +40,18 @@ use pallet_cosmos_types::{ }; use pallet_cosmos_x_wasm_types::{ errors::WasmError, - events::{ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, EVENT_TYPE_STORE_CODE}, + events::{ + ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, ATTRIBUTE_KEY_CONTRACT_ADDR, + EVENT_TYPE_INSTANTIATE, EVENT_TYPE_STORE_CODE, + }, +}; +use pallet_cosmwasm::{ + runtimes::vm::InitialStorageMutability, + types::{ + CodeIdentifier, ContractCodeOf, ContractLabelOf, ContractMessageOf, ContractSaltOf, FundsOf, + }, }; +use sp_runtime::{traits::Convert, SaturatedConversion}; pub struct MsgStoreCodeHandler(PhantomData); @@ -63,11 +75,13 @@ where error: RootError::TxDecodeError.into(), })?; - let address = address_from_bech32(&sender).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; - let who = T::AddressMapping::into_account_id(address); + let who = + address_from_bech32(&sender) + .map(T::AddressMapping::into_account_id) + .map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; let mut decoder = Decoder::new(&wasm_byte_code[..]).map_err(|_| MsgHandlerErrorInfo { weight: total_weight, @@ -79,8 +93,9 @@ where error: WasmError::CreateFailed.into(), })?; - let code = BoundedVec::::try_from(decoded_code).map_err(|_| { - MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } + let code: ContractCodeOf = decoded_code.try_into().map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::CreateFailed.into(), })?; let (code_hash, code_id) = @@ -88,6 +103,7 @@ where MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } })?; + // TODO: Duplicated events emitted let msg_event = CosmosEvent { r#type: EVENT_TYPE_STORE_CODE.into(), attributes: vec![ @@ -97,7 +113,7 @@ where }, EventAttribute { key: ATTRIBUTE_KEY_CHECKSUM.into(), - value: hex::encode(&code_hash.0).into(), + value: hex::encode(code_hash.0).into(), }, ], }; @@ -114,26 +130,133 @@ impl Default for MsgInstantiateContract2Handler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgInstantiateContract2Handler { +impl pallet_cosmos_types::msgservice::MsgHandler for MsgInstantiateContract2Handler +where + T: pallet_cosmos::Config + pallet_cosmwasm::Config, + T::AccountId: EcdsaExt, +{ fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { let total_weight = Weight::zero(); let MsgInstantiateContract2 { - sender: _, - admin: _, - code_id: _, - label: _, - msg: _, - funds: _, - salt: _, + sender, + admin, + code_id, + label, + msg, + funds: coins, + salt, fix_msg: _, } = MsgInstantiateContract2::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into(), })?; - // TODO: Implements instantiate contract with pallet_cosmwasm - Err(MsgHandlerErrorInfo { weight: total_weight, error: RootError::UnknownRequest.into() }) + if sender.is_empty() { + return Err(MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::Empty.into(), + }); + } + + let who = + address_from_bech32(&sender) + .map(T::AddressMapping::into_account_id) + .map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + + // TODO: Get gas limit from tx + let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( + 0, + InitialStorageMutability::ReadWrite, + ); + let code_identifier = CodeIdentifier::CodeId(code_id); + + let salt: ContractSaltOf = salt.try_into().map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + + let admin = if !admin.is_empty() { + let admin = address_from_bech32(&admin) + .map(T::AddressMapping::into_account_id) + .map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + Some(admin) + } else { + None + }; + + let label: ContractLabelOf = label.as_bytes().to_vec().try_into().map_err(|_| { + MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into() } + })?; + + let mut funds = FundsOf::::default(); + for coin in coins.iter() { + let asset_id = ::AssetToDenom::convert( + coin.denom.clone(), + ) + .map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + let amount = u128::from_str(&coin.amount).map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + + funds.try_insert(asset_id, (amount.saturated_into(), true)).map_err(|_| { + MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into() } + })?; + } + + let message: ContractMessageOf = msg.try_into().map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: RootError::TxDecodeError.into(), + })?; + + let contract = pallet_cosmwasm::Pallet::::do_instantiate( + &mut shared, + who, + code_identifier, + salt, + admin, + label, + funds, + message, + ) + .map_err(|_| MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::InstantiateFailed.into(), + })?; + let contract_address = contract.to_cosm_address().ok_or(MsgHandlerErrorInfo { + weight: total_weight, + error: WasmError::InstantiateFailed.into(), + })?; + + let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); + let contract_address = bech32::encode::(hrp, contract_address.as_bytes()).unwrap(); + + // TODO: Duplicated events emitted + let msg_event = CosmosEvent { + r#type: EVENT_TYPE_INSTANTIATE.into(), + attributes: vec![ + EventAttribute { + key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), + value: contract_address.into(), + }, + EventAttribute { + key: ATTRIBUTE_KEY_CODE_ID.into(), + value: code_id.to_string().into(), + }, + ], + }; + + Ok((total_weight, vec![msg_event])) } } diff --git a/frame/cosmos/x/wasm/types/src/errors.rs b/frame/cosmos/x/wasm/types/src/errors.rs index 07417548..738c6a9c 100644 --- a/frame/cosmos/x/wasm/types/src/errors.rs +++ b/frame/cosmos/x/wasm/types/src/errors.rs @@ -39,6 +39,8 @@ pub const WASM_CODESPACE: u8 = 1; #[derive(Clone, PartialEq, Eq, Debug)] pub enum WasmError { CreateFailed = 2, + InstantiateFailed = 4, + Empty = 12, } impl From for CosmosError { diff --git a/frame/cosmos/x/wasm/types/src/events.rs b/frame/cosmos/x/wasm/types/src/events.rs index dd0f2763..ac754307 100644 --- a/frame/cosmos/x/wasm/types/src/events.rs +++ b/frame/cosmos/x/wasm/types/src/events.rs @@ -16,6 +16,8 @@ // limitations under the License. pub const EVENT_TYPE_STORE_CODE: &str = "store_code"; +pub const EVENT_TYPE_INSTANTIATE: &str = "instantiate"; +pub const ATTRIBUTE_KEY_CONTRACT_ADDR: &str = "_contract_address"; pub const ATTRIBUTE_KEY_CODE_ID: &str = "code_id"; pub const ATTRIBUTE_KEY_CHECKSUM: &str = "code_checksum"; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index cfd07d96..366911ae 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -461,7 +461,8 @@ pub mod pallet { label, funds, message, - ); + ) + .map(|_| ()); Self::refund_gas(outcome, initial_gas, shared.gas.remaining()) } @@ -645,7 +646,7 @@ impl Pallet { /// This state is shared across all VMs (all contracts loaded within a single call) and is /// used to optimize some operations as well as track shared state (readonly storage while /// doing a `query` etc...) - pub(crate) fn do_create_vm_shared( + pub fn do_create_vm_shared( gas: u64, storage_mutability: InitialStorageMutability, ) -> CosmwasmVMShared { @@ -962,7 +963,7 @@ impl Pallet { } #[allow(clippy::too_many_arguments)] - fn do_instantiate( + pub fn do_instantiate( shared: &mut CosmwasmVMShared, who: AccountIdOf, code_identifier: CodeIdentifier, @@ -971,7 +972,7 @@ impl Pallet { label: ContractLabelOf, funds: FundsOf, message: ContractMessageOf, - ) -> Result<(), CosmwasmVMError> { + ) -> Result, CosmwasmVMError> { let code_id = match code_identifier { CodeIdentifier::CodeId(code_id) => code_id, CodeIdentifier::CodeHash(code_hash) => @@ -979,7 +980,6 @@ impl Pallet { }; setup_instantiate_call(who, code_id, &salt, admin, label)? .top_level_call(shared, funds, message) - .map(|_| ()) } fn do_execute( diff --git a/template/runtime/src/msgs.rs b/template/runtime/src/msgs.rs index ab2ea9cb..f04ad68e 100644 --- a/template/runtime/src/msgs.rs +++ b/template/runtime/src/msgs.rs @@ -26,6 +26,7 @@ use cosmos_sdk_proto::{ }, Any, }; +use hp_crypto::EcdsaExt; use pallet_cosmos_types::msgservice::MsgHandler; use pallet_cosmos_x_auth_signing::any_match; use pallet_cosmos_x_bank::msgs::MsgSendHandler; @@ -38,6 +39,7 @@ pub struct MsgServiceRouter(PhantomData); impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter where T: frame_system::Config + pallet_cosmos::Config + pallet_cosmwasm::Config, + T::AccountId: EcdsaExt, { fn route(msg: &Any) -> Option> { any_match!( From 1f0d9720e07361656cab9ad6c9e3590ad499cea3 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 14:49:16 +0900 Subject: [PATCH 11/55] feat: Add Context --- composable/vm/src/system.rs | 4 +- frame/cosmos/src/lib.rs | 135 +++++++++++++----- frame/cosmos/types/src/errors.rs | 1 + frame/cosmos/types/src/events.rs | 9 ++ frame/cosmos/types/src/lib.rs | 1 + frame/cosmos/types/src/msgservice.rs | 18 +-- frame/cosmos/types/src/store.rs | 77 ++++++++++ frame/cosmos/x/bank/src/msgs.rs | 120 ++++++---------- frame/cosmos/x/wasm/src/msgs.rs | 202 ++++++++++----------------- template/runtime/src/context.rs | 67 +++++++++ template/runtime/src/lib.rs | 3 + template/runtime/src/msgs.rs | 7 +- 12 files changed, 383 insertions(+), 261 deletions(-) create mode 100644 frame/cosmos/types/src/store.rs create mode 100644 template/runtime/src/context.rs diff --git a/composable/vm/src/system.rs b/composable/vm/src/system.rs index 9f886884..2b4e569d 100644 --- a/composable/vm/src/system.rs +++ b/composable/vm/src/system.rs @@ -766,7 +766,7 @@ where (Ok((data, events)), ReplyOn::Always | ReplyOn::Success) => { log::debug!("Commit & Reply"); vm.transaction_commit()?; - // TODO: + // TODO: Handle msg_response SubCallContinuation::Reply(SubMsgResult::Ok(SubMsgResponse { events, data, @@ -805,7 +805,7 @@ where // the reply and optionally overwrite the current data with with the // one yield by the reply. SubCallContinuation::Reply(response) => { - // TODO: Handle data + // TODO: Handle payload and gas_used let new_data = vm.continue_reply( Reply { id: submsg.id, diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 55d85bd2..26e9ba98 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -41,10 +41,12 @@ use frame_system::{pallet_prelude::OriginFor, CheckWeight}; use pallet_cosmos_types::{ address::address_from_bech32, errors::{CosmosError, RootError}, - events::CosmosEvent, + events, + events::{CosmosEvent, CosmosEvents, EventManager as _}, handler::AnteDecorator, msgservice::MsgServiceRouter, - tx::{Account, Gas}, + store::{self, BasicGasMeter, Context, Gas, GasMeter}, + tx::Account, }; use pallet_cosmos_x_auth_signing::{ sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, @@ -197,6 +199,54 @@ pub mod pallet { pub const AddressPrefix: &'static str = "cosmos"; } + #[derive(Clone, Debug, Default)] + pub struct EventManager { + events: CosmosEvents, + } + + impl events::EventManager for EventManager { + fn new() -> Self { + Self::default() + } + + fn events(&self) -> CosmosEvents { + self.events.clone() + } + + fn emit_event(&mut self, event: events::CosmosEvent) { + self.events.push(event); + } + + fn emit_events(&mut self, events: CosmosEvents) { + self.events.extend(events); + } + } + + pub struct Context { + pub gas_meter: BasicGasMeter, + pub event_manager: EventManager, + } + + impl store::Context for Context { + type GasMeter = BasicGasMeter; + type EventManager = EventManager; + + fn new(limit: Gas) -> Self { + Self { + gas_meter: Self::GasMeter::new(limit), + event_manager: Self::EventManager::new(), + } + } + + fn gas_meter(&mut self) -> &mut Self::GasMeter { + &mut self.gas_meter + } + + fn event_manager(&mut self) -> &mut Self::EventManager { + &mut self.event_manager + } + } + #[frame_support::register_default_impl(TestDefaultConfig)] impl DefaultConfig for TestDefaultConfig { #[inject_runtime_type] @@ -213,6 +263,7 @@ pub mod pallet { type TxSigLimit = TxSigLimit; type MaxDenomLimit = MaxDenomLimit; type AddressPrefix = AddressPrefix; + type Context = Context; } } @@ -261,7 +312,7 @@ pub mod pallet { type NativeDenom: Get<&'static str>; /// Router for handling message services. #[pallet::no_default] - type MsgServiceRouter: MsgServiceRouter; + type MsgServiceRouter: MsgServiceRouter; /// The chain ID. #[pallet::constant] type ChainId: Get<&'static str>; @@ -291,6 +342,8 @@ pub mod pallet { /// The chain ID. #[pallet::constant] type AddressPrefix: Get<&'static str>; + + type Context: store::Context; } #[pallet::genesis_config] @@ -404,58 +457,68 @@ impl Pallet { } pub fn apply_validated_transaction(_source: H160, tx: Tx) -> DispatchResultWithPostInfo { - let mut total_weight = T::WeightInfo::default_weight(); - let mut events = Vec::::new(); - let body = tx.body.ok_or(DispatchErrorWithPostInfo { - post_info: PostDispatchInfo { actual_weight: Some(total_weight), pays_fee: Pays::Yes }, + post_info: PostDispatchInfo { + actual_weight: Some(T::WeightInfo::default_weight()), + pays_fee: Pays::Yes, + }, error: Error::::CosmosError(RootError::TxDecodeError.into()).into(), })?; + let gas_limit = tx + .auth_info + .as_ref() + .and_then(|auth_info| auth_info.fee.as_ref()) + .ok_or(DispatchErrorWithPostInfo { + post_info: PostDispatchInfo { + actual_weight: Some(T::WeightInfo::default_weight()), + pays_fee: Pays::Yes, + }, + error: Error::::CosmosError(RootError::TxDecodeError.into()).into(), + })? + .gas_limit; + + let mut ctx = T::Context::new(gas_limit); + ctx.gas_meter() + .consume_gas(T::WeightInfo::default_weight().ref_time(), "") + .map_err(|_| DispatchErrorWithPostInfo { + post_info: PostDispatchInfo { + actual_weight: Some(Weight::from_parts(ctx.gas_meter().consumed_gas(), 0)), + pays_fee: Pays::Yes, + }, + error: Error::::CosmosError(RootError::OutOfGas.into()).into(), + })?; for msg in body.messages.iter() { let handler = T::MsgServiceRouter::route(msg).ok_or(DispatchErrorWithPostInfo { post_info: PostDispatchInfo { - actual_weight: Some(total_weight), + actual_weight: Some(Weight::from_parts(ctx.gas_meter().consumed_gas(), 0)), pays_fee: Pays::Yes, }, error: Error::::CosmosError(RootError::UnknownRequest.into()).into(), })?; - match handler.handle(msg) { - Ok((weight, msg_events)) => { - total_weight = total_weight.saturating_add(weight); - events.extend(msg_events); - }, - Err(e) => { - total_weight = total_weight.saturating_add(e.weight); - - return Err(DispatchErrorWithPostInfo { - post_info: PostDispatchInfo { - actual_weight: Some(total_weight), - pays_fee: Pays::Yes, - }, - error: Error::::CosmosError(e.error).into(), - }); - }, - } - } - let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or( - DispatchErrorWithPostInfo { + handler.handle(msg, &mut ctx).map_err(|e| DispatchErrorWithPostInfo { post_info: PostDispatchInfo { - actual_weight: Some(total_weight), + actual_weight: Some(Weight::from_parts(ctx.gas_meter().consumed_gas(), 0)), pays_fee: Pays::Yes, }, - error: Error::::CosmosError(RootError::TxDecodeError.into()).into(), - }, - )?; + error: Error::::CosmosError(e).into(), + })?; + } Self::deposit_event(Event::Executed { - gas_wanted: fee.gas_limit, - gas_used: T::WeightToGas::convert(total_weight), - events, + gas_wanted: gas_limit, + gas_used: T::WeightToGas::convert(Weight::from_parts( + ctx.gas_meter().consumed_gas(), + 0, + )), + events: ctx.event_manager().events(), }); - Ok(PostDispatchInfo { actual_weight: Some(total_weight), pays_fee: Pays::Yes }) + Ok(PostDispatchInfo { + actual_weight: Some(Weight::from_parts(ctx.gas_meter().consumed_gas(), 0)), + pays_fee: Pays::Yes, + }) } /// Get the base account info. diff --git a/frame/cosmos/types/src/errors.rs b/frame/cosmos/types/src/errors.rs index bd349bff..dc4683e4 100644 --- a/frame/cosmos/types/src/errors.rs +++ b/frame/cosmos/types/src/errors.rs @@ -34,6 +34,7 @@ pub enum RootError { UnknownRequest = 6, InvalidAddress = 7, InvalidCoins = 10, + OutOfGas = 11, UnpackAnyError = 34, } diff --git a/frame/cosmos/types/src/events.rs b/frame/cosmos/types/src/events.rs index ad25b533..369b2b6e 100644 --- a/frame/cosmos/types/src/events.rs +++ b/frame/cosmos/types/src/events.rs @@ -52,3 +52,12 @@ pub struct EventAttribute { pub key: Vec, pub value: Vec, } + +pub type CosmosEvents = Vec; + +pub trait EventManager { + fn new() -> Self; + fn events(&self) -> CosmosEvents; + fn emit_event(&mut self, event: CosmosEvent); + fn emit_events(&mut self, events: CosmosEvents); +} diff --git a/frame/cosmos/types/src/lib.rs b/frame/cosmos/types/src/lib.rs index fe917116..3bdce5a0 100644 --- a/frame/cosmos/types/src/lib.rs +++ b/frame/cosmos/types/src/lib.rs @@ -25,4 +25,5 @@ pub mod errors; pub mod events; pub mod handler; pub mod msgservice; +pub mod store; pub mod tx; diff --git a/frame/cosmos/types/src/msgservice.rs b/frame/cosmos/types/src/msgservice.rs index b5e47af9..66424d8d 100644 --- a/frame/cosmos/types/src/msgservice.rs +++ b/frame/cosmos/types/src/msgservice.rs @@ -15,20 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{errors::CosmosError, events::CosmosEvent}; -use alloc::{boxed::Box, vec::Vec}; +use crate::errors::CosmosError; +use alloc::boxed::Box; use cosmos_sdk_proto::Any; -use frame_support::weights::Weight; -pub struct MsgHandlerErrorInfo { - pub weight: Weight, - pub error: CosmosError, +pub trait MsgHandler { + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError>; } -pub trait MsgHandler { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo>; -} - -pub trait MsgServiceRouter { - fn route(msg: &Any) -> Option>; +pub trait MsgServiceRouter { + fn route(msg: &Any) -> Option>>; } diff --git a/frame/cosmos/types/src/store.rs b/frame/cosmos/types/src/store.rs new file mode 100644 index 00000000..b5462971 --- /dev/null +++ b/frame/cosmos/types/src/store.rs @@ -0,0 +1,77 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::events::EventManager; + +pub trait Context { + type GasMeter: GasMeter; + type EventManager: EventManager; + + fn new(limit: Gas) -> Self; + fn gas_meter(&mut self) -> &mut Self::GasMeter; + fn event_manager(&mut self) -> &mut Self::EventManager; +} + +pub type Gas = u64; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum Error { + GasOverflow, + OutOfGas, +} + +pub trait GasMeter { + fn new(limit: Gas) -> Self; + fn consumed_gas(&self) -> Gas; + fn gas_remaining(&self) -> Gas; + fn limit(&self) -> Gas; + fn consume_gas(&mut self, amount: Gas, descriptor: &str) -> Result; +} + +#[derive(Clone, Debug)] +pub struct BasicGasMeter { + pub limit: Gas, + pub consumed: Gas, +} + +impl GasMeter for BasicGasMeter { + fn new(limit: Gas) -> Self { + Self { limit, consumed: 0 } + } + + fn consumed_gas(&self) -> Gas { + self.consumed + } + + fn gas_remaining(&self) -> Gas { + self.limit.saturating_sub(self.consumed) + } + + fn limit(&self) -> Gas { + self.limit + } + + fn consume_gas(&mut self, amount: Gas, _descriptor: &str) -> Result { + let consumed = self.consumed.checked_add(amount).ok_or(Error::GasOverflow)?; + if consumed > self.limit { + return Err(Error::OutOfGas); + } + + self.consumed = consumed; + Ok(self.consumed) + } +} diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 20980dcc..7a0f4686 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -16,12 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::{string::String, vec, vec::Vec}; -use cosmos_sdk_proto::{ - cosmos::{bank::v1beta1::MsgSend, base::v1beta1::Coin}, - traits::Message, - Any, -}; +use alloc::vec; +use cosmos_sdk_proto::{cosmos::bank::v1beta1::MsgSend, traits::Message, Any}; use frame_support::{ pallet_prelude::*, traits::{fungibles::Mutate, tokens::Preservation, Currency, ExistenceRequirement}, @@ -32,9 +28,9 @@ use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ address::address_from_bech32, coin::amount_to_string, - errors::RootError, - events::{CosmosEvent, EventAttribute, ATTRIBUTE_KEY_AMOUNT, ATTRIBUTE_KEY_SENDER}, - msgservice::MsgHandlerErrorInfo, + errors::{CosmosError, RootError}, + events::{EventAttribute, EventManager, ATTRIBUTE_KEY_AMOUNT, ATTRIBUTE_KEY_SENDER}, + store::{self, GasMeter}, }; use pallet_cosmos_x_bank_types::events::{ATTRIBUTE_KEY_RECIPIENT, EVENT_TYPE_TRANSFER}; use sp_runtime::{traits::Convert, SaturatedConversion}; @@ -47,62 +43,29 @@ impl Default for MsgSendHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgSendHandler +impl pallet_cosmos_types::msgservice::MsgHandler for MsgSendHandler where T: pallet_cosmos::Config, + Context: store::Context, { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let mut total_weight = Weight::zero(); - - let MsgSend { from_address, to_address, amount } = MsgSend::decode(&mut &*msg.value) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::UnpackAnyError.into(), - })?; - - match Self::send_coins(from_address, to_address, amount) { - Ok((weight, msg_events)) => { - total_weight = total_weight.saturating_add(weight); - Ok((total_weight, msg_events)) - }, - Err(e) => Err(MsgHandlerErrorInfo { - weight: total_weight.saturating_add(e.weight), - error: e.error, - }), - } - } -} + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { + let MsgSend { from_address, to_address, amount } = + MsgSend::decode(&mut &*msg.value).map_err(|_| RootError::UnpackAnyError)?; -impl MsgSendHandler -where - T: pallet_cosmos::Config, -{ - fn send_coins( - from_address: String, - to_address: String, - amount: Vec, - ) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let mut total_weight = Weight::zero(); - - let from_addr = address_from_bech32(&from_address).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InvalidAddress.into(), - })?; - - let to_addr = address_from_bech32(&to_address).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InvalidAddress.into(), - })?; + let from_addr = + address_from_bech32(&from_address).map_err(|_| RootError::InvalidAddress)?; + let to_addr = address_from_bech32(&to_address).map_err(|_| RootError::InvalidAddress)?; let from_account = T::AddressMapping::into_account_id(from_addr); let to_account = T::AddressMapping::into_account_id(to_addr); - total_weight = total_weight.saturating_add(T::DbWeight::get().reads(2)); + + ctx.gas_meter() + .consume_gas(T::DbWeight::get().reads(2).ref_time(), "") + .map_err(|_| RootError::OutOfGas)?; for amt in amount.iter() { - let transfer_amount = amt.amount.parse::().map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InvalidCoins.into(), - })?; + let transfer_amount = + amt.amount.parse::().map_err(|_| RootError::InvalidCoins)?; if T::NativeDenom::get() == amt.denom { T::NativeAsset::transfer( @@ -111,21 +74,18 @@ where transfer_amount.saturated_into(), ExistenceRequirement::KeepAlive, ) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InsufficientFunds.into(), - })?; - - total_weight = total_weight.saturating_add( - pallet_balances::weights::SubstrateWeight::::transfer_keep_alive(), - ); + .map_err(|_| RootError::InsufficientFunds)?; + + ctx.gas_meter() + .consume_gas( + pallet_balances::weights::SubstrateWeight::::transfer_keep_alive() + .ref_time(), + "", + ) + .map_err(|_| RootError::OutOfGas)?; } else { - let asset_id = T::AssetToDenom::convert(amt.denom.clone()).map_err(|_| { - MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InvalidCoins.into(), - } - })?; + let asset_id = T::AssetToDenom::convert(amt.denom.clone()) + .map_err(|_| RootError::InvalidCoins)?; T::Assets::transfer( asset_id, &from_account, @@ -133,13 +93,15 @@ where transfer_amount.saturated_into(), Preservation::Preserve, ) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::InsufficientFunds.into(), - })?; - total_weight = total_weight.saturating_add( - pallet_assets::weights::SubstrateWeight::::transfer_keep_alive(), - ); + .map_err(|_| RootError::InsufficientFunds)?; + + ctx.gas_meter() + .consume_gas( + pallet_assets::weights::SubstrateWeight::::transfer_keep_alive() + .ref_time(), + "", + ) + .map_err(|_| RootError::OutOfGas)?; } } @@ -155,6 +117,8 @@ where ], }; - Ok((total_weight, vec![msg_event])) + ctx.event_manager().emit_event(msg_event); + + Ok(()) } } diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 6a7bda78..60c34c12 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -28,15 +28,15 @@ use cosmos_sdk_proto::{ prost::Message, Any, }; -use frame_support::{traits::Get, weights::Weight}; +use frame_support::traits::Get; use hp_crypto::EcdsaExt; use libflate::gzip::Decoder; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ address::address_from_bech32, - errors::RootError, - events::{CosmosEvent, EventAttribute}, - msgservice::MsgHandlerErrorInfo, + errors::{CosmosError, RootError}, + events::{CosmosEvent, EventAttribute, EventManager}, + store::{self, GasMeter}, }; use pallet_cosmos_x_wasm_types::{ errors::WasmError, @@ -61,49 +61,31 @@ impl Default for MsgStoreCodeHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgStoreCodeHandler +impl pallet_cosmos_types::msgservice::MsgHandler for MsgStoreCodeHandler where T: pallet_cosmos::Config + pallet_cosmwasm::Config, + Context: store::Context, { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { // TODO: Apply actual weights - let total_weight = Weight::zero(); - let MsgStoreCode { sender, wasm_byte_code, instantiate_permission: _ } = - MsgStoreCode::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + MsgStoreCode::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; - let who = - address_from_bech32(&sender) - .map(T::AddressMapping::into_account_id) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; - - let mut decoder = Decoder::new(&wasm_byte_code[..]).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::CreateFailed.into(), - })?; + let who = address_from_bech32(&sender) + .map(T::AddressMapping::into_account_id) + .map_err(|_| RootError::TxDecodeError)?; + + let mut decoder = Decoder::new(&wasm_byte_code[..]).map_err(|_| WasmError::CreateFailed)?; let mut decoded_code = Vec::new(); - decoder.read_to_end(&mut decoded_code).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::CreateFailed.into(), - })?; - - let code: ContractCodeOf = decoded_code.try_into().map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::CreateFailed.into(), - })?; - - let (code_hash, code_id) = - pallet_cosmwasm::Pallet::::do_upload(&who, code).map_err(|_| { - MsgHandlerErrorInfo { weight: total_weight, error: WasmError::CreateFailed.into() } - })?; - - // TODO: Duplicated events emitted + decoder.read_to_end(&mut decoded_code).map_err(|_| WasmError::CreateFailed)?; + + let code: ContractCodeOf = + decoded_code.try_into().map_err(|_| WasmError::CreateFailed)?; + + let (code_hash, code_id) = pallet_cosmwasm::Pallet::::do_upload(&who, code) + .map_err(|_| WasmError::CreateFailed)?; + + // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm let msg_event = CosmosEvent { r#type: EVENT_TYPE_STORE_CODE.into(), attributes: vec![ @@ -118,7 +100,9 @@ where ], }; - Ok((total_weight, vec![msg_event])) + ctx.event_manager().emit_event(msg_event); + + Ok(()) } } @@ -130,14 +114,14 @@ impl Default for MsgInstantiateContract2Handler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgInstantiateContract2Handler +impl pallet_cosmos_types::msgservice::MsgHandler + for MsgInstantiateContract2Handler where T: pallet_cosmos::Config + pallet_cosmwasm::Config, T::AccountId: EcdsaExt, + Context: store::Context, { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let total_weight = Weight::zero(); - + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { let MsgInstantiateContract2 { sender, admin, @@ -147,77 +131,50 @@ where funds: coins, salt, fix_msg: _, - } = MsgInstantiateContract2::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; - + } = MsgInstantiateContract2::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; if sender.is_empty() { - return Err(MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::Empty.into(), - }); + return Err(WasmError::Empty.into()); } - let who = - address_from_bech32(&sender) - .map(T::AddressMapping::into_account_id) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + let who = address_from_bech32(&sender) + .map(T::AddressMapping::into_account_id) + .map_err(|_| RootError::TxDecodeError)?; - // TODO: Get gas limit from tx + let gas = ctx.gas_meter().gas_remaining(); let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( - 0, + gas, InitialStorageMutability::ReadWrite, ); let code_identifier = CodeIdentifier::CodeId(code_id); - let salt: ContractSaltOf = salt.try_into().map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + let salt: ContractSaltOf = salt.try_into().map_err(|_| RootError::TxDecodeError)?; let admin = if !admin.is_empty() { let admin = address_from_bech32(&admin) .map(T::AddressMapping::into_account_id) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + .map_err(|_| RootError::TxDecodeError)?; + Some(admin) } else { None }; - let label: ContractLabelOf = label.as_bytes().to_vec().try_into().map_err(|_| { - MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into() } - })?; + let label: ContractLabelOf = + label.as_bytes().to_vec().try_into().map_err(|_| RootError::TxDecodeError)?; let mut funds = FundsOf::::default(); for coin in coins.iter() { - let asset_id = ::AssetToDenom::convert( - coin.denom.clone(), - ) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; - let amount = u128::from_str(&coin.amount).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; - - funds.try_insert(asset_id, (amount.saturated_into(), true)).map_err(|_| { - MsgHandlerErrorInfo { weight: total_weight, error: RootError::TxDecodeError.into() } - })?; + let asset_id = + ::AssetToDenom::convert(coin.denom.clone()) + .map_err(|_| RootError::TxDecodeError)?; + let amount = u128::from_str(&coin.amount).map_err(|_| RootError::TxDecodeError)?; + + funds + .try_insert(asset_id, (amount.saturated_into(), true)) + .map_err(|_| RootError::TxDecodeError)?; } - let message: ContractMessageOf = msg.try_into().map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; let contract = pallet_cosmwasm::Pallet::::do_instantiate( &mut shared, @@ -229,19 +186,13 @@ where funds, message, ) - .map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::InstantiateFailed.into(), - })?; - let contract_address = contract.to_cosm_address().ok_or(MsgHandlerErrorInfo { - weight: total_weight, - error: WasmError::InstantiateFailed.into(), - })?; + .map_err(|_| WasmError::InstantiateFailed)?; + let contract_address = contract.to_cosm_address().ok_or(WasmError::InstantiateFailed)?; let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); let contract_address = bech32::encode::(hrp, contract_address.as_bytes()).unwrap(); - // TODO: Duplicated events emitted + // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm let msg_event = CosmosEvent { r#type: EVENT_TYPE_INSTANTIATE.into(), attributes: vec![ @@ -256,7 +207,9 @@ where ], }; - Ok((total_weight, vec![msg_event])) + ctx.event_manager().emit_event(msg_event); + + Ok(()) } } @@ -268,18 +221,15 @@ impl Default for MsgExecuteContractHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgExecuteContractHandler { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let total_weight = Weight::zero(); - +impl pallet_cosmos_types::msgservice::MsgHandler + for MsgExecuteContractHandler +{ + fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { let MsgExecuteContract { sender: _, contract: _, msg: _, funds: _ } = - MsgExecuteContract::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + MsgExecuteContract::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; // TODO: Implements execute contract with pallet_cosmwasm - Err(MsgHandlerErrorInfo { weight: total_weight, error: RootError::UnknownRequest.into() }) + Err(RootError::UnknownRequest.into()) } } @@ -291,18 +241,15 @@ impl Default for MsgMigrateContractHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgMigrateContractHandler { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let total_weight = Weight::zero(); - +impl pallet_cosmos_types::msgservice::MsgHandler + for MsgMigrateContractHandler +{ + fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { let MsgMigrateContract { sender: _, contract: _, code_id: _, msg: _ } = - MsgMigrateContract::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + MsgMigrateContract::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; // TODO: Implements migrate contract with pallet_cosmwasm - Err(MsgHandlerErrorInfo { weight: total_weight, error: RootError::UnknownRequest.into() }) + Err(RootError::UnknownRequest.into()) } } @@ -314,17 +261,12 @@ impl Default for MsgUpdateAdminHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgUpdateAdminHandler { - fn handle(&self, msg: &Any) -> Result<(Weight, Vec), MsgHandlerErrorInfo> { - let total_weight = Weight::zero(); - +impl pallet_cosmos_types::msgservice::MsgHandler for MsgUpdateAdminHandler { + fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { let MsgUpdateAdmin { sender: _, new_admin: _, contract: _ } = - MsgUpdateAdmin::decode(&mut &*msg.value).map_err(|_| MsgHandlerErrorInfo { - weight: total_weight, - error: RootError::TxDecodeError.into(), - })?; + MsgUpdateAdmin::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; // TODO: Implements update admin with pallet_cosmwasm - Err(MsgHandlerErrorInfo { weight: total_weight, error: RootError::UnknownRequest.into() }) + Err(RootError::UnknownRequest.into()) } } diff --git a/template/runtime/src/context.rs b/template/runtime/src/context.rs new file mode 100644 index 00000000..67388b66 --- /dev/null +++ b/template/runtime/src/context.rs @@ -0,0 +1,67 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use pallet_cosmos_types::{ + events::{self, CosmosEvents, EventManager as _}, + store::{self, BasicGasMeter, Gas, GasMeter}, +}; + +#[derive(Clone, Debug, Default)] +pub struct EventManager { + events: CosmosEvents, +} + +impl events::EventManager for EventManager { + fn new() -> Self { + Self::default() + } + + fn events(&self) -> CosmosEvents { + self.events.clone() + } + + fn emit_event(&mut self, event: events::CosmosEvent) { + self.events.push(event); + } + + fn emit_events(&mut self, events: CosmosEvents) { + self.events.extend(events); + } +} + +pub struct Context { + pub gas_meter: BasicGasMeter, + pub event_manager: EventManager, +} + +impl store::Context for Context { + type GasMeter = BasicGasMeter; + type EventManager = EventManager; + + fn new(limit: Gas) -> Self { + Self { gas_meter: Self::GasMeter::new(limit), event_manager: Self::EventManager::new() } + } + + fn gas_meter(&mut self) -> &mut Self::GasMeter { + &mut self.gas_meter + } + + fn event_manager(&mut self) -> &mut Self::EventManager { + &mut self.event_manager + } +} diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index a91ab533..45ab5130 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -32,6 +32,7 @@ mod accounts; mod ante; mod assets; mod compat; +mod context; mod msgs; mod sig_verifiable_tx; mod sign_mode_handler; @@ -420,6 +421,8 @@ impl pallet_cosmos::Config for Runtime { type MaxDenomLimit = MaxDenomLimit; type AddressPrefix = AddressPrefix; + + type Context = context::Context; } impl pallet_cosmos_accounts::Config for Runtime { diff --git a/template/runtime/src/msgs.rs b/template/runtime/src/msgs.rs index f04ad68e..d103bc79 100644 --- a/template/runtime/src/msgs.rs +++ b/template/runtime/src/msgs.rs @@ -27,7 +27,7 @@ use cosmos_sdk_proto::{ Any, }; use hp_crypto::EcdsaExt; -use pallet_cosmos_types::msgservice::MsgHandler; +use pallet_cosmos_types::{msgservice::MsgHandler, store}; use pallet_cosmos_x_auth_signing::any_match; use pallet_cosmos_x_bank::msgs::MsgSendHandler; use pallet_cosmos_x_wasm::msgs::{ @@ -36,12 +36,13 @@ use pallet_cosmos_x_wasm::msgs::{ }; pub struct MsgServiceRouter(PhantomData); -impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter +impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter where T: frame_system::Config + pallet_cosmos::Config + pallet_cosmwasm::Config, T::AccountId: EcdsaExt, + Context: store::Context, { - fn route(msg: &Any) -> Option> { + fn route(msg: &Any) -> Option>> { any_match!( msg, { MsgSend => Some(Box::>::default()), From fc1213d95abeb41bd82a48e15e75885c9b83c313 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 14:50:20 +0900 Subject: [PATCH 12/55] chore: Add todo to consume_gas --- frame/cosmos/types/src/store.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/cosmos/types/src/store.rs b/frame/cosmos/types/src/store.rs index b5462971..9959577e 100644 --- a/frame/cosmos/types/src/store.rs +++ b/frame/cosmos/types/src/store.rs @@ -65,6 +65,7 @@ impl GasMeter for BasicGasMeter { self.limit } + // TODO: Handle or remove descriptor fn consume_gas(&mut self, amount: Gas, _descriptor: &str) -> Result { let consumed = self.consumed.checked_add(amount).ok_or(Error::GasOverflow)?; if consumed > self.limit { From c57f094484d4bf8cedfe1105d416833e3a897a69 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 15:33:40 +0900 Subject: [PATCH 13/55] chore: Add todo to MsgInstantiateContract2 handle --- frame/cosmos/x/wasm/src/msgs.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 60c34c12..8c069e31 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -122,6 +122,7 @@ where Context: store::Context, { fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { + // TODO: Handle fix_msg let MsgInstantiateContract2 { sender, admin, From 36db10e48c33bd89c82126b7f0983737dc847271 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 16:39:41 +0900 Subject: [PATCH 14/55] feat: Implement MsgExecuteContractHandler --- frame/cosmos/x/wasm/src/msgs.rs | 118 ++++++++++++++++-------- frame/cosmos/x/wasm/types/src/errors.rs | 1 + frame/cosmos/x/wasm/types/src/events.rs | 1 + frame/cosmwasm/src/lib.rs | 2 +- 4 files changed, 80 insertions(+), 42 deletions(-) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 8c069e31..8e912bc3 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -21,6 +21,7 @@ use bech32::{Bech32, Hrp}; use core::{marker::PhantomData, str::FromStr}; use core2::io::Read; use cosmos_sdk_proto::{ + cosmos::base::v1beta1::Coin, cosmwasm::wasm::v1::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, MsgUpdateAdmin, @@ -36,13 +37,14 @@ use pallet_cosmos_types::{ address::address_from_bech32, errors::{CosmosError, RootError}, events::{CosmosEvent, EventAttribute, EventManager}, + msgservice::MsgHandler, store::{self, GasMeter}, }; use pallet_cosmos_x_wasm_types::{ errors::WasmError, events::{ ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, ATTRIBUTE_KEY_CONTRACT_ADDR, - EVENT_TYPE_INSTANTIATE, EVENT_TYPE_STORE_CODE, + EVENT_TYPE_EXECUTE, EVENT_TYPE_INSTANTIATE, EVENT_TYPE_STORE_CODE, }, }; use pallet_cosmwasm::{ @@ -61,7 +63,7 @@ impl Default for MsgStoreCodeHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgStoreCodeHandler +impl MsgHandler for MsgStoreCodeHandler where T: pallet_cosmos::Config + pallet_cosmwasm::Config, Context: store::Context, @@ -114,29 +116,22 @@ impl Default for MsgInstantiateContract2Handler { } } -impl pallet_cosmos_types::msgservice::MsgHandler - for MsgInstantiateContract2Handler +impl MsgHandler for MsgInstantiateContract2Handler where T: pallet_cosmos::Config + pallet_cosmwasm::Config, T::AccountId: EcdsaExt, Context: store::Context, { + // TODO: Consume gas fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { - // TODO: Handle fix_msg - let MsgInstantiateContract2 { - sender, - admin, - code_id, - label, - msg, - funds: coins, - salt, - fix_msg: _, - } = MsgInstantiateContract2::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; + // TODO: Ignore fix_msg + let MsgInstantiateContract2 { sender, admin, code_id, label, msg, funds, salt, fix_msg: _ } = + MsgInstantiateContract2::decode(&mut &*msg.value) + .map_err(|_| RootError::TxDecodeError)?; + if sender.is_empty() { return Err(WasmError::Empty.into()); } - let who = address_from_bech32(&sender) .map(T::AddressMapping::into_account_id) .map_err(|_| RootError::TxDecodeError)?; @@ -148,8 +143,6 @@ where ); let code_identifier = CodeIdentifier::CodeId(code_id); - let salt: ContractSaltOf = salt.try_into().map_err(|_| RootError::TxDecodeError)?; - let admin = if !admin.is_empty() { let admin = address_from_bech32(&admin) .map(T::AddressMapping::into_account_id) @@ -160,21 +153,10 @@ where None }; + let salt: ContractSaltOf = salt.try_into().map_err(|_| RootError::TxDecodeError)?; let label: ContractLabelOf = label.as_bytes().to_vec().try_into().map_err(|_| RootError::TxDecodeError)?; - - let mut funds = FundsOf::::default(); - for coin in coins.iter() { - let asset_id = - ::AssetToDenom::convert(coin.denom.clone()) - .map_err(|_| RootError::TxDecodeError)?; - let amount = u128::from_str(&coin.amount).map_err(|_| RootError::TxDecodeError)?; - - funds - .try_insert(asset_id, (amount.saturated_into(), true)) - .map_err(|_| RootError::TxDecodeError)?; - } - + let funds = convert_funds::(&funds)?; let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; let contract = pallet_cosmwasm::Pallet::::do_instantiate( @@ -222,15 +204,56 @@ impl Default for MsgExecuteContractHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler - for MsgExecuteContractHandler +impl MsgHandler for MsgExecuteContractHandler +where + T: pallet_cosmos::Config + pallet_cosmwasm::Config, + T::AccountId: EcdsaExt, + Context: store::Context, { - fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { - let MsgExecuteContract { sender: _, contract: _, msg: _, funds: _ } = + // TODO: Consume gas + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { + let MsgExecuteContract { sender, contract, msg, funds } = MsgExecuteContract::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; - // TODO: Implements execute contract with pallet_cosmwasm - Err(RootError::UnknownRequest.into()) + if sender.is_empty() { + return Err(WasmError::Empty.into()); + } + let who = address_from_bech32(&sender) + .map(T::AddressMapping::into_account_id) + .map_err(|_| RootError::TxDecodeError)?; + + let gas = ctx.gas_meter().gas_remaining(); + let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( + gas, + InitialStorageMutability::ReadWrite, + ); + + let contract_address = address_from_bech32(&contract) + .map(T::AddressMapping::into_account_id) + .map_err(|_| RootError::TxDecodeError)?; + + let funds: FundsOf = convert_funds::(&funds)?; + let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; + + pallet_cosmwasm::Pallet::::do_execute( + &mut shared, + who, + contract_address, + funds, + message, + ) + .map_err(|_| WasmError::ExecuteFailed)?; + + // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm + let msg_event = CosmosEvent { + r#type: EVENT_TYPE_EXECUTE.into(), + attributes: vec![EventAttribute { + key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), + value: contract.into(), + }], + }; + + Ok(()) } } @@ -242,9 +265,7 @@ impl Default for MsgMigrateContractHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler - for MsgMigrateContractHandler -{ +impl MsgHandler for MsgMigrateContractHandler { fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { let MsgMigrateContract { sender: _, contract: _, code_id: _, msg: _ } = MsgMigrateContract::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; @@ -262,7 +283,7 @@ impl Default for MsgUpdateAdminHandler { } } -impl pallet_cosmos_types::msgservice::MsgHandler for MsgUpdateAdminHandler { +impl MsgHandler for MsgUpdateAdminHandler { fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { let MsgUpdateAdmin { sender: _, new_admin: _, contract: _ } = MsgUpdateAdmin::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; @@ -271,3 +292,18 @@ impl pallet_cosmos_types::msgservice::MsgHandler for MsgUpd Err(RootError::UnknownRequest.into()) } } + +fn convert_funds(coins: &[Coin]) -> Result, CosmosError> { + let mut funds = FundsOf::::default(); + for coin in coins.iter() { + let asset_id = + T::AssetToDenom::convert(coin.denom.clone()).map_err(|_| RootError::TxDecodeError)?; + let amount = u128::from_str(&coin.amount).map_err(|_| RootError::TxDecodeError)?; + + funds + .try_insert(asset_id, (amount.saturated_into(), true)) + .map_err(|_| RootError::TxDecodeError)?; + } + + Ok(funds) +} diff --git a/frame/cosmos/x/wasm/types/src/errors.rs b/frame/cosmos/x/wasm/types/src/errors.rs index 738c6a9c..75138443 100644 --- a/frame/cosmos/x/wasm/types/src/errors.rs +++ b/frame/cosmos/x/wasm/types/src/errors.rs @@ -40,6 +40,7 @@ pub const WASM_CODESPACE: u8 = 1; pub enum WasmError { CreateFailed = 2, InstantiateFailed = 4, + ExecuteFailed = 5, Empty = 12, } diff --git a/frame/cosmos/x/wasm/types/src/events.rs b/frame/cosmos/x/wasm/types/src/events.rs index ac754307..ecebe211 100644 --- a/frame/cosmos/x/wasm/types/src/events.rs +++ b/frame/cosmos/x/wasm/types/src/events.rs @@ -17,6 +17,7 @@ pub const EVENT_TYPE_STORE_CODE: &str = "store_code"; pub const EVENT_TYPE_INSTANTIATE: &str = "instantiate"; +pub const EVENT_TYPE_EXECUTE: &str = "execute"; pub const ATTRIBUTE_KEY_CONTRACT_ADDR: &str = "_contract_address"; pub const ATTRIBUTE_KEY_CODE_ID: &str = "code_id"; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index 366911ae..ffd5f507 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -982,7 +982,7 @@ impl Pallet { .top_level_call(shared, funds, message) } - fn do_execute( + pub fn do_execute( shared: &mut CosmwasmVMShared, who: AccountIdOf, contract: AccountIdOf, From 9540a438b3fc688650b591723f11455c30f77593 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 17:39:05 +0900 Subject: [PATCH 15/55] fix: Add emit events to MsgExecuteContractHandler handle --- frame/cosmos/x/wasm/src/msgs.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 8e912bc3..24573100 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -253,6 +253,8 @@ where }], }; + ctx.event_manager().emit_event(msg_event); + Ok(()) } } From 413bfe22faed19a2900891c45a48b84be40ac742 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 18:21:22 +0900 Subject: [PATCH 16/55] refactor: Refactor address_from_bech32 --- frame/cosmos/types/src/address.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frame/cosmos/types/src/address.rs b/frame/cosmos/types/src/address.rs index fdd5a728..ea45bb5d 100644 --- a/frame/cosmos/types/src/address.rs +++ b/frame/cosmos/types/src/address.rs @@ -23,7 +23,7 @@ pub enum AddressError { } pub fn address_from_bech32(address: &str) -> Result { - let (_prefix, data) = bech32::decode(address).map_err(AddressError::Bech32Error)?; - - Ok(H160::from_slice(&data)) + bech32::decode(address) + .map(|(_hrp, data)| H160::from_slice(&data)) + .map_err(AddressError::Bech32Error) } From b1e27bacfa700437d3c85d574dca3ca7be8cfd55 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 18:54:18 +0900 Subject: [PATCH 17/55] refactor: Add from_bech32 to AddressMapping --- frame/accounts/src/lib.rs | 2 +- frame/cosmos/src/lib.rs | 5 +++-- frame/cosmos/x/auth/src/fee.rs | 8 +++---- frame/cosmos/x/auth/src/sigverify.rs | 6 ++---- frame/cosmos/x/bank/src/msgs.rs | 11 ++++------ frame/cosmos/x/wasm/src/msgs.rs | 31 +++++++--------------------- primitives/account/src/lib.rs | 2 +- primitives/crypto/src/ecdsa.rs | 2 +- template/runtime/src/accounts.rs | 15 +++++--------- template/runtime/src/compat/cosm.rs | 7 ++++++- template/runtime/src/lib.rs | 18 +++++++--------- 11 files changed, 41 insertions(+), 66 deletions(-) diff --git a/frame/accounts/src/lib.rs b/frame/accounts/src/lib.rs index 4705cc8c..2d238eab 100644 --- a/frame/accounts/src/lib.rs +++ b/frame/accounts/src/lib.rs @@ -106,7 +106,7 @@ pub mod pallet { T::AccountId: EcdsaExt, { pub fn connect_account(who: &T::AccountId) -> Result<(), DispatchError> { - let address = who.to_cosm_address().ok_or(Error::::DeriveFailed)?; + let address = who.to_cosmos_address().ok_or(Error::::DeriveFailed)?; Connections::::insert(address, who); Self::deposit_event(Event::::Connected { address, who: who.clone() }); Ok(()) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 26e9ba98..62bef53a 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -142,7 +142,8 @@ where } pub trait AddressMapping { - fn into_account_id(address: H160) -> A; + fn from_address_raw(address: H160) -> A; + fn from_bech32(address: &str) -> Option; } #[frame_support::pallet] @@ -523,7 +524,7 @@ impl Pallet { /// Get the base account info. pub fn account(address: &H160) -> (Account, Weight) { - let account_id = T::AddressMapping::into_account_id(*address); + let account_id = T::AddressMapping::from_address_raw(*address); let nonce = frame_system::Pallet::::account_nonce(&account_id); // keepalive `true` takes into account ExistentialDeposit as part of what's considered diff --git a/frame/cosmos/x/auth/src/fee.rs b/frame/cosmos/x/auth/src/fee.rs index f629386c..ee786edf 100644 --- a/frame/cosmos/x/auth/src/fee.rs +++ b/frame/cosmos/x/auth/src/fee.rs @@ -29,7 +29,6 @@ use frame_support::{ }; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ - address::address_from_bech32, coin::amount_to_string, events::{ CosmosEvent, EventAttribute, ATTRIBUTE_KEY_FEE, ATTRIBUTE_KEY_FEE_PAYER, EVENT_TYPE_TX, @@ -91,13 +90,12 @@ where return Err(TransactionValidityError::Invalid(InvalidTransaction::Call)); } - let deduct_fees_from = address_from_bech32(&fee_payer) - .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Call))?; - let deduct_fees_from_acc = T::AddressMapping::into_account_id(deduct_fees_from); + let deduct_fees_from = T::AddressMapping::from_bech32(&fee_payer) + .ok_or(TransactionValidityError::Invalid(InvalidTransaction::Call))?; // TODO: Check fee is zero if !fee.amount.is_empty() { - Self::deduct_fees(&deduct_fees_from_acc, fee)?; + Self::deduct_fees(&deduct_fees_from, fee)?; } pallet_cosmos::Pallet::::deposit_event(pallet_cosmos::Event::AnteHandled(vec![ diff --git a/frame/cosmos/x/auth/src/sigverify.rs b/frame/cosmos/x/auth/src/sigverify.rs index 211ec64b..3d702057 100644 --- a/frame/cosmos/x/auth/src/sigverify.rs +++ b/frame/cosmos/x/auth/src/sigverify.rs @@ -201,10 +201,8 @@ where let signers = T::SigVerifiableTx::get_signers(tx) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; for signer in signers.iter() { - let signer_addr = address_from_bech32(signer) - .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; - let account = T::AddressMapping::into_account_id(signer_addr); - + let account = T::AddressMapping::from_bech32(signer) + .ok_or(TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; frame_system::pallet::Pallet::::inc_account_nonce(account); } diff --git a/frame/cosmos/x/bank/src/msgs.rs b/frame/cosmos/x/bank/src/msgs.rs index 7a0f4686..e06761ec 100644 --- a/frame/cosmos/x/bank/src/msgs.rs +++ b/frame/cosmos/x/bank/src/msgs.rs @@ -26,7 +26,6 @@ use pallet_assets::WeightInfo as _; use pallet_balances::WeightInfo as _; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ - address::address_from_bech32, coin::amount_to_string, errors::{CosmosError, RootError}, events::{EventAttribute, EventManager, ATTRIBUTE_KEY_AMOUNT, ATTRIBUTE_KEY_SENDER}, @@ -52,12 +51,10 @@ where let MsgSend { from_address, to_address, amount } = MsgSend::decode(&mut &*msg.value).map_err(|_| RootError::UnpackAnyError)?; - let from_addr = - address_from_bech32(&from_address).map_err(|_| RootError::InvalidAddress)?; - let to_addr = address_from_bech32(&to_address).map_err(|_| RootError::InvalidAddress)?; - - let from_account = T::AddressMapping::into_account_id(from_addr); - let to_account = T::AddressMapping::into_account_id(to_addr); + let from_account = + T::AddressMapping::from_bech32(&from_address).ok_or(RootError::InvalidAddress)?; + let to_account = + T::AddressMapping::from_bech32(&to_address).ok_or(RootError::InvalidAddress)?; ctx.gas_meter() .consume_gas(T::DbWeight::get().reads(2).ref_time(), "") diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 24573100..88b7688a 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -34,7 +34,6 @@ use hp_crypto::EcdsaExt; use libflate::gzip::Decoder; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{ - address::address_from_bech32, errors::{CosmosError, RootError}, events::{CosmosEvent, EventAttribute, EventManager}, msgservice::MsgHandler, @@ -73,10 +72,7 @@ where let MsgStoreCode { sender, wasm_byte_code, instantiate_permission: _ } = MsgStoreCode::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; - let who = address_from_bech32(&sender) - .map(T::AddressMapping::into_account_id) - .map_err(|_| RootError::TxDecodeError)?; - + let who = T::AddressMapping::from_bech32(&sender).ok_or(RootError::TxDecodeError)?; let mut decoder = Decoder::new(&wasm_byte_code[..]).map_err(|_| WasmError::CreateFailed)?; let mut decoded_code = Vec::new(); decoder.read_to_end(&mut decoded_code).map_err(|_| WasmError::CreateFailed)?; @@ -132,10 +128,7 @@ where if sender.is_empty() { return Err(WasmError::Empty.into()); } - let who = address_from_bech32(&sender) - .map(T::AddressMapping::into_account_id) - .map_err(|_| RootError::TxDecodeError)?; - + let who = T::AddressMapping::from_bech32(&sender).ok_or(RootError::TxDecodeError)?; let gas = ctx.gas_meter().gas_remaining(); let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( gas, @@ -144,10 +137,7 @@ where let code_identifier = CodeIdentifier::CodeId(code_id); let admin = if !admin.is_empty() { - let admin = address_from_bech32(&admin) - .map(T::AddressMapping::into_account_id) - .map_err(|_| RootError::TxDecodeError)?; - + let admin = T::AddressMapping::from_bech32(&admin).ok_or(RootError::TxDecodeError)?; Some(admin) } else { None @@ -170,7 +160,7 @@ where message, ) .map_err(|_| WasmError::InstantiateFailed)?; - let contract_address = contract.to_cosm_address().ok_or(WasmError::InstantiateFailed)?; + let contract_address = contract.to_cosmos_address().ok_or(WasmError::InstantiateFailed)?; let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); let contract_address = bech32::encode::(hrp, contract_address.as_bytes()).unwrap(); @@ -218,27 +208,22 @@ where if sender.is_empty() { return Err(WasmError::Empty.into()); } - let who = address_from_bech32(&sender) - .map(T::AddressMapping::into_account_id) - .map_err(|_| RootError::TxDecodeError)?; - + let who = T::AddressMapping::from_bech32(&sender).ok_or(RootError::TxDecodeError)?; let gas = ctx.gas_meter().gas_remaining(); let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( gas, InitialStorageMutability::ReadWrite, ); - let contract_address = address_from_bech32(&contract) - .map(T::AddressMapping::into_account_id) - .map_err(|_| RootError::TxDecodeError)?; - + let contract_account = + T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; let funds: FundsOf = convert_funds::(&funds)?; let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; pallet_cosmwasm::Pallet::::do_execute( &mut shared, who, - contract_address, + contract_account, funds, message, ) diff --git a/primitives/account/src/lib.rs b/primitives/account/src/lib.rs index ed56bfba..b68ce716 100644 --- a/primitives/account/src/lib.rs +++ b/primitives/account/src/lib.rs @@ -78,7 +78,7 @@ impl core::fmt::Debug for CosmosSigner { } impl EcdsaExt for CosmosSigner { - fn to_cosm_address(&self) -> Option { + fn to_cosmos_address(&self) -> Option { let mut hasher = ripemd::Ripemd160::new(); hasher.update(sha2_256(&self.0 .0)); let address = H160::from_slice(&hasher.finalize()); diff --git a/primitives/crypto/src/ecdsa.rs b/primitives/crypto/src/ecdsa.rs index a157bf00..0404e12a 100644 --- a/primitives/crypto/src/ecdsa.rs +++ b/primitives/crypto/src/ecdsa.rs @@ -22,5 +22,5 @@ use sp_core::H160; /// Extension trait to sp_core::ecdsa (alternative to frame_support::crypto::ECDSAExt) pub trait EcdsaExt { /// Convert to cosmos address, if available. - fn to_cosm_address(&self) -> Option; + fn to_cosmos_address(&self) -> Option; } diff --git a/template/runtime/src/accounts.rs b/template/runtime/src/accounts.rs index 6f4918d8..63ac76e1 100644 --- a/template/runtime/src/accounts.rs +++ b/template/runtime/src/accounts.rs @@ -21,7 +21,6 @@ use bech32::{Bech32, Hrp}; use core::str; use hp_crypto::EcdsaExt; use pallet_cosmos::AddressMapping; -use pallet_cosmos_types::address::address_from_bech32; use sp_core::Get; use sp_runtime::traits::Convert; @@ -35,7 +34,7 @@ where fn convert(account: T::AccountId) -> String { // TODO: Handle errors let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); - let address = account.to_cosm_address().unwrap(); + let address = account.to_cosmos_address().unwrap(); bech32::encode::(hrp, address.as_bytes()).unwrap() } @@ -46,9 +45,7 @@ where T: pallet_cosmos::Config, { fn convert(address: String) -> Result { - let address = address_from_bech32(&address).map_err(|_| ())?; - - Ok(T::AddressMapping::into_account_id(address)) + T::AddressMapping::from_bech32(&address).ok_or(()) } } @@ -57,11 +54,9 @@ where T: pallet_cosmos::Config, { fn convert(address_raw: Vec) -> Result { - let address = str::from_utf8(&address_raw) - .map(address_from_bech32) + str::from_utf8(&address_raw) + .map(T::AddressMapping::from_bech32) .map_err(|_| ())? - .map_err(|_| ())?; - - Ok(T::AddressMapping::into_account_id(address)) + .ok_or(()) } } diff --git a/template/runtime/src/compat/cosm.rs b/template/runtime/src/compat/cosm.rs index 72cfe55c..14c4a37d 100644 --- a/template/runtime/src/compat/cosm.rs +++ b/template/runtime/src/compat/cosm.rs @@ -22,6 +22,7 @@ use core::marker::PhantomData; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::AddressMapping; +use pallet_cosmos_types::address::address_from_bech32; use sp_core::{ecdsa, Hasher, H160, H256}; /// Hashed address mapping. @@ -33,7 +34,7 @@ where T::AccountId: From + EcdsaExt, H: Hasher, { - fn into_account_id(address: H160) -> T::AccountId { + fn from_address_raw(address: H160) -> T::AccountId { if let Some(x) = pallet_cosmos_accounts::Connections::::get(address) { return x; } @@ -47,4 +48,8 @@ where CosmosSigner(ecdsa::Public(interim)).into() } + + fn from_bech32(address: &str) -> Option { + address_from_bech32(address).map(Self::from_address_raw).ok() + } } diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 45ab5130..45def626 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -562,7 +562,7 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { match self { RuntimeCall::Cosmos(call) => match call.check_self_contained()? { Ok(address) => Some(Ok( - ::AddressMapping::into_account_id(address), + ::AddressMapping::from_address_raw(address), )), Err(e) => Some(Err(e)), }, @@ -586,7 +586,7 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { } } - call.validate_self_contained(&info.to_cosm_address().unwrap(), dispatch_info, len) + call.validate_self_contained(&info.to_cosmos_address().unwrap(), dispatch_info, len) }, _ => None, } @@ -609,7 +609,7 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { } call.pre_dispatch_self_contained( - &info.to_cosm_address().unwrap(), + &info.to_cosmos_address().unwrap(), dispatch_info, len, ) @@ -625,7 +625,7 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { match self { call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => Some(call.dispatch(RuntimeOrigin::from( - pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosm_address().unwrap()), + pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosmos_address().unwrap()), ))), _ => None, } @@ -636,7 +636,6 @@ impl Runtime { fn migrate_cosm_account(tx_bytes: &[u8]) -> Result<(), TransactionValidityError> { use cosmos_sdk_proto::cosmos::crypto::secp256k1; use fungible::{Inspect, Mutate}; - use pallet_cosmos_types::address::address_from_bech32; use pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx; let tx = Tx::decode(&mut &*tx_bytes) @@ -654,14 +653,11 @@ impl Runtime { let signer = signers .get(i) .ok_or(TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; - let signer_addr = address_from_bech32(signer).map_err(|_| { - TransactionValidityError::Invalid(InvalidTransaction::BadSigner) - })?; let interim_account = - ::AddressMapping::into_account_id( - signer_addr, - ); + ::AddressMapping::from_bech32(signer) + .ok_or(TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; + let public_key = signer_info .public_key .as_ref() From e7b7864aea6b70843603c47526686a136a7e566f Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 30 Aug 2024 23:08:29 +0900 Subject: [PATCH 18/55] feat: Implement MsgMigrateContractHandler --- frame/cosmos/x/wasm/src/msgs.rs | 53 ++++++++++++++++++++++--- frame/cosmos/x/wasm/types/src/errors.rs | 1 + frame/cosmos/x/wasm/types/src/events.rs | 1 + frame/cosmwasm/src/lib.rs | 2 +- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 88b7688a..a741921e 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -43,7 +43,7 @@ use pallet_cosmos_x_wasm_types::{ errors::WasmError, events::{ ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, ATTRIBUTE_KEY_CONTRACT_ADDR, - EVENT_TYPE_EXECUTE, EVENT_TYPE_INSTANTIATE, EVENT_TYPE_STORE_CODE, + EVENT_TYPE_EXECUTE, EVENT_TYPE_INSTANTIATE, EVENT_TYPE_MIGRATE, EVENT_TYPE_STORE_CODE, }, }; use pallet_cosmwasm::{ @@ -252,13 +252,54 @@ impl Default for MsgMigrateContractHandler { } } -impl MsgHandler for MsgMigrateContractHandler { - fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { - let MsgMigrateContract { sender: _, contract: _, code_id: _, msg: _ } = +impl MsgHandler for MsgMigrateContractHandler +where + T: pallet_cosmos::Config + pallet_cosmwasm::Config, + Context: store::Context, +{ + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { + let MsgMigrateContract { sender, contract, code_id, msg } = MsgMigrateContract::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; - // TODO: Implements migrate contract with pallet_cosmwasm - Err(RootError::UnknownRequest.into()) + if sender.is_empty() { + return Err(WasmError::Empty.into()); + } + let who = T::AddressMapping::from_bech32(&sender).ok_or(RootError::TxDecodeError)?; + let gas = ctx.gas_meter().gas_remaining(); + let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( + gas, + InitialStorageMutability::ReadWrite, + ); + + let contract_account = + T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; + let new_code_identifier = CodeIdentifier::CodeId(code_id); + let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; + + pallet_cosmwasm::Pallet::::do_migrate( + &mut shared, + who, + contract_account, + new_code_identifier, + message, + ) + .map_err(|_| WasmError::MigrationFailed)?; + + // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm + let msg_event = CosmosEvent { + r#type: EVENT_TYPE_MIGRATE.into(), + attributes: vec![ + EventAttribute { + key: ATTRIBUTE_KEY_CODE_ID.into(), + value: code_id.to_string().into(), + }, + EventAttribute { key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), value: contract.into() }, + ], + }; + + ctx.event_manager().emit_event(msg_event); + + Ok(()) } } diff --git a/frame/cosmos/x/wasm/types/src/errors.rs b/frame/cosmos/x/wasm/types/src/errors.rs index 75138443..096accda 100644 --- a/frame/cosmos/x/wasm/types/src/errors.rs +++ b/frame/cosmos/x/wasm/types/src/errors.rs @@ -41,6 +41,7 @@ pub enum WasmError { CreateFailed = 2, InstantiateFailed = 4, ExecuteFailed = 5, + MigrationFailed = 11, Empty = 12, } diff --git a/frame/cosmos/x/wasm/types/src/events.rs b/frame/cosmos/x/wasm/types/src/events.rs index ecebe211..60a46c13 100644 --- a/frame/cosmos/x/wasm/types/src/events.rs +++ b/frame/cosmos/x/wasm/types/src/events.rs @@ -18,6 +18,7 @@ pub const EVENT_TYPE_STORE_CODE: &str = "store_code"; pub const EVENT_TYPE_INSTANTIATE: &str = "instantiate"; pub const EVENT_TYPE_EXECUTE: &str = "execute"; +pub const EVENT_TYPE_MIGRATE: &str = "migrate"; pub const ATTRIBUTE_KEY_CONTRACT_ADDR: &str = "_contract_address"; pub const ATTRIBUTE_KEY_CODE_ID: &str = "code_id"; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index ffd5f507..6286f6a5 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -992,7 +992,7 @@ impl Pallet { setup_execute_call(who, contract)?.top_level_call(shared, funds, message) } - fn do_migrate( + pub fn do_migrate( shared: &mut CosmwasmVMShared, who: AccountIdOf, contract: AccountIdOf, From 7a669661487f545a8533730c67ec7db3fffe1695 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sat, 31 Aug 2024 00:57:53 +0900 Subject: [PATCH 19/55] feat: Implement MsgUpdateAdminHandler --- frame/cosmos/x/wasm/src/msgs.rs | 56 ++++++++++++++++++++++--- frame/cosmos/x/wasm/types/src/events.rs | 2 + frame/cosmwasm/src/lib.rs | 2 +- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index a741921e..13559a4d 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -43,7 +43,8 @@ use pallet_cosmos_x_wasm_types::{ errors::WasmError, events::{ ATTRIBUTE_KEY_CHECKSUM, ATTRIBUTE_KEY_CODE_ID, ATTRIBUTE_KEY_CONTRACT_ADDR, - EVENT_TYPE_EXECUTE, EVENT_TYPE_INSTANTIATE, EVENT_TYPE_MIGRATE, EVENT_TYPE_STORE_CODE, + ATTRIBUTE_KEY_NEW_ADMIN, EVENT_TYPE_EXECUTE, EVENT_TYPE_INSTANTIATE, EVENT_TYPE_MIGRATE, + EVENT_TYPE_STORE_CODE, EVENT_TYPE_UPDATE_CONTRACT_ADMIN, }, }; use pallet_cosmwasm::{ @@ -311,13 +312,56 @@ impl Default for MsgUpdateAdminHandler { } } -impl MsgHandler for MsgUpdateAdminHandler { - fn handle(&self, msg: &Any, _ctx: &mut Context) -> Result<(), CosmosError> { - let MsgUpdateAdmin { sender: _, new_admin: _, contract: _ } = +impl MsgHandler for MsgUpdateAdminHandler +where + T: pallet_cosmos::Config + pallet_cosmwasm::Config, + Context: store::Context, +{ + fn handle(&self, msg: &Any, ctx: &mut Context) -> Result<(), CosmosError> { + let MsgUpdateAdmin { sender, new_admin, contract } = MsgUpdateAdmin::decode(&mut &*msg.value).map_err(|_| RootError::TxDecodeError)?; - // TODO: Implements update admin with pallet_cosmwasm - Err(RootError::UnknownRequest.into()) + if sender.is_empty() { + return Err(WasmError::Empty.into()); + } + let who = T::AddressMapping::from_bech32(&sender).ok_or(RootError::TxDecodeError)?; + let gas = ctx.gas_meter().gas_remaining(); + let mut shared = pallet_cosmwasm::Pallet::::do_create_vm_shared( + gas, + InitialStorageMutability::ReadWrite, + ); + + let new_admin_account = if !new_admin.is_empty() { + let new_admin_account = + T::AddressMapping::from_bech32(&new_admin).ok_or(RootError::TxDecodeError)?; + Some(new_admin_account) + } else { + None + }; + + let contract_account = + T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; + + pallet_cosmwasm::Pallet::::do_update_admin( + &mut shared, + who, + contract_account, + new_admin_account, + ) + .map_err(|_| WasmError::MigrationFailed)?; + + // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm + let msg_event = CosmosEvent { + r#type: EVENT_TYPE_UPDATE_CONTRACT_ADMIN.into(), + attributes: vec![ + EventAttribute { key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), value: contract.into() }, + EventAttribute { key: ATTRIBUTE_KEY_NEW_ADMIN.into(), value: new_admin.into() }, + ], + }; + + ctx.event_manager().emit_event(msg_event); + + Ok(()) } } diff --git a/frame/cosmos/x/wasm/types/src/events.rs b/frame/cosmos/x/wasm/types/src/events.rs index 60a46c13..66b49c2b 100644 --- a/frame/cosmos/x/wasm/types/src/events.rs +++ b/frame/cosmos/x/wasm/types/src/events.rs @@ -19,7 +19,9 @@ pub const EVENT_TYPE_STORE_CODE: &str = "store_code"; pub const EVENT_TYPE_INSTANTIATE: &str = "instantiate"; pub const EVENT_TYPE_EXECUTE: &str = "execute"; pub const EVENT_TYPE_MIGRATE: &str = "migrate"; +pub const EVENT_TYPE_UPDATE_CONTRACT_ADMIN: &str = "update_contract_admin"; pub const ATTRIBUTE_KEY_CONTRACT_ADDR: &str = "_contract_address"; pub const ATTRIBUTE_KEY_CODE_ID: &str = "code_id"; pub const ATTRIBUTE_KEY_CHECKSUM: &str = "code_checksum"; +pub const ATTRIBUTE_KEY_NEW_ADMIN: &str = "new_admin_address"; diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index 6286f6a5..a62f5a2f 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -1012,7 +1012,7 @@ impl Pallet { ) } - fn do_update_admin( + pub fn do_update_admin( shared: &mut CosmwasmVMShared, who: AccountIdOf, contract: AccountIdOf, From 24f0d1f587e68c57748dddbb6780e111bb07fd69 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sat, 31 Aug 2024 13:31:17 +0900 Subject: [PATCH 20/55] fix: Fix conversion to contract account in wasm message handlers --- frame/cosmos/x/wasm/src/msgs.rs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 13559a4d..32791934 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -17,7 +17,6 @@ // along with this program. If not, see . use alloc::{string::ToString, vec, vec::Vec}; -use bech32::{Bech32, Hrp}; use core::{marker::PhantomData, str::FromStr}; use core2::io::Read; use cosmos_sdk_proto::{ @@ -29,7 +28,6 @@ use cosmos_sdk_proto::{ prost::Message, Any, }; -use frame_support::traits::Get; use hp_crypto::EcdsaExt; use libflate::gzip::Decoder; use pallet_cosmos::AddressMapping; @@ -161,19 +159,13 @@ where message, ) .map_err(|_| WasmError::InstantiateFailed)?; - let contract_address = contract.to_cosmos_address().ok_or(WasmError::InstantiateFailed)?; - - let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); - let contract_address = bech32::encode::(hrp, contract_address.as_bytes()).unwrap(); + let contract = T::AccountToAddr::convert(contract); // TODO: Same events emitted pallet_cosmos and pallet_cosmwasm let msg_event = CosmosEvent { r#type: EVENT_TYPE_INSTANTIATE.into(), attributes: vec![ - EventAttribute { - key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), - value: contract_address.into(), - }, + EventAttribute { key: ATTRIBUTE_KEY_CONTRACT_ADDR.into(), value: contract.into() }, EventAttribute { key: ATTRIBUTE_KEY_CODE_ID.into(), value: code_id.to_string().into(), @@ -217,7 +209,7 @@ where ); let contract_account = - T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; + T::AccountToAddr::convert(contract.clone()).map_err(|_| RootError::TxDecodeError)?; let funds: FundsOf = convert_funds::(&funds)?; let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; @@ -273,7 +265,7 @@ where ); let contract_account = - T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; + T::AccountToAddr::convert(contract.clone()).map_err(|_| RootError::TxDecodeError)?; let new_code_identifier = CodeIdentifier::CodeId(code_id); let message: ContractMessageOf = msg.try_into().map_err(|_| RootError::TxDecodeError)?; @@ -340,7 +332,7 @@ where }; let contract_account = - T::AddressMapping::from_bech32(&contract).ok_or(RootError::TxDecodeError)?; + T::AccountToAddr::convert(contract.clone()).map_err(|_| RootError::TxDecodeError)?; pallet_cosmwasm::Pallet::::do_update_admin( &mut shared, From cd034ffb4cbf52292b26ccbb63de652842c7ee78 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 1 Sep 2024 11:55:25 +0900 Subject: [PATCH 21/55] fix: Convert admin account with pallet_cosmwasm::AccountToAddr --- frame/cosmos/x/wasm/src/msgs.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 32791934..693d591a 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -135,9 +135,10 @@ where ); let code_identifier = CodeIdentifier::CodeId(code_id); - let admin = if !admin.is_empty() { - let admin = T::AddressMapping::from_bech32(&admin).ok_or(RootError::TxDecodeError)?; - Some(admin) + let admin_account = if !admin.is_empty() { + let admin_account = + T::AccountToAddr::convert(admin).map_err(|_| RootError::InvalidAddress)?; + Some(admin_account) } else { None }; @@ -153,7 +154,7 @@ where who, code_identifier, salt, - admin, + admin_account, label, funds, message, @@ -324,8 +325,8 @@ where ); let new_admin_account = if !new_admin.is_empty() { - let new_admin_account = - T::AddressMapping::from_bech32(&new_admin).ok_or(RootError::TxDecodeError)?; + let new_admin_account = T::AccountToAddr::convert(new_admin.clone()) + .map_err(|_| RootError::InvalidAddress)?; Some(new_admin_account) } else { None From edfb0b6ad1c3e35b7372dedb6b94cd3d64588838 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 1 Sep 2024 15:43:30 +0900 Subject: [PATCH 22/55] feat: Add cosmwasm rpc and runtime-api packages --- Cargo.toml | 6 +- frame/cosmwasm/rpc/Cargo.toml | 32 ++++++++++ frame/cosmwasm/rpc/src/lib.rs | 86 +++++++++++++++++++++++++++ frame/cosmwasm/runtime-api/Cargo.toml | 20 +++++++ frame/cosmwasm/runtime-api/src/lib.rs | 25 ++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 frame/cosmwasm/rpc/Cargo.toml create mode 100644 frame/cosmwasm/rpc/src/lib.rs create mode 100644 frame/cosmwasm/runtime-api/Cargo.toml create mode 100644 frame/cosmwasm/runtime-api/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 046eb106..1a7b815a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,8 @@ members = [ "frame/accounts", "frame/cosmos", "frame/cosmwasm", + "frame/cosmwasm/rpc", + "frame/cosmwasm/runtime-api", "frame/cosmos/types", "frame/cosmos/x/auth", "frame/cosmos/x/auth/migrations", @@ -140,12 +142,14 @@ wasmi = { version = "0.30.0", default-features = false } wasmi-validation = { version = "0.5.0", default-features = false } # Composable -pallet-cosmwasm = { path = "frame/cosmwasm", default-features = false } ibc-primitives = { path = "composable/primitives", default-features = false } +pallet-cosmwasm = { path = "frame/cosmwasm", default-features = false } cosmwasm-vm = { path = "composable/vm", default-features = false } cosmwasm-vm-wasmi = { path = "composable/vm-wasmi", default-features = false } composable-support = { path = "composable/composable-support", default-features = false } composable-traits = { path = "composable/composable-traits", default-features = false } +cosmwasm-rpc = { path = "frame/cosmwasm/rpc", default-features = false } +cosmwasm-runtime-api = { path = "frame/cosmwasm/runtime-api", default-features = false } [profile.release] panic = "unwind" diff --git a/frame/cosmwasm/rpc/Cargo.toml b/frame/cosmwasm/rpc/Cargo.toml new file mode 100644 index 00000000..cfc8f2b8 --- /dev/null +++ b/frame/cosmwasm/rpc/Cargo.toml @@ -0,0 +1,32 @@ +[package] +authors = ["Composable Developers"] +edition = "2021" +homepage = "https://composable.finance" +name = "cosmwasm-rpc" +rust-version = "1.56" +version = "1.0.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +hex = { workspace = true } + +# substrate primitives +sp-api = { workspace = true } +sp-blockchain = { workspace = true } +sp-runtime = { workspace = true } + +# local +cosmwasm-runtime-api = { workspace = true } + +# SCALE +codec = { default-features = false, features = [ + "derive", +], package = "parity-scale-codec", version = "3.2.0" } +scale-info = { version = "2.3.0", default-features = false, features = [ + "derive", +] } + +# rpc +jsonrpsee = { version = "0.22.5", features = ["server", "macros"] } diff --git a/frame/cosmwasm/rpc/src/lib.rs b/frame/cosmwasm/rpc/src/lib.rs new file mode 100644 index 00000000..f00e0706 --- /dev/null +++ b/frame/cosmwasm/rpc/src/lib.rs @@ -0,0 +1,86 @@ +extern crate alloc; + +use crate::cosmwasm_api::CosmwasmApiServer; +use alloc::sync::Arc; +use codec::Codec; +use core::{cmp::Ord, fmt::Display, marker::PhantomData, str::FromStr}; +use cosmwasm_runtime_api::CosmwasmRuntimeApi; +use jsonrpsee::{ + core::RpcResult, + proc_macros::rpc, + types::{ErrorObject, ErrorObjectOwned}, +}; +use sp_api::ProvideRuntimeApi; +use sp_blockchain::HeaderBackend; +use sp_runtime::traits::Block as BlockT; + +#[allow(clippy::too_many_arguments)] +mod cosmwasm_api { + use super::*; + #[rpc(client, server)] + pub trait CosmwasmApi + where + AccountId: FromStr + Display, + AssetId: FromStr + Display + Ord, + Balance: FromStr + Display, + { + #[method(name = "cosmwasm_query")] + fn query( + &self, + contract: AccountId, + gas: u64, + query_request: Vec, + at: Option, + ) -> RpcResult>; + } +} + +pub struct Cosmwasm { + client: Arc, + _marker: PhantomData, +} + +impl Cosmwasm { + pub fn new(client: Arc) -> Self { + Self { client, _marker: Default::default() } + } +} + +fn runtime_error_into_rpc_error(e: E) -> ErrorObjectOwned { + ErrorObject::owned( + 9876, // no real reason for this value + e.to_string(), + None::<()>, + ) +} + +impl + CosmwasmApiServer<::Hash, AccountId, AssetId, Balance, Error> + for Cosmwasm +where + Block: BlockT, + AccountId: Send + Sync + 'static + Codec + FromStr + Display, + AssetId: Send + Sync + 'static + Codec + FromStr + Display + Ord, + Balance: Send + Sync + 'static + Codec + FromStr + Display, + Error: Send + Sync + 'static + Codec + AsRef<[u8]>, + C: Send + Sync + 'static, + C: ProvideRuntimeApi, + C: HeaderBackend, + C::Api: CosmwasmRuntimeApi, +{ + fn query( + &self, + contract: AccountId, + gas: u64, + query_request: Vec, + at: Option<::Hash>, + ) -> RpcResult> { + let api = self.client.runtime_api(); + let at = at.unwrap_or_else(|| self.client.info().best_hash); + let runtime_api_result = api + .query(at, contract, gas, query_request) + .map_err(runtime_error_into_rpc_error)?; + runtime_api_result + .map_err(|e| runtime_error_into_rpc_error(String::from_utf8_lossy(e.as_ref()))) + } +} diff --git a/frame/cosmwasm/runtime-api/Cargo.toml b/frame/cosmwasm/runtime-api/Cargo.toml new file mode 100644 index 00000000..ddb67e4f --- /dev/null +++ b/frame/cosmwasm/runtime-api/Cargo.toml @@ -0,0 +1,20 @@ +[package] +authors = ["Composable Developers"] +edition = "2021" +homepage = "https://composable.finance" +name = "cosmwasm-runtime-api" +rust-version = "1.56" +version = "1.0.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { default-features = false, features = [ + "derive", +], package = "parity-scale-codec", version = "3.2.0" } +sp-api = { default-features = false, workspace = true } + +[features] +default = ["std"] +std = ["sp-api/std"] diff --git a/frame/cosmwasm/runtime-api/src/lib.rs b/frame/cosmwasm/runtime-api/src/lib.rs new file mode 100644 index 00000000..99ea9db4 --- /dev/null +++ b/frame/cosmwasm/runtime-api/src/lib.rs @@ -0,0 +1,25 @@ +#![cfg_attr(not(feature = "std"), no_std)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::unnecessary_mut_passed)] + +extern crate alloc; + +use alloc::vec::Vec; +use codec::Codec; + +// Cosmwasm Runtime API declaration. +sp_api::decl_runtime_apis! { + pub trait CosmwasmRuntimeApi + where + AccountId: Codec, + AssetId: Codec, + Balance: Codec, + Error: Codec + { + fn query( + contract: AccountId, + gas: u64, + query_request: Vec, + ) -> Result, Error>; + } +} From 36bc6a1b849f9c6549565c60e027d35a3a79d6e1 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 1 Sep 2024 21:19:36 +0900 Subject: [PATCH 23/55] refactor: Rename cosm to cosmos --- client/rpc/src/{cosm.rs => cosmos.rs} | 12 ++++++------ client/rpc/src/lib.rs | 4 ++-- sidecar/src/constants/rpc.ts | 2 +- sidecar/src/services/tx.ts | 4 ++-- template/node/Cargo.toml | 12 ++++++++++-- template/node/src/rpc.rs | 7 +++---- template/runtime/Cargo.toml | 18 ++++++++++++++---- template/runtime/src/compat.rs | 2 +- .../runtime/src/compat/{cosm.rs => cosmos.rs} | 0 template/runtime/src/lib.rs | 19 ++++++++++++++++++- 10 files changed, 57 insertions(+), 23 deletions(-) rename client/rpc/src/{cosm.rs => cosmos.rs} (91%) rename template/runtime/src/compat/{cosm.rs => cosmos.rs} (100%) diff --git a/client/rpc/src/cosm.rs b/client/rpc/src/cosmos.rs similarity index 91% rename from client/rpc/src/cosm.rs rename to client/rpc/src/cosmos.rs index 0eb36a30..f9646ac0 100644 --- a/client/rpc/src/cosm.rs +++ b/client/rpc/src/cosmos.rs @@ -32,28 +32,28 @@ use std::{marker::PhantomData, sync::Arc}; #[rpc(server)] #[async_trait] -pub trait CosmApi { - #[method(name = "cosm_broadcastTx")] +pub trait CosmosApi { + #[method(name = "cosmos_broadcastTx")] async fn broadcast_tx(&self, tx_bytes: Bytes) -> RpcResult; - #[method(name = "cosm_simulate")] + #[method(name = "cosmos_simulate")] async fn simulate(&self, tx_bytes: Bytes) -> RpcResult; } -pub struct Cosm { +pub struct Cosmos { pool: Arc

, client: Arc, _marker: PhantomData, } -impl Cosm { +impl Cosmos { pub fn new(pool: Arc

, client: Arc) -> Self { Self { pool, client, _marker: Default::default() } } } #[async_trait] -impl CosmApiServer for Cosm +impl CosmosApiServer for Cosmos where Block: BlockT, C: Send + Sync + 'static, diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index eb7c478c..7dac3690 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -18,9 +18,9 @@ #![deny(unused_crate_dependencies)] -mod cosm; +mod cosmos; -pub use cosm::{Cosm, CosmApiServer}; +pub use cosmos::{Cosmos, CosmosApiServer}; pub use jsonrpsee::{ core, types::{error, ErrorObject, ErrorObjectOwned}, diff --git a/sidecar/src/constants/rpc.ts b/sidecar/src/constants/rpc.ts index 1f9065f1..20b36166 100644 --- a/sidecar/src/constants/rpc.ts +++ b/sidecar/src/constants/rpc.ts @@ -1,5 +1,5 @@ const rpc = { - cosm: { + cosmos: { broadcastTx: { description: "Broadcast cosmos transaction.", params: [ diff --git a/sidecar/src/services/tx.ts b/sidecar/src/services/tx.ts index 347c07eb..f0d31d47 100644 --- a/sidecar/src/services/tx.ts +++ b/sidecar/src/services/tx.ts @@ -24,7 +24,7 @@ export class TxService implements ApiService { public async broadcastTx(txBytes: string): Promise { const rawTx = `0x${Buffer.from(txBytes, 'base64').toString('hex')}`; - let txHash = (await this.chainApi.rpc['cosm']['broadcastTx'](rawTx)).toString(); + let txHash = (await this.chainApi.rpc['cosmos']['broadcastTx'](rawTx)).toString(); txHash = txHash.startsWith('0x') ? txHash.slice(2) : txHash; console.debug(`txHash: ${txHash.toLowerCase()}`); @@ -168,7 +168,7 @@ export class TxService implements ApiService { public async simulate(txBytes: string): Promise { const txRaw = `0x${this.convert(txBytes, 'base64', 'hex')}`; - const { gas_info, events } = (await this.chainApi.rpc['cosm']['simulate'](txRaw)).toJSON(); + const { gas_info, events } = (await this.chainApi.rpc['cosmos']['simulate'](txRaw)).toJSON(); const cosmosEvents = this.encodeEvents(events, 'hex', 'utf8'); diff --git a/template/node/Cargo.toml b/template/node/Cargo.toml index 68bccc4e..f7e4b8f1 100644 --- a/template/node/Cargo.toml +++ b/template/node/Cargo.toml @@ -23,7 +23,9 @@ serde_json = { workspace = true } # Substrate FRAME frame-system-rpc-runtime-api = { workspace = true, features = ["std"] } pallet-transaction-payment-rpc = { workspace = true } -pallet-transaction-payment-rpc-runtime-api = { workspace = true, features = ["std"] } +pallet-transaction-payment-rpc-runtime-api = { workspace = true, features = [ + "std", +] } # Substrate sc-basic-authorship = { workspace = true } @@ -63,7 +65,13 @@ hp-io = { workspace = true, features = ["std"] } hp-rpc = { workspace = true, features = ["std"] } horizon-template-runtime = { workspace = true, features = ["std"] } pallet-cosmos-types = { workspace = true, features = ["std", "with-codec"] } -pallet-cosmos-x-bank-types = { workspace = true, features = ["std", "with-codec"] } +pallet-cosmos-x-bank-types = { workspace = true, features = [ + "std", + "with-codec", +] } + +cosmwasm-rpc = { workspace = true } +cosmwasm-runtime-api = { workspace = true, features = ["std"] } [build-dependencies] substrate-build-script-utils = { workspace = true } diff --git a/template/node/src/rpc.rs b/template/node/src/rpc.rs index 8203c4e2..73f538a2 100644 --- a/template/node/src/rpc.rs +++ b/template/node/src/rpc.rs @@ -5,8 +5,6 @@ #![warn(missing_docs)] -use std::sync::Arc; - use horizon_template_runtime::{opaque::Block, AccountId, Balance, Nonce}; use jsonrpsee::RpcModule; pub use sc_rpc_api::DenyUnsafe; @@ -14,6 +12,7 @@ use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; +use std::sync::Arc; /// Full client dependencies. pub struct FullDeps { @@ -39,7 +38,7 @@ where P: TransactionPool + 'static, C::Api: hp_rpc::CosmosTxRuntimeApi, { - use hc_rpc::{Cosm, CosmApiServer}; + use hc_rpc::{Cosmos, CosmosApiServer}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use substrate_frame_rpc_system::{System, SystemApiServer}; @@ -49,7 +48,7 @@ where module.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(Cosm::new(pool, client).into_rpc())?; + module.merge(Cosmos::new(pool, client).into_rpc())?; // Extend this RPC with a custom API by using the following syntax. // `YourRpcStruct` should have a reference to a client, which is needed diff --git a/template/runtime/Cargo.toml b/template/runtime/Cargo.toml index e1d91135..e355e6d7 100644 --- a/template/runtime/Cargo.toml +++ b/template/runtime/Cargo.toml @@ -10,7 +10,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bech32 = { workspace = true, default-features = false } -cosmos-sdk-proto = { workspace = true, default-features = false, features = ["cosmwasm"] } +cosmos-sdk-proto = { workspace = true, default-features = false, features = [ + "cosmwasm", +] } parity-scale-codec = { workspace = true, default-features = false } ripemd = { workspace = true, default-features = false } scale-info = { workspace = true, default-features = false } @@ -19,7 +21,9 @@ serde_json = { workspace = true, default-features = false } # Substrate sp-api = { workspace = true, default-features = false } sp-block-builder = { workspace = true, default-features = false } -sp-consensus-aura = { workspace = true, default-features = false, features = ["serde"] } +sp-consensus-aura = { workspace = true, default-features = false, features = [ + "serde", +] } sp-core = { workspace = true, default-features = false } sp-genesis-builder = { workspace = true, default-features = false } sp-inherents = { workspace = true, default-features = false } @@ -44,7 +48,9 @@ pallet-transaction-payment-rpc-runtime-api = { workspace = true, default-feature pallet-timestamp = { workspace = true, default-features = false } # Frontier -fp-self-contained = { workspace = true, default-features = false, features = ["serde"] } +fp-self-contained = { workspace = true, default-features = false, features = [ + "serde", +] } # Horizon hp-account = { workspace = true, default-features = false } @@ -53,7 +59,9 @@ hp-io = { workspace = true, default-features = false } hp-rpc = { workspace = true, default-features = false } pallet-cosmos = { workspace = true, default-features = false } pallet-cosmos-accounts = { workspace = true, default-features = false } -pallet-cosmos-types = { workspace = true, default-features = false, features = ["with-codec"] } +pallet-cosmos-types = { workspace = true, default-features = false, features = [ + "with-codec", +] } pallet-cosmos-x-auth = { workspace = true, default-features = false } pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } pallet-cosmos-x-auth-signing = { workspace = true, default-features = false } @@ -63,6 +71,7 @@ pallet-cosmos-x-wasm = { workspace = true, default-features = false } pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } pallet-cosmwasm = { workspace = true, default-features = false } +cosmwasm-runtime-api = { workspace = true, default-features = false } [dev-dependencies] base64ct = { workspace = true } @@ -114,5 +123,6 @@ std = [ "pallet-cosmos-x-bank/std", "pallet-cosmos-x-bank-types/std", "pallet-cosmwasm/std", + "cosmwasm-runtime-api/std", "substrate-wasm-builder", ] diff --git a/template/runtime/src/compat.rs b/template/runtime/src/compat.rs index 6e5d781a..f21bd8d0 100644 --- a/template/runtime/src/compat.rs +++ b/template/runtime/src/compat.rs @@ -18,4 +18,4 @@ //! Horizon runtime compatibility adapters. -pub mod cosm; +pub mod cosmos; diff --git a/template/runtime/src/compat/cosm.rs b/template/runtime/src/compat/cosmos.rs similarity index 100% rename from template/runtime/src/compat/cosm.rs rename to template/runtime/src/compat/cosmos.rs diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 45def626..735cc6fc 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -379,7 +379,7 @@ parameter_types! { impl pallet_cosmos::Config for Runtime { /// Mapping an address to an account id. - type AddressMapping = compat::cosm::HashedAddressMapping; + type AddressMapping = compat::cosmos::HashedAddressMapping; /// Native asset type. type NativeAsset = Balances; /// Type of an account balance. @@ -726,6 +726,23 @@ impl_runtime_apis! { } } + impl cosmwasm_runtime_api::CosmwasmRuntimeApi> for Runtime { + fn query( + contract: AccountId, + gas: u64, + query_request: Vec, + ) -> Result, Vec>{ + match pallet_cosmwasm::query::( + contract, + gas, + query_request, + ) { + Ok(response) => Ok(response.into()), + Err(err) => Err(alloc::format!("{:?}", err).into_bytes()) + } + } + } + impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { VERSION From 1b6992de2a66e84b5396095967c978f24e555d66 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 1 Sep 2024 22:48:46 +0900 Subject: [PATCH 24/55] feat: Implement cosmwasm qeury --- frame/cosmwasm/rpc/src/lib.rs | 25 ++++++++----------------- frame/cosmwasm/runtime-api/src/lib.rs | 9 +++------ template/node/src/rpc.rs | 5 ++++- template/runtime/src/lib.rs | 7 ++++--- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/frame/cosmwasm/rpc/src/lib.rs b/frame/cosmwasm/rpc/src/lib.rs index f00e0706..30aead98 100644 --- a/frame/cosmwasm/rpc/src/lib.rs +++ b/frame/cosmwasm/rpc/src/lib.rs @@ -1,9 +1,9 @@ extern crate alloc; -use crate::cosmwasm_api::CosmwasmApiServer; use alloc::sync::Arc; use codec::Codec; -use core::{cmp::Ord, fmt::Display, marker::PhantomData, str::FromStr}; +use core::marker::PhantomData; +pub use cosmwasm_api::CosmwasmApiServer; use cosmwasm_runtime_api::CosmwasmRuntimeApi; use jsonrpsee::{ core::RpcResult, @@ -18,16 +18,11 @@ use sp_runtime::traits::Block as BlockT; mod cosmwasm_api { use super::*; #[rpc(client, server)] - pub trait CosmwasmApi - where - AccountId: FromStr + Display, - AssetId: FromStr + Display + Ord, - Balance: FromStr + Display, - { + pub trait CosmwasmApi { #[method(name = "cosmwasm_query")] fn query( &self, - contract: AccountId, + contract: String, gas: u64, query_request: Vec, at: Option, @@ -54,23 +49,19 @@ fn runtime_error_into_rpc_error(e: E) -> ErrorObjectOwned { ) } -impl - CosmwasmApiServer<::Hash, AccountId, AssetId, Balance, Error> - for Cosmwasm +impl CosmwasmApiServer<::Hash, Error> + for Cosmwasm where Block: BlockT, - AccountId: Send + Sync + 'static + Codec + FromStr + Display, - AssetId: Send + Sync + 'static + Codec + FromStr + Display + Ord, - Balance: Send + Sync + 'static + Codec + FromStr + Display, Error: Send + Sync + 'static + Codec + AsRef<[u8]>, C: Send + Sync + 'static, C: ProvideRuntimeApi, C: HeaderBackend, - C::Api: CosmwasmRuntimeApi, + C::Api: CosmwasmRuntimeApi, { fn query( &self, - contract: AccountId, + contract: String, gas: u64, query_request: Vec, at: Option<::Hash>, diff --git a/frame/cosmwasm/runtime-api/src/lib.rs b/frame/cosmwasm/runtime-api/src/lib.rs index 99ea9db4..ce6271f4 100644 --- a/frame/cosmwasm/runtime-api/src/lib.rs +++ b/frame/cosmwasm/runtime-api/src/lib.rs @@ -4,20 +4,17 @@ extern crate alloc; -use alloc::vec::Vec; +use alloc::{string::String, vec::Vec}; use codec::Codec; // Cosmwasm Runtime API declaration. sp_api::decl_runtime_apis! { - pub trait CosmwasmRuntimeApi + pub trait CosmwasmRuntimeApi where - AccountId: Codec, - AssetId: Codec, - Balance: Codec, Error: Codec { fn query( - contract: AccountId, + contract: String, gas: u64, query_request: Vec, ) -> Result, Error>; diff --git a/template/node/src/rpc.rs b/template/node/src/rpc.rs index 73f538a2..954432ec 100644 --- a/template/node/src/rpc.rs +++ b/template/node/src/rpc.rs @@ -37,7 +37,9 @@ where C::Api: BlockBuilder, P: TransactionPool + 'static, C::Api: hp_rpc::CosmosTxRuntimeApi, + C::Api: cosmwasm_runtime_api::CosmwasmRuntimeApi>, { + use cosmwasm_rpc::{Cosmwasm, CosmwasmApiServer}; use hc_rpc::{Cosmos, CosmosApiServer}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use substrate_frame_rpc_system::{System, SystemApiServer}; @@ -48,7 +50,8 @@ where module.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(Cosmos::new(pool, client).into_rpc())?; + module.merge(Cosmos::new(pool, client.clone()).into_rpc())?; + module.merge(Cosmwasm::new(client).into_rpc())?; // Extend this RPC with a custom API by using the following syntax. // `YourRpcStruct` should have a reference to a client, which is needed diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 735cc6fc..a1e31433 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -37,7 +37,7 @@ mod msgs; mod sig_verifiable_tx; mod sign_mode_handler; -use alloc::{boxed::Box, vec::Vec}; +use alloc::{boxed::Box, string::String, vec::Vec}; use core::marker::PhantomData; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, @@ -726,12 +726,13 @@ impl_runtime_apis! { } } - impl cosmwasm_runtime_api::CosmwasmRuntimeApi> for Runtime { + impl cosmwasm_runtime_api::CosmwasmRuntimeApi> for Runtime { fn query( - contract: AccountId, + contract: String, gas: u64, query_request: Vec, ) -> Result, Vec>{ + let contract = ::AccountToAddr::convert(contract).map_err(|_| "Invalid contract address".as_bytes().to_vec())?; match pallet_cosmwasm::query::( contract, gas, From 471c7628ce7162244e18d5c0fef99a4af5e8b513 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 11:45:58 +0900 Subject: [PATCH 25/55] fix: Fix implement AccountToAddr --- primitives/account/src/lib.rs | 4 +++ template/runtime/src/accounts.rs | 53 +++++++++++++++++++------------- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/primitives/account/src/lib.rs b/primitives/account/src/lib.rs index b68ce716..48cd6b3d 100644 --- a/primitives/account/src/lib.rs +++ b/primitives/account/src/lib.rs @@ -79,6 +79,10 @@ impl core::fmt::Debug for CosmosSigner { impl EcdsaExt for CosmosSigner { fn to_cosmos_address(&self) -> Option { + // If the first byte is 0, the account is either a contract or interim account. + if *self.0 .0.first().unwrap() == 0 { + return None; + } let mut hasher = ripemd::Ripemd160::new(); hasher.update(sha2_256(&self.0 .0)); let address = H160::from_slice(&hasher.finalize()); diff --git a/template/runtime/src/accounts.rs b/template/runtime/src/accounts.rs index 63ac76e1..6dbed49d 100644 --- a/template/runtime/src/accounts.rs +++ b/template/runtime/src/accounts.rs @@ -16,47 +16,58 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::AccountId; use alloc::{string::String, vec::Vec}; use bech32::{Bech32, Hrp}; -use core::str; +use core::marker::PhantomData; +use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::AddressMapping; -use sp_core::Get; +use sp_core::{crypto::UncheckedFrom, Get, H160, H256}; use sp_runtime::traits::Convert; -pub struct AccountToAddr(core::marker::PhantomData); +pub struct AccountToAddr(PhantomData); -impl Convert for AccountToAddr +impl Convert for AccountToAddr where T: pallet_cosmos::Config, - T::AccountId: EcdsaExt, { - fn convert(account: T::AccountId) -> String { - // TODO: Handle errors - let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); - let address = account.to_cosmos_address().unwrap(); + fn convert(account: AccountId) -> String { + // TODO: Handle error + let data = if account.0 .0.first().unwrap() == &0 { + &account.0 .0[1..] + } else { + &account.to_cosmos_address().unwrap().0[..] + }; - bech32::encode::(hrp, address.as_bytes()).unwrap() + let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); + bech32::encode::(hrp, data).unwrap() } } -impl Convert> for AccountToAddr +impl Convert> for AccountToAddr where - T: pallet_cosmos::Config, + T: pallet_cosmos::Config, { - fn convert(address: String) -> Result { - T::AddressMapping::from_bech32(&address).ok_or(()) + fn convert(address: String) -> Result { + bech32::decode(&address) + .map(|(_hrp, data)| Self::convert(data)) + .map_err(|_| ())? } } -impl Convert, Result> for AccountToAddr +impl Convert, Result> for AccountToAddr where - T: pallet_cosmos::Config, + T: pallet_cosmos::Config, { - fn convert(address_raw: Vec) -> Result { - str::from_utf8(&address_raw) - .map(T::AddressMapping::from_bech32) - .map_err(|_| ())? - .ok_or(()) + fn convert(address_raw: Vec) -> Result { + // Cosmos address length is 20, contract address is 32. + let account = match address_raw.len() { + 20 => T::AddressMapping::from_address_raw(H160::from_slice(&address_raw)), + 32 => AccountId::unchecked_from(H256::from_slice(&address_raw)), + _ => return Err(()), + }; + + Ok(account) } } From 7344af7cd5df2fdf47add507fa558906569b613f Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 13:25:52 +0900 Subject: [PATCH 26/55] refactor: Refactor acc_address_from_bech32 --- frame/cosmos/src/lib.rs | 13 ++++++++++--- frame/cosmos/types/src/address.rs | 10 +++++++--- frame/cosmos/x/auth/src/sigverify.rs | 21 ++++++++++++++++----- template/runtime/src/compat/cosmos.rs | 9 +++++++-- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 62bef53a..1b480df0 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -39,7 +39,7 @@ use frame_support::{ }; use frame_system::{pallet_prelude::OriginFor, CheckWeight}; use pallet_cosmos_types::{ - address::address_from_bech32, + address::acc_address_from_bech32, errors::{CosmosError, RootError}, events, events::{CosmosEvent, CosmosEvents, EventManager as _}, @@ -96,8 +96,15 @@ where TransactionValidityError::Invalid(InvalidTransaction::BadSigner) })?; - address_from_bech32(&fee_payer) - .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::BadSigner)) + let (_hrp, address_raw) = acc_address_from_bech32(&fee_payer).map_err(|_| { + TransactionValidityError::Invalid(InvalidTransaction::BadSigner) + })?; + + if address_raw.len() != 20 { + return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)); + } + + Ok(H160::from_slice(&address_raw)) }; Some(check()) diff --git a/frame/cosmos/types/src/address.rs b/frame/cosmos/types/src/address.rs index ea45bb5d..88459922 100644 --- a/frame/cosmos/types/src/address.rs +++ b/frame/cosmos/types/src/address.rs @@ -15,15 +15,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -use sp_core::H160; +use alloc::{ + string::{String, ToString}, + vec::Vec, +}; #[derive(Clone, PartialEq, Eq, Debug)] pub enum AddressError { Bech32Error(bech32::DecodeError), + IncorrectLength, } -pub fn address_from_bech32(address: &str) -> Result { +pub fn acc_address_from_bech32(address: &str) -> Result<(String, Vec), AddressError> { bech32::decode(address) - .map(|(_hrp, data)| H160::from_slice(&data)) + .map(|(hrp, data)| (hrp.to_string(), data)) .map_err(AddressError::Bech32Error) } diff --git a/frame/cosmos/x/auth/src/sigverify.rs b/frame/cosmos/x/auth/src/sigverify.rs index 3d702057..51ccd124 100644 --- a/frame/cosmos/x/auth/src/sigverify.rs +++ b/frame/cosmos/x/auth/src/sigverify.rs @@ -28,7 +28,7 @@ use cosmos_sdk_proto::{ }; use hp_io::cosmos::secp256k1_ecdsa_verify; use pallet_cosmos::AddressMapping; -use pallet_cosmos_types::{address::address_from_bech32, handler::AnteDecorator}; +use pallet_cosmos_types::{address::acc_address_from_bech32, handler::AnteDecorator}; use pallet_cosmos_x_auth_signing::{ sign_mode_handler::{SignModeHandler, SignerData}, sign_verifiable_tx::SigVerifiableTx, @@ -74,9 +74,14 @@ where .get(i) .ok_or(TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; - let signer_addr = address_from_bech32(signer) + let (_hrp, signer_addr) = acc_address_from_bech32(signer) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::BadSigner))?; + if signer_addr.len() != 20 { + return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)); + } + + let signer_addr = H160::from_slice(&signer_addr); let (account, _) = pallet_cosmos::Pallet::::account(&signer_addr); if signer_info.sequence > account.sequence { return Err(TransactionValidityError::Invalid(InvalidTransaction::Future)); @@ -130,10 +135,16 @@ where hasher.update(sha2_256(&public_key.key)); let address = H160::from_slice(&hasher.finalize()); - let signer_addr = address_from_bech32(&signer_data.address).map_err(|_| { - TransactionValidityError::Invalid(InvalidTransaction::BadSigner) - })?; + let (_hrp, signer_addr) = + acc_address_from_bech32(&signer_data.address).map_err(|_| { + TransactionValidityError::Invalid(InvalidTransaction::BadSigner) + })?; + + if signer_addr.len() != 20 { + return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)); + } + let signer_addr = H160::from_slice(&signer_addr); if signer_addr != address { return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)); } diff --git a/template/runtime/src/compat/cosmos.rs b/template/runtime/src/compat/cosmos.rs index 14c4a37d..065f0d0f 100644 --- a/template/runtime/src/compat/cosmos.rs +++ b/template/runtime/src/compat/cosmos.rs @@ -22,7 +22,7 @@ use core::marker::PhantomData; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::AddressMapping; -use pallet_cosmos_types::address::address_from_bech32; +use pallet_cosmos_types::address::acc_address_from_bech32; use sp_core::{ecdsa, Hasher, H160, H256}; /// Hashed address mapping. @@ -50,6 +50,11 @@ where } fn from_bech32(address: &str) -> Option { - address_from_bech32(address).map(Self::from_address_raw).ok() + let (_hrp, address_raw) = acc_address_from_bech32(address).ok()?; + if address_raw.len() != 20 { + return None; + } + + Some(Self::from_address_raw(H160::from_slice(&address_raw))) } } From 7763864669e2c013c68c32206a2e753ceb388e66 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 13:43:17 +0900 Subject: [PATCH 27/55] refactor: Refactor convert weight to gas --- frame/cosmos/src/lib.rs | 22 +++++++++------------- template/runtime/src/lib.rs | 36 ++++++++---------------------------- 2 files changed, 17 insertions(+), 41 deletions(-) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 1b480df0..08fedada 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -184,13 +184,6 @@ pub mod pallet { } } - pub struct GasToWeight; - impl Convert for GasToWeight { - fn convert(gas: Gas) -> Weight { - Weight::from_parts(gas, 0u64) - } - } - pub struct WeightToGas; impl Convert for WeightToGas { fn convert(weight: Weight) -> Gas { @@ -198,6 +191,12 @@ pub mod pallet { } } + impl Convert for WeightToGas { + fn convert(gas: Gas) -> Weight { + Weight::from_parts(gas, 0u64) + } + } + parameter_types! { pub const MaxMemoCharacters: u64 = 256; pub NativeDenom: &'static str = "acdt"; @@ -266,7 +265,6 @@ pub mod pallet { type NativeDenom = NativeDenom; type ChainId = ChainId; type MsgFilter = MsgFilter; - type GasToWeight = GasToWeight; type WeightToGas = WeightToGas; type TxSigLimit = TxSigLimit; type MaxDenomLimit = MaxDenomLimit; @@ -326,10 +324,8 @@ pub mod pallet { type ChainId: Get<&'static str>; /// The message filter. type MsgFilter: Contains; - /// Converter for converting Gas to Weight. - type GasToWeight: Convert; - /// Converter for converting Weight to Gas. - type WeightToGas: Convert; + /// Converts Gas to Weight and Weight to Gas. + type WeightToGas: Convert + Convert; /// The maximum number of transaction signatures allowed. #[pallet::constant] type TxSigLimit: Get; @@ -402,7 +398,7 @@ pub mod pallet { .and_then(|tx| tx.auth_info) .and_then(|auth_info| auth_info.fee) .map_or(T::WeightInfo::default_weight(), |fee| { - T::GasToWeight::convert(fee.gas_limit) + T::WeightToGas::convert(fee.gas_limit) }) })] pub fn transact(origin: OriginFor, tx_bytes: Vec) -> DispatchResultWithPostInfo { diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index a1e31433..d4c99b8a 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -67,8 +67,13 @@ use frame_system::EnsureRoot; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use hp_rpc::{GasInfo, SimulateError, SimulateResponse}; -use pallet_cosmos::AddressMapping; -use pallet_cosmos_types::tx::Gas; +use pallet_cosmos::{ + config_preludes::{ + AddressPrefix, ChainId, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, + WeightToGas, + }, + AddressMapping, +}; use pallet_cosmos_x_auth::sigverify::SECP256K1_TYPE_URL; use pallet_cosmos_x_auth_signing::any_match; use pallet_cosmwasm::instrument::CostRules; @@ -354,29 +359,6 @@ impl Contains for MsgFilter { } } -pub struct GasToWeight; -impl Convert for GasToWeight { - fn convert(gas: Gas) -> Weight { - Weight::from_parts(gas, 0u64) - } -} - -pub struct WeightToGas; -impl Convert for WeightToGas { - fn convert(weight: Weight) -> Gas { - weight.ref_time() - } -} - -parameter_types! { - pub const MaxMemoCharacters: u64 = 256; - pub NativeDenom: &'static str = "acdt"; - pub ChainId: &'static str = "dev"; - pub const TxSigLimit: u64 = 7; - pub const MaxDenomLimit: u32 = 128; - pub const AddressPrefix: &'static str = "cosmos"; -} - impl pallet_cosmos::Config for Runtime { /// Mapping an address to an account id. type AddressMapping = compat::cosmos::HashedAddressMapping; @@ -403,9 +385,7 @@ impl pallet_cosmos::Config for Runtime { type ChainId = ChainId; /// The message filter. type MsgFilter = MsgFilter; - /// Converter for converting Gas to Weight. - type GasToWeight = GasToWeight; - /// Converter for converting Weight to Gas. + /// Converts Weight to Gas and Gas to Weight. type WeightToGas = WeightToGas; /// The maximum number of transaction signatures allowed. type TxSigLimit = TxSigLimit; From 226f884e151039a79d867f4b615cfc847fe21f97 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 14:03:14 +0900 Subject: [PATCH 28/55] docs: Fix annotations in pallet_cosmos --- frame/cosmos/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 08fedada..abfd7c1b 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -335,15 +335,17 @@ pub mod pallet { /// Handler for managing different signature modes in transactions. #[pallet::no_default] type SignModeHandler: SignModeHandler; + /// Defines the weight information for extrinsics in the pallet. #[pallet::no_default] type WeightInfo: WeightInfo; /// A way to convert from cosmos coin denom to asset id. #[pallet::no_default] type AssetToDenom: Convert> + Convert; + /// The maximum number of characters allowed for a denomination. #[pallet::constant] type MaxDenomLimit: Get; - /// The chain ID. + /// The prefix used for addresses. #[pallet::constant] type AddressPrefix: Get<&'static str>; From b170231fdac77c8af9de6e8227e108ad63d4b5b0 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 17:45:03 +0900 Subject: [PATCH 29/55] test: Add mock runtime to pallet-cosmos --- frame/cosmos/Cargo.toml | 37 +- frame/cosmos/src/lib.rs | 2 + frame/cosmos/src/mock.rs | 490 ++++++++++++++++++ primitives/crypto/src/ecdsa.rs | 2 +- template/runtime/build.rs | 2 +- template/runtime/src/accounts.rs | 4 +- template/runtime/src/ante.rs | 2 +- template/runtime/src/assets.rs | 2 +- template/runtime/src/compat/cosmos.rs | 2 +- .../runtime/src/{compat.rs => compat/mod.rs} | 4 +- template/runtime/src/context.rs | 67 --- template/runtime/src/lib.rs | 5 +- template/runtime/src/msgs.rs | 2 +- template/runtime/src/sig_verifiable_tx.rs | 3 +- template/runtime/src/sign_mode_handler.rs | 2 +- 15 files changed, 541 insertions(+), 85 deletions(-) create mode 100644 frame/cosmos/src/mock.rs rename template/runtime/src/{compat.rs => compat/mod.rs} (90%) delete mode 100644 template/runtime/src/context.rs diff --git a/frame/cosmos/Cargo.toml b/frame/cosmos/Cargo.toml index 975320c6..3aa3b3af 100644 --- a/frame/cosmos/Cargo.toml +++ b/frame/cosmos/Cargo.toml @@ -9,7 +9,9 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true, default-features = false } +cosmos-sdk-proto = { workspace = true, default-features = false, features = [ + "cosmwasm", +] } parity-scale-codec = { workspace = true, default-features = false } scale-info = { workspace = true, default-features = false } log = { workspace = true, default-features = false } @@ -24,12 +26,29 @@ sp-runtime = { workspace = true, default-features = false } # Horizon hp-io = { workspace = true, default-features = false } - pallet-cosmos-types = { workspace = true, default-features = false, features = [ "with-codec", ] } pallet-cosmos-x-auth-signing = { workspace = true, default-features = false } +[dev-dependencies] +bech32 = { workspace = true, default-features = false } +serde_json = { workspace = true, default-features = false } + +hp-account = { workspace = true, default-features = false } +hp-crypto = { workspace = true, default-features = false } + +pallet-assets = { workspace = true, default-features = false } +pallet-cosmos = { workspace = true, default-features = false } +pallet-cosmos-accounts = { workspace = true, default-features = false } +pallet-cosmwasm = { workspace = true, default-features = false } +pallet-timestamp = { workspace = true, default-features = false } +pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } +pallet-cosmos-x-bank = { workspace = true, default-features = false } +pallet-cosmos-x-bank-types = { workspace = true, default-features = false } +pallet-cosmos-x-wasm = { workspace = true, default-features = false } +pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } + [features] default = ["std"] std = [ @@ -46,5 +65,19 @@ std = [ "hp-io/std", "pallet-cosmos-x-auth-signing/std", "pallet-cosmos-types/std", + "bech32/std", + "serde_json/std", + "hp-account/std", + "hp-crypto/std", + "pallet-assets/std", + "pallet-cosmos/std", + "pallet-cosmos-accounts/std", + "pallet-cosmwasm/std", + "pallet-timestamp/std", + "pallet-cosmos-x-auth-migrations/std", + "pallet-cosmos-x-bank/std", + "pallet-cosmos-x-bank-types/std", + "pallet-cosmos-x-wasm/std", + "pallet-cosmos-x-wasm-types/std", ] try-runtime = [] diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index abfd7c1b..c10eade3 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -21,6 +21,8 @@ extern crate alloc; +#[cfg(test)] +pub mod mock; pub mod weights; pub use self::pallet::*; diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs new file mode 100644 index 00000000..09d1f7dc --- /dev/null +++ b/frame/cosmos/src/mock.rs @@ -0,0 +1,490 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use super::*; +use alloc::{boxed::Box, string::String, vec::Vec}; +use bech32::{Bech32, Hrp}; +use core::marker::PhantomData; +use cosmos_sdk_proto::{ + cosmos::{ + bank::v1beta1::MsgSend, + tx::v1beta1::{ + mode_info::{Single, Sum}, + ModeInfo, SignDoc, TxRaw, + }, + }, + cosmwasm::wasm::v1::{ + MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, + MsgUpdateAdmin, + }, + Any, +}; +use frame_support::{ + derive_impl, parameter_types, + traits::{AsEnsureOriginWithArg, Contains}, + PalletId, +}; +use hp_account::CosmosSigner; +use hp_crypto::EcdsaExt; +use pallet_cosmos::{ + config_preludes::{ + AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, + WeightToGas, + }, + AddressMapping, +}; +use pallet_cosmos_types::msgservice::MsgHandler; +use pallet_cosmos_x_auth_migrations::legacytx::stdsign::StdSignDoc; +use pallet_cosmos_x_auth_signing::{ + any_match, + sign_mode_handler::{SignModeHandlerError, SignerData}, + sign_verifiable_tx::SigVerifiableTxError, +}; +use pallet_cosmos_x_bank::msgs::MsgSendHandler; +use pallet_cosmos_x_bank_types::msgs::msg_send; +use pallet_cosmos_x_wasm::msgs::{ + MsgExecuteContractHandler, MsgInstantiateContract2Handler, MsgMigrateContractHandler, + MsgStoreCodeHandler, MsgUpdateAdminHandler, +}; +use pallet_cosmos_x_wasm_types::tx::{ + msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, + msg_update_admin, +}; +use pallet_cosmwasm::instrument::CostRules; +use serde_json::{Map, Value}; +use sp_core::{crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, H160, H256}; +use sp_runtime::traits::{BlakeTwo256, Convert, IdentityLookup}; + +type Block = frame_system::mocking::MockBlock; +type AssetId = u64; +type AccountId = CosmosSigner; +type Balance = u128; +type Hash = sp_core::H256; + +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system, + Assets: pallet_assets, + Balances: pallet_balances, + Cosmos: pallet_cosmos, + Cosmwasm: pallet_cosmwasm, + Timestamp: pallet_timestamp, + } +); + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Test { + type AccountId = CosmosSigner; + type Lookup = IdentityLookup; + type Block = Block; + type AccountData = pallet_balances::AccountData; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Test { + type Balance = u128; + type ExistentialDeposit = ConstU128<1>; + type AccountStore = System; +} + +#[derive_impl(pallet_assets::config_preludes::TestDefaultConfig)] +impl pallet_assets::Config for Test { + type AssetId = AssetId; + type AssetIdParameter = AssetId; + type Balance = Balance; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = frame_system::EnsureRoot; + type Freezer = (); + type AssetDeposit = ConstU128<1>; + type AssetAccountDeposit = ConstU128<10>; + type MetadataDepositBase = ConstU128<1>; + type MetadataDepositPerByte = ConstU128<1>; + type ApprovalDeposit = ConstU128<1>; +} + +impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<5>; + type WeightInfo = (); +} + +pub struct MsgFilter; +impl Contains for MsgFilter { + fn contains(msg: &Any) -> bool { + any_match!( + msg, { + MsgSend => true, + MsgStoreCode => true, + MsgInstantiateContract2 => true, + MsgExecuteContract => true, + MsgMigrateContract => true, + MsgUpdateAdmin => true, + }, + false + ) + } +} + +pub struct MsgServiceRouter(PhantomData); +impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter +where + T: frame_system::Config + pallet_cosmos::Config + pallet_cosmwasm::Config, + T::AccountId: EcdsaExt, + Context: store::Context, +{ + fn route(msg: &Any) -> Option>> { + any_match!( + msg, { + MsgSend => Some(Box::>::default()), + MsgStoreCode => Some(Box::>::default()), + MsgInstantiateContract2 => Some(Box::>::default()), + MsgExecuteContract => Some(Box::>::default()), + MsgMigrateContract => Some(Box::>::default()), + MsgUpdateAdmin => Some(Box::>::default()), + }, + None + ) + } +} + +pub struct SigVerifiableTx; +impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVerifiableTx { + fn get_signers(tx: &Tx) -> Result, SigVerifiableTxError> { + let mut signers = Vec::::new(); + + let body = tx.body.as_ref().ok_or(SigVerifiableTxError::EmptyTxBody)?; + for msg in body.messages.iter() { + let msg_signers = any_match!( + msg, { + MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + }, + Err(SigVerifiableTxError::InvalidMsg) + )?; + + for msg_signer in msg_signers.iter() { + if !signers.contains(msg_signer) { + signers.push(msg_signer.clone()); + } + } + } + + let fee_payer = &tx + .auth_info + .as_ref() + .and_then(|auth_info| auth_info.fee.as_ref()) + .ok_or(SigVerifiableTxError::EmptyFee)? + .payer; + + if !fee_payer.is_empty() && !signers.contains(fee_payer) { + signers.push(fee_payer.clone()); + } + + Ok(signers) + } + + fn fee_payer(tx: &Tx) -> Result { + let fee = tx + .auth_info + .as_ref() + .and_then(|auth_info| auth_info.fee.as_ref()) + .ok_or(SigVerifiableTxError::EmptyFee)?; + + let fee_payer = if fee.payer.is_empty() { + Self::get_signers(tx)? + .first() + .ok_or(SigVerifiableTxError::EmptySigners)? + .clone() + } else { + fee.payer.clone() + }; + + Ok(fee_payer) + } + + fn sequence(tx: &Tx) -> Result { + let auth_info = tx.auth_info.as_ref().ok_or(SigVerifiableTxError::EmptyAuthInfo)?; + let fee = auth_info.fee.as_ref().ok_or(SigVerifiableTxError::EmptyFee)?; + + let sequence = if !fee.payer.is_empty() { + auth_info + .signer_infos + .first() + .ok_or(SigVerifiableTxError::EmptySigners)? + .sequence + } else { + // TODO: Verify that the last signer is the fee payer. + auth_info + .signer_infos + .last() + .ok_or(SigVerifiableTxError::EmptySigners)? + .sequence + }; + + Ok(sequence) + } +} + +pub struct HashedAddressMapping(PhantomData<(T, H)>); + +impl AddressMapping for HashedAddressMapping +where + T: pallet_cosmos_accounts::Config, + T::AccountId: From + EcdsaExt, + H: Hasher, +{ + fn from_address_raw(address: H160) -> T::AccountId { + if let Some(x) = pallet_cosmos_accounts::Connections::::get(address) { + return x; + } + let mut data = [0u8; 25]; + data[0..5].copy_from_slice(b"cosm:"); + data[5..25].copy_from_slice(&address[..]); + let hash = H::hash(&data); + + let mut interim = [0u8; 33]; + interim[1..33].copy_from_slice(&hash.0[..]); + + CosmosSigner(ecdsa::Public(interim)).into() + } + + fn from_bech32(address: &str) -> Option { + let (_hrp, address_raw) = acc_address_from_bech32(address).ok()?; + if address_raw.len() != 20 { + return None; + } + + Some(Self::from_address_raw(H160::from_slice(&address_raw))) + } +} + +pub struct SignModeHandler; + +impl pallet_cosmos_x_auth_signing::sign_mode_handler::SignModeHandler for SignModeHandler { + fn get_sign_bytes( + mode: &ModeInfo, + data: &SignerData, + tx: &Tx, + ) -> Result, SignModeHandlerError> { + let sum = mode.sum.as_ref().ok_or(SignModeHandlerError::EmptyModeInfo)?; + let sign_bytes = match sum { + Sum::Single(Single { mode }) => match mode { + 1 /* SIGN_MODE_DIRECT */ => { + let tx_raw = TxRaw::decode(&mut &*tx.encode_to_vec()).map_err(|_| SignModeHandlerError::DecodeTxError)?; + SignDoc { + body_bytes: tx_raw.body_bytes, + auth_info_bytes: tx_raw.auth_info_bytes, + chain_id: data.chain_id.clone(), + account_number: data.account_number, + }.encode_to_vec() + }, + 127 /* SIGN_MODE_LEGACY_AMINO_JSON */ => { + let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or(SignModeHandlerError::EmptyFee)?; + let body = tx.body.as_ref().ok_or(SignModeHandlerError::EmptyTxBody)?; + + let mut coins = Vec::::new(); + for amt in fee.amount.iter() { + let mut coin = Map::new(); + coin.insert("amount".to_string(), Value::String(amt.amount.clone())); + coin.insert("denom".to_string(), Value::String(amt.denom.clone())); + + coins.push(Value::Object(coin)); + } + + let mut std_fee = Map::new(); + std_fee.insert("gas".to_string(), Value::String(fee.gas_limit.to_string())); + std_fee.insert("amount".to_string(), Value::Array(coins)); + + let mut msgs = Vec::::new(); + for msg in body.messages.iter() { + let sign_msg = any_match!( + msg, { + MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + }, + Err(SignModeHandlerError::InvalidMsg))?; + + msgs.push(sign_msg); + } + + let sign_doc = StdSignDoc { + account_number: data.account_number.to_string(), + chain_id: data.chain_id.clone(), + fee: Value::Object(std_fee), + memo: body.memo.clone(), + msgs, + sequence: data.sequence.to_string(), + }; + serde_json::to_value(sign_doc).map_err(|_| SignModeHandlerError::SerializeError)?.to_string().as_bytes().to_vec() + }, + _ => return Err(SignModeHandlerError::InvalidMode), + }, + _ => return Err(SignModeHandlerError::InvalidMode), + }; + + Ok(sign_bytes) + } +} + +#[derive_impl(pallet_cosmos::config_preludes::TestDefaultConfig)] +impl pallet_cosmos::Config for Test { + type AddressMapping = HashedAddressMapping; + type NativeAsset = Balances; + type Assets = Assets; + type RuntimeEvent = RuntimeEvent; + type AnteHandler = (); + type Balance = Balance; + type AssetId = AssetId; + type MaxMemoCharacters = MaxMemoCharacters; + type NativeDenom = NativeDenom; + type ChainId = ChainId; + type MsgFilter = MsgFilter; + type WeightToGas = WeightToGas; + type TxSigLimit = TxSigLimit; + type MaxDenomLimit = MaxDenomLimit; + type AddressPrefix = AddressPrefix; + type Context = Context; + type MsgServiceRouter = MsgServiceRouter; + type SigVerifiableTx = SigVerifiableTx; + type WeightInfo = pallet_cosmos::weights::CosmosWeight; + type AssetToDenom = AssetToDenom; + type SignModeHandler = SignModeHandler; +} + +parameter_types! { + pub const CosmwasmPalletId: PalletId = PalletId(*b"cosmwasm"); + pub const MaxContractLabelSize: u32 = 64; + pub const MaxContractTrieIdSize: u32 = Hash::len_bytes() as u32; + pub const MaxInstantiateSaltSize: u32 = 128; + pub const MaxFundsAssets: u32 = 32; + pub const CodeTableSizeLimit: u32 = 4096; + pub const CodeGlobalVariableLimit: u32 = 256; + pub const CodeParameterLimit: u32 = 128; + pub const CodeBranchTableSizeLimit: u32 = 256; + pub const CodeStorageByteDeposit: u32 = 1_000_000; + pub const ContractStorageByteReadPrice: u32 = 1; + pub const ContractStorageByteWritePrice: u32 = 1; + pub WasmCostRules: CostRules = Default::default(); +} + +pub struct AssetToDenom; +impl Convert> for AssetToDenom { + fn convert(denom: String) -> Result { + denom.parse::().map_err(|_| ()) + } +} +impl Convert for AssetToDenom { + fn convert(asset_id: AssetId) -> String { + asset_id.to_string() + } +} + +struct AccountToAddr(PhantomData); +impl Convert for AccountToAddr +where + T: pallet_cosmos::Config, +{ + fn convert(account: AccountId) -> String { + let data = if *account.0 .0.first().unwrap() == 0 { + &account.0 .0[1..] + } else { + &account.to_cosmos_address().unwrap().0[..] + }; + + let hrp = Hrp::parse(T::AddressPrefix::get()).unwrap(); + bech32::encode::(hrp, data).unwrap() + } +} +impl Convert> for AccountToAddr +where + T: pallet_cosmos::Config, +{ + fn convert(address: String) -> Result { + bech32::decode(&address) + .map(|(_hrp, data)| Self::convert(data)) + .map_err(|_| ())? + } +} +impl Convert, Result> for AccountToAddr +where + T: pallet_cosmos::Config, +{ + fn convert(address_raw: Vec) -> Result { + // Cosmos address length is 20, contract address is 32. + let account = match address_raw.len() { + 20 => T::AddressMapping::from_address_raw(H160::from_slice(&address_raw)), + 32 => AccountId::unchecked_from(H256::from_slice(&address_raw)), + _ => return Err(()), + }; + + Ok(account) + } +} + +impl pallet_cosmwasm::Config for Test { + const MAX_FRAMES: u8 = 64; + type RuntimeEvent = RuntimeEvent; + type AccountIdExtended = AccountId; + type PalletId = CosmwasmPalletId; + type MaxCodeSize = ConstU32<{ 1024 * 1024 }>; + type MaxInstrumentedCodeSize = ConstU32<{ 2 * 1024 * 1024 }>; + type MaxMessageSize = ConstU32<{ 64 * 1024 }>; + type AccountToAddr = AccountToAddr; + type AssetToDenom = AssetToDenom; + type Balance = Balance; + type AssetId = AssetId; + type Assets = Assets; + type NativeAsset = Balances; + type ChainId = ChainId; + type MaxContractLabelSize = MaxContractLabelSize; + type MaxContractTrieIdSize = MaxContractTrieIdSize; + type MaxInstantiateSaltSize = MaxInstantiateSaltSize; + type MaxFundsAssets = MaxFundsAssets; + + type CodeTableSizeLimit = CodeTableSizeLimit; + type CodeGlobalVariableLimit = CodeGlobalVariableLimit; + type CodeStackLimit = ConstU32<{ u32::MAX }>; + + type CodeParameterLimit = CodeParameterLimit; + type CodeBranchTableSizeLimit = CodeBranchTableSizeLimit; + type CodeStorageByteDeposit = CodeStorageByteDeposit; + type ContractStorageByteReadPrice = ContractStorageByteReadPrice; + type ContractStorageByteWritePrice = ContractStorageByteWritePrice; + + type WasmCostRules = WasmCostRules; + type UnixTime = Timestamp; + type WeightInfo = pallet_cosmwasm::weights::SubstrateWeight; + + // TODO: Add precompile to use execute or query pallet + type PalletHook = (); + + type UploadWasmOrigin = frame_system::EnsureSigned; + + type ExecuteWasmOrigin = frame_system::EnsureSigned; +} diff --git a/primitives/crypto/src/ecdsa.rs b/primitives/crypto/src/ecdsa.rs index 0404e12a..506bd232 100644 --- a/primitives/crypto/src/ecdsa.rs +++ b/primitives/crypto/src/ecdsa.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: Apache-2.0 diff --git a/template/runtime/build.rs b/template/runtime/build.rs index 1ad1669c..55b6afcb 100644 --- a/template/runtime/build.rs +++ b/template/runtime/build.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/template/runtime/src/accounts.rs b/template/runtime/src/accounts.rs index 6dbed49d..f850da3b 100644 --- a/template/runtime/src/accounts.rs +++ b/template/runtime/src/accounts.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later @@ -34,7 +34,7 @@ where { fn convert(account: AccountId) -> String { // TODO: Handle error - let data = if account.0 .0.first().unwrap() == &0 { + let data = if *account.0 .0.first().unwrap() == 0 { &account.0 .0[1..] } else { &account.to_cosmos_address().unwrap().0[..] diff --git a/template/runtime/src/ante.rs b/template/runtime/src/ante.rs index ed47e943..70cab4c3 100644 --- a/template/runtime/src/ante.rs +++ b/template/runtime/src/ante.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/template/runtime/src/assets.rs b/template/runtime/src/assets.rs index 25db7f5e..9e6bf041 100644 --- a/template/runtime/src/assets.rs +++ b/template/runtime/src/assets.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/template/runtime/src/compat/cosmos.rs b/template/runtime/src/compat/cosmos.rs index 065f0d0f..03e4c73d 100644 --- a/template/runtime/src/compat/cosmos.rs +++ b/template/runtime/src/compat/cosmos.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/template/runtime/src/compat.rs b/template/runtime/src/compat/mod.rs similarity index 90% rename from template/runtime/src/compat.rs rename to template/runtime/src/compat/mod.rs index f21bd8d0..f40e102f 100644 --- a/template/runtime/src/compat.rs +++ b/template/runtime/src/compat/mod.rs @@ -1,4 +1,4 @@ -// This file is part of Horizon. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later @@ -16,6 +16,4 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -//! Horizon runtime compatibility adapters. - pub mod cosmos; diff --git a/template/runtime/src/context.rs b/template/runtime/src/context.rs deleted file mode 100644 index 67388b66..00000000 --- a/template/runtime/src/context.rs +++ /dev/null @@ -1,67 +0,0 @@ -// This file is part of Horizon. - -// Copyright (C) 2023 Haderech Pte. Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -use pallet_cosmos_types::{ - events::{self, CosmosEvents, EventManager as _}, - store::{self, BasicGasMeter, Gas, GasMeter}, -}; - -#[derive(Clone, Debug, Default)] -pub struct EventManager { - events: CosmosEvents, -} - -impl events::EventManager for EventManager { - fn new() -> Self { - Self::default() - } - - fn events(&self) -> CosmosEvents { - self.events.clone() - } - - fn emit_event(&mut self, event: events::CosmosEvent) { - self.events.push(event); - } - - fn emit_events(&mut self, events: CosmosEvents) { - self.events.extend(events); - } -} - -pub struct Context { - pub gas_meter: BasicGasMeter, - pub event_manager: EventManager, -} - -impl store::Context for Context { - type GasMeter = BasicGasMeter; - type EventManager = EventManager; - - fn new(limit: Gas) -> Self { - Self { gas_meter: Self::GasMeter::new(limit), event_manager: Self::EventManager::new() } - } - - fn gas_meter(&mut self) -> &mut Self::GasMeter { - &mut self.gas_meter - } - - fn event_manager(&mut self) -> &mut Self::EventManager { - &mut self.event_manager - } -} diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index d4c99b8a..acc92216 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -32,7 +32,6 @@ mod accounts; mod ante; mod assets; mod compat; -mod context; mod msgs; mod sig_verifiable_tx; mod sign_mode_handler; @@ -69,7 +68,7 @@ use hp_crypto::EcdsaExt; use hp_rpc::{GasInfo, SimulateError, SimulateResponse}; use pallet_cosmos::{ config_preludes::{ - AddressPrefix, ChainId, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, + AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, WeightToGas, }, AddressMapping, @@ -402,7 +401,7 @@ impl pallet_cosmos::Config for Runtime { type AddressPrefix = AddressPrefix; - type Context = context::Context; + type Context = Context; } impl pallet_cosmos_accounts::Config for Runtime { diff --git a/template/runtime/src/msgs.rs b/template/runtime/src/msgs.rs index d103bc79..e1db68a4 100644 --- a/template/runtime/src/msgs.rs +++ b/template/runtime/src/msgs.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/template/runtime/src/sig_verifiable_tx.rs b/template/runtime/src/sig_verifiable_tx.rs index 90ce3201..03c8924f 100644 --- a/template/runtime/src/sig_verifiable_tx.rs +++ b/template/runtime/src/sig_verifiable_tx.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later @@ -103,6 +103,7 @@ impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVe .ok_or(SigVerifiableTxError::EmptySigners)? .sequence } else { + // TODO: Verify that the last signer is the fee payer. auth_info .signer_infos .last() diff --git a/template/runtime/src/sign_mode_handler.rs b/template/runtime/src/sign_mode_handler.rs index fda026be..e8e75ff9 100644 --- a/template/runtime/src/sign_mode_handler.rs +++ b/template/runtime/src/sign_mode_handler.rs @@ -1,4 +1,4 @@ -// This file is part of Hrozion. +// This file is part of Horizion. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later From ca0bb80415e40a655cf8eba148d42ce93c3bd2ca Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 18:11:52 +0900 Subject: [PATCH 30/55] refactor: Refactor MsgFilter --- frame/cosmos/src/lib.rs | 26 +++++++++++++++++---- frame/cosmos/src/mock.rs | 21 ++--------------- template/runtime/src/lib.rs | 46 ++++++++++--------------------------- 3 files changed, 36 insertions(+), 57 deletions(-) diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index c10eade3..d3518b4f 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -29,7 +29,15 @@ pub use self::pallet::*; use crate::weights::WeightInfo; use alloc::{string::String, vec::Vec}; use core::marker::PhantomData; -use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message, Any}; +use cosmos_sdk_proto::{ + cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, + cosmwasm::wasm::v1::{ + MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, + MsgUpdateAdmin, + }, + prost::Message, + Any, +}; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchInfo, PostDispatchInfo}, pallet_prelude::{DispatchResultWithPostInfo, InvalidTransaction, Pays}, @@ -51,7 +59,7 @@ use pallet_cosmos_types::{ tx::Account, }; use pallet_cosmos_x_auth_signing::{ - sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, + any_match, sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, }; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -181,8 +189,18 @@ pub mod pallet { pub struct MsgFilter; impl Contains for MsgFilter { - fn contains(_msg: &Any) -> bool { - false + fn contains(msg: &Any) -> bool { + any_match!( + msg, { + MsgSend => true, + MsgStoreCode => true, + MsgInstantiateContract2 => true, + MsgExecuteContract => true, + MsgMigrateContract => true, + MsgUpdateAdmin => true, + }, + false + ) } } diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index 09d1f7dc..e2d57bca 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -43,8 +43,8 @@ use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::{ config_preludes::{ - AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, - WeightToGas, + AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, MsgFilter, NativeDenom, + TxSigLimit, WeightToGas, }, AddressMapping, }; @@ -126,23 +126,6 @@ impl pallet_timestamp::Config for Test { type WeightInfo = (); } -pub struct MsgFilter; -impl Contains for MsgFilter { - fn contains(msg: &Any) -> bool { - any_match!( - msg, { - MsgSend => true, - MsgStoreCode => true, - MsgInstantiateContract2 => true, - MsgExecuteContract => true, - MsgMigrateContract => true, - MsgUpdateAdmin => true, - }, - false - ) - } -} - pub struct MsgServiceRouter(PhantomData); impl pallet_cosmos_types::msgservice::MsgServiceRouter for MsgServiceRouter where diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index acc92216..7d2f3491 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -38,15 +38,7 @@ mod sign_mode_handler; use alloc::{boxed::Box, string::String, vec::Vec}; use core::marker::PhantomData; -use cosmos_sdk_proto::{ - cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, - cosmwasm::wasm::v1::{ - MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, - MsgUpdateAdmin, - }, - prost::Message, - Any, -}; +use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; use frame_support::{ construct_runtime, derive_impl, genesis_builder_helper::{build_config, create_default_config}, @@ -54,7 +46,7 @@ use frame_support::{ parameter_types, traits::{ tokens::{fungible, Fortitude, Preservation}, - AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU8, Contains, OnTimestampSet, + AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU8, OnTimestampSet, }, weights::{ constants::{RocksDbWeight as RuntimeDbWeight, WEIGHT_REF_TIME_PER_MILLIS}, @@ -68,13 +60,12 @@ use hp_crypto::EcdsaExt; use hp_rpc::{GasInfo, SimulateError, SimulateResponse}; use pallet_cosmos::{ config_preludes::{ - AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, NativeDenom, TxSigLimit, - WeightToGas, + AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, MsgFilter, NativeDenom, + TxSigLimit, WeightToGas, }, AddressMapping, }; use pallet_cosmos_x_auth::sigverify::SECP256K1_TYPE_URL; -use pallet_cosmos_x_auth_signing::any_match; use pallet_cosmwasm::instrument::CostRules; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, @@ -341,23 +332,6 @@ impl pallet_timestamp::Config for Runtime { type WeightInfo = (); } -pub struct MsgFilter; -impl Contains for MsgFilter { - fn contains(msg: &Any) -> bool { - any_match!( - msg, { - MsgSend => true, - MsgStoreCode => true, - MsgInstantiateContract2 => true, - MsgExecuteContract => true, - MsgMigrateContract => true, - MsgUpdateAdmin => true, - }, - false - ) - } -} - impl pallet_cosmos::Config for Runtime { /// Mapping an address to an account id. type AddressMapping = compat::cosmos::HashedAddressMapping; @@ -602,10 +576,11 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { info: Self::SignedInfo, ) -> Option>> { match self { - call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => + call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => { Some(call.dispatch(RuntimeOrigin::from( pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosmos_address().unwrap()), - ))), + ))) + }, _ => None, } } @@ -651,8 +626,11 @@ impl Runtime { pk.copy_from_slice(&public_key.key); CosmosSigner(Public(pk)) }, - _ => - return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)), + _ => { + return Err(TransactionValidityError::Invalid( + InvalidTransaction::BadSigner, + )) + }, }; let balance = pallet_balances::Pallet::::reducible_balance( From 0ba2c496e9a4a082dc7d9284acfa51c2bd997ead Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 2 Sep 2024 21:36:39 +0900 Subject: [PATCH 31/55] refactor: Relocate SignModeHandler and SigVerifiableTx implementations to pallet-cosmos-x-auth-signing --- frame/accounts/src/weights.rs | 4 +- frame/cosmos/Cargo.toml | 8 - frame/cosmos/src/lib.rs | 3 +- frame/cosmos/src/mock.rs | 192 ++---------------- frame/cosmos/x/auth/signing/Cargo.toml | 24 ++- .../auth/signing/src/sign_mode_handler/mod.rs | 41 +++- .../traits.rs} | 28 +-- .../signing/src/sign_verifiable_tx/mod.rs | 30 ++- .../traits.rs} | 10 +- frame/cosmos/x/auth/src/fee.rs | 2 +- frame/cosmos/x/auth/src/sigverify.rs | 4 +- template/runtime/src/lib.rs | 25 +-- 12 files changed, 108 insertions(+), 263 deletions(-) rename template/runtime/src/sign_mode_handler.rs => frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs (92%) rename frame/cosmos/x/auth/signing/src/{sign_mode_handler.rs => sign_mode_handler/traits.rs} (67%) rename template/runtime/src/sig_verifiable_tx.rs => frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs (92%) rename frame/cosmos/x/auth/signing/src/{sign_verifiable_tx.rs => sign_verifiable_tx/traits.rs} (88%) diff --git a/frame/accounts/src/weights.rs b/frame/accounts/src/weights.rs index d80b68ca..18870d3f 100644 --- a/frame/accounts/src/weights.rs +++ b/frame/accounts/src/weights.rs @@ -29,8 +29,8 @@ pub trait WeightInfo { } /// Weights for pallet_cosmos_accounts using the Horizon node and recommended hardware. -pub struct HorizonWeight(PhantomData); -impl WeightInfo for HorizonWeight { +pub struct CosmosWeight(PhantomData); +impl WeightInfo for CosmosWeight { fn connect() -> Weight { Weight::from_parts(50_000_000, 0) .saturating_add(T::DbWeight::get().writes(1u64)) diff --git a/frame/cosmos/Cargo.toml b/frame/cosmos/Cargo.toml index 3aa3b3af..cb08bebc 100644 --- a/frame/cosmos/Cargo.toml +++ b/frame/cosmos/Cargo.toml @@ -33,7 +33,6 @@ pallet-cosmos-x-auth-signing = { workspace = true, default-features = false } [dev-dependencies] bech32 = { workspace = true, default-features = false } -serde_json = { workspace = true, default-features = false } hp-account = { workspace = true, default-features = false } hp-crypto = { workspace = true, default-features = false } @@ -43,11 +42,8 @@ pallet-cosmos = { workspace = true, default-features = false } pallet-cosmos-accounts = { workspace = true, default-features = false } pallet-cosmwasm = { workspace = true, default-features = false } pallet-timestamp = { workspace = true, default-features = false } -pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } pallet-cosmos-x-bank = { workspace = true, default-features = false } -pallet-cosmos-x-bank-types = { workspace = true, default-features = false } pallet-cosmos-x-wasm = { workspace = true, default-features = false } -pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } [features] default = ["std"] @@ -66,7 +62,6 @@ std = [ "pallet-cosmos-x-auth-signing/std", "pallet-cosmos-types/std", "bech32/std", - "serde_json/std", "hp-account/std", "hp-crypto/std", "pallet-assets/std", @@ -74,10 +69,7 @@ std = [ "pallet-cosmos-accounts/std", "pallet-cosmwasm/std", "pallet-timestamp/std", - "pallet-cosmos-x-auth-migrations/std", "pallet-cosmos-x-bank/std", - "pallet-cosmos-x-bank-types/std", "pallet-cosmos-x-wasm/std", - "pallet-cosmos-x-wasm-types/std", ] try-runtime = [] diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index d3518b4f..1eff8f83 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -59,7 +59,8 @@ use pallet_cosmos_types::{ tx::Account, }; use pallet_cosmos_x_auth_signing::{ - any_match, sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, + any_match, sign_mode_handler::traits::SignModeHandler, + sign_verifiable_tx::traits::SigVerifiableTx, }; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index e2d57bca..6fc3ead8 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -21,24 +21,14 @@ use alloc::{boxed::Box, string::String, vec::Vec}; use bech32::{Bech32, Hrp}; use core::marker::PhantomData; use cosmos_sdk_proto::{ - cosmos::{ - bank::v1beta1::MsgSend, - tx::v1beta1::{ - mode_info::{Single, Sum}, - ModeInfo, SignDoc, TxRaw, - }, - }, + cosmos::bank::v1beta1::MsgSend, cosmwasm::wasm::v1::{ MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, MsgUpdateAdmin, }, Any, }; -use frame_support::{ - derive_impl, parameter_types, - traits::{AsEnsureOriginWithArg, Contains}, - PalletId, -}; +use frame_support::{derive_impl, parameter_types, traits::AsEnsureOriginWithArg, PalletId}; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use pallet_cosmos::{ @@ -49,24 +39,15 @@ use pallet_cosmos::{ AddressMapping, }; use pallet_cosmos_types::msgservice::MsgHandler; -use pallet_cosmos_x_auth_migrations::legacytx::stdsign::StdSignDoc; use pallet_cosmos_x_auth_signing::{ - any_match, - sign_mode_handler::{SignModeHandlerError, SignerData}, - sign_verifiable_tx::SigVerifiableTxError, + any_match, sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, }; use pallet_cosmos_x_bank::msgs::MsgSendHandler; -use pallet_cosmos_x_bank_types::msgs::msg_send; use pallet_cosmos_x_wasm::msgs::{ MsgExecuteContractHandler, MsgInstantiateContract2Handler, MsgMigrateContractHandler, MsgStoreCodeHandler, MsgUpdateAdminHandler, }; -use pallet_cosmos_x_wasm_types::tx::{ - msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, - msg_update_admin, -}; use pallet_cosmwasm::instrument::CostRules; -use serde_json::{Map, Value}; use sp_core::{crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, H160, H256}; use sp_runtime::traits::{BlakeTwo256, Convert, IdentityLookup}; @@ -84,6 +65,7 @@ frame_support::construct_runtime!( Balances: pallet_balances, Cosmos: pallet_cosmos, Cosmwasm: pallet_cosmwasm, + CosmosAccounts: pallet_cosmos_accounts, Timestamp: pallet_timestamp, } ); @@ -148,90 +130,7 @@ where } } -pub struct SigVerifiableTx; -impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVerifiableTx { - fn get_signers(tx: &Tx) -> Result, SigVerifiableTxError> { - let mut signers = Vec::::new(); - - let body = tx.body.as_ref().ok_or(SigVerifiableTxError::EmptyTxBody)?; - for msg in body.messages.iter() { - let msg_signers = any_match!( - msg, { - MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - }, - Err(SigVerifiableTxError::InvalidMsg) - )?; - - for msg_signer in msg_signers.iter() { - if !signers.contains(msg_signer) { - signers.push(msg_signer.clone()); - } - } - } - - let fee_payer = &tx - .auth_info - .as_ref() - .and_then(|auth_info| auth_info.fee.as_ref()) - .ok_or(SigVerifiableTxError::EmptyFee)? - .payer; - - if !fee_payer.is_empty() && !signers.contains(fee_payer) { - signers.push(fee_payer.clone()); - } - - Ok(signers) - } - - fn fee_payer(tx: &Tx) -> Result { - let fee = tx - .auth_info - .as_ref() - .and_then(|auth_info| auth_info.fee.as_ref()) - .ok_or(SigVerifiableTxError::EmptyFee)?; - - let fee_payer = if fee.payer.is_empty() { - Self::get_signers(tx)? - .first() - .ok_or(SigVerifiableTxError::EmptySigners)? - .clone() - } else { - fee.payer.clone() - }; - - Ok(fee_payer) - } - - fn sequence(tx: &Tx) -> Result { - let auth_info = tx.auth_info.as_ref().ok_or(SigVerifiableTxError::EmptyAuthInfo)?; - let fee = auth_info.fee.as_ref().ok_or(SigVerifiableTxError::EmptyFee)?; - - let sequence = if !fee.payer.is_empty() { - auth_info - .signer_infos - .first() - .ok_or(SigVerifiableTxError::EmptySigners)? - .sequence - } else { - // TODO: Verify that the last signer is the fee payer. - auth_info - .signer_infos - .last() - .ok_or(SigVerifiableTxError::EmptySigners)? - .sequence - }; - - Ok(sequence) - } -} - pub struct HashedAddressMapping(PhantomData<(T, H)>); - impl AddressMapping for HashedAddressMapping where T: pallet_cosmos_accounts::Config, @@ -263,81 +162,9 @@ where } } -pub struct SignModeHandler; - -impl pallet_cosmos_x_auth_signing::sign_mode_handler::SignModeHandler for SignModeHandler { - fn get_sign_bytes( - mode: &ModeInfo, - data: &SignerData, - tx: &Tx, - ) -> Result, SignModeHandlerError> { - let sum = mode.sum.as_ref().ok_or(SignModeHandlerError::EmptyModeInfo)?; - let sign_bytes = match sum { - Sum::Single(Single { mode }) => match mode { - 1 /* SIGN_MODE_DIRECT */ => { - let tx_raw = TxRaw::decode(&mut &*tx.encode_to_vec()).map_err(|_| SignModeHandlerError::DecodeTxError)?; - SignDoc { - body_bytes: tx_raw.body_bytes, - auth_info_bytes: tx_raw.auth_info_bytes, - chain_id: data.chain_id.clone(), - account_number: data.account_number, - }.encode_to_vec() - }, - 127 /* SIGN_MODE_LEGACY_AMINO_JSON */ => { - let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or(SignModeHandlerError::EmptyFee)?; - let body = tx.body.as_ref().ok_or(SignModeHandlerError::EmptyTxBody)?; - - let mut coins = Vec::::new(); - for amt in fee.amount.iter() { - let mut coin = Map::new(); - coin.insert("amount".to_string(), Value::String(amt.amount.clone())); - coin.insert("denom".to_string(), Value::String(amt.denom.clone())); - - coins.push(Value::Object(coin)); - } - - let mut std_fee = Map::new(); - std_fee.insert("gas".to_string(), Value::String(fee.gas_limit.to_string())); - std_fee.insert("amount".to_string(), Value::Array(coins)); - - let mut msgs = Vec::::new(); - for msg in body.messages.iter() { - let sign_msg = any_match!( - msg, { - MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - }, - Err(SignModeHandlerError::InvalidMsg))?; - - msgs.push(sign_msg); - } - - let sign_doc = StdSignDoc { - account_number: data.account_number.to_string(), - chain_id: data.chain_id.clone(), - fee: Value::Object(std_fee), - memo: body.memo.clone(), - msgs, - sequence: data.sequence.to_string(), - }; - serde_json::to_value(sign_doc).map_err(|_| SignModeHandlerError::SerializeError)?.to_string().as_bytes().to_vec() - }, - _ => return Err(SignModeHandlerError::InvalidMode), - }, - _ => return Err(SignModeHandlerError::InvalidMode), - }; - - Ok(sign_bytes) - } -} - #[derive_impl(pallet_cosmos::config_preludes::TestDefaultConfig)] impl pallet_cosmos::Config for Test { - type AddressMapping = HashedAddressMapping; + type AddressMapping = HashedAddressMapping; type NativeAsset = Balances; type Assets = Assets; type RuntimeEvent = RuntimeEvent; @@ -388,7 +215,7 @@ impl Convert for AssetToDenom { } } -struct AccountToAddr(PhantomData); +pub struct AccountToAddr(PhantomData); impl Convert for AccountToAddr where T: pallet_cosmos::Config, @@ -471,3 +298,10 @@ impl pallet_cosmwasm::Config for Test { type ExecuteWasmOrigin = frame_system::EnsureSigned; } + +impl pallet_cosmos_accounts::Config for Test { + /// The overarching event type. + type RuntimeEvent = RuntimeEvent; + /// Weight information for extrinsics in this pallet. + type WeightInfo = pallet_cosmos_accounts::weights::CosmosWeight; +} diff --git a/frame/cosmos/x/auth/signing/Cargo.toml b/frame/cosmos/x/auth/signing/Cargo.toml index 74c997d7..8895f2b5 100644 --- a/frame/cosmos/x/auth/signing/Cargo.toml +++ b/frame/cosmos/x/auth/signing/Cargo.toml @@ -9,8 +9,28 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true } +cosmos-sdk-proto = { workspace = true, default-features = false } +serde_json = { workspace = true, default-features = false } + +pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } +pallet-cosmos-x-bank-types = { workspace = true, default-features = false } +pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } + +[dev-dependencies] +base64ct = { workspace = true, default-features = false } +hex = { workspace = true, default-features = false } + +sp-core = { workspace = true, default-features = false } [features] default = ["std"] -std = ["cosmos-sdk-proto/std"] +std = [ + "cosmos-sdk-proto/std", + "serde_json/std", + "pallet-cosmos-x-auth-migrations/std", + "pallet-cosmos-x-bank-types/std", + "pallet-cosmos-x-wasm-types/std", + "base64ct/std", + "hex/std", + "sp-core/std", +] diff --git a/template/runtime/src/sign_mode_handler.rs b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs similarity index 92% rename from template/runtime/src/sign_mode_handler.rs rename to frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs index e8e75ff9..f5fdec3a 100644 --- a/template/runtime/src/sign_mode_handler.rs +++ b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs @@ -1,4 +1,4 @@ -// This file is part of Horizion. +// This file is part of Horizon. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later @@ -16,7 +16,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::{string::ToString, vec::Vec}; +pub mod traits; + +use crate::any_match; +use alloc::{ + string::{String, ToString}, + vec::Vec, +}; use cosmos_sdk_proto::{ cosmos::{ bank::v1beta1::MsgSend, @@ -30,12 +36,9 @@ use cosmos_sdk_proto::{ MsgUpdateAdmin, }, traits::Message, + Any, }; use pallet_cosmos_x_auth_migrations::legacytx::stdsign::StdSignDoc; -use pallet_cosmos_x_auth_signing::{ - any_match, - sign_mode_handler::{SignModeHandlerError, SignerData}, -}; use pallet_cosmos_x_bank_types::msgs::msg_send; use pallet_cosmos_x_wasm_types::tx::{ msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, @@ -43,9 +46,28 @@ use pallet_cosmos_x_wasm_types::tx::{ }; use serde_json::{Map, Value}; -pub struct SignModeHandler; +#[derive(Clone)] +pub struct SignerData { + pub address: String, + pub chain_id: String, + pub account_number: u64, + pub sequence: u64, + pub pub_key: Any, +} + +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum SignModeHandlerError { + EmptyTxBody, + EmptyFee, + EmptyModeInfo, + DecodeTxError, + InvalidMsg, + InvalidMode, + SerializeError, +} -impl pallet_cosmos_x_auth_signing::sign_mode_handler::SignModeHandler for SignModeHandler { +pub struct SignModeHandler; +impl traits::SignModeHandler for SignModeHandler { fn get_sign_bytes( mode: &ModeInfo, data: &SignerData, @@ -117,7 +139,7 @@ impl pallet_cosmos_x_auth_signing::sign_mode_handler::SignModeHandler for SignMo #[cfg(test)] mod tests { - use crate::sign_mode_handler::SignModeHandler; + use crate::sign_mode_handler::{traits::SignModeHandler as _, SignModeHandler, SignerData}; use base64ct::{Base64, Encoding}; use cosmos_sdk_proto::{ cosmos::tx::v1beta1::{ @@ -126,7 +148,6 @@ mod tests { }, prost::Message, }; - use pallet_cosmos_x_auth_signing::sign_mode_handler::{SignModeHandler as _, SignerData}; use sp_core::sha2_256; #[test] diff --git a/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs b/frame/cosmos/x/auth/signing/src/sign_mode_handler/traits.rs similarity index 67% rename from frame/cosmos/x/auth/signing/src/sign_mode_handler.rs rename to frame/cosmos/x/auth/signing/src/sign_mode_handler/traits.rs index d11dda78..17b0a6f8 100644 --- a/frame/cosmos/x/auth/signing/src/sign_mode_handler.rs +++ b/frame/cosmos/x/auth/signing/src/sign_mode_handler/traits.rs @@ -16,31 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::{string::String, vec::Vec}; -use cosmos_sdk_proto::{ - cosmos::tx::v1beta1::{ModeInfo, Tx}, - Any, -}; - -#[derive(Clone)] -pub struct SignerData { - pub address: String, - pub chain_id: String, - pub account_number: u64, - pub sequence: u64, - pub pub_key: Any, -} - -#[derive(Clone, PartialEq, Eq, Debug)] -pub enum SignModeHandlerError { - EmptyTxBody, - EmptyFee, - EmptyModeInfo, - DecodeTxError, - InvalidMsg, - InvalidMode, - SerializeError, -} +use super::{SignModeHandlerError, SignerData}; +use alloc::vec::Vec; +use cosmos_sdk_proto::cosmos::tx::v1beta1::{ModeInfo, Tx}; pub trait SignModeHandler { fn get_sign_bytes( diff --git a/template/runtime/src/sig_verifiable_tx.rs b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs similarity index 92% rename from template/runtime/src/sig_verifiable_tx.rs rename to frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs index 03c8924f..041e25ba 100644 --- a/template/runtime/src/sig_verifiable_tx.rs +++ b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs @@ -1,4 +1,4 @@ -// This file is part of Horizion. +// This file is part of Horizon. // Copyright (C) 2023 Haderech Pte. Ltd. // SPDX-License-Identifier: GPL-3.0-or-later @@ -16,6 +16,9 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +pub mod traits; + +use crate::any_match; use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::{ cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, @@ -25,16 +28,23 @@ use cosmos_sdk_proto::{ }, prost::Message, }; -use pallet_cosmos_x_auth_signing::{any_match, sign_verifiable_tx::SigVerifiableTxError}; use pallet_cosmos_x_bank_types::msgs::msg_send; use pallet_cosmos_x_wasm_types::tx::{ msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, msg_update_admin, }; -pub struct SigVerifiableTx; +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum SigVerifiableTxError { + EmptyAuthInfo, + EmptyFee, + EmptySigners, + EmptyTxBody, + InvalidMsg, +} -impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVerifiableTx { +pub struct SigVerifiableTx; +impl traits::SigVerifiableTx for SigVerifiableTx { fn get_signers(tx: &Tx) -> Result, SigVerifiableTxError> { let mut signers = Vec::::new(); @@ -80,13 +90,13 @@ impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVe .and_then(|auth_info| auth_info.fee.as_ref()) .ok_or(SigVerifiableTxError::EmptyFee)?; - let fee_payer = if fee.payer.is_empty() { + let fee_payer = if !fee.payer.is_empty() { + fee.payer.clone() + } else { Self::get_signers(tx)? .first() .ok_or(SigVerifiableTxError::EmptySigners)? .clone() - } else { - fee.payer.clone() }; Ok(fee_payer) @@ -97,16 +107,16 @@ impl pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx for SigVe let fee = auth_info.fee.as_ref().ok_or(SigVerifiableTxError::EmptyFee)?; let sequence = if !fee.payer.is_empty() { + // TODO: Verify that the last signer is the fee payer. auth_info .signer_infos - .first() + .last() .ok_or(SigVerifiableTxError::EmptySigners)? .sequence } else { - // TODO: Verify that the last signer is the fee payer. auth_info .signer_infos - .last() + .first() .ok_or(SigVerifiableTxError::EmptySigners)? .sequence }; diff --git a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/traits.rs similarity index 88% rename from frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs rename to frame/cosmos/x/auth/signing/src/sign_verifiable_tx/traits.rs index 2fb266e6..5c846008 100644 --- a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx.rs +++ b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/traits.rs @@ -16,18 +16,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use super::SigVerifiableTxError; use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::cosmos::tx::v1beta1::Tx; -#[derive(Clone, PartialEq, Eq, Debug)] -pub enum SigVerifiableTxError { - EmptyAuthInfo, - EmptyFee, - EmptySigners, - EmptyTxBody, - InvalidMsg, -} - pub trait SigVerifiableTx { fn get_signers(tx: &Tx) -> Result, SigVerifiableTxError>; diff --git a/frame/cosmos/x/auth/src/fee.rs b/frame/cosmos/x/auth/src/fee.rs index ee786edf..f9dd352e 100644 --- a/frame/cosmos/x/auth/src/fee.rs +++ b/frame/cosmos/x/auth/src/fee.rs @@ -35,7 +35,7 @@ use pallet_cosmos_types::{ }, handler::AnteDecorator, }; -use pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx; +use pallet_cosmos_x_auth_signing::sign_verifiable_tx::traits::SigVerifiableTx; use sp_core::Get; use sp_runtime::{ traits::{Convert, Zero}, diff --git a/frame/cosmos/x/auth/src/sigverify.rs b/frame/cosmos/x/auth/src/sigverify.rs index 51ccd124..4f3579b6 100644 --- a/frame/cosmos/x/auth/src/sigverify.rs +++ b/frame/cosmos/x/auth/src/sigverify.rs @@ -30,8 +30,8 @@ use hp_io::cosmos::secp256k1_ecdsa_verify; use pallet_cosmos::AddressMapping; use pallet_cosmos_types::{address::acc_address_from_bech32, handler::AnteDecorator}; use pallet_cosmos_x_auth_signing::{ - sign_mode_handler::{SignModeHandler, SignerData}, - sign_verifiable_tx::SigVerifiableTx, + sign_mode_handler::{traits::SignModeHandler, SignerData}, + sign_verifiable_tx::traits::SigVerifiableTx, }; use ripemd::Digest; use sp_core::{sha2_256, Get, H160}; diff --git a/template/runtime/src/lib.rs b/template/runtime/src/lib.rs index 7d2f3491..559b0bfd 100644 --- a/template/runtime/src/lib.rs +++ b/template/runtime/src/lib.rs @@ -33,8 +33,6 @@ mod ante; mod assets; mod compat; mod msgs; -mod sig_verifiable_tx; -mod sign_mode_handler; use alloc::{boxed::Box, string::String, vec::Vec}; use core::marker::PhantomData; @@ -66,6 +64,9 @@ use pallet_cosmos::{ AddressMapping, }; use pallet_cosmos_x_auth::sigverify::SECP256K1_TYPE_URL; +use pallet_cosmos_x_auth_signing::{ + sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, +}; use pallet_cosmwasm::instrument::CostRules; use pallet_grandpa::{ fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList, @@ -363,9 +364,9 @@ impl pallet_cosmos::Config for Runtime { /// The maximum number of transaction signatures allowed. type TxSigLimit = TxSigLimit; /// Defines the features for all signature verification handlers. - type SigVerifiableTx = sig_verifiable_tx::SigVerifiableTx; + type SigVerifiableTx = SigVerifiableTx; /// Handler for managing different signature modes in transactions. - type SignModeHandler = sign_mode_handler::SignModeHandler; + type SignModeHandler = SignModeHandler; type WeightInfo = pallet_cosmos::weights::CosmosWeight; @@ -382,7 +383,7 @@ impl pallet_cosmos_accounts::Config for Runtime { /// The overarching event type. type RuntimeEvent = RuntimeEvent; /// Weight information for extrinsics in this pallet. - type WeightInfo = pallet_cosmos_accounts::weights::HorizonWeight; + type WeightInfo = pallet_cosmos_accounts::weights::CosmosWeight; } parameter_types! { @@ -576,11 +577,10 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { info: Self::SignedInfo, ) -> Option>> { match self { - call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => { + call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => Some(call.dispatch(RuntimeOrigin::from( pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosmos_address().unwrap()), - ))) - }, + ))), _ => None, } } @@ -590,7 +590,7 @@ impl Runtime { fn migrate_cosm_account(tx_bytes: &[u8]) -> Result<(), TransactionValidityError> { use cosmos_sdk_proto::cosmos::crypto::secp256k1; use fungible::{Inspect, Mutate}; - use pallet_cosmos_x_auth_signing::sign_verifiable_tx::SigVerifiableTx; + use pallet_cosmos_x_auth_signing::sign_verifiable_tx::traits::SigVerifiableTx; let tx = Tx::decode(&mut &*tx_bytes) .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Call))?; @@ -626,11 +626,8 @@ impl Runtime { pk.copy_from_slice(&public_key.key); CosmosSigner(Public(pk)) }, - _ => { - return Err(TransactionValidityError::Invalid( - InvalidTransaction::BadSigner, - )) - }, + _ => + return Err(TransactionValidityError::Invalid(InvalidTransaction::BadSigner)), }; let balance = pallet_balances::Pallet::::reducible_balance( From dc82918e76fbc4c5bed827a1b57859efb4e387cb Mon Sep 17 00:00:00 2001 From: code0xff Date: Tue, 3 Sep 2024 16:43:03 +0900 Subject: [PATCH 32/55] test: Add any_match test --- frame/cosmos/src/lib.rs | 2 ++ frame/cosmos/src/mock.rs | 10 +++++- frame/cosmos/src/tests.rs | 27 +++++++++++++++++ frame/cosmos/x/auth/signing/src/macros.rs | 37 +++++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 frame/cosmos/src/tests.rs diff --git a/frame/cosmos/src/lib.rs b/frame/cosmos/src/lib.rs index 1eff8f83..bb2bcdcb 100644 --- a/frame/cosmos/src/lib.rs +++ b/frame/cosmos/src/lib.rs @@ -23,6 +23,8 @@ extern crate alloc; #[cfg(test)] pub mod mock; +#[cfg(test)] +mod tests; pub mod weights; pub use self::pallet::*; diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index 6fc3ead8..cc529774 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -49,7 +49,10 @@ use pallet_cosmos_x_wasm::msgs::{ }; use pallet_cosmwasm::instrument::CostRules; use sp_core::{crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, H160, H256}; -use sp_runtime::traits::{BlakeTwo256, Convert, IdentityLookup}; +use sp_runtime::{ + traits::{BlakeTwo256, Convert, IdentityLookup}, + BuildStorage, +}; type Block = frame_system::mocking::MockBlock; type AssetId = u64; @@ -305,3 +308,8 @@ impl pallet_cosmos_accounts::Config for Test { /// Weight information for extrinsics in this pallet. type WeightInfo = pallet_cosmos_accounts::weights::CosmosWeight; } + +pub fn new_test_ext() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + sp_io::TestExternalities::new(t) +} diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs new file mode 100644 index 00000000..013b8bc2 --- /dev/null +++ b/frame/cosmos/src/tests.rs @@ -0,0 +1,27 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::mock::*; + +#[test] +fn pallet_cosmos_test() { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + }); +} diff --git a/frame/cosmos/x/auth/signing/src/macros.rs b/frame/cosmos/x/auth/signing/src/macros.rs index 1725db29..370075d1 100644 --- a/frame/cosmos/x/auth/signing/src/macros.rs +++ b/frame/cosmos/x/auth/signing/src/macros.rs @@ -32,3 +32,40 @@ macro_rules! any_match { } }; } + +#[cfg(test)] +mod tests { + use cosmos_sdk_proto::{ + cosmos::bank::v1beta1::MsgSend, + cosmwasm::wasm::v1::{MsgExecuteContract, MsgStoreCode}, + prost::Name, + traits::Message, + Any, + }; + + #[test] + fn any_match_test() { + let any = Any { type_url: MsgSend::type_url(), value: MsgSend::default().encode_to_vec() }; + let result = any_match!( + any, { + MsgSend => any.type_url, + MsgStoreCode => any.type_url, + }, + "Unsupported msg".to_string() + ); + assert_eq!(result, MsgSend::type_url()); + + let any = Any { + type_url: MsgExecuteContract::type_url(), + value: MsgExecuteContract::default().encode_to_vec(), + }; + let result = any_match!( + any, { + MsgSend => any.type_url, + MsgStoreCode => any.type_url, + }, + "Unsupported msg".to_string() + ); + assert_eq!(result, "Unsupported msg".to_string()); + } +} From f4cb0966ede51651912c1f8203abebae3e591135 Mon Sep 17 00:00:00 2001 From: code0xff Date: Tue, 3 Sep 2024 23:23:26 +0900 Subject: [PATCH 33/55] test: Add balances genesis state --- frame/cosmos/src/mock.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index cc529774..6f6dd25b 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -48,7 +48,9 @@ use pallet_cosmos_x_wasm::msgs::{ MsgStoreCodeHandler, MsgUpdateAdminHandler, }; use pallet_cosmwasm::instrument::CostRules; -use sp_core::{crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, H160, H256}; +use sp_core::{ + crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, Pair, H160, H256, +}; use sp_runtime::{ traits::{BlakeTwo256, Convert, IdentityLookup}, BuildStorage, @@ -310,6 +312,15 @@ impl pallet_cosmos_accounts::Config for Test { } pub fn new_test_ext() -> sp_io::TestExternalities { - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + let bob = CosmosSigner(ecdsa::Pair::from_string("//Bob", None).unwrap().public()); + + pallet_balances::GenesisConfig:: { + balances: vec![(alice, 1_000_000_000), (bob, 1_000_000_000)], + } + .assimilate_storage(&mut t) + .unwrap(); sp_io::TestExternalities::new(t) } From 7b847f4858036172539b2a289bb118679ad4d4e8 Mon Sep 17 00:00:00 2001 From: code0xff Date: Tue, 3 Sep 2024 23:36:06 +0900 Subject: [PATCH 34/55] refactor: Remove alloc dependency --- frame/cosmos/types/src/events.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/frame/cosmos/types/src/events.rs b/frame/cosmos/types/src/events.rs index 369b2b6e..af53b42e 100644 --- a/frame/cosmos/types/src/events.rs +++ b/frame/cosmos/types/src/events.rs @@ -15,8 +15,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -extern crate alloc; - #[cfg(not(feature = "std"))] use alloc::vec::Vec; #[cfg(feature = "with-codec")] From eb096a5ee98819c9b08f423aba19c2c8be047517 Mon Sep 17 00:00:00 2001 From: code0xff Date: Tue, 3 Sep 2024 23:46:27 +0900 Subject: [PATCH 35/55] refactor: Remove unused error from AddressError --- frame/cosmos/types/src/address.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/frame/cosmos/types/src/address.rs b/frame/cosmos/types/src/address.rs index 88459922..1fe611ea 100644 --- a/frame/cosmos/types/src/address.rs +++ b/frame/cosmos/types/src/address.rs @@ -23,7 +23,6 @@ use alloc::{ #[derive(Clone, PartialEq, Eq, Debug)] pub enum AddressError { Bech32Error(bech32::DecodeError), - IncorrectLength, } pub fn acc_address_from_bech32(address: &str) -> Result<(String, Vec), AddressError> { From 3784157291cdab634b6e5305407302187a5fc49d Mon Sep 17 00:00:00 2001 From: code0xff Date: Tue, 3 Sep 2024 23:59:24 +0900 Subject: [PATCH 36/55] test: Add acc_address_from_bech32_test --- frame/cosmos/types/Cargo.toml | 2 ++ frame/cosmos/types/src/address.rs | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/frame/cosmos/types/Cargo.toml b/frame/cosmos/types/Cargo.toml index 073e14d8..2a3aa4c7 100644 --- a/frame/cosmos/types/Cargo.toml +++ b/frame/cosmos/types/Cargo.toml @@ -33,6 +33,7 @@ sp-runtime = { workspace = true, default-features = false } [dev-dependencies] array-bytes = { workspace = true } base64ct = { workspace = true, features = ["alloc"] } +hex = { workspace = true, default-features = false } [features] default = ["std"] @@ -47,6 +48,7 @@ std = [ "sp-core/std", "sp-runtime-interface/std", "sp-runtime/std", + "hex/std", ] with-codec = ["parity-scale-codec", "scale-info"] with-serde = ["serde"] diff --git a/frame/cosmos/types/src/address.rs b/frame/cosmos/types/src/address.rs index 1fe611ea..5f2d50f1 100644 --- a/frame/cosmos/types/src/address.rs +++ b/frame/cosmos/types/src/address.rs @@ -30,3 +30,18 @@ pub fn acc_address_from_bech32(address: &str) -> Result<(String, Vec), Addre .map(|(hrp, data)| (hrp.to_string(), data)) .map_err(AddressError::Bech32Error) } + +#[cfg(test)] +mod tests { + use super::acc_address_from_bech32; + + #[test] + fn acc_address_from_bech32_test() { + let address = "cosmos1qd69nuwj95gta4akjgyxtj9ujmz4w8edmqysqw"; + let (hrp, address_raw) = acc_address_from_bech32(address).unwrap(); + assert_eq!(hrp, "cosmos"); + + let address_raw = hex::encode(address_raw); + assert_eq!(address_raw, "037459f1d22d10bed7b6920865c8bc96c5571f2d"); + } +} From ee82443567d492bffccf650b467b1aeca77f0391 Mon Sep 17 00:00:00 2001 From: code0xff Date: Wed, 4 Sep 2024 19:12:57 +0900 Subject: [PATCH 37/55] refactor: Refactor get_std_sign_bytes --- frame/cosmos/types/src/coin.rs | 16 ++++++++++++-- frame/cosmos/x/auth/migrations/Cargo.toml | 9 +++++++- .../x/auth/migrations/src/legacytx/stdsign.rs | 21 +++++++++++++++++-- .../auth/signing/src/sign_mode_handler/mod.rs | 21 ++++--------------- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/frame/cosmos/types/src/coin.rs b/frame/cosmos/types/src/coin.rs index ba762a2d..3c3208f0 100644 --- a/frame/cosmos/types/src/coin.rs +++ b/frame/cosmos/types/src/coin.rs @@ -16,9 +16,21 @@ // limitations under the License. use alloc::string::{String, ToString}; -use cosmos_sdk_proto::cosmos::base::v1beta1::Coin; +use serde::{Deserialize, Serialize}; -pub fn amount_to_string(amount: &[Coin]) -> String { +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Coin { + pub amount: String, + pub denom: String, +} + +impl From<&cosmos_sdk_proto::cosmos::base::v1beta1::Coin> for Coin { + fn from(coin: &cosmos_sdk_proto::cosmos::base::v1beta1::Coin) -> Self { + Self { amount: coin.amount.clone(), denom: coin.denom.clone() } + } +} + +pub fn amount_to_string(amount: &[cosmos_sdk_proto::cosmos::base::v1beta1::Coin]) -> String { let mut ret = "".to_string(); for (i, coin) in amount.iter().enumerate() { ret.push_str(&coin.amount); diff --git a/frame/cosmos/x/auth/migrations/Cargo.toml b/frame/cosmos/x/auth/migrations/Cargo.toml index 34f7f41e..3e66035e 100644 --- a/frame/cosmos/x/auth/migrations/Cargo.toml +++ b/frame/cosmos/x/auth/migrations/Cargo.toml @@ -13,6 +13,13 @@ cosmos-sdk-proto = { workspace = true, default-features = false } serde = { workspace = true, default-features = false } serde_json = { workspace = true, default-features = false } +pallet-cosmos-types = { workspace = true, default-features = false } + [features] default = ["std"] -std = ["cosmos-sdk-proto/std", "serde/std", "serde_json/std"] +std = [ + "cosmos-sdk-proto/std", + "serde/std", + "serde_json/std", + "pallet-cosmos-types/std", +] diff --git a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs index f9b80246..a1d4c4c5 100644 --- a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs +++ b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs @@ -16,7 +16,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use alloc::{string::String, vec::Vec}; +use alloc::{ + string::{String, ToString}, + vec::Vec, +}; +use cosmos_sdk_proto::cosmos::tx::v1beta1::Fee; +use pallet_cosmos_types::coin::Coin; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -24,8 +29,20 @@ use serde_json::Value; pub struct StdSignDoc { pub account_number: String, pub chain_id: String, - pub fee: Value, + pub fee: StdFee, pub memo: String, pub msgs: Vec, pub sequence: String, } + +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct StdFee { + pub amount: Vec, + pub gas: String, +} + +impl From<&Fee> for StdFee { + fn from(fee: &Fee) -> Self { + Self { amount: fee.amount.iter().map(Into::into).collect(), gas: fee.gas_limit.to_string() } + } +} diff --git a/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs index f5fdec3a..3bd3d4fc 100644 --- a/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs +++ b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs @@ -44,7 +44,7 @@ use pallet_cosmos_x_wasm_types::tx::{ msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, msg_update_admin, }; -use serde_json::{Map, Value}; +use serde_json::Value; #[derive(Clone)] pub struct SignerData { @@ -86,22 +86,7 @@ impl traits::SignModeHandler for SignModeHandler { }.encode_to_vec() }, 127 /* SIGN_MODE_LEGACY_AMINO_JSON */ => { - let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or(SignModeHandlerError::EmptyFee)?; let body = tx.body.as_ref().ok_or(SignModeHandlerError::EmptyTxBody)?; - - let mut coins = Vec::::new(); - for amt in fee.amount.iter() { - let mut coin = Map::new(); - coin.insert("amount".to_string(), Value::String(amt.amount.clone())); - coin.insert("denom".to_string(), Value::String(amt.denom.clone())); - - coins.push(Value::Object(coin)); - } - - let mut std_fee = Map::new(); - std_fee.insert("gas".to_string(), Value::String(fee.gas_limit.to_string())); - std_fee.insert("amount".to_string(), Value::Array(coins)); - let mut msgs = Vec::::new(); for msg in body.messages.iter() { let sign_msg = any_match!( @@ -118,10 +103,12 @@ impl traits::SignModeHandler for SignModeHandler { msgs.push(sign_msg); } + let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or(SignModeHandlerError::EmptyFee)?; + let sign_doc = StdSignDoc { account_number: data.account_number.to_string(), chain_id: data.chain_id.clone(), - fee: Value::Object(std_fee), + fee: fee.into(), memo: body.memo.clone(), msgs, sequence: data.sequence.to_string(), From d4c300ffd4228f5c75b72420848592d364b56ffe Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 5 Sep 2024 12:28:06 +0900 Subject: [PATCH 38/55] refactor: Refactor get_sign_bytes and get_signers --- frame/cosmos/types/src/lib.rs | 1 + frame/cosmos/types/src/tx_msgs.rs | 22 ++ .../x/auth/migrations/src/legacytx/stdsign.rs | 11 + frame/cosmos/x/auth/signing/Cargo.toml | 2 + .../auth/signing/src/sign_mode_handler/mod.rs | 34 +-- .../signing/src/sign_verifiable_tx/mod.rs | 28 +- frame/cosmos/x/bank/types/Cargo.toml | 17 +- frame/cosmos/x/bank/types/src/msgs.rs | 61 ++-- frame/cosmos/x/wasm/types/Cargo.toml | 10 +- frame/cosmos/x/wasm/types/src/tx.rs | 261 ++++++++++-------- 10 files changed, 267 insertions(+), 180 deletions(-) create mode 100644 frame/cosmos/types/src/tx_msgs.rs diff --git a/frame/cosmos/types/src/lib.rs b/frame/cosmos/types/src/lib.rs index 3bdce5a0..6f03a6a8 100644 --- a/frame/cosmos/types/src/lib.rs +++ b/frame/cosmos/types/src/lib.rs @@ -27,3 +27,4 @@ pub mod handler; pub mod msgservice; pub mod store; pub mod tx; +pub mod tx_msgs; diff --git a/frame/cosmos/types/src/tx_msgs.rs b/frame/cosmos/types/src/tx_msgs.rs new file mode 100644 index 00000000..03042d5e --- /dev/null +++ b/frame/cosmos/types/src/tx_msgs.rs @@ -0,0 +1,22 @@ +// This file is part of Horizon. + +// Copyright (C) 2023 Haderech Pte. Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use alloc::{string::String, vec::Vec}; + +pub trait Msg { + fn get_signers(self) -> Vec; +} diff --git a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs index a1d4c4c5..ed88d3d8 100644 --- a/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs +++ b/frame/cosmos/x/auth/migrations/src/legacytx/stdsign.rs @@ -46,3 +46,14 @@ impl From<&Fee> for StdFee { Self { amount: fee.amount.iter().map(Into::into).collect(), gas: fee.gas_limit.to_string() } } } + +pub trait LegacyMsg { + const AMINO_NAME: &'static str; + + fn get_sign_bytes(self) -> Value + where + Self: Sized + Serialize, + { + serde_json::json!({"type": Self::AMINO_NAME.to_string(), "value": serde_json::to_value(self).unwrap()}) + } +} diff --git a/frame/cosmos/x/auth/signing/Cargo.toml b/frame/cosmos/x/auth/signing/Cargo.toml index 8895f2b5..802b23e3 100644 --- a/frame/cosmos/x/auth/signing/Cargo.toml +++ b/frame/cosmos/x/auth/signing/Cargo.toml @@ -12,6 +12,7 @@ targets = ["x86_64-unknown-linux-gnu"] cosmos-sdk-proto = { workspace = true, default-features = false } serde_json = { workspace = true, default-features = false } +pallet-cosmos-types = { workspace = true, default-features = false } pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } pallet-cosmos-x-bank-types = { workspace = true, default-features = false } pallet-cosmos-x-wasm-types = { workspace = true, default-features = false } @@ -27,6 +28,7 @@ default = ["std"] std = [ "cosmos-sdk-proto/std", "serde_json/std", + "pallet-cosmos-types/std", "pallet-cosmos-x-auth-migrations/std", "pallet-cosmos-x-bank-types/std", "pallet-cosmos-x-wasm-types/std", diff --git a/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs index 3bd3d4fc..e5d83495 100644 --- a/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs +++ b/frame/cosmos/x/auth/signing/src/sign_mode_handler/mod.rs @@ -25,24 +25,22 @@ use alloc::{ }; use cosmos_sdk_proto::{ cosmos::{ - bank::v1beta1::MsgSend, + bank, tx::v1beta1::{ mode_info::{Single, Sum}, ModeInfo, SignDoc, Tx, TxRaw, }, }, - cosmwasm::wasm::v1::{ - MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, - MsgUpdateAdmin, - }, + cosmwasm::wasm, traits::Message, Any, }; -use pallet_cosmos_x_auth_migrations::legacytx::stdsign::StdSignDoc; -use pallet_cosmos_x_bank_types::msgs::msg_send; +use pallet_cosmos_x_auth_migrations::legacytx::stdsign::{LegacyMsg, StdSignDoc}; +use pallet_cosmos_x_bank_types::msgs::msg_send::MsgSend; use pallet_cosmos_x_wasm_types::tx::{ - msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, - msg_update_admin, + msg_execute_contract::MsgExecuteContract, msg_instantiate_contract2::MsgInstantiateContract2, + msg_migrate_contract::MsgMigrateContract, msg_store_code::MsgStoreCode, + msg_update_admin::MsgUpdateAdmin, }; use serde_json::Value; @@ -89,22 +87,20 @@ impl traits::SignModeHandler for SignModeHandler { let body = tx.body.as_ref().ok_or(SignModeHandlerError::EmptyTxBody)?; let mut msgs = Vec::::new(); for msg in body.messages.iter() { - let sign_msg = any_match!( + let legacy_msg = any_match!( msg, { - MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), - MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + bank::v1beta1::MsgSend => MsgSend::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + wasm::v1::MsgStoreCode => MsgStoreCode::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + wasm::v1::MsgInstantiateContract2 => MsgInstantiateContract2::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + wasm::v1::MsgExecuteContract => MsgExecuteContract::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + wasm::v1::MsgMigrateContract => MsgMigrateContract::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), + wasm::v1::MsgUpdateAdmin => MsgUpdateAdmin::try_from(msg).map(LegacyMsg::get_sign_bytes).map_err(|_| SignModeHandlerError::InvalidMsg), }, Err(SignModeHandlerError::InvalidMsg))?; - msgs.push(sign_msg); + msgs.push(legacy_msg); } - let fee = tx.auth_info.as_ref().and_then(|auth_info| auth_info.fee.as_ref()).ok_or(SignModeHandlerError::EmptyFee)?; - let sign_doc = StdSignDoc { account_number: data.account_number.to_string(), chain_id: data.chain_id.clone(), diff --git a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs index 041e25ba..c2c770ef 100644 --- a/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs +++ b/frame/cosmos/x/auth/signing/src/sign_verifiable_tx/mod.rs @@ -21,17 +21,15 @@ pub mod traits; use crate::any_match; use alloc::{string::String, vec::Vec}; use cosmos_sdk_proto::{ - cosmos::{bank::v1beta1::MsgSend, tx::v1beta1::Tx}, - cosmwasm::wasm::v1::{ - MsgExecuteContract, MsgInstantiateContract2, MsgMigrateContract, MsgStoreCode, - MsgUpdateAdmin, - }, - prost::Message, + cosmos::{bank, tx::v1beta1::Tx}, + cosmwasm::wasm, }; -use pallet_cosmos_x_bank_types::msgs::msg_send; +use pallet_cosmos_types::tx_msgs::Msg; +use pallet_cosmos_x_bank_types::msgs::msg_send::MsgSend; use pallet_cosmos_x_wasm_types::tx::{ - msg_execute_contract, msg_instantiate_contract2, msg_migrate_contract, msg_store_code, - msg_update_admin, + msg_execute_contract::MsgExecuteContract, msg_instantiate_contract2::MsgInstantiateContract2, + msg_migrate_contract::MsgMigrateContract, msg_store_code::MsgStoreCode, + msg_update_admin::MsgUpdateAdmin, }; #[derive(Clone, PartialEq, Eq, Debug)] @@ -52,12 +50,12 @@ impl traits::SigVerifiableTx for SigVerifiableTx { for msg in body.messages.iter() { let msg_signers = any_match!( msg, { - MsgSend => MsgSend::decode(&mut &*msg.value).as_ref().map(msg_send::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgStoreCode => MsgStoreCode::decode(&mut &*msg.value).as_ref().map(msg_store_code::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgInstantiateContract2 => MsgInstantiateContract2::decode(&mut &*msg.value).as_ref().map(msg_instantiate_contract2::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgExecuteContract => MsgExecuteContract::decode(&mut &*msg.value).as_ref().map(msg_execute_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgMigrateContract => MsgMigrateContract::decode(&mut &*msg.value).as_ref().map(msg_migrate_contract::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), - MsgUpdateAdmin => MsgUpdateAdmin::decode(&mut &*msg.value).as_ref().map(msg_update_admin::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + bank::v1beta1::MsgSend => MsgSend::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + wasm::v1::MsgStoreCode => MsgStoreCode::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + wasm::v1::MsgInstantiateContract2 => MsgInstantiateContract2::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + wasm::v1::MsgExecuteContract => MsgExecuteContract::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + wasm::v1::MsgMigrateContract => MsgMigrateContract::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), + wasm::v1::MsgUpdateAdmin => MsgUpdateAdmin::try_from(msg).map(Msg::get_signers).map_err(|_| SigVerifiableTxError::InvalidMsg), }, Err(SigVerifiableTxError::InvalidMsg) )?; diff --git a/frame/cosmos/x/bank/types/Cargo.toml b/frame/cosmos/x/bank/types/Cargo.toml index ac20ad55..08f2e66f 100644 --- a/frame/cosmos/x/bank/types/Cargo.toml +++ b/frame/cosmos/x/bank/types/Cargo.toml @@ -9,14 +9,18 @@ repository = "https://github.com/noirhq/horizon/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -cosmos-sdk-proto = { workspace = true } -parity-scale-codec = { workspace = true, features = [ +cosmos-sdk-proto = { workspace = true, default-features = false } +parity-scale-codec = { workspace = true, default-features = false, features = [ "derive", ], optional = true } -scale-info = { workspace = true, optional = true } -serde_json = { workspace = true } +scale-info = { workspace = true, default-features = false, optional = true } +serde = { workspace = true, default-features = false } +serde_json = { workspace = true, default-features = false } -pallet-cosmos-types = { workspace = true, features = ["with-codec"] } +pallet-cosmos-types = { workspace = true, default-features = false, features = [ + "with-codec", +] } +pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } [features] default = ["std"] @@ -24,6 +28,9 @@ std = [ "cosmos-sdk-proto/std", "parity-scale-codec/std", "scale-info/std", + "serde/std", + "serde_json/std", "pallet-cosmos-types/std", + "pallet-cosmos-x-auth-migrations/std", ] with-codec = ["parity-scale-codec", "scale-info"] diff --git a/frame/cosmos/x/bank/types/src/msgs.rs b/frame/cosmos/x/bank/types/src/msgs.rs index 1ce7f3f9..ce103c43 100644 --- a/frame/cosmos/x/bank/types/src/msgs.rs +++ b/frame/cosmos/x/bank/types/src/msgs.rs @@ -15,41 +15,42 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::{string::String, vec, vec::Vec}; +use cosmos_sdk_proto::{cosmos::bank, prost::Message, Any}; +use pallet_cosmos_types::{coin::Coin, tx_msgs::Msg}; +use pallet_cosmos_x_auth_migrations::legacytx::stdsign::LegacyMsg; +use serde::{Deserialize, Serialize}; + pub mod msg_send { - use alloc::{ - string::{String, ToString}, - vec, - vec::Vec, - }; - use cosmos_sdk_proto::cosmos::bank::v1beta1::MsgSend; - use serde_json::{Map, Value}; - - const AMINO_NAME: &str = "cosmos-sdk/MsgSend"; - - pub fn get_sign_bytes(msg: &MsgSend) -> Value { - let mut value = Map::new(); - value.insert("from_address".to_string(), Value::String(msg.from_address.clone())); - value.insert("to_address".to_string(), Value::String(msg.to_address.clone())); - - let mut coins = Vec::::new(); - for amt in msg.amount.iter() { - let mut coin = Map::new(); - coin.insert("amount".to_string(), Value::String(amt.amount.clone())); - coin.insert("denom".to_string(), Value::String(amt.denom.clone())); - - coins.push(Value::Object(coin)); - } + use super::*; - value.insert("amount".to_string(), Value::Array(coins)); + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgSend { + amount: Vec, + from_address: String, + to_address: String, + } - let mut legacy_msg = Map::new(); - legacy_msg.insert("type".to_string(), Value::String(AMINO_NAME.to_string())); - legacy_msg.insert("value".to_string(), Value::Object(value)); + impl TryFrom<&Any> for MsgSend { + type Error = (); - Value::Object(legacy_msg) + fn try_from(any: &Any) -> Result { + let msg = bank::v1beta1::MsgSend::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { + amount: msg.amount.iter().map(Into::into).collect(), + from_address: msg.from_address, + to_address: msg.to_address, + }) + } + } + + impl Msg for MsgSend { + fn get_signers(self) -> Vec { + vec![self.from_address.clone()] + } } - pub fn get_signers(msg: &MsgSend) -> Vec { - vec![msg.from_address.clone()] + impl LegacyMsg for MsgSend { + const AMINO_NAME: &'static str = "cosmos-sdk/MsgSend"; } } diff --git a/frame/cosmos/x/wasm/types/Cargo.toml b/frame/cosmos/x/wasm/types/Cargo.toml index 99b19ad9..5007c629 100644 --- a/frame/cosmos/x/wasm/types/Cargo.toml +++ b/frame/cosmos/x/wasm/types/Cargo.toml @@ -12,10 +12,18 @@ targets = ["x86_64-unknown-linux-gnu"] cosmos-sdk-proto = { workspace = true, default-features = false, features = [ "cosmwasm", ] } +serde = { workspace = true, default-features = false } serde_json = { workspace = true, default-features = false } pallet-cosmos-types = { workspace = true, default-features = false } +pallet-cosmos-x-auth-migrations = { workspace = true, default-features = false } [features] default = ["std"] -std = ["cosmos-sdk-proto/std", "serde_json/std", "pallet-cosmos-types/std"] +std = [ + "cosmos-sdk-proto/std", + "serde/std", + "serde_json/std", + "pallet-cosmos-types/std", + "pallet-cosmos-x-auth-migrations/std", +] diff --git a/frame/cosmos/x/wasm/types/src/tx.rs b/frame/cosmos/x/wasm/types/src/tx.rs index 858fc356..a1370769 100644 --- a/frame/cosmos/x/wasm/types/src/tx.rs +++ b/frame/cosmos/x/wasm/types/src/tx.rs @@ -15,160 +15,201 @@ // See the License for the specific language governing permissions and // limitations under the License. -use alloc::{ - string::{String, ToString}, - vec, - vec::Vec, -}; -use serde_json::{Map, Value}; +use alloc::{string::String, vec, vec::Vec}; +use cosmos_sdk_proto::{cosmwasm::wasm, prost::Message, Any}; +use pallet_cosmos_types::{coin::Coin, tx_msgs::Msg}; +use pallet_cosmos_x_auth_migrations::legacytx::stdsign::LegacyMsg; +use serde::{Deserialize, Serialize}; pub mod msg_store_code { use super::*; - use cosmos_sdk_proto::cosmwasm::wasm::v1::MsgStoreCode; - - pub fn get_sign_bytes(msg: &MsgStoreCode) -> Value { - let mut value = Map::new(); - value.insert("sender".to_string(), Value::String(msg.sender.clone())); - value.insert("wasm_byte_code".to_string(), Value::from(msg.wasm_byte_code.clone())); - - if let Some(config) = msg.instantiate_permission.clone() { - let mut permission = Map::new(); - permission.insert("permission".to_string(), Value::from(config.permission)); - permission.insert( - "addresses".to_string(), - Value::Array( - config.addresses.into_iter().map(Value::String).collect::>(), - ), - ); - - value.insert("instantiate_permission".to_string(), Value::Object(permission)); - } else { - value.insert("instantiate_permission".to_string(), Value::Null); + + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct AccessConfig { + pub addresses: Vec, + pub permission: i32, + } + + impl From for AccessConfig { + fn from(config: wasm::v1::AccessConfig) -> Self { + Self { addresses: config.addresses, permission: config.permission } + } + } + + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgStoreCode { + pub instantiate_permission: Option, + pub sender: String, + pub wasm_byte_code: Vec, + } + + impl TryFrom<&Any> for MsgStoreCode { + type Error = (); + + fn try_from(any: &Any) -> Result { + let msg = wasm::v1::MsgStoreCode::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { + instantiate_permission: msg.instantiate_permission.map(Into::into), + sender: msg.sender, + wasm_byte_code: msg.wasm_byte_code, + }) } + } - Value::Object(value) + impl LegacyMsg for MsgStoreCode { + const AMINO_NAME: &'static str = "wasm/MsgStoreCode"; } - pub fn get_signers(msg: &MsgStoreCode) -> Vec { - vec![msg.sender.clone()] + impl Msg for MsgStoreCode { + fn get_signers(self) -> Vec { + vec![self.sender.clone()] + } } } pub mod msg_instantiate_contract2 { use super::*; - use cosmos_sdk_proto::cosmwasm::wasm::v1::MsgInstantiateContract2; - - pub fn get_sign_bytes(msg: &MsgInstantiateContract2) -> Value { - let mut value = Map::new(); - - value.insert("sender".to_string(), Value::String(msg.sender.clone())); - value.insert("admin".to_string(), Value::String(msg.admin.clone())); - value.insert("code_id".to_string(), Value::from(msg.code_id)); - value.insert("label".to_string(), Value::String(msg.label.clone())); - value.insert( - "msg".to_string(), - Value::Array(msg.msg.clone().into_iter().map(Value::from).collect::>()), - ); - let funds = msg - .funds - .clone() - .into_iter() - .map(|coin| { - let mut fund = Map::new(); - fund.insert("denom".to_string(), Value::String(coin.denom.clone())); - fund.insert("amount".to_string(), Value::String(coin.amount.clone())); - fund + + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgInstantiateContract2 { + pub admin: String, + pub code_id: u64, + pub fix_msg: bool, + pub funds: Vec, + pub label: String, + pub msg: Vec, + pub salt: Vec, + pub sender: String, + } + + impl TryFrom<&Any> for MsgInstantiateContract2 { + type Error = (); + + fn try_from(any: &Any) -> Result { + let msg = + wasm::v1::MsgInstantiateContract2::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { + admin: msg.admin, + code_id: msg.code_id, + fix_msg: msg.fix_msg, + funds: msg.funds.iter().map(Into::into).collect(), + label: msg.label, + msg: msg.msg, + salt: msg.salt, + sender: msg.sender, }) - .map(Value::Object) - .collect::>(); - value.insert("funds".to_string(), Value::Array(funds)); - value.insert( - "salt".to_string(), - Value::Array(msg.salt.clone().into_iter().map(Value::from).collect::>()), - ); - value.insert("fix_msg".to_string(), Value::Bool(msg.fix_msg)); + } + } - Value::Object(value) + impl LegacyMsg for MsgInstantiateContract2 { + const AMINO_NAME: &'static str = "wasm/MsgInstantiateContract2"; } - pub fn get_signers(msg: &MsgInstantiateContract2) -> Vec { - vec![msg.sender.clone()] + impl Msg for MsgInstantiateContract2 { + fn get_signers(self) -> Vec { + vec![self.sender.clone()] + } } } pub mod msg_execute_contract { use super::*; - use cosmos_sdk_proto::cosmwasm::wasm::v1::MsgExecuteContract; - - pub fn get_sign_bytes(msg: &MsgExecuteContract) -> Value { - let mut value = Map::new(); - - value.insert("sender".to_string(), Value::String(msg.sender.clone())); - value.insert("contract".to_string(), Value::String(msg.contract.clone())); - value.insert( - "msg".to_string(), - Value::Array(msg.msg.clone().into_iter().map(Value::from).collect::>()), - ); - let funds = msg - .funds - .clone() - .into_iter() - .map(|coin| { - let mut fund = Map::new(); - fund.insert("denom".to_string(), Value::String(coin.denom.clone())); - fund.insert("amount".to_string(), Value::String(coin.amount.clone())); - fund + + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgExecuteContract { + pub contract: String, + pub funds: Vec, + pub msg: Vec, + pub sender: String, + } + + impl TryFrom<&Any> for MsgExecuteContract { + type Error = (); + + fn try_from(any: &Any) -> Result { + let msg = wasm::v1::MsgExecuteContract::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { + contract: msg.contract, + funds: msg.funds.iter().map(Into::into).collect(), + msg: msg.msg, + sender: msg.sender, }) - .map(Value::Object) - .collect::>(); - value.insert("funds".to_string(), Value::Array(funds)); + } + } - Value::Object(value) + impl LegacyMsg for MsgExecuteContract { + const AMINO_NAME: &'static str = "wasm/MsgExecuteContract"; } - pub fn get_signers(msg: &MsgExecuteContract) -> Vec { - vec![msg.sender.clone()] + impl Msg for MsgExecuteContract { + fn get_signers(self) -> Vec { + vec![self.sender.clone()] + } } } pub mod msg_migrate_contract { use super::*; - use cosmos_sdk_proto::cosmwasm::wasm::v1::MsgMigrateContract; - pub fn get_sign_bytes(msg: &MsgMigrateContract) -> Value { - let mut value = Map::new(); + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgMigrateContract { + pub code_id: u64, + pub contract: String, + pub msg: Vec, + pub sender: String, + } + + impl TryFrom<&Any> for MsgMigrateContract { + type Error = (); - value.insert("sender".to_string(), Value::String(msg.sender.clone())); - value.insert("contract".to_string(), Value::String(msg.contract.clone())); - value.insert("code_id".to_string(), Value::from(msg.code_id)); - value.insert( - "msg".to_string(), - Value::Array(msg.msg.clone().into_iter().map(Value::from).collect::>()), - ); + fn try_from(any: &Any) -> Result { + let msg = wasm::v1::MsgMigrateContract::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { + code_id: msg.code_id, + contract: msg.contract, + msg: msg.msg, + sender: msg.sender, + }) + } + } - Value::Object(value) + impl LegacyMsg for MsgMigrateContract { + const AMINO_NAME: &'static str = "wasm/MsgMigrateContract"; } - pub fn get_signers(msg: &MsgMigrateContract) -> Vec { - vec![msg.sender.clone()] + impl Msg for MsgMigrateContract { + fn get_signers(self) -> Vec { + vec![self.sender.clone()] + } } } pub mod msg_update_admin { use super::*; - use cosmos_sdk_proto::cosmwasm::wasm::v1::MsgUpdateAdmin; - pub fn get_sign_bytes(msg: &MsgUpdateAdmin) -> Value { - let mut value: Map = Map::new(); + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + pub struct MsgUpdateAdmin { + pub contract: String, + pub new_admin: String, + pub sender: String, + } - value.insert("sender".to_string(), Value::String(msg.sender.clone())); - value.insert("new_admin".to_string(), Value::String(msg.new_admin.clone())); - value.insert("contract".to_string(), Value::String(msg.contract.clone())); + impl TryFrom<&Any> for MsgUpdateAdmin { + type Error = (); - Value::Object(value) + fn try_from(any: &Any) -> Result { + let msg = wasm::v1::MsgUpdateAdmin::decode(&mut &*any.value).map_err(|_| ())?; + Ok(Self { contract: msg.contract, new_admin: msg.new_admin, sender: msg.sender }) + } + } + + impl LegacyMsg for MsgUpdateAdmin { + const AMINO_NAME: &'static str = "wasm/MsgUpdateAdmin"; } - pub fn get_signers(msg: &MsgUpdateAdmin) -> Vec { - vec![msg.sender.clone()] + impl Msg for MsgUpdateAdmin { + fn get_signers(self) -> Vec { + vec![self.sender.clone()] + } } } From 33bc852af80b5f6779d2a93c09ae1a68c48c4e08 Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 5 Sep 2024 18:50:28 +0900 Subject: [PATCH 39/55] test: Implement SelfContainedCall for RuntimeCall --- frame/cosmos/Cargo.toml | 7 +++ frame/cosmos/src/mock.rs | 102 ++++++++++++++++++++++++++++++-------- frame/cosmos/src/tests.rs | 18 ++++++- 3 files changed, 105 insertions(+), 22 deletions(-) diff --git a/frame/cosmos/Cargo.toml b/frame/cosmos/Cargo.toml index cb08bebc..d8b75e73 100644 --- a/frame/cosmos/Cargo.toml +++ b/frame/cosmos/Cargo.toml @@ -32,8 +32,13 @@ pallet-cosmos-types = { workspace = true, default-features = false, features = [ pallet-cosmos-x-auth-signing = { workspace = true, default-features = false } [dev-dependencies] +base64ct = { workspace = true, default-features = false } bech32 = { workspace = true, default-features = false } +fp-self-contained = { workspace = true, default-features = false, features = [ + "serde", +] } + hp-account = { workspace = true, default-features = false } hp-crypto = { workspace = true, default-features = false } @@ -61,7 +66,9 @@ std = [ "hp-io/std", "pallet-cosmos-x-auth-signing/std", "pallet-cosmos-types/std", + "base64ct/std", "bech32/std", + "fp-self-contained/std", "hp-account/std", "hp-crypto/std", "pallet-assets/std", diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index 6f6dd25b..2325f1f3 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -31,13 +31,7 @@ use cosmos_sdk_proto::{ use frame_support::{derive_impl, parameter_types, traits::AsEnsureOriginWithArg, PalletId}; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; -use pallet_cosmos::{ - config_preludes::{ - AddressPrefix, ChainId, Context, MaxDenomLimit, MaxMemoCharacters, MsgFilter, NativeDenom, - TxSigLimit, WeightToGas, - }, - AddressMapping, -}; +use pallet_cosmos::{config_preludes::ChainId, AddressMapping}; use pallet_cosmos_types::msgservice::MsgHandler; use pallet_cosmos_x_auth_signing::{ any_match, sign_mode_handler::SignModeHandler, sign_verifiable_tx::SigVerifiableTx, @@ -52,7 +46,7 @@ use sp_core::{ crypto::UncheckedFrom, ecdsa, ConstU128, ConstU32, ConstU64, Hasher, Pair, H160, H256, }; use sp_runtime::{ - traits::{BlakeTwo256, Convert, IdentityLookup}, + traits::{BlakeTwo256, Convert, IdentityLookup, PostDispatchInfoOf}, BuildStorage, }; @@ -77,10 +71,12 @@ frame_support::construct_runtime!( #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type AccountId = CosmosSigner; + type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; - type AccountData = pallet_balances::AccountData; + type AccountData = pallet_balances::AccountData; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; } #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] @@ -176,15 +172,6 @@ impl pallet_cosmos::Config for Test { type AnteHandler = (); type Balance = Balance; type AssetId = AssetId; - type MaxMemoCharacters = MaxMemoCharacters; - type NativeDenom = NativeDenom; - type ChainId = ChainId; - type MsgFilter = MsgFilter; - type WeightToGas = WeightToGas; - type TxSigLimit = TxSigLimit; - type MaxDenomLimit = MaxDenomLimit; - type AddressPrefix = AddressPrefix; - type Context = Context; type MsgServiceRouter = MsgServiceRouter; type SigVerifiableTx = SigVerifiableTx; type WeightInfo = pallet_cosmos::weights::CosmosWeight; @@ -311,6 +298,73 @@ impl pallet_cosmos_accounts::Config for Test { type WeightInfo = pallet_cosmos_accounts::weights::CosmosWeight; } +impl fp_self_contained::SelfContainedCall for RuntimeCall { + type SignedInfo = AccountId; + + fn is_self_contained(&self) -> bool { + match self { + RuntimeCall::Cosmos(call) => call.is_self_contained(), + _ => false, + } + } + + fn check_self_contained(&self) -> Option> { + match self { + RuntimeCall::Cosmos(call) => match call.check_self_contained()? { + Ok(address) => Some(Ok( + ::AddressMapping::from_address_raw(address), + )), + Err(e) => Some(Err(e)), + }, + _ => None, + } + } + + fn validate_self_contained( + &self, + info: &Self::SignedInfo, + dispatch_info: &DispatchInfoOf, + len: usize, + ) -> Option { + match self { + RuntimeCall::Cosmos(call) => { + call.validate_self_contained(&info.to_cosmos_address().unwrap(), dispatch_info, len) + }, + _ => None, + } + } + + fn pre_dispatch_self_contained( + &self, + info: &Self::SignedInfo, + dispatch_info: &DispatchInfoOf, + len: usize, + ) -> Option> { + match self { + RuntimeCall::Cosmos(call) => call.pre_dispatch_self_contained( + &info.to_cosmos_address().unwrap(), + dispatch_info, + len, + ), + _ => None, + } + } + + fn apply_self_contained( + self, + info: Self::SignedInfo, + ) -> Option>> { + match self { + call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => { + Some(call.dispatch(RuntimeOrigin::from( + pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosmos_address().unwrap()), + ))) + }, + _ => None, + } + } +} + pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); @@ -318,9 +372,17 @@ pub fn new_test_ext() -> sp_io::TestExternalities { let bob = CosmosSigner(ecdsa::Pair::from_string("//Bob", None).unwrap().public()); pallet_balances::GenesisConfig:: { - balances: vec![(alice, 1_000_000_000), (bob, 1_000_000_000)], + balances: vec![(alice, 1_000_000_000_000_000_000), (bob, 1_000_000_000_000_000_000)], + } + .assimilate_storage(&mut t) + .unwrap(); + pallet_assets::GenesisConfig:: { + assets: vec![(0, alice, true, 1_000)], + metadata: vec![(0, "stake".as_bytes().to_vec(), "stake".as_bytes().to_vec(), 18)], + accounts: vec![(0, alice, 1_000_000_000_000_000_000)], } .assimilate_storage(&mut t) .unwrap(); + sp_io::TestExternalities::new(t) } diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index 013b8bc2..e83ff63e 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -16,12 +16,26 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::mock::*; +use crate::{mock::*, RawOrigin}; +use base64ct::{Base64, Encoding}; +use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; +use frame_support::{assert_err, assert_ok}; +use hp_account::CosmosSigner; +use hp_crypto::EcdsaExt; +use sp_core::{ecdsa, Pair}; #[test] -fn pallet_cosmos_test() { +fn pallet_cosmos_msg_send_test() { new_test_ext().execute_with(|| { System::set_block_number(1); System::reset_events(); + + let tx_raw = "CpoBCpcBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEncKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxItY29zbW9zMW41amd4NjR6dzM4c3M3Nm16dXU0dWM3amV5cXcydmZqazYwZmR6GhcKBGFjZHQSDzEwMDAwMDAwMDAwMDAwMBJsCk4KRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiECChCRNB/lZkv6F4LV4Ed5aJBoyRawTLNl7DFTdVaE2aESBAoCCH8SGgoSCgRhY2R0EgoxMDQwMDAwMDAwEIDa8esEGkBgXIiPoBpecG7QpKDJPaztFogqvmxjDHF5ORfWBrOoSzf0+AAmch1CXrG4OmiKL0y8v9ITx0QzWYUc7ueXcdIm"; + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + let alice_address = alice.to_cosmos_address().unwrap(); + + assert_ok!(Cosmos::transact(RuntimeOrigin::from(RawOrigin::CosmosTransaction(alice_address)), tx_bytes)); }); } From a109fee47545153473c886be1668e50bfe90013f Mon Sep 17 00:00:00 2001 From: code0xff Date: Thu, 5 Sep 2024 22:12:41 +0900 Subject: [PATCH 40/55] test: Fix origin issue --- frame/cosmos/src/mock.rs | 11 +++++------ frame/cosmos/src/tests.rs | 6 ++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index 2325f1f3..67fbb619 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -327,9 +327,8 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { len: usize, ) -> Option { match self { - RuntimeCall::Cosmos(call) => { - call.validate_self_contained(&info.to_cosmos_address().unwrap(), dispatch_info, len) - }, + RuntimeCall::Cosmos(call) => + call.validate_self_contained(&info.to_cosmos_address().unwrap(), dispatch_info, len), _ => None, } } @@ -355,11 +354,10 @@ impl fp_self_contained::SelfContainedCall for RuntimeCall { info: Self::SignedInfo, ) -> Option>> { match self { - call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => { + call @ RuntimeCall::Cosmos(pallet_cosmos::Call::transact { .. }) => Some(call.dispatch(RuntimeOrigin::from( pallet_cosmos::RawOrigin::CosmosTransaction(info.to_cosmos_address().unwrap()), - ))) - }, + ))), _ => None, } } @@ -376,6 +374,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { } .assimilate_storage(&mut t) .unwrap(); + pallet_assets::GenesisConfig:: { assets: vec![(0, alice, true, 1_000)], metadata: vec![(0, "stake".as_bytes().to_vec(), "stake".as_bytes().to_vec(), 18)], diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index e83ff63e..c2853401 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::{mock::*, RawOrigin}; +use crate::mock::*; use base64ct::{Base64, Encoding}; use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; use frame_support::{assert_err, assert_ok}; @@ -36,6 +36,8 @@ fn pallet_cosmos_msg_send_test() { let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); let alice_address = alice.to_cosmos_address().unwrap(); - assert_ok!(Cosmos::transact(RuntimeOrigin::from(RawOrigin::CosmosTransaction(alice_address)), tx_bytes)); + assert_eq!(Balances::balance(&alice), 100); + + assert_ok!(Cosmos::transact(pallet_cosmos::RawOrigin::CosmosTransaction(alice_address).into(), tx_bytes)); }); } From 9c2a5714771d705ef43165f6dfa9b7e5df391c89 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 00:17:40 +0900 Subject: [PATCH 41/55] test: Add check balance test --- frame/cosmos/src/tests.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index c2853401..97617035 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -19,7 +19,7 @@ use crate::mock::*; use base64ct::{Base64, Encoding}; use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; -use frame_support::{assert_err, assert_ok}; +use frame_support::{assert_err, assert_ok, traits::fungible::Inspect}; use hp_account::CosmosSigner; use hp_crypto::EcdsaExt; use sp_core::{ecdsa, Pair}; @@ -36,8 +36,7 @@ fn pallet_cosmos_msg_send_test() { let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); let alice_address = alice.to_cosmos_address().unwrap(); - assert_eq!(Balances::balance(&alice), 100); - - assert_ok!(Cosmos::transact(pallet_cosmos::RawOrigin::CosmosTransaction(alice_address).into(), tx_bytes)); + assert_eq!(Balances::balance(&alice), 1_000_000_000_000_000_000); + // assert_ok!(Cosmos::transact(pallet_cosmos::RawOrigin::CosmosTransaction(alice_address).into(), tx_bytes)); }); } From dee332ef76451afe647d9db92c823beaf961d9f4 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 11:57:20 +0900 Subject: [PATCH 42/55] test: Add MsgSend test --- frame/cosmos/Cargo.toml | 4 +++ frame/cosmos/src/mock.rs | 16 +++++++---- frame/cosmos/src/tests.rs | 38 ++++++++++++++++++++++----- frame/cosmos/x/bank/types/src/msgs.rs | 6 ++--- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/frame/cosmos/Cargo.toml b/frame/cosmos/Cargo.toml index d8b75e73..517a2e0f 100644 --- a/frame/cosmos/Cargo.toml +++ b/frame/cosmos/Cargo.toml @@ -47,7 +47,9 @@ pallet-cosmos = { workspace = true, default-features = false } pallet-cosmos-accounts = { workspace = true, default-features = false } pallet-cosmwasm = { workspace = true, default-features = false } pallet-timestamp = { workspace = true, default-features = false } +pallet-cosmos-x-auth = { workspace = true, default-features = false } pallet-cosmos-x-bank = { workspace = true, default-features = false } +pallet-cosmos-x-bank-types = { workspace = true, default-features = false } pallet-cosmos-x-wasm = { workspace = true, default-features = false } [features] @@ -76,7 +78,9 @@ std = [ "pallet-cosmos-accounts/std", "pallet-cosmwasm/std", "pallet-timestamp/std", + "pallet-cosmos-x-auth/std", "pallet-cosmos-x-bank/std", + "pallet-cosmos-x-bank-types/std", "pallet-cosmos-x-wasm/std", ] try-runtime = [] diff --git a/frame/cosmos/src/mock.rs b/frame/cosmos/src/mock.rs index 67fbb619..ff0a91b9 100644 --- a/frame/cosmos/src/mock.rs +++ b/frame/cosmos/src/mock.rs @@ -60,12 +60,12 @@ frame_support::construct_runtime!( pub enum Test { System: frame_system, - Assets: pallet_assets, + Timestamp: pallet_timestamp, Balances: pallet_balances, - Cosmos: pallet_cosmos, - Cosmwasm: pallet_cosmwasm, + Assets: pallet_assets, CosmosAccounts: pallet_cosmos_accounts, - Timestamp: pallet_timestamp, + Cosmwasm: pallet_cosmwasm, + Cosmos: pallet_cosmos, } ); @@ -163,13 +163,15 @@ where } } +type AnteHandler = pallet_cosmos_x_auth::AnteDecorators; + #[derive_impl(pallet_cosmos::config_preludes::TestDefaultConfig)] impl pallet_cosmos::Config for Test { type AddressMapping = HashedAddressMapping; type NativeAsset = Balances; type Assets = Assets; type RuntimeEvent = RuntimeEvent; - type AnteHandler = (); + type AnteHandler = AnteHandler; type Balance = Balance; type AssetId = AssetId; type MsgServiceRouter = MsgServiceRouter; @@ -383,5 +385,9 @@ pub fn new_test_ext() -> sp_io::TestExternalities { .assimilate_storage(&mut t) .unwrap(); + pallet_cosmos_accounts::GenesisConfig:: { accounts: vec![alice, bob] } + .assimilate_storage(&mut t) + .unwrap(); + sp_io::TestExternalities::new(t) } diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index 97617035..c2272a83 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -19,10 +19,11 @@ use crate::mock::*; use base64ct::{Base64, Encoding}; use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; -use frame_support::{assert_err, assert_ok, traits::fungible::Inspect}; +use fp_self_contained::{CheckedExtrinsic, SelfContainedCall}; +use frame_support::{assert_ok, dispatch::GetDispatchInfo, traits::fungible::Inspect}; use hp_account::CosmosSigner; -use hp_crypto::EcdsaExt; -use sp_core::{ecdsa, Pair}; +use pallet_cosmos_x_bank_types::msgs::msg_send::MsgSend; +use sp_core::{ecdsa, Pair, H160}; #[test] fn pallet_cosmos_msg_send_test() { @@ -30,13 +31,36 @@ fn pallet_cosmos_msg_send_test() { System::set_block_number(1); System::reset_events(); + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + let tx_raw = "CpoBCpcBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEncKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxItY29zbW9zMW41amd4NjR6dzM4c3M3Nm16dXU0dWM3amV5cXcydmZqazYwZmR6GhcKBGFjZHQSDzEwMDAwMDAwMDAwMDAwMBJsCk4KRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiECChCRNB/lZkv6F4LV4Ed5aJBoyRawTLNl7DFTdVaE2aESBAoCCH8SGgoSCgRhY2R0EgoxMDQwMDAwMDAwEIDa8esEGkBgXIiPoBpecG7QpKDJPaztFogqvmxjDHF5ORfWBrOoSzf0+AAmch1CXrG4OmiKL0y8v9ITx0QzWYUc7ueXcdIm"; let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx = Tx::decode(&mut &*tx_bytes).unwrap(); - let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); - let alice_address = alice.to_cosmos_address().unwrap(); + let mut expected_balance = 1_000_000_000_000_000_000u128; + assert_eq!(Balances::balance(&alice), expected_balance); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + + let msg = tx.body.as_ref().unwrap().messages.first().unwrap(); + let msg = MsgSend::try_from(msg).unwrap(); + + let amount = msg.amount.first().unwrap().amount.parse::().unwrap(); + expected_balance -= amount; + + let fee = tx.auth_info.as_ref().unwrap().fee.clone().unwrap(); + let fee_amount = fee.amount.first().unwrap().amount.parse::().unwrap(); + expected_balance -= fee_amount; - assert_eq!(Balances::balance(&alice), 1_000_000_000_000_000_000); - // assert_ok!(Cosmos::transact(pallet_cosmos::RawOrigin::CosmosTransaction(alice_address).into(), tx_bytes)); + assert_eq!(Balances::balance(&alice), expected_balance); }); } diff --git a/frame/cosmos/x/bank/types/src/msgs.rs b/frame/cosmos/x/bank/types/src/msgs.rs index ce103c43..1cb50af4 100644 --- a/frame/cosmos/x/bank/types/src/msgs.rs +++ b/frame/cosmos/x/bank/types/src/msgs.rs @@ -26,9 +26,9 @@ pub mod msg_send { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct MsgSend { - amount: Vec, - from_address: String, - to_address: String, + pub amount: Vec, + pub from_address: String, + pub to_address: String, } impl TryFrom<&Any> for MsgSend { From 64292ff48b4d0c22c527b45ba03163dd231bc2fc Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 14:04:01 +0900 Subject: [PATCH 43/55] test: Add MsgStoreCode test --- frame/cosmos/src/tests.rs | 57 +++++++++++++++++++++++++++++++++ frame/cosmos/txs/msg_store_code | 1 + sidecar/src/services/tx.ts | 4 ++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 frame/cosmos/txs/msg_store_code diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index c2272a83..b016343d 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -22,8 +22,10 @@ use cosmos_sdk_proto::{cosmos::tx::v1beta1::Tx, prost::Message}; use fp_self_contained::{CheckedExtrinsic, SelfContainedCall}; use frame_support::{assert_ok, dispatch::GetDispatchInfo, traits::fungible::Inspect}; use hp_account::CosmosSigner; +use pallet_cosmos_types::events::{CosmosEvent, EventAttribute}; use pallet_cosmos_x_bank_types::msgs::msg_send::MsgSend; use sp_core::{ecdsa, Pair, H160}; +use std::fs; #[test] fn pallet_cosmos_msg_send_test() { @@ -64,3 +66,58 @@ fn pallet_cosmos_msg_send_test() { assert_eq!(Balances::balance(&alice), expected_balance); }); } + +#[test] +fn pallet_cosmos_msg_store_code_test() { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + + let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + + let (_gas_wanted, _gas_used, events) = System::read_events_no_consensus() + .find_map(|record| { + if let RuntimeEvent::Cosmos(pallet_cosmos::Event::Executed { + gas_wanted, + gas_used, + events, + }) = record.event + { + Some((gas_wanted, gas_used, events)) + } else { + None + } + }) + .unwrap(); + + for CosmosEvent { r#type, attributes } in events.iter() { + println!("type: {}", String::from_utf8_lossy(&r#type)); + + for EventAttribute { key, value } in attributes.iter() { + let key = String::from_utf8_lossy(key).to_string(); + let value = String::from_utf8_lossy(value).to_string(); + + if key == "code_id" { + assert_eq!(value, "1"); + } + if key == "code_checksum" { + assert_eq!(value, "db366741dcbad5f2e4933cda49133cd2a11fdb32b08c67cb1d22379bd392448e"); + } + } + } + }); +} diff --git a/frame/cosmos/txs/msg_store_code b/frame/cosmos/txs/msg_store_code new file mode 100644 index 00000000..03fb9995 --- /dev/null +++ b/frame/cosmos/txs/msg_store_code @@ -0,0 +1 @@ +CoXRBQqB0QUKHi9jb3Ntd2FzbS53YXNtLnYxLk1zZ1N0b3JlQ29kZRLd0AUKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxKq0AUfiwgAAAAAAAID3L0NnF1XdR969j6f955775z5kDTSSPI5FxlGIGEB9kjYAs8ZeyS7xkHwy6/P6Ut/tkGi+I4xlhAO9JdnDUEPBChBCQrIxQkiMbVIrFbkuS9O6/ci9zm/KqlDRaskIriJSJxEpIYqKU3U4pS3/mvtvc+5d2Yk+SM072E093ztr7XXXmvttdeHd/cH3qc8z1NfUSvv0vv2efij9t3l78M1/tJNsI/vFP+j+3CfPIj2mYt4n73y+JMH70r2uUfhvgfpf6ayB6UybgEPpSq6NQXcMylAfz16aetHsQe5kw/Stf4p3fF33fdAvPNdd+7ZdfdOL8JdQnc/tueevbs8D7cNfvm+9z+wywvtxx949933eb69u2/Xh/ZK0fbdO3fuufOBu++9Z+fdVJ6fDfMzKvD+++55N735x7s8VX373g++7+773LPsA7veff8br5uae8OdD+zac897PiyNjFeP9+x6N/Vkz533f/Bdc7s+7HH3O7t2vvG6697w5r4yY/bhu+7e++739r0Kd+561wf/kYwm3f3BXXs+fOe733v3PfdRf5/Vv6/Dvv95ntaeHvGCWAeBpon2tPICehYEXpAkHv0/8GLf8+mR0rHWKo4VfxYnWut4VEsh/KAmz1e4UL5SaghPmp6XhA1cpdQlhRehp/r/R403vCa132q0Wjqgj0NP/qcjulLcoBe2VTujJ9SIl0lBDx0Kx6ir1GHPlfLQB0WvUDJEFeEylfKbmJ5F8j8ZrLmjfirbLRqMj8I0FpXq5cOoJ/bjaIUa5v5rNeRTsY7v06UaR5HI120/iNX96hfpPxqnNxyt9Pepcn7+pJfu88rHvvAU/57Ab/wp1YzeR0i358MElnvu+8Deu+/bew9Qaibe9aFd7/4gXd0c8tR5tyd333vv+9+Nl0+q5s5d7u7/UsN7du3+4D17dn3gTsLmPXfvff8e75+q0Xvuo5v33P3uXUCKD9zz/vvu3EKPm3feSTh795277tvpq/TOO9+76+77CXc+sMvXjZ+jKS9V+gvqmjdfv/UtO/67+j9154vqEfULNJRH1TH1ZfVL6pfVY+q4+mfqn6vs/ffv3jP8vvs+8Id61WfV3g8+0Pm4+oj6qLp/v/rfVefBfZ9Qn1SfUgdV5yfVT6lPK7ntfF09pc6qL6jD6mfV59TPqM4/UUfUQ+r31OfVSfW76ufMd2fo98v6qOp8SZ0gkvMr5vHPq87D6uPqmo7c/t/q1xVq/x1b+1/Rq/+ivquoK7+qn9XXfI/uX1B/g/uP6+GPafr9H+qA/oT+pP6U3vuTIAz/TB/Xj+m9v6R/Wf9z/ZT+1/pf0troPKnP6d/Q/1Y/o7+pf1t/Vf87/Ue6+a3Hhn5f+55Kb/X0dO5Nam82oN8y6eGyregywGVXbrKP6qGUnrXktWe/7MoNvU7Ttyu1j2vCn4B+h0O57Cr6Q7XTT7KKv8D3aLYcr+obG6zvKu6ZdIOfDry/mdrjL8aqSjKuROFGuUY2VO8nBxv5XcW12P+4kU5ElEJpP0grgPh1gPgGILoGMc99ULVe9U27vskNvW3pKynvBqSqyhS/xXwwcGvT4UqmjwV94+r/T0bZVE0aYxjFScOTugQFzBw363PcbKWuN7Pthv0KrxqtZg1OSR1OiQw0eRGAiuuAiqloVTCqVx214tqrsP4qbEUvosGg3mDQCi9b9HIoR4/yCmdWO5xp1dFJ1zusW3661NIzWLLkRHNval2odc32ZnX9bd73FjiE3+8TD9i3+FoZGPiW6v21CwY+qacLdP+Ux680oZMuw72FzhV1q1A+cE/ZDpTBHL7yceNzBYq6RxXoMp/r6rZna8QgnjZVzuZqdg/XOrsH6Op6tt73ZvQ7uGOrqz6OL5ycC1xT6W9nZH/G62XL0/SXlCEmNVAFCwA9qVv2ZbbIy3H7cvXAS7vm1nWI4moez4ZqsicXobObqiFsGCRZD7nJ6ieN/TPRKhzFeGUmoiUTYdcKz4PXPw/pR18RMNaAuDjayneT9uWGftL3H6pO7DBAoY/OeD3wIc/wJcWVD/ClHQZFznsV+J/zFiyDioQGHiSyRRevsnS6Zd5nq2pFJ2tFN1VFNyyKClQyPeQvSc+lK2mjoXRD6DkmzLLWpM5aHUGuehzXyc1LJ7jVq6D+6koIakWz/DotBsF8qQyWCOqVF1X1oiC4ixWs1p+lmR9PVSTyThHgJ+kqwqWA1s55795eEfl008VNrwjMRAHROiTEe2lt9pQ03mGJw8PaG7cwVmbmFN9g5hiaqhKb7BfV2uX366r3eW/B2mYsY1ogJNynfvsgDz6teCIPmsmDNlVoQx5C3IRchQZ50FSGyIMP8kAD21Bw3ZtMh3NN5EExeSCM0Oh7IH2rdbg2kL87ffel774jbdo0vdUiqRIuiGnxZVr8y05LNTDtBqb4xomCV1he1cs7EsPlRXILpis4c2WTOuuvabUD4rpXDoirC8M4KgTgsYZ7ZVGhG9zm+CvXZiZtji2CdERaZeKCPNpuWBit1LRGCvKAP6flKhMdVLxTO6qJRc29vtfyTV2xNL1g7emKpWkjI9dAr2nwXaptu+OpfUK+6f/4vXXEA0csfMsDuT++6U/A/fGJygS1ye5HGxmNQygejc+l/UVHE+EqWno01Xs7Gn+7mY2WzMY4VW2p2lKD8vPAwoAGV5dSc7/vc7/i9+ssv5/s5/dfIIo6wBoZDKWa6/hEVD2Zc8g5vWwNXXtT2hsafKjkoVlEXV16t/BSY+gUPoBB/SlVocDQdamyH0N/CKEUjUZnf6ZZ4Gr1cj2lRU43VzlVHVTN9rXgVS2g6lwkNVO3vvK6pffZl4i1cPlH6hefilRr36s8LJxgnZcHNDUEuo8pA6sAkit9O9eNcn07I0h0K409Kv291G6AZdak7yKMPyhSjJ96TX1MiQCmeZO+HLu3143z5rZgX+mFWND3lmNzBa7+x/e//32/V34fP7vzlCpsAvOoFzQIP/swDTFY7yebNUCRQOr0QQ78PKQauiEhSal6KahEHt1O9DbIYyrk0Xcp1Q81Q9HCT9CNC+3m36e+dxMaS0jgLRp5QhXEhUftNgT2utdt5/pWyA15G1js3Up8qoEeNHJd0PIpE6EzVmqj+fohAKetaKZ8omgVtH8MK06lpVdgEDTPCY1KY2ZoNJinOA/pv6TXTbYH+3zplfRjfj54OzUcYhwNoC3N5lypMA2Ycp39Y8ZlrCgSHgrgcu7T7JfJXir7Qrwbq3DvnjJ74AZPBF0aGfdA29puk7pyUxdXImQi93p5g/FrlXxhioYEhi711y7sgCYyrdUUL9GrFr2xdcU9qgl7XouF5fzDJ2mZlxc+f9LLHqcH2f9WPXz4YfMQUzmG7QXRX0MCmkwxIrpKhaATJVxH2F7Of5TKFuWRT9myhL/lMdz9ivYERx+xj5/A4xN0918j3dynHqTlMN3r+rQcfMzUGGjqlM5AGgktaYV0sULoapJpxB6+mdSbusD1oonrDST30c9kEVMLdLEaf/KuYjChniKURafXeUKU6L+IcOA28DTLhUq1t0v4Sf81bp3oJmWQ07/b6Or4zNiD3fZMfmBHqfcSbrQfLZjLM4UY75UBEIsp+73ov2YcoiEIecIV/eYpJpiGk00yeefCSbXL0IwihlzQNS0r9CxPUHkIkHjMeNd5VK0gPAaJraAPspFw+z1C8CbPvC9DbE7pnLgrTZWdxJinrskkpY9W78ubQlfC0qsoS4jONQHqiH7UnKUfIXUwgayA9UnLgOmH308/RJwAUSKKZulHTAUaU3or/fzy/EmCzpY8BskjcnKbUJXbqMXAAf3RriLa0H602wCZJjDPYhao63mDt7tUs8KOiNYsdZeYIm2BsMYDGmGvmxpCGDP5U708AmC536D3uV6vPemxd73nmU05zwxRohTLjgesdnPfFboHKsHY6JP0SQinXGNYibxKs3kFoDcE4sKjPUBncrPlGr4IuZjWJqijMGPC3f4ll8jzcnpunbAss5KoH+XJg2aBMTrYRXjioFvA9M3pg2a1MXxQ9GCq2/sCLLsL3pysOxpHFxRSZ+cVd4wEsAtEOvSDIOAbvU2l2i2owSyXnryh/J63nZ50zBPUoLJv2WWa/ZnCVxtESuzx4uyiTqkvR30QjDZ6BUNb7eYvz3m0mPYwhpySywZdnqZ9W0K/Z+m3OeMXmZ72F9t+7+uXO0qatG5YbtjOvOdvvG2EOxoPiW00qNtjqdzSKDK5DWQA42b41Ltx7ugwLlcWvCRQaVp2t0upPKWKt7dHy1GqYTRlcuUKZ1w4w+WwlOjIV6YdGiJd/memZncUTLh+mBgp/ewANCb12wp+d0t7hJCeRxGTHBW0dTsttV28tLpilq48nZYPliASWFZlI3tOT/Ds0FPA+Nwn6WksT2mFsDRY31St3Vuu/SCWWItufML3uTZ2ivnwDiaiMiG27p2tTppnM/4729Vk2RZ2ttppvRftJirhRYMPzfNddHuGNToYOiaZLlssy7qethNu5B1tAy77ZtGyqcDubQK7W2jorVRwiqD8HYbkXUTklwEfkjw26z7BWoyFENNaxIDtzLyD64HmRL+EivyqovfILDJ53NEdBk0jSam53ve6I3zTzocfLTr5yKPF0IwqhluhLYt1lT2vmDijDtvsYqBTfYX+XLkC2xh8l4CXHBvQMh3d7IuqNs/kaqyXt0XOJbwekiuSfVsi8XZIrpjxUFqQNV0Uk0GbaeB3FKM8/iKregpwgiLURhbnDQNQwJLFQANQVU3CtJuDbW1+/Hw1ONEYSus7Cy2wTGRVlthq03JsFLxAkxLEgGYqFepiqzhTq6JaioQFhgBi8aXyXR4BFAzSPORLyDBvExnmFqb05Ud/mpB2rQw52zKjUsDWh/Z7nZd+ztfaCUEknrCI0PWzP8SS3QS5/E9AiPdZ0ZcEH160uLpW5A5N873RI/YVSBG79IgM/z0u0DZ1ad4LZm/jhyx/bMDXWy0f0uCG127W60RYJISAoJLrjV6Q/TVLKLk5IjElN2HZd5WbI7TAs7dOFvJS1bNcBKHBngrY137WDQTzCMuUYFmwWQcikDBXVlxvvcp1VEJAM2b2zln/Tp+4tKoV8L3N/qa+qcFIshtLlYqQBV6bHg11Y59+kEFAHIlFsqadg6Tr9tUsMnQT3pCLWE59L4J+eZOwCsJYCHkzMPJmJPImRBXImyTsQeAjeTM8PjP+YLdVyZstkTejAXkzoq25yJvBKyFvRtwzweJA8HpA3kx4gfBCxCYrj436AnKGqBomdYu7RQJ3jk0gdljosig0Eiq1itUc63mvCEUGrtrYYfZYWjTTFGL+25u1SOd5i6+MKMzivEj1BFQSy4rI6j9EkxHQ8yA1qhYZCPEeEjDL8ffhFSOJ7forpEfilkmqniUZebxP0PbMkhB1CfVpsufu8x6r6dz9eI+VNu4e2gH64+6THkvWcp/+aqL9fT4LciQ+J+sMD6IRZmvpEo1hyhJsarAmmhhcazjwRFbCw0kZSlKeUiiYiEyaXUVXhxRkwqQ8q3q8YjzsjNb7p9Vm/wDVW57j5wVhRXleLlt4f0rRdFLNG6zGiN5fANGuV3KAKnkv9aAN0SIhCHR9+azb99l7N/vjeQr+r+n1vAIi+DyZ9a/GqS66Iqr6IU2ivlPxJ+VFqtA36ifW9efhep/F8OQfgEDRXSJ30EYGKcvb5QFqB41Lj1Agoqk8xbA8wIripDyJb8pHlMXXpHyCnzyseHLQtfIEPzlcPaFa9UEa+TGA7zS/PaZ62U8zNL2eA6T52EB4s3+Hm4VuNJN/TGahGxN92E/gp0cHaAXEjxLRLof4/NrALsm9GSXUNDegYxRL5SrruRHSAxTkScdMRnR5RMlsEO1LiCIyE3Wdi0FBkzza7E/miZmOLQaNgHlZLlMwqU8pgeppJcSSiFITz59RXYz7jDwG7R6O5SizdlgnWKhqsMDsD8LJYugB5drp0krdDhLFsJgUWHgOFhiQqYAhkhCLcPcMl019YJFeFr55Kwjs6jqievXKlLshGuYLD9PQ5chsQIzIsJNMWGjgqcfUxg6h7+jSXN0ibfGEp5hqrjJXx3H3sf08IjQfu3ZlgrmNlDfHWNi04PHbsCtRQeb4dkg7wD6ZA7x2zFBqIppQsYDbdxNRPGrohpsDit1EdoRBpSoImCvQ9LIiwqogcQe9X013EDjdo650j3pR3WMDuoOG1R1AjRlDd6DLvzS6g1DUpSF0B6FRl7LuYMjpDoYepS3bgO4gFd1BLLqDlHUHMesOAnA/3s63zAhCozvoto0uQE9zs7RL6rIOIoZioPABCXNp1Qv+ouoFrCUem5KxpaX/9mB6iTK+UPxiiEvbemimhjaz6Jm5t5Pu7Qb3dty93ere0moekgawtVa8RScK3BIe1u5XeIRQ9kKynOyJKBVDT2wg1KfwiGYJqn2cT9cVHrpSeCTuiEcvUHg0DVsdVHjQFF9W4YFvKoVHahQe/11rRZIcofs5z+jdRSUruIZf3zJGo/MI7PlOAMWGxojlSyhIAt67aNrWBdgCkIwYYJ/IX5/lxQx1OGArtFS+D8yuDN8SeaKdCzHq9bSxCKWa62SL48qxRh2bWa6U3qZvZUEm3EzbiwAU5RZ6RdLgz36GoLBOWsm2CC0IIGX4FcELHEEDIx4vQqEu0N/az6hiP5mRQ3dLKpMeX8lBPFUbOgoZOWJDO0BmKFD8V0f6AcgakZqva5JRnLIpXOdATnBhvTW0nDTibowdTyj7O8KfH8ESoz0eaz0AvtDs8UQbGq7XOzez6EYf/TCfTFYmJtyBEBtBKVsr5U9v9u+ip4TvygKOG81upN8MBZgTdBMMCcp3+sOg6zb4Cd0yZLtN3CqRgISHOJGt4VC+yVfMcDG33IMdVLdezX2YlB0ToW1ChIoeyR4U2Oi4obPoAT+ZYhnG7ByP53rVvgajtbJ6PEhaqvzYR2hgNWlPkHpQU4Zm7u+OgopP2HMunFpEFa+iulb0yu8fOulNet4U046sV16k+/Wet9mTySwv1O/PVzcAxszn5+fnT/h9e7oW77fnmbOP0tVFz64s3r3TcEV/9l6ndQxaDdY63uO0jvJEKhFt2jnP6h0JbbCNR4GdVEV37HrvMZze0cCOKdnp55Fp4w7ThnZt/AhrIkl4g/qxjV27XC7DLp82GziYIImjWJ6PFWrGL9b60/oK/xN9Y7cpOskm6yT9fKwNvQSOshplo9Ct1UbNyIe7PLTTpsP4BF3cYTqNUoGUoKfvKCAz0cMxKuJhzKmt1zSsRQs5WpJ4hsYnqMQqq4uxELmlhEoUV7fS5+2G7QREu8hoK88q6Ggn9Rkl5y+nVdHB7zNKtCWnVLtpjmkFlnmH6Pq7RYUjt3H2btot0Rg7ouDe6J1Q7ZX4/YrqhHEUBj7rW+JqMnRrBRF12Ly2qN4VonnkV+WXDxDGJ9lOmSOsyjUyTVCMLUurD38RH0b8obzlrWRVRsYAmLliNGqrpTqlQLkxee18meHSbSz0ZQNqqhNcjMucUELtMzx/0rW5Xj+uijUY0VpscFqmi1/F0g2yXS057MzXzKh3OiBGRvtoq1R5lrdNNzJ0o111Q9tBn/oU1diiGlvVeN4jg5ltt+2IUzOt6BntLqhnNPwVovilSgx8d7GuTzaLvHf5R5gwVJRcGqDQrrdgxibVmVnYBRu3dFY0w/T4CwfM4EkiW7MDMKHy3heJZhzB+vV5wwVC9Hk1o/O1DLmJ4irXI6IG2fPKTFSlKa3BnPqyJh9255cjdNUSfjWbD83mV83od+ypGaAoogpjKXeDujClDynp0ufVlPcZ1dfun/9ttXuI2j1h2v0Mtft/iKFq/irH3Nc5rjx+PF95XLYH4DtXyy4B9G7V9UyQobGcEDUuiMqIXD7jWZUuU4LVcvk0XQ7LJQmMqVyR/JdLc9c6hTCOi6as/uIqaZqxdMr7EXr4LFTSk9RvYiAzHo/LrWii5DFOEnhl5E3RpWIr3XG61McBZ9pvExK1awvZ4MrlFjKxZyasRAilnRNuQeva8sSMLb2WVLVy3mVXjqqtnFoPZPGgWW6OSeRqQyKHTZFUdNI/qJ60GG7ckwnTkxFTpMXHHRu931TFKgLTCjm0WIC43JAcE9QpojXwsGi/jdGecCWqqdqna0ycTSbpWVl+x9vG56I1zvLt+gJq+8SRE3uy6HjTllplEff8zTWJgJ6YGjehiBxBXmuOamEwEJtqJh3/DKDK5+nY6K0Hr9xdNGa8opjRxVq8puuuf/lTxj6OrvOGOWEcTfOGOV2ky1j6hj276UdenS4W1emiqri0Ei6tWiOpnEvGfeeSfLS4sjpaHHGNAKRxxaybZv47Zv4TM/8G5Og6TXeHppiqYIVNp/TnOkFAXCitnzU2+bHS7rAxKZ8SWt532JiUfwCu49vDxs5sntSPs2uHjc3+w8agztWfWpRZG/TUstxxaYcTtIbTeo9wfBhU7MU839WH4qaOFqtHXK+hB1gLJwYDTPtm0bKpCD3PGLiegmFamrpZ4KWyb7GlklUTmtVO2AUdh80i6ZvRgUVC6Lm2WpWx5evU6+XYo+RQHjEh6F7F2sIiz6Et7OZXPVqEM4oKN6oF31qMgKy1mCJvzyh3csi0YS3AhBNMYseP0oJt1odtuhqgq9UQ3mVwURtcHLKTZ+mZX+/FUL3S6JLc3WJDNRlDvHkitEhTZqx83SSpmDrL0ztBH+njRS6nvpeoCoJKfT4He/EkywFnnD7YF/hsJu5VCYSxEwirg8tKIATbc20+jjYjc3IZCzltDJ5cerwy0fcuJrrgKX5VHh7H5cf2F+vy5DhNMapBZxgHHuV140ZKeJAwVPwr+UgOQLGmDFzpeqh2bWFMS4k2pyyIEAey7JemkbFSWlhpEOxqVD9OuLgG8o7d5aAAxqmEiXhuuJqGw9tV1gk5SmGE3J2W7TkUMofcRhZo5CNC90fQXZbA2NZzWJ4OAwypWIHTxjyekjZO9s2Rky8eZ5a7dubBjxIm4XStBhBzHdSvARwN4IzAMIjEYZH4RA4cps0+tGd7aEeUGpMfmgB7prxmMw0BJztThHZydImNdjkhIHCnyqN8MDWp9+J31NRzjpW+f5PqSDQxR5W1PoXiJYLiJYCinaD/J2pgxxpAAGXBFJeHSRa9H5fQefOR815TNIDqwQhlYoBQStm26vtCJH/6gqRL94muf8Ib3OxW88rvKy3TnPvZ36t1bFLfDyXbRm8vRAoYQbIXDK66cR7J0R6LG7SSNsoXMXSFcal63RDajghal7hXbiApGeQ3gLKJ/j7sFnQAXd1hWtA76+8PqcED8MCc9u1kZnapavzLvNeXec+6Qp4BDLEbYwihDDO0wwxTGVrYK7vYAEA/ascsBeZK/3YpQ8L0+gWlvv3vf+0X4ylTMrDQEpCisLKF9SKFf+G73g2mqIYJqhae122IgyDrSy+y5uGPlAynQsIFiIemDyiHeQFr/mgi+RwPU51YQ07AICRBY6N8kUDvlmDYMRvUonOJmWpudL+qTaVfm0qYcn+ITxsxoz/uIH5QLDP5zD+PpbnYNhen0kRsQB4KmnHbUmCuDG+XMiSMrB8s1RX5xejbEmqn/A26v8ZjWHIhOxIzDbGZBrzTCyu008CvMQ0GzkwXJ60ZYvbNfqCbRYez0EZ2W20pY8KCSZ6KjQSJ7K+VYKpAcRFM/XEDyDqwL/EZmx1/iLsgyL+//9sfd7gPhV9UerBMoSJ38dkTK8G7SgrXixltcWC0xQG0xZqP9I26mtDKGYmgBDTFhxRryLvKElsGS3aj2O0HRlXMmmC2oTda9q7ow60SvttyquK27JGbTlWcOlVxS1TFbaMq5i7soLr1au6DHFYYxW7zUR6i0RbrS2qLAyL3IP9fUnXXjH3G4FfDjwKmn+xjsQoowZ4+LIQEXR/ObkSDWTQXD4dSpbRrAj8nGqsAQD7/Izj+WMq297wgsXWnjnyIalC2ZK7FVtTDoSiq4DoD50YB1XD6JLoptjM+bGfYUlvTFNxW8wDUsJwJ+FVw6wTILxTRt03wwZ42Jt/siFGZlHuViYxvTGRgwqOYJGWTPPJAbJmdiYxfM5HBdaGNp4o71PV4Q7fOOnz8ntKBHKxa2x90Euu/r//+YP8xAbD8UcdnznsP4pT/wA6cvAZ5RII66KY1/UnE9AeKcmP74y1m+xPihOhF2P74fQPzK9sfM7AzSgX7XvqwcKJ44+5cbZNBwS9siWGFe3+Ao/qdlz9d43a29GKzFdhhjf8gJ+tJeKW/6EHV15AbgDHM8y/Re8XGxa9c73/XGUSes+bp4sDDJpVe/ykungdSl1Dg7PeNPo1NBYnCEaVPmKOt160iZOM8+EJY5qBwnmrMC5lRtGBzFGB0k3mAQ7CcyTpMvKiX5cUvn/Sy05pPXonm/TdminDDENtK1LBODs6sixgfkWGYxrzQnIxCVXLol4icbxZKXp7FzSn6kz3NXsmgONxzGCxRt5zjmjEscWNoWVtUQ/Go0/pmevL4R2AgAVDQ8x9l/Tm1M6V34HJK38Gsv6tYZdfV2T+FIWmwh6j2MWDs2JTVWFxr9hSb+ly2sdOa3uw83mynTok9kTFMyFYZm11iQMNeFZGGKvm6Th/RQlQyR+td7JvlZlwwLeCNF7tjKJ5UAgtzE8eufXGsBLzE+CsPed81KwdrYHYwrcgDCI7lW3Fuos2KYHtB4WAwd6BlAAOS8kkCHU0L65B4hfRKPUciWPnrL3jb2Zp2fvL2qqPsyjpijL7x7rY2c6IyuRWyxnrPm/nEF3/tX5556id+svlOXoPLzcce4GzO10fNmKUq8SUguD2uOcZEGfEZbWgc6con5iuhsHx83kqMBvnZP85n/7jA+cf5XEPA3oyAnw9vxsA5pAoGdyMjQgsGZxsA5jF2J4WfRg+UoDJpZINPDUtKLJAp3Mx8bH5+/py3maconFpot7iIneOgHWS/nSQskiyhyKxJFRshyAdDKQPnETtGXPyrNXqV2e1qezjOJ8TliZ+gddapHY6zKflywTuzvlbTfFcm53xQvdyZlstB9VlzUC0Arw6SKxeZHxl0kTlXHVaf9ionmR8uAmu4z1KpqdRWfIs7oY5K7Sq/FWZGUFej7AU5TSHxrTyg+XICnw8eTC/uEhPUXGIaqdwapXUDjtvfEgqRa6OpnK4NVE7My0p3HVS668DqrhOjxJcK0NnCQa1S6LfMwN5s1dn8wDRPo6JLUWcf0UULv4e1qHYOaVEdHtSizj7Ap86Kfe/NuGnBzHUSHcde7Mcq5n3IAetiErF2sPwUHqR4EDIYaDmVz//Bz30v2t4OWlzkswesP4uPk4x6qKqWNICgdn6ggv4GaDWKMqBqghYS7/9rjahSy0aqasYrYVFWUtnQngx2ApyMs9c2UV2G537dY/jLCR4BYL8WYnhBWeAL+Kze8oC2estV+YRZYquwRCcGzplopqjYtNQlOktWSb5QKeAvqspT4rugNTHsx7y8M8Fmo14+NFE08owuRicK3Ee0ZdOEFk3TLV4V4uEy0Dm/PKxdO4d01c5BTHhjNh+W7Y6YNsaz+Ujd9mzZLGyxU6NjE41aQpuTdtrX8J+rqlFxk3nFG51tt9J8bLadih4bh5uxbBweZ8KyQm5gUTwul08qUNMRuYHOOZXLp9ki2xySwn54tVw+A5VOvkxuztLzMbk8A72DGM2LAnpYLmlD2G3mK+UGNtKJ0HP2ShGzHO3uD3BnAncvZuGhuz/Cjcf2Pm9MaTa2IZnlMZKe7q+I6rW08TUcG+F12BZbyP06Yx5uaK+4aGjjf6TcTYtNb+UG4sf9xGOweEcZW0D5zNrZdZl55Ckv2PCzvjjYKL5CB651U88RvpoTZB5TLSuLkG0q4AwpRzV91OrbNdTa3ta8ZQ6qBt9laNhKQ8PiARrGxyBH7CBse3ysVI3HjFKW64LH5lwKQwYdGJvNR2fzTLCTBIPRPINKOi7GclVk6Ju5xDuQJ1qp2x1ov/oTYptxhaAN+0C7r0YtH1wI5MkKyJM1IKfulHf9FQFYDrNyqaxkVy5zxuoO1oTrFFSEeXNuzlqb/chwJz46ANGPfj/BwSY6tS/KZYbSWrqRCCTcyQBDPBrgXndK28KeuF7m3RZGg3RoQX1xKpfYqj3Abmo0D7DtXVPNA7fKHFxOPdHZzkBn48Uqx3Rd4/0kH7Z8mqSsvXuWagFfHNQWl6Uih390ndZq1QvRfQHLrgj/rFHc5Nr5CY87W7SVLK3gPH5NHhCzTAtwULm10+vL2bW7Juzma22ep+Yaz1MrlNESu057M/nHcABlQLsmD4/vL9Y4AYRlmwJusfMP7uaq8YDWR0Jwoo/WmDOzNbT9h+BFcwW7i5Lk0daegmbkOFVoT8NSNMAFVqPAMnSp45aZkRGucJnRSu3UiUo/i3eHzHrhIXPeoFrGCxOgsXbcfIklxrspMRHpn9RxM6mNQRqm6zSsavHSgxPacakP5AytM5u3HTHr5G0Qs0YxQhSsDZiaSwYRjuUciI1kduUgHqqPeTEQJxWIkxqIm1TLChqwJTuNlwHiFQbEzUuCuGrx8hC89Ac+H0kOsd2GAfEQG29QG8O5Etscc4l3KUfHYbIbyMGt6j+4pc9HWUWfzRInwjFnZkP45VHHV56Cxf4syVDVEWjfJPME13uFymx0hMO6Z9WxNBR7akob0oNaROUDxqiXwPz8YZr/rkA42wJ5ln2m5Wi3u0Z0F/v5QP+kPFsrzw7ys1Py7Cp+xtJJN9+s98ou9iq3v13rdPxrnI4/lytWdOfLjVplJ36Xm3Ec1djyHw5UvI/13kVkLYflmF1UFRy9IihwoKa7wQbPoz0d7/gDeEPSrpvpFbujBDQV5Y27+eFVu0nKCMs7obmIy2hvrvfAHbLUPamXvtX0Le2yo717OOzP/bdyiKu4bO2VT337KWL5kOxQjiD2zQVvNwr7KOyjMM7R5uef9rbTHgYIgSNZPlIP5vKEg/CBUW9DIJC5MrwVMw7JE60F9CmwM/tjDd0J3UGnIoHDqK4E9cEQwcPBHj3f1kYooajLIUQiwjhqenxvOf5BDhcCUZ16pffh8GvB+2nWkhBcMCT3nb/Ud0PuO/oqkK/KeDcGnLo/ZuS0s04HRykMjoYJBk/j4+XAQwNfwqmJnsvjnjkXyZM5DigFJ84eMOYjDR1dzlO8sjS/Ij9xIYV9rjDZ/9LvMm44ko2VZbVF5jNuQlzj4CUeTBstHE8hTmUhjbpTWZ9Ppn1zTOzLYXSAI0nfHBnzqax/KdfxV8j5nKHg85E2mg6ke4HtnnTfg+KPT3F9XlrSVylgDs7xAgfng6V4Vz9lSgZ2lObENjAntrz4FilsTmxlbcrBuUIwVtat80zLgTnCB3YDq3TfxNTpE7BTo4G8XcbJD09+gq23/5hjE9ppM0EWWSc+aWU7jp0pcIncpCkLFWW6qGSi5ACtB+/9xIKUz/7V0uW6g+VcW7maK5PbTUi9hoVKVZRWOLZ3xrcEwSHKn6d7RmipsmGqtLUpW5teWFsFY+VgHCwAsNzA6Sr7pkovHzbBZ48LCZ3gy9G0BE1QLy4egl+Lh5AM+pIm2Pb+rURDMJzRRkMo7NGti4nwUKi1aFXn6zZERILq1sCeWOXc0WUXth/exoyJA2QQQuAFVj9O4LHiv8fTFzAtwKGE2ADx9xZvv8lHLPfLScuV1Xr90pU+i0r/kP7wke5E6bMAl/0QtzFru+4PNOLbRnzTiN+jHYm04ksrdYufF/qtD/Y6g55zrh9mpQL/s7cbCwbDW5es4+UYOMBwY9DA4X5r3/CZn6HOZAKnQfuGaIF9Q9xv35A4+4aGyD6Rk31iJ/uIe1ze6LdviPrtG0TJkEcvyr5hnu0bnlFaCWoSdxTMRPi47FoTVlGsWmxD5hAggPcpmlp32ZZkZmpACAUsCwDlwCJQEg/LIhmETOggIzDKAUU0wQvte03L6097c4bZb6oOHAbN0Cu2L2qqwFy/gaSRruhwvudBr+DNfGR+fv6ooiZbmSUG2Z34dgufgPD7c9X7qR7e3dhVQHUiF9d4b+n6N6hrmSII09Cw5VvPZtgcK2Yr+ACtrhs8eJnG1ID4nrScj2TiHEbYHRBevtgSSW+6AVQlsE0xfaLfN3No2i0m/hJN0xbRZWjuhsCXnm4tXKAY16VaP+mDLm/hUz6EXqQ/ZmPv72FDF+MyMttuifeziSCk0KNKT+W3mqlAe33XN2ol36qVfGgITc/v4hHRFq9Dj1MTBcy+kxqq8arB8fqiGBoYb8j7xVYqg/OhvlCLjZ41h2xbbaq9W74SR1z3lVTqc4sM3NyMGv5+WpRp0sOC9TExwoj5tGMLmbtg39n3gMEDOZ3QhvGINUuL95BRhz5vpAYLT0LTK6HExIlXVANXPgBfAhpwODbtlEnaKpN821clfSWsqA1AVQMIUn7np3yn3cyZUG8ydZmrfVhUVSU7z9cr48Oc6qHhyBJryY6QTb4xidFxhECEzigR6+FvqboUwITDrSHJnEE4Hh5H8AMuVRqDfiC0spoqF6U26dmzWQQrglYKTv1YD7J+GMbvWgzGvsE859QAWM8asw+LLcpSo8SBpWHOG/22aIdnCQ57MAkMZoG8ueWzMRowL7aQzc3CPCriPlDFbLntw+rGTA7gm7LBtzzEcEMLHAutPggGzEJExkHVp9lS4fvGBk0YyWIxZ8OBmLMhb+VCNoPjCMGBhJ4NxIsaXAJiS/ndz4r1CIb5l8rmeFkylHBWPxeJnYtd4LY8Rt4qx25te9Z0jUW9BaHyDWMZSsuDnzNGJ1t65dl/QtdPf87YnLj4sF/1dVw57at1HvvGi66IrUsb+AkKEyw3IvxiF31kk+BowSaIELYYXewviJN3mybQAEK2d2nPCVGom7qH03McwfQ8PWzZhxAqdmymEU7j6pYdvGvJ5RSo25ZycIrCbUduMzlX6g65Cia7GdwgFfs+mrAXcEnsyOVzngk0Ja77DkkMQ4gkgnCGoAts9nDLZhhA4JSKo2c4k4V1vbzpbkjOT93Ntb28Zc+9JLCCHqAKXLONUlOLLFOPKhPX49OE5kYqcsG54U0aMWWJjJuVRAr4+VCHg/M5Zpa1nVmfp08mOGCrkOk5nl6aK7avDrNv6HpQ72mOQEwQuXmz3gA7KlhMKcBtHf3ECDtrAzDbWALTc2xqaleBEvbyKNvYCI+m6gKJrTup15kg6nk99LxXhrXwBMaG1q/NmajnYa9AQLiK97bdyMyVxTVIUoyTjTpOJgYnm3X0uwUGYPQ7vQPSE67yS06TqgJtGBMVE3UDmtpYXEvsEmRsH1yDjNGJsyJWEgNsU82QGHQiqlYA98mi/zMWmwXdWxW6p5XkOYjjseB4B2ZjjOPTNRw/1Y/j/UhPeN6o43mzH88lfwOkFoPn5oHnYo4Kfv4MQu01gZ8nVC1GM4fZM0jQYkFzXLYwXY4dEoDcxMMeh5kZ76aSc4g2Y3MsLR5VPQ4XNNkrEg40tKUKUoaAOFRoU9HGT15k+LmlGMbPdNGRWOGJHFbWji3THaxRG3qrfi/9ZBxKBOFKac/0NQgEOEtvcNQQuz7NSr0/70gUU80Erpk33Aca59hUEUyth4uRvMMCBoh6aztbfazCZimTrYUYJ8JInPZqRMwQvqztz7Cml/jqTJAWoOKwTeKW6q3ctdnfQVx2BgrVGV8ORTQb+DcHPptXMyF1OKAOr6qqO6D6qpunBbCDe9wuRvNWMZZ30PgogXSsIIGUGnqHsSKFq82w56bGfm9n7Z1G/cnqTCXt1VvagWGm6I5YiroAW1pCRtkYcdZ8nn5G8JDjrmT003LBsjRHizMWZtoFv2ESPOPT1+jFCd5PftbX+kE2oz19JTwwEUrTHGSC5xUTl7yZvYcNsJ7meEHKiEzK2EsyCxXBPpbvURusU/BlNxSLGFqZW/nLpyVakElwZmLxMJNwdGcBI0uEbNb5jxb+o1PXOK+rrawSPFXFHFLYtm4VEr9F7FlN6Bx01YYcYoO+WsghVcUWoglLiqgWz9CGHIpqtHQRXpYwrbAuwyKc/VFg5+XcAC9L3AwFfbzMF5LJvKyxOC9LLC9rgc/zQG8RInAzItZN8dRxtDHmZZvEEtVnwlxjZ4iS59jZJjS8Xl+LIxzc32wo2fRl2FnUp+9rmXQ4CN5IkGB0omYInYTaCzJNCzKdrpDJ4FUsn6MGg03T3cRh08386TOXx6ZwQHYGSBw2BUiJpDm/VB9C05B5WZwewCSANJky6ZYqTJqeqzApH8CkyRomZRUmjS+OSfBCYQstbAgcrz27kNcGhj+ljh+JqfJfxXpMtC+GH3FcNolvWsWXVCaOcrfBwDchiNsiU+KyKRXisiNceNKEYjOxhjNh0ybALEypeJ910HAuorhFyvk5fLFV0WI/rre3IUb5ZtOyCZkjYpizehwnuFJTszBtVQa8xljASSwzdER0E4JMao6wOYRQPXnbkP1sOPGE2s947+wOMweDOjStn7qwqOvfMuMVy2XTyd3h3G6xpHWLOa1bwwDZ5HTLm/WAb7y+dsgOj7W6VQvwOOxjqdwcBDwJjzmjiuUY9AG4JjHH745ILbaL4CyjTlDjkK1jeasOAZbz+OoOYBIbMx+Anfhy8EOweUh+WmKCdZflI6bqyPAgj/uYj5o6IyDomNzQjAzL/vgijyuvunWBH4zbCKEtpmAuXOgyc2WHfAf4VJqtKtmL2JfOGhckqd0axEscxwt9tvgyXi37RGdIp0Ro9lLWPfrbOA1OhWfK4hmCiAH9J7s+sHGffAX3Qc16RZENn3FdMNLj0zVhEbZ85dbqHtHASGi09xy1kG+C3A9LnTrq56Mhz1lkW58x45cZSON+BVdu26/bl4/1bJzEzZWrgouj63j+X/5ANv5/8CI3/snSG/9ufbf/0vb6B9qqua/ubMP8omaDvkQoM2MJHri7sqvLb3hznVcFKlKX+l+oIm6/O9dJtU2p7YXG44Ha/gtnrCS2X8Ns76DLDdvoz3/0tu2R6GV72nFuzOmTqlhDIgaYAAngab7RMXvsjiVRgMarKHMSSiWwoVQ4vZ9Lz6DY6NwSae1i54v9zdvkyPSWdpSbhL3LTAtylUuO1HZbAtqy7fFk1TLrkNuRGDh+w9tejSe33gHohFjl5GLOuA42/wnN1yZ7LDDuYsMFVuk2btJrQNVZxOIGkMdi9h8DgrRiE454kEBxFst5feS0mpHRmGa1cDsgzJiKmAMZykBpq83VweJfzP1YPkfgM44eG4ikYU4oOQzdpOGM9H5dkUqRpBoBKwpF1+xmMIT9cwAvORcZvDFlKDFbQwsTXOdJHgHEUGKLTJm//1TLg1BNUVs8mPTbhH4wPThTES8JU9gyjguqHn0IVZuwQ+2Gna9NffPF5gybMG0bvWsxX1HfOU6OI0u7vqxW3UxXYRiYpD4Bm8ZV068FZGA/CzeZolONnA8H24lGzoeDb0OZ2HFpt0IQXxAkMCajVVqTwKQ1iXhaI9maucKS1kSLqrtbC74UugONEMtGT7KAqZE4ODbHM05ZHM8aZdWeSi9C3ZAzDmTvYCO2RGbLav1DGy2LT0QMdjWc3q3BCNHnxMDnNqHg42Q3MGFXtGSsZCFrk1VvI4uU0TAnMlg2IWaEDBxC8lbVRD0WPpxAfxLQTyCBwFtGXOZY7FFdsVzDz6bDz+cXxc/WleAnUzdmk01Lcfj0ROgcp4+F8a9ki+Uqztb48yDTEUEgcuVDVz64TGe0c2YLnDNbxzHryxSsHAT/Qte8ceN1kkCR/WmVmBbxtpvTD1xhwIdoMOBDKjGVA4nfwGZPkZSObOnIBE6IXPyGyFUlG4Bc0jyESOpgwy1UpYxf3Sr2gY9sH4zhT+RCNURVqIZaiy5UQ2RCNcS88Fgf5CIQf5Nzuk3qLNgnOVJim7FR8tvF6/WYRKutZ9FowM1VhaXHziQxe9ymv/+LSr9lX2wNOobXsXttw0oCR3WPJIp/B7p2QgNZ+fIkG6by5YWYndaOsp/BMZ3NXjIjk7/evxBLMqHz7IEzD69OIzETcvKzI07Shw+Jf5E2oec0O68eoq89fgdBqjwgvqBstlQelJjCr0KnE7MP88tH5PLVCFbJ1RY3V50+wZ1+Qmfb2MEpbotDKeJRlful4JjYtiHIzgsxP9mMby/GxevY4Slmy/iLPvUL9ycl9qlJonWEgSec44hm2kF0wzgpHEWYb4zIjf4IPzlQe3IoMDAahMeBQEIYXNTs7OtfYAvekHtRXtCVRoLqC9CJz6h2Kx9m+GssxWFx2R2WFXlRV/sG+j5bxY5KG72HtHNg9MSPjEcqHO8Qj+7PwLQ3GdPkVELuHsZYr/ceQQRewrWj8CMguvBMZGyaUwOTA1qkixm/mC21cfT4BFs2l2dj5nuI3XdALt+ANuNe8RqIYFGvuAEWu/SL4J9H6DnseE/Q7xtRnT99KSOJRcVZcV/0hK165nyYOvRIBLbauio1NzBNZgDMm6GULDnO82Daa1fh5iPWTRO05pEodZU730huYKK1JhUXOgeTi8oJvf8NrinEJ0xzBAa6NB6QsYifh2MxBz8UG0efuBBPj7jN+zWxNyVYEk1qZv9QuiS3KvuHEn1X2+i7Z+P2avx+Pe5ESRV+tzYbKWIFb5zlyL6vp6rf1FZuflwA3tbKtHpYC7Z7JHbZlWgazVKULqPI+Gw7ndH5bD7LIV2nS79gU71nIgJbICYVx2I2cIwqbD3KT05GtVXET56oPTnET07UnpyjJzeY3Z9dVsciWlYxXd/AT8/GuVewr9X+CPH46YHsnF8Ie9IT14fv8pOjcbXVfp6fHKk9eY6fHKo9ORj1pCf2CRo5QI08C4PZz/HbL0Q9Z9zoX+P9XHSD97OA31Gq7SYEfNtm00IQNkbOS/Asvb7OOADS5ZTxEaTLNxuPQrrMjdMhXV5vnA7pcqtxFaTLGan3GF1OijF9fBwNIrTsEbC21dd7h7HEx6f0ady/fko/jd+NU/oJ/F4zpR/DL8LohAaBmYIYiedATDNr3JEOO+RYD4y4WchZtkwWiKC+87vgcsCIa/M3GMHvWnDBNwx4r57lYlzmrGlrjIPcPRt3p9n/BpuE52zT04+SyDlhkK4MtiG4JuNx5VOIztWKVr1Gr2jpcRW0RoDDiKzMxW1A5yssbtaCKfwVtJ1dceHxNH+TuLnEVcjmKy9rJ+loZAI7H4gRbNtibq2KI7UqDroqVqT562d5QtH+L7pom1fU/nKmLQZTXCToKyzMoboPM798mPjgW8oXPFHH+BDODwWCh8w3D4UWD8X391Bo8ektDgcPh4yDYIbL0DEWCIiKS61vNZLLjcaPF1VfjIX1Mgu+GPdoL3VASRrW8kkSPo/+xElDLx6nu+9+xN49RndnzV0qcpGhU2/NX2VYMjW1luMaakPR6EEh8pKjaWcSE42ZuGPiHICfSUy0Z1r0dLnZuBHT5esMAaXLm6WGh+ny1Sb+MmcnpfUjEiURBBOdScjUOerHhVjca+YhFK+Z0ifx257SRxJxtzmWCKhZDCOBiyWzk0lPIjNSdZ7ApxgTR7liE/3bPOMVs/RvG12von9dbJu12BmzBNe9Cuc5b8ivwky9seLexFOr2BhDvfJf7XcB1KAkKB/f7+zGw/Ixd2NCakSznGE76JX/z34XUyMqf72qhM1ibVwL32RHuzcPZj6D5AYkUu2ErfGUvou+PAYkkJCK4Owe0veR+H6Roxzi6gUCzym+hgzBFP4Zbb4OylMkvj2M7H2JGAtLjMSLEgix+uSReXbcYCtg+wkbuD6tOWaa7rMNfkFt1k9qCVz4hOb4bejBRmrYRE97QrcDsck9prvTm3WLVZfYdbyxhCVe2aaFxjFwTnDV+RvEVLZsFV5/IlFqhaeD80y7sBy2Yxclyp5XD5joMRV/0tg+X2IAHMxMi/Xz0/0fPEk4eUSLqe9j2hhA01D6lKIQ2fosoI9QqYtKtLRe+c1P0zjHpJNsA31U9WVICRDxvp5ZJWAbY745oji4TeHZ2EKFiSyKYz62xll8V4QtmhiZ09qofZOPiWKi9OfKa7BjHBO3ga4q23PlA2/nJ0aJgdg2UOYoHK9Ti4RShcem75zmZeM2+vM9bw4yaPkn6rY9dPsNc/un6u17OP3QFl4JHuuEco/D65TaRncvP7a/ltNjslf+j4/W7vNe+Vf1+/Fe+Z2P9uUAKf+0fk/r8Q/q979b3UDzMvMEral5HD0Ck66z/VIL+rWReOtH+/v1mwP9emqgX7820K+vDPTry/X7Lw70619Qt07jcBT6kLGN3n5VjtzO2s2WKElMFhWPdWMDnV3RK79U0RNu/Of39zf+2fr9T+3vb9xlUYG+9jq7vLbYCxcQN2AHHs59lo9B8TZCeGIMJptETg/RLn+IyOkQn+6NFLGEX5qgR02EMHtz36bIpANfgZX5Zs7wtcLkfYzp8xD5n7axGjkGbbHJwW/cXSzjUOHx7i4HsIJHKpVawagask5jymR2RJpImikOFoIchqzwXVbGb2flJkLFxCiDA53YJn9EiTm5GcPNtKkNNp44xnBa4hhKDacpjhH31raL5NnmDoXsi1w6xDURtcDxOefEYvvnZVhRK+ln7Faa4ZWl2lu+wImysEUh2FxPfZ6Q45+JGc5iuqIM5orr6IcW93r8zBVT9NOaKzYQWPN8pV3yON7goMfIPAKNF2cGA/Gi6xU4+9orqx+kdwW9hS+jfehxak3rv9eV8MAcxxGWDLdOZM8RHcTlXO5NyGEWKig6+QZc7O0VEQxtOURWB8SoIS6YITtSdTMbzW0Os5Rn0hpRFljX3obaiwzsc46NCRDcJ4dmNSMcydBc25PgWmxVsu8DeaPHZwiI5ZxPmQ54koWTKsLJSoREbJiZFZIYvhqp6UpnrlhOXfFsVzr4xwMtRnFUP1cgcwK7wnao2dF8eT46wREuUxO3B2mGb2fl8Uokm2/k8Vw3LPWtxAXRo6JTMgV9oFTb2v4qamCqx66nBCnU/AAnhIt3z6Hn7HVYAHrJekQS+ARng86nzZVJZ5dg9uEhEfHkAa2gKaV+lGd/9qSX/QtJ0b5S7pDjDNFy5lL23NV8PgBwECRAVWjpeXIM5VHnVuDZvg+4x5WOGDFqOD+dlmObxm3uTvPoGQjEZQgb1kv11MnrzLRkPr7hOSDQaC6hASh1e9UdRsrucsFM6doonlyDP5P5cjNnUX6NuVqdR/lqi5Z0adASAavz5XK2GZY+LJpHQc245no9S5dXXD7POKkYn2WPwhorkhoit0BW05erq4WxuloYozxZgNWomP6irg6hU8KmsoHxNrba4+7VUvXVpupRqnrUVr0cl3P5clN1JNEnovxqjgqIlJ0w3qdlzkHoMgnidI0cGIARJ0DkJNfstN281SBMNR8eo8t5iy7Ecxpyx6g0gTB7kC2cPl0iVeUtFwpyop6IGICgf7dNgJpBlU9XickEmCfbOG1izukgPZOKOHYRLmPOBojIcDHatTEiYxMjMmYn5lhiRMbiHxjXY0TGtRiRuC6kbxK6aCL3Ko21S0WMZoiCTkCB3krznIaFfITW4F+ONiZksJ7YcpKw1W1hjXu147ScH2IWuHxoztFRW86eca05wTqYknXj2+XdrRyPrYV56kA1ys3PdV+NOvAdzgbi3u00tFYZ4GO/9rEqV8+xu3Me4ROwTlRJH7O5WjxYG/waiSvdCs7bAuF+Nf3mr+ZpvJ04EV0jQWOec4HuanSAMI+agOUzrLDxmOn2m25to2tE82jdAMIr8jfximW6HnRfRzfdGKQ6YipIAHodff8mJNh83VyXqcf1yFeN7yLav9Fiioie47vSexs9994Gk71Ofl0P8eckbPgckQF2mL8mZ6LQ4UXDllO46hhUuNome+92qIKrmbV0G/nVeWcub4B8dxsThrjF+TX0iPnRJLoz0Q3fLps45kIAFp8ci+9MTH1O8pi7C57OXaUBma6u6BUd6mrCZhyh65YYGk+ac0XpoCUhDVp6poO0nvPGXB5N0DLybplw+YADEFJ0iejymgfKYDf2LTF6CeCaJ2Bb3FN8GsNn+cd3s9ZgNH8dSzWr8zcxRWS7LproOZpLCGytPOuGYoskp1FR3kJKuhA/aKJVDhFurKLJ//HdHHgNWVa6JAKE5mNsFmLOOErIT40bVWPMz8HLbjMda5Hg0G1QNVS6UOCLYBbLe7Rs/N2cKYZor+YVQ5xhfDcx8Ra+jnky+Hs8DXnlc5MgbIRxRNb2iohBksIDe9iayk5gYskd144MiY0ev6uKR9YCq78MMzaMHsoAIeWhdILGn2H6M3lDBDlhmScxQ8eRIRsscgQ0g0IxjR/wxog6HLiQ+gKjHjf4t7WZ2+wlQYmGCfNv+pTnn4WFOQEJp05He8DZxgMyblp1e+24YfoXcyD/XJmBSO3Udx52XB/x4NdMQhCiiDCqhxPFFnYhCtjA+8M8MoM0+dLNIEPHVQAdVoS0UMFylJiDK9Vy4ENU4UmtHoF6KHjCVBqRYFpgavKMCB4kPY5NWF78WZuW9dV0d+Cz9u5NVNWRz1quRbRJ7pijeTb365vtBbiapIv194rSIefN/fXGwWAZhrCCZHQQNfAYmoQHaa6XMRhWQJQyMhITRH6iWPRDul9LnIh1W6k3ceRplCZuVDi7xuVcrickwghhiIgtK2WpsOzSguzCbdQrW7ySH2Lb9YwpWwF6w7JLC7JLIjUkpgZNNWhbAywDRyvZpYXhsvK7JdbeqAsJVAjRqU4juwAzBQAtqbrlaNooUTVTdYbLORHgkbWpkARJJkscu21CCIHgQq3gmL8zpa2g7whxyGiwgvd52ELZhK0QOex4IEMSCUZU7bmajL9NcnmYmMGa+sQ7T8UWFZxSgVMcyBZyGTqzjDdqy8tl2JxuY7VnczZ/s2DJCqMCIgg1SLZAYF0jAAzB21+Vy9HgUPZvVD5Em2M+c+3eBC8CumXdN1wJGnkzeJB3vjTGqyQgCgzN45wVk4koJkPZXePILMOThNeP7LijfMTo1UYk1EMeDwced4IkviFYq2SVbmwoz/g4Kqc3iMuIfXvey15lKoMIkeQj2dUyjP0cnpku5lVd78UD5HToAZWjre0IUtqPyBizf6uk8DpTNq8XHcGGeAT22LT0MddDou8qbgJQsjCfTmEs2xA78AYqv8nkTB9i85ah8rtiIi3D4cTTUFnSqLp8wjQEs54hGEzjUcmPqG79owD4JgI4B/Ro5KySbGC/X4qlz2ocUfHVup4IiA2bXZ3qe4bbvuiZaeS2n+ZnYhPbnZFnW/FI/GS6XDEm3+RjpyavpepzjIkbGndNZrYb6FdiW1av3Kj1ixz1kjM4hHidJhiCTFwAC/oZMSVb7ycwxxjj4c/odyBZOvGssVxNMIkoFfRIM6xQoG/+fn4Tq64YOn8/n85vesfELJvFqvIqq/sK87YNCL6iVz67v1/j9jsDSq/frt//RnXTRurgL8zPz1/g1MFtqHN4vMiFKJbAHJP3vOc0sgLHwGpsu5zpuW1xUtK0zshVDoDyFc0pfeexrz+J2WMyumIWMEmKbdChrS5M9AssZfpi3BCuMRNMoqIDWMku3DxbzNQCzdvg8sd07g26xXGsDzcORrcAOOTGMiOPJC7IeIWuAeuuDbbulJHdJElpLba2HbYyBKblSmaoX3PPoQT4jICo0KwNXpFvk6tNPTkdkDug+ViVzz1gf3FzNiAPzvAXW6vhz4BUBAA8XNhuEhe2MXZ7neYrhMJBZnPWrV7v3WGipbwxfwPDP3uNqPfv6nZEZz6GZV6M0u8F44cBvtmUiCDEwUZNRHHuMNLZjMKN0j44wA8mqwcwzh+tbPH5zIfEq9HKIp/RjQT+0cp4IMhH+eou9Gy/IrlPcxA/7PMCjrlr47h0DVzkDOG7NWpgDxqer5EDCekCHD6iaLrWOexf7aZ1zE1ry01rYhKnygTDjidgmxvOotP1hPVIP3AY4tUHwscwchxyRJmzmmwTxnVEkYC0HObJ8kpmBK+vc69b/BqnW5yxXs5vilXSkFhO8SGVkAgpPSTYdo5bO6YMpjNEzvKzo6pvYa8nYAAkp5Vg+ozD9NJh+rQDibbkIrf5kE3yIgn2YudDAgOtrk+HEJWxgdloWYryIiZDcdoHyYt5ldXRy+SkfMizwRruj4lldI12lzjFGaOFxV+E9rwHQX1CoRwhVIRETiaKTQjgIPpabAzw0xIsE7N1LBti5PSzs1iBn3uLZfQelnxZ/UDsQ5v9JzB9yHO+UozMl3NmBj43FB0CKxRXOm8M6A1YOSf0MbbyC25bQhRdfOyVSADIzjIrMX/Lq6O0lZjF5dVZ20rM5fLKwWslGljuXAdTut7kZDihC6dVx/e04nk+qyy341STXT5YVIY2BpytcZVMP8Jxb5bLx+lyk1w+pgz+yHptySWWaSSw6k7pk0oOfU/gd9mUfgS/K6b0w/gd4ZTVDEizXGjhZFPST5HGzELLxiUT3Dwv0/PKSp6eW7oX6itD1otZFbxYzVin7ZqwfM1wvczxukR4naX+yzgFISZzmQ22uULuR/h+82y+aZa2C3rbHoTp2GTjcrDpH1ErVV9F0tPnVH0ZyYieVQPr6Ayv4Ysvkqzpiqw5uPFUn2dK8Xhfb4SiPNbXG6Eojwz25uGKoryI3oR9vWFaZpmTZw6fd7qFLG/uNW8Ms6qdS0/qD4ka1LIKXHtGNGjP4Dh0XsnETfZK08W8N+NZ8sefnPQsDZwJbD/5E169T7tGA7iAen2dMz4t5u3bBt6u98fFsz4wqWACpIKpDYDPGUP83NL12HqS9kcRn85h1222fHyiY/d4VWFz5hZhixFhiyG1QRR72vBNDhTDtQp6hrbV+4nfY7O8nR+PZsvR3zWVM9SagbbWYK+m6AvJd1Lrq3pJfaUahaOKRsL2TxnIvUraQflXue9cZa+ytF/TpaP9WibezMvf5qxBiCq8avbMKXFX85H25WawFlnu8jOoZQZ1/wzC6JblbOSC3MMscHXFDUXK7ks4ZOU8mnWuheW//49Oulef9MpC5TTC/+Zp/hYjld0II/bQymhrYTDm7mAC9ri7Y8N5MeOs2bXqwyFstcRy8hBnRRoWCjIs9llsjGPcKIcRzsOr0u4MM0Ws0vIMgy56lVvlMKijV7lVsjm559wqxQpTTHQPJrV+0pO3Vukk+P0LcV+vvxuLNS66eiISI/djkVjksYXdsajPyD2GndUt7VVi434sWmjjfqKyGobdYJnexn6TVDJbZXJtPa1NQOaTun8tIdWvfXeiz6SIHjxCb8bFBwJvxmX9jqc1s2nOHYB0gzA2tek7YIQsAavBdJ7FYM/HvSKFo6KznzZWkDuv2ASTZMaNyIHuajAGpDslccRZZ0mra3axsH18TX6tmcXXgL9dO2BLKya47xLgmcyIB1nxR/A+FC/WLdedLDW26tcbW/WtpvRGSajwP6FTr2coc6febDqVm9Kvt44IcbGaJPc3mUQWtT7WI50aI2axs/cqO36bDMorxtnnIzYJob7B/hR42pGnaZUOKrXpoDgNFCfIgY8H0J9E5guR8RhriqekV08NlRTWf+JWBKzfXWygNtbS41F/Cf8GcdqkDRoMPTZIwgj4u22AUNV0OZ+aC3I+eVXOJ2xqYhkG1+48QWW8EvWk5jlpysepc6A0viWxa3ITiggYrhVfWc47Nz6QHATmobrwbHIQWM3sLhBpfNUMCcL0uwwpvunfOn+hr0e/T5JmuCiBizLulJ5zp/Rg/us5d0q+HXc+urZf4sA5xqlFCnZpXdTfg4ovM07O4/WMDO1RScDQtQBZ5hoB4o1Xbh8tg7VqcbcPHAJw1oNluS46qMaTwCDRXEcHug2jG8+lrMJD5dFG80FsI8unP24SVk3wIQI95Vg882zFzU8RQbJPY0TjWru3XPtBmNbg3MffXaq5NieLXQVH2ekdlTk4ESNTV80dZKSy6F5mhtRxQyoA0lUgp2NpvX/tJlcfmIrN811VVSNCLydl118bQztJ8+kZ9U7nuGLeLFo2lS4dNF2Csbn4jp/lObH+CHVyxc4Fjl5Z54I+gjWevccSrLBGsHh2R8zsOlCIx/jLbM8RSL/WXm0CFmsSJZt9jhomI9cgkGowoulqy3RRFeuPF9OS6MPMvZmlJefe1uemnzkW92296VthXq3iuJZM4ksm8cvyLRVvXJeXj1ItROlHZhR1ogaJhS4kwpJtP6yFOzWymQBbuZGM97uRqLRyHBkRXu5A8SxgyOQvkVXOapwFcQmYfBFrWSUR878b5WuFi1yIevnajN0LL0bFWnZNjIpR2COtZYtLD5qLTOJBTIuTJ4lhhZh8jRzP1x0XJx2YmnWO58vMrSc8gypRve5a4SucitoQopWFC4bQRmrnVLpVrDI9GHdc8D/1ue80+3wy7CwmZqrCfC2NCh2n0Y9D3k5Z3k6NEJwaebsm56eQtzmQgJwvYq3nq1jOpmU7bgPJXapRMNjWSMo/w3Bi87iSgqNJrbKSGw1KV92DCaT0TecpTiOdGK+MGF/rY8S97KZsG5qPUCeWUesdTmoAqNG3nOO4X7k+joWxlj5cVZdfvlNLyz0oUhwxroHsIhkIHh1RVbyKh5TJKNPnJPjt+rJta0K17owuZiX93KGat+GhWlU/rSqGXDJntXWqSjQ5qCRBHNevuhZ35pXjyyOM2AHz5Y8ow5jh0kE94Pd0fZP/shjySD9DHnHCw0WvQucP8cgyXH740hyZpeULtaL3c9EhXO6uWPKwa0Zo4wJPTG2oVHcBS+bYyTTt3SJENZ7EAvLnOkGQpogmUDFlxY+V1pYtd8unDlQM2LLlbvkHn0LweMuWaYPdFVzrDrLlZj9bHqnz46cWdc887FaTXViOUcEfr9YjsNORihE/dWCQmcZ9jLjWa+SRnIZ+wjJi82bRsmmNnFhG3Ky4lM3ct3D5nK/N6ntrEmjI6HmPWTt909q/dnyIk/W2DO+mbm+RM9P8Y7XNxv5iWw6OVNwE9hMz+2lUtErCMR9xw0O5YtrBVldfpvwaj6cBJ9nGsKNbw7Kk5ksVCJqVQKAXEQgig86JQedQ/N+EsiwpECxK+pfNtpezLhlVdI4XM0QpJ4lSXlNis8rzP9HtHifK1LasvmNatVLFSL3fL5l9N5dm33HFvhPDvk32rHN2r2X4993Cv++q8W8/Xdo9EbMFss3b30t9RFtR4VAjnPvK6t/zuIggbuKH5HZeBF2c8eBBc9E96b5B/L+grIu6DOGC0PshG7HpL66AfRBFErtlnzXtlnWcl6qGcf2tGusAOTa1nasxjueUyUxKNZ+rGMfZinG8ltrpmF3bMisdwR3dMhHz3u7sXrsgubGQ+EgYR7QI42j3M462o+g4pLFdOq1qhKLNXfiaqjiIrjiIthyEwwSdcnWUJ+Ne4VkYn6rqi0yG499Ulq3wE9OJszW2cj6WdficYSvnDJt51rCVs3wG59VTHGvOQOwjxbHmFMdqMMWxGkxxrGqphjlOkKqlI16Q4jiSBpDiWHOKY7UwxbFamOK43ohJcVxvpkpxrK0StZbimJb0SazQM4BoKtG4GQBnDIBOxhb+S9FEv3wm7qOEQiJAJZ82JOJkRSJOGhLBO5dnKtp2KrbxvyapGC0IyMf5W6b0k/CDXTmln8Dv+in9OH6XT+kT+L16Sh/D74Yp/Qh+b5zSD+N3dIoEB/pNpojWISTcFNEH+m0RYXztxJQ+ipuCbkYmED7mMG7X0e2yie5rpzQrRnXeyTulv20CLrqPxU6NJhT6bD+FtKMYJHRGAbpc1JUXaeexpRYWoZyP8SCrQh2cpy/eWA+csIWvoJrK38iX55D6Eh3bbkNP1PPGLuyKNl0xvSbs7nT8tNUemNL6pAppO1lbsidrSzZfSdWvp3qXG53rRu8p1c/oz9YY/VnL6Ettt23yerNZhivNMlxvluFyu8eT0qJ0fD4u3iKb3UuMEMS81jk4lche+1JlCA6vLdU2B8xafuMrACZt+V47KDEsBOUTNVA+Uad+vklb+WtXAEBmk5K38mwlZBDgrjaAWzFAvzhv5XkzBil4KUCkl/uAWOKG2fy1fKZt8lW+Nm+Bka4oNuRe0QJ9MpcMF2ry6gJvOUf6SB3KtRysVwblEQmPcykon6hB+cRiUP7Ky4HyjQbKjZcH5eblPmggiScklcJBeSQvJPHqKIG2QBvmkuFCZPxGTv3K2ZOX1aFcS8N6ZVBeVl+gi0P5WA3KxxaD8pdfDpQTA+Xs5UG5cbkPEk5Cs2w2X+egvCxfByhn8OguOL+huWS4IBFqgbdKyNBR1S+7flGJ8HpU1aRXyd9cbfaqTcpVHCmKU1XdwAEf+PIq6K2ZKxiGcJXsMS5GNojNDfLgfFRFtVES+AmM+/FIWB4O9MDyHsMv8bNjkczrgq6k7nArBKXsdAKPdsY01vWz+XLWBi032qCVs/QMyp31vP3dACoAwrldEse2+OkosBYL3Twt5HgXUAZimqfrJEke/EBku7W2uC5fVUxxcKtJfTTqWhF4MMOtbBsQ2MvrC+ql+gJ66VcgmBcf4155NK8klYV9iRBMeQ7l1ut57K+fLTblN5vNys2PsuX+W/OtIqZvBdpsNKZAqXExrZDfxTSSqp+NU6q7XpeNr+PPlfrtsmQjnOHnk7P5NYj+9OBHYQ3AUzFpzl/H0bfr6MF1L0+PODWbT4ke0WM9YkqjptHmm0x+YRn+1tl842z+Vnm0UXDkeJ5IUqWbU4kwYwTR/ObN+nAogioHObpIdO2vkUpvrZ1ETjD8ikR7g6gIBDkAd0rRmiwS580XzEAoqUHMOBQPYEb+utl8jWw514i1OHwgAOQ0nwCQlW/i4xtF6ALjCERqp2WQAsgpA3lsNh+zQJ4QmwdE+uRGAr5/NWd0ptft6nz9pZ+9e9XZu3tTnmuIq6iNfywMZyAA8jAOKIezm/JhE5J0mBVGw87uSMwkhtfrrWL5OYwTUfOUHmzhGrKvYssxDBBxFcGebAIkabhKxjQsPkuuf8OSsXAIVxe5xSrhxTCrIodr2Wpsr05VT7gnfHNXeR6Deh09Oef1ysOfp5tjnzYj/PQ1emifftBEfeDYs4hL4y0VFU8mWhL6Jl1O88VpcTUnv8RDpNRCREQkv5S8ndokv0xM9Hhdfh0g19k3lYRpnVdXXOP1i1aI+DlcD4cA0Wxl7U/pTRIfn+ivzTkcupzDUX/O4cimoQVvlGieocs5HNVzDq/uSfT9ejrV/WqzHpMsfpy9dV4tnXa4aSLl6vIMoBBy2oDs7ZyDFTlgmybz8LWS9ZajeoaLJEY2yZBNrtzQ9VgKzJWxJLYNy8Qmtq1KzXz7t3778597/uu/8l/YkcIXJ9Gwnn44dKlxwyo1bq1dlxo3NFFIlSQ6kRnxbSrorp89Z+cmdNPBieEk3Y6ZrWbuB/s4Tep5794ebZ0CgiTMy2Y5T48AlF3KLojXVMMHY+BAiE1BnGY1n03GnabBnaZDl6bBIgnzKl1tckbsPjTcjyDTUblhjrOMIePPRu+AkqyvicnuJ3mrg6rNwOaYZTBJWlkgoZ0Rg0McWRg+GkkdORJGDrbACVy+aV+q9W21klWWB9CtkspKG1LAzBleYM4GS33rlLrBlNMvppyZaylXLTviHdm5y4WAd3ANZJZCB67FxrVh8XG9BEBoOyB/4YC6cfkfP+mieMU0qPIPP+myRHOhlwyerkkKJeYTPMWlghEF2MmSo3EYGvRTToFz+SefY/3IN+1KCi4DzQXVgWyyfi6fs/TbVP3vJfTgn9qqO7kWdL/e+1FLS5Ed2ZJuOC1eQHeaVNvquaysytW+EJsJZLiYy/7XijQz46K7O9DEj2YXFWysbE9+a6An7SvoiWtntWtHBrdIQ7Q/AIl+qXPwh5/jk6tvqheD1otOhK3ScS2OXMXuXYsQhb1in3LaW5zv+LfgvNANeL8SmJms4vfPtv2qdJUsmkvvReGhlw6Rbwxgpf/SsLKmPeaYF1guga+VF1S48ZEjrG1xuNG8Atw4eIRD0kXluMPSJXCjkwrXlbYeQrlW1VbjpbWFcrUvvnSEmX1UtqreEEI2qnZ/6QjrOly7yUtsN+n74isMOQ4HAFfeH13sI+nVP7C9anA2XtOrJ/shP9vmnbh9e3agz9FL7HO0ZHf6X5VfNWB0q71tcg88v8T60BxtuI6Y7WYrvcyKutz7ZroYGgFfK+HzDqZ+EiwcY+V445LLgWUJFqjkdAGdS/vl0dSKenyIkIK9xU4eTSsJxgOgWVBM2VFcSse2dGwEttgJirGrSgrMlYGIeXEZWjGvKtXNGHFNSLoM8S+/fMRxSi40UJuytemFtVVCYyyCBIGjXTEjP/sjJfKRiJDtfIiIS+qWrp7uQ4V/w7gHqtGH2d7SqORdEpUGXv8Ht2B7Dk29xaY9TFNEXErqCSbqdBz76/uFiC8oqxZ7mgrl7mcu2wnRHSlv1NlEQ1JdAf0u14tFa97G+SouVbNOl5C+/sYbFL9aZp9KQnPLppobye0QVF89lSzcl4dLMm0ZYfgVlwsTK8k1FpULTzzk3MsRGaR84qE+ubDxcsRmwt+RHZXo1YftIksbXOdIObRXx04p/kELzrEdUrJwSDN/+VtP/fFn//Pv/ep3GEL81cuDiGP+iCnU8ZX2vYq7PPIQi1x/rATz5aHsmvFQVw9/7iHmQ39ch2j5Ox83XxqwMugvwSeY6p9jv17PyE93tSHmnvcQIkbRTrRDE0N3sOkrvTAPU7Zp97Zn/1VJOvmK6W+SNJbZHbXGNyzR9jpuG/mAOInMtXarGbqtZtS/1YzsjEZYmlH/5j8a3GouMd7YaRp4z+k7TcPAVrauaQhqmgbf6AlCmfKQpmr9YKmuXx56yDEQMKry8ENu68WFbNcHFA+BUTwMdsPhUE3xsLqI3DpSxnW7pnjQleIhdqYQ56zATNt46B7Y1vVeBHeK+3QOcaVoCM1KrGeU8W1OGB8B2KyEGy6iaAgrLZWuxKStlZi0xeHOFtqrg/1goheKSFuYrfW6UR9uvbDURO8VIdNwmS1oeKvdHrQTRmupLk8sXscDeH1XO65rPBhVlkaUDYOIYvVZLxbBkNOz8KXJyOCGb3EjWAQ3nvvXX/tUNGVqCTg0ucQAQ9Q0g1WqwiplSqoaVimDVegsb8scrWZyAyjHdR4Zm01aaGHsZ8+4YgzjLoPwQ2aftLc6fbgSutAw6dIqkpRDdr8SVenf9CtfU5NbUtsIl47Zet1hZJ+uJwIaRiIgT1q/BGLVKMzSKs+d9c8WbEH1Tqc1fb7/3U6Mnwn/05dpYau0IJ8trGWra+Hp/ndbqQWn0t3Q92rdZj1mIMbpplf3vR0jeIkSIGAfV6Y3fM4gE8sG0aou0NzPGUI5nM3XkMz2m0bYzG4sVSoCGgfhSf/qCV+v25dAI38SIezWmSRhnGIpkZyEfDVpEiwl5VG/h9BxSbeLn2xBgqVBlVyy3j/qQxBJWORLyhO+TZqExqbn6M8p354kJPj+mI9kqnRZnvRtOqYtdPeEb/IrjdPNkz4f8K1FvXK5ki7PyOVVdHmWKy02VH0e767DT55tw89R5DdXEhMkKR+XghMSNH01PXlMnlyNb4/5xavw+4hfrKFXBzitQoIEbq/GzybkV0okt1IiB7AcLnWjp2DhLelIv8fmf0nZnKJqID8nHJCHB+nAcYyfPFF7clQboA1C6Agqozk/S23iFO40ZucQx+RKYEDozuISk/jpM9BkJOWzXOFZVeWypQpP0wo7g09pSdoifFCL0QJ6GHO2HUM64M/ybHZ4HH4qoKK/h33rd0vj4CeH/Foj13g/6d/gfcnH9Ubv0/713qPm+iBdP8KKbgHtECwheNaKJkIAIQo1soDFNgvYyahHu7Xtl0mhtI9NsaJZyV70VMSmtVL0O2xecTKqjNJOsYlAMVmyBe6kfjriWMiQE2kH32zYBETyjsrNP7ibK3wmwqiLSZcIKC0UAo9ztDcQucnNfGUTVjTF5DOP90zpQNy3NqFLcoS/aYGt5xtqpqz0ZEisRCZRRCxZN3A3crZknexGdQdAjgkr5ojwA+QoddLr06FJ6OiXByJxCsZ5bNSDQ195hH7bl3VU9Bbzi4hr5q2rU7k15q2rTUJP3yYIrXKdrhKHH8/Yw9LWyOR99Dih5Pb2BDtxThgvJls44cIr2ZmpcoyYcO3Q0OjSOEZEkhr1cGR8FSOZ6IORcYyIqBeVc2IQtNv97okBP655QsTlmU8aQ9KaJ0S80EExlsPm+DIOighOmU/u4HyeZlb6HBSjns0tdziqMr72jSMEKDkSz6q03j84KGrjF0EVm+e7qqoCmX1jbhP3OyhOOgfFqN9BcbBsKl06aLp0gLoET0lGN5oIawt72iW4acmuX3t8elHTBxgre54/cXGIrHtiZLwDlgZHa/Rlt/ku26a/eJv9eCQNmikzwF1yygysqlmDhbpfnqV2XyOGF6fpcr1cEnUhiWDYZMyJTJwXH476T0dihXEyMr0est4QNbK2YIrqMwRimI1J84/HPSPfcOot3Lm4CcjQE8sG0z14Jjbp7u2DM/wgrx48yw8mKwuPE3G9+4+ZaAqwR8YJ9VDN/9gkWQZJ4RiY3wJF3WJSABk+2ATZJFjVHkz2xDDaPch7YkztHoxzLrbaAzYgO1F7kHBytWOx3DFajCGRBCf85Txr2Zgh75j15sxHJNKN5CaLLTwZP4YNfli8ZVvzNtjMa9jXJirWz6hiso53zqPEzWFDktlbLVs6gK6C5TUUN94kz4Zu4s+G1cSfCQlb22x1INZ4sRiOeX2GY8bX1TDLzYKStrpnKkwWhmeM0KPC5AA/GXEkizORddUqzwYyv2LxeDZwU/z1gKm7snO82mAIz1QgV2OWcbIdg2Or3pRhq2VTrjybVNsaXotrOLa/EsCGHwaS/1pJ/mtlPk+rz10MRH5oPrebqKYkUeGuBK4rynbFdq/K1Xy6b+Sngxp7F9eLrwU1/q4cfz8VVAz+mYB9ek8GzOJPBd3RKlczJJygxuql0qcw0hHw+pGK1+cVry+Q32MJed1bLJvzSI2rd1K5NVydbkelz09QB0et2TZ3ijgcrLWDirGPVN4qI9ZbhW3Oj9UKH5PCPJQvBxVjb7umsFhGK8Y+YhZctjhjp4EggzQMWZGGcuGQwZ2zMp7rhGokHPFHan4m1E0893ztK04uXrmY6NLkG69cTFSphH9WLiZeychEH2b9kkCHKgyH+6vMEKNIbZekc1GfRbKh5CMVJQ/MKJXltaUqxkCU6j3qwKaLatSmxpol+ZXVONwa7h9Qq2Y1jRprHgBXUKOJBcPz9506u2Lh5GgNC47WF8sII8MXA2Mr3YcG3+6rxmdb6bRq5V0GOQKDHKofOWbZYdxw6pGlume8n2vdO1LvXtMYcz90BR0UY+7mwg4uNx3Ugx1s1DvYTFtxagIZLNHNQ7VuHqp3MzLd/Okr7ma0sJsrBriaVxPPqm5G6GMrTIVLPRcZeumX5yITEZR4FFgeexGZPKF0v9zkCaXLhskeSJfwQxo2X4lItKISidpy2RBRKEcIyrGJrpWQLiMZLY6rRjIa+gFKRu1+yahhJKMTQSUanagY51eCvyPC0eqlhKOJxYWjVemlYQ+22Z6F0W7qXA3G8hSuBmHRRg5cnCSYSyZ4EbxoAs6skFyuciramM2H6z45w+KTo2kvbHxyzCXTPiLby3FMInGIO+wDEdV8IJBHL1dFJ4efBcyP5dL6QFRrdFCsy/PC4EMOsBaLiHWjS4t1I5VYFxixTombxwGz9kv+aKP3CeNpeyCoCXfKOPgu43DatF2epaFByolYymmwt8LwgLdCG1PC7GnPHk463ScQVSLaiJOLgqm65kNo8nyfQDS/UCD6yOIC0UW/Eohe8Hn3csFngeiiz0oPqfCCv0AY+gv/RSo+wPxfpvIDsT4yczu8yqojzvuV6uK8X8WD+Ja/UPNh9B7Dq8pR4Ulna4XPSuGhssNCtI+83Nmql6j1GP7/g9ZjWKT24b8rWo/0f4LWo/mD1no0X5bWo3GFWo/EqDgW0X68HK1HYyFvfyVYeWL49gI5YRHtxzm/4u3nfMfbv+n/HeHty5bi7WOL8/bRv+uKD3YwPG0IqVV+fM0XDnnar3FIaAtSE8gmZNaol+J3i+kBYhPr3sfR1v/L3tsAyXVdZ2Lvvt/uft09b34x+H/dwpo9JOiMNzAwplm7eBMNSUVyFtJqXVQVU6FVlAsesLZIhtnQKRY51FI2ZNP2cM3NDtdIMoqxxVGW3IwSJAE33C3YQW0gm6VACrIZJ7A9smEbsml57GArcJnO5vzdn/e65wcgKNGSpCKm38+97/6ce853zj33HEfeXQr65N2Xg4Hy7oIj7y6yvDvP8u6CK+/O98u7Nz8w8m7VEVmrjrz70k7k3bJTeLkk775wh+RddKrt+2FF2uFNTxlZ9/YCefV8YGWdaV9F1sn978m690PWyeC+D7JugIxL7oCFv/7ts/AnIg9XHFm3YmXdF4PvGfnfR1m3VJF1r4qsW7rTso4obLEk6xb7Zd3Lg2XdaUfWvcSyboFl3emg2+bowqkjk57Xpu8FS0gvDJJ6mZV6u0TqTYjUGwmOb+c+sIlpfFMZmFsZeHBP3ha91Z/P20L3N30SYwfw95/7fTJwVKTgA3ubB+kIu1P0OhfdzxLwGxj0qXXAfATJqr2tBOxqCXjAbHQHp9pxfcKPJ8KJcmylkB4FoceRlVxBI5GVkinPm/3d33rzl1/7Z2tfuuF9QodXciULh1cq0AMfj8BRoL25ltpD4ZUqYrMd+mFcHycp1qKcoCgoW9sISt0/YYPsISAFzmCB2q2w6b3lno5SY+o7EamDBmQYYzm0hHfr1uxIIg+JRA5uUyITNDAjjhb7YWOul9uf2U50mA2AmOPtIQ9qDxC2E5wREBM3IjfIBgjbdvZjWtimOxG2d+ijP+7Yz3eGKtrv+ZsGVSQ76qhHsSzifLg1ah0l3vvHox1BGlisw7RFRyF+BZlct8jkmrXBo9G+aY32w9Ze37L2+nFrr49cU31ssc1YGdvEdwDbjH0Lsc1YGdvEgm02fIttNphR0+8/9T8g4Gb/ZuBm33tCtWozEz867Aldt3Vig5hj5wDljRmkFOpHLXk0Lo8iJM6RfhDl6wJ1KdCUAsPuOujHV1m+S2YWV06+awC+at8iviJr+7qIaI2vvu4zvlr3GV9xEB4ZisjspuFwCx+uDLcdYxl5y94xmwClE/Y4W02B0W3GOAjOGFRPPqWI3OA3BsMhUMefpkS1TYr8QchuHIGe3mCR7EV+4T2Yx0/i1svtQUAOOOaXPD38Pgj4G/5ACHjZtxDwik/9v+QTBLzsk7kDd1TKnp2XfAP+vuxvbfJoC/hrCfjLgjsH+0RG7i35OupbYqHArHbalnHBt06Lv7IVCJRaaMNs1alglSuYJEuKb7wj9Mu3ZBQxkHBij2MVifx4dDQcdb0gyDASeX4gXhAWJBkvCGt2N14QFtFYL4gq7AsA9o0Q0MLNaY37mrdrIMGArEDCmAHdBGa/XRM1L7FhXmLDeLLXl1Q67gBkYtfZIUp0xqlNAPF2tiea79FkM7SV+aRlzCetHZhsbh1c3fY3bxFc4YLI7txHdwyqGEQJnlq3eArhUmrh0tgmcKlp4dJwGS5FdwAuZd9CuDRchkuRwKXzDlw678ClNz8ocGlyM7i06/2AS+MGLpGRkeipKfQ0bKBSoB+lFRRFpzazW7Y3tV17U/tO2ZtW/LK96YuCh1YsHhJQgnYBReGmERzgT4rURlEmyb+AUckwOmWSx8VtYRIK47hcwiTL/ZjkC4MxyZKDSc4wJllkTLLkO1swi37fFszL/i1uwcyGnd4m2zC3YYgat4aoMbtL4kCI075N8vR5f9PNmDHcjCH96qayhW9yoPURNkX9OYYOb43e7mbMWDkfVFbGHJwPitDFVxe0j6TSgMO1MwngWP8Z/dbWgGOIZHYjnzox10q3NTENbH+EuaB8yQXlti8o4QG5vwUesN1I03wKpXq4A6le7W8dEUH4cYMI5MmOEUGzzC7850z6irgcvl+TwYbqy19hoveXaKHinjkbAHNq2a99XChBIfcCirlbuFiPmwSN/0FJVPGDvvvYsFXfvpbSY7zdw+HAIJ8q770G3bz7tU74LdioGrRp9O3apRLKu51dqnvsLpVjFrp7yw0rRDqzQd4jMtzL8UI1cAn/au9hhQJcFhzgsmC1zxc+KLhleDPckg1GHkPb72HdI8vtLsAUU9+ePazrqowpviGnVa6rO7yHRdYZzBFiwcK66gMLX1cDwcKasmDhqmK5z9lF1pQDFkwyDwsWvqo+eGDhksPoOV8Ig4Uvqx2AhfNO4fMlsPDm98DCdw9YWHXIYLUfLHzpe2Dhe2BhEFgI/mqDhUDAwgVlwQLlg5EwBOoDAhayzcDC0GCw0P4rARZWKmDhiwIWVu40WIh0VgvHstAPFr4wGCwsOWDhDIOFRQYLS2rAbofYGSwRvazu3H7HrUZ1yKPW3kpkB30rtvk5jaVB2d2Oz6stdzuglj3sv4GBg+JS2kza7PhJs9ehX709GLHL9X5JRkbCEX+kDCXwAW11EJzod3TZHFNYp4stMUUyLJgC9zrqt+jjMj6gTYxRbsfXpPXefE1gKkYZ1Niug2CJbtPfhIMRvCeD/Y9tszNRkYIjd24rJNnhVgiMWcZOzt/inYmID7u+T9sT/h0Q3MPfvu0JX2v5juDmPMK8PfHCB0VyT2wmucffk/Ob2uxQB25PAMlSPPMttieyLdw1+jctvsXbE9D+hD0UNrwyQniSAcITZoOCeFrIAv69+GqMm51jqM84Z8AipAi4FIwiIseMsbnKdsf47W53sL3EY/rFLzByoEzDIJDa3NWfQEwC9QsYWfcsGHmMT5Z6hEUe7UZYjd/xtb/tw1wR/vwU9NtEmDidzBP8WKIszpR0aYF/NjnLD7rv9qVHTQYhDRtpwkcFxUaaoMtIvEU8DHDJS/QEtamGPz+O0Z8TN682FKO82g+26sUoVEF6wfFTpvBxKkx0UGh0QW/JhzDhZCTIYlFyv72UiLhKOO7Ei5J2bQEza3tUXMeUSArMWwqdMOK28B4E3VLh3hdGf4yRn1QfQx8wox2SwAiRQAgMiGS0z3zSQQqfaZIu7/EzHnQXRQDPhn9fSgwrRJX3RUw1GvNy4B7qJbhg0nTGeVOKxEheTRsHkXJLLUmm0iUqfpwzj+NCJBLkry4nNusaquv81cQW019dSuzCj92FH1e++qJ8lRv949ziuZafbtNTsuyBxILPKOb/wHO13LtA2VjXKf5bt8f3LiU2bVxXVNlFEn8iN4ENdH1dwzJchLkUXcEQs1r9XY3nKffPRmzTap2He3WbpY50X46HeDo2MXfe6QtQBxzNBN8xSWMvxseCyxIsBHg1je16xDndulobh+vQ6dsGXEd4rVtPmd1sTriVyOnnaoT9lJLnI+ynHrYI+xmbYpci7GrdzRV2Glq3FHHeMefN09IAyekqzeOrm25CumKjlKzuupvIjigqOhasIye+5FmR/ZDRkj4yQF5DS8ry+nRUkdcLUUVe3wwr8nojrMjr62FVXq+HjrxuOvJ6PXTkdVqVuPQU+VyKsnSK06aROt3DmZ1hrqeP9v8QC7AZlly8k05LATGbMpiNRIMgthEHsaWGqC67RCWREJmuOKxTylRixCpHc6UpAPl7F00yDYUVR3cd41CHVnSRR+J7U7pTTuZ3yJPwnRgkcoECTa4FQIyG5mt06oLiglKkUab8GvnpUrDR7rihfwqw2fUlLmnuBuIEWueYoxPm7qpPkYspLukuc/e8jytaqrsAF81cvngJLlJeSzWOitkNqBgF71w2gTX/UHGXQBoCDw04PqeJQaqjdPpnAwnzidE5xziGaIhhOFNTYtUtgR/kuVQSvVRxlE30J/RLQUdVKeCodyeCjUa3GGyUWob7L6Ezk7T7484hXNfd2VMUMtf2ReFsSuFVZRhzDbclYO70LCmcsqYpdknhrKVut5d86DZ287TCSbTvLtC7dXONUXvrhr/VEGFiBHVzDYAMWmGbCICr69sBp2/BkD4Mj94J5ovlz17goSquwdWNF/TVVbhak6uAo+maKs8BYXXyA/hoAuubwdu7KLyueedFYJ97uCoMwrGXf74LNLiPf2KIjb/GP2/Azw9xcObDXPptuHOQH17XZNuVluE5dju7Dx0LljGw6+RRfxX/7j/qb+Df3Uf9S/gXqQjbj+HCUruy4MoOMUYDswOMUaHs8GIQJju4bgZT+vzDlJ+SiLPjSRRZpLEN+Bt/yAOCOdVVh7zN4xVjCBVKhEexX5UfhFGc1OoND7OlTXKUWPiVzTOPVihHIlFHA4/UTMpwp69B1uGvHJ5c9zhWv7RXcVh4KGBurNGN3N7gvDCT9sYlupHZGwBnMcq2vs51vGRFmmzstowMa27TCG0FT8CjRUpi0NTrVMEQ+yDETivOqImJA2cwRZ5C8ibsCsuiU4cBvaxTOUIrs/9VB6aDVkzmU5/Tncl7n3vxBCdfwUHAGPZ5HUVJSxs3YMzo6z2/ORxSlOuTnKnqCnUYvsZcgaJXv61jdDNnoHsckPsmrQrgDhwLG1vLGM6/HzSBXCSTh5K8x78yRIL0q4bbFvSLBBYd5eYQ5RhmkIJW1SmxDkcAn8bv3SgH+X78WNDD3oWg+UQc/tBHcy8wkDD7kPQeY/c3s0OmB6A164Z37qb43Z17/OdxVw0vTnIWj5n5WS+/O7/nRDfdC7/uytO9+VTeyy5JLgjKRWlycq7ypSz/FSVfprbg1+EXcMrsr9E4d9OiyZHd4XMrwIrOc+lVxZXh9gXpr8XbqhJWvbioZBQEdsso+G9hFQB6zivTTY5pj1vLxJ59BMkX8LV7+Isyxzy41HIamMtmYHr+/R0bel26aujhbv78XTjT9OkZnYcAk6K+zF1akC5d4subnu6hCZzutCTt3FXAPykHXz+jJPr6kuq28WebM8L6z+UpzdAKTTMu51ucaZ5lXh24vO3wHOfRmTFNwhbxANU2oYdf455l5Y7VpGNMBCuGCM5bIoD19yA14W2vb5K9wZOMAx2ZVBJu8/Cb5xW1HB5ekFEHdVsG83U9mCuqSwdTKMZUy9AssFhMzAP8Ff7McI+5Fn5ySfGj8wq3cc0yzeZZ2stapl+5DCiteRL/8NnDxFswYLaHvzw5K0DDPEvMkeZJfs6GFFDfn10QsP4E/IYhPSlJRXFYi199gSxuP+AfL8JCZf9pF23gUfH71/7FH1GWCCbG0E0oEBL7PWmWEVSTfRW/8yJ/h1dRJKvobc4CHDGVSFIMnpwoO4y9+Rimp4C/H4bvTj6OKIWnQW8bm5mgG5QW9pKyq4gXi4EMOgOIBRqcasB3sgNTIgHOb6LvUEqNo/7HJJ9B0+FKkp4A0MnJwqcxSudau/K0uPFblCtUUx30sWn6d8P271np39O6f7OfhYHKMbF0k23Xep+8SR0x/J+betmRGnxnzZEtfIcl8qK508T4s6U8Vdy9Z7lb3brDRaR7J4Hsi5hJgA6iYB6aqwsmD01EBhpJUsP9w4X7v+PE/xT0Zx3a/zjP+0l32us7mfI6t0BbUMwA0I3MSshjvjtVHmesWDePvOKQM9F0Y59DC3RjrMyFKaOHJh+CjjTVMDce6cG88A/Luu+5+acBbTUx2C5USV2lhRM9DcITv9LxKOm3J8mrPUn6XceLukRcyRHsRZj0O2p5usKUYBq+G87l3txTeIrpad6J09m8Y/4kVhXLu067Ys7TgQ4VMe8edOnC43TzzdEUt77qnKGHkohj3TqLuOQYwurCSsUf+A57bof1Ux81vUMU2Ejj3x4xtO8oJJyjLbuEdiNMWO5rlFszKPd5cXxC+cpYNyth3TonqSbMWKe2AzeMCBwg1wReBaDwEMtjDQ6WlQUHS6pzD/5dVGjgVSUQ2GSh3yyDQL8EAqddDNgzvBrEYB2zBSFQIdm/CDLYQYAgQTcYRMj8oMc/pxx6Ee0GxVmbnad4l6o8o0rQ4BUQOTewiibofsp0EHeJDJRmQIkutRbu3BQ0SGVWd4AGmztEg00GKUuqjAZXhM0v8LgtK91fHgjUyp2mMBxkNrZP2NgkSjAJhkkAbgoqY4iygRDFE55r5Akhk6kByARxC3cWZwkp4/s0cS0qVgGm57ujmHMIcOaYq3RcUzy96/CgzVtSPtpcuhkny6F128V05DRgaOvYLYNIhpAhfJIyGuzuYU8e6nR3L2fQYWy7T+ag519VnRb+vYLhU+HvRdUZQVGj5nnYeCy7+3ExWPLc4PRTNw2MQxsCsw54ekNRPnempwXfzibSnKhzPSGrUMiK5xM+ixPKUV1tvNKkzJAxeOnIXH7XrP9xPvacCk9bFs1yNv8pbn33ntn89IvQQLh1Ghsn80/0t6LX5z3oJAgVtNm+yhCO7KtDDEX2sGfcXrag7BMyL64o2Xlu8Fb6bsapfnFVSTSFDE0nXr7fjEP3XnxjLB91czzBWFwTJYY78P3HeOSR17UNnkFGl5krRHgNc3Xdm9cfp03AEiy6xwV811UZRR3mJXsvayjfzzj/LszaZMiXF9pdwl9CrVwAp/hBn6Z8E64HzKPT848b1VoW2hOO+NOpWe3TZ13hiIoDzHKLUt09NkdKxTqDqDpe1TkdgLlLdMfVsdJBjX6skzLkrA9qTAt/EV3N5XWmMv54SFFyLZWFQmWrVq9YVq5eseLqFTiBqFgsKq1ZwGjqXOU/IHpFiM7EoatYLJFFMiqhVJJnVA8vKaiorFuUVpKAzHCAbhFqoBkK0Awt0NxQDtK8qSpI067iZlmvWOnTK1b79IrzfXpFaPSKZcXAu1+vWFSCvEOc6bCCvMMy8r44CHnfz6MyY+RcN3SQ9xllBuSskhE5o9whmXFGxGBhGRBHSElvziqNvc+rCvZeVRXsvaIq2HtZVbD3kr3BcsOib7RGNQkyMuQMQzrU/3QnvDXIGSLkDBFyRgI5ozsEOUMXcoaMscP3yKDTqpS928jg8A10+v6pF/kGGgGxfvQDf5ElMUZ+Y8MCxiWwWD6qdOADP7CbYPlFH7F8HbF8z2D5/DsLy08ONGpnxt496TzSVW5h8s5YNUDLdxN0go1Blm/HkXRzGzhZYbUNfHML+JJqBdrQfLacEvOMMpbm1FqaEdq1xNKM32jlEeCcQ5usEGjfsqgYS0bFuO4ZHaPFOkbL1TFOio6hbR7ryjGzHwvWLCy7REbGlKEoKxqwdFuOorFmDITr1kCIzhraBvm6qtogz5YVDRgFYtgtZti6k82w33TPCsym5tXzuqhOna5Ha0FZheNxhL1ksCmZUShpqVU4HucGnWTWJWa9l8sm9YdK+oeMx7KqtIXUgReVFQ96/4OzpK6W9j9ueFZI2P0PYZ53Y7Nuef8Drd8tVnje1gbbS2Xrd94igl4jwjO27x3THhu/l5Ssi5ul6XmCp+ekMyT91u8ykZat38eN8dtqf2uGLGcsVRrb97t9dHdjM7pzTHSr/cbvGWq3hT1PGNP3VT2Sa8pRHlvE4p5h1fGk1Ryt/XJLzVGTO1vYfGNh81mOCirm2mds7QaT3ULlg+3m5y2+XSnh21UX3y4Lvl0qbUgVXysDXIpxXLKcXyPY9TUXvl4V0zhxnHetafymA1+3MB2nwoCgWymDtXUDnlIenOuOaZwX8kYfYnWNyYxYXWPyBVU2JrvGY71b1G88XlJiHKdTg5E1juMo1LMVeE/bvUuDwFQLg5CaATirzAC8rmQEzqrbGwLeHVh2usfbA6uquj1wXlW3By70DcHrSvYHUocPetbuctJa0Ee3s6BjL/tw/BkZmqUSfaQ7po0ld2BQ4WiVh2bFGRq909Bt9+81dJP+3YZutul+Q2V/QQYpqu4vAHcdsJNEfV1Tsqy6LVT4BFx0GmyOTK05kil43eF1b6mSpyc5/uGSRc6wpKzQXiHbHjHEc3olt7LTDBAw3J5m9y9S5Z1mntC+uZkJdMjWmIU1606Wk+mqnVc1aiPILV/aJ9EoiUO1jmqNKDGbgNFRrRRlGgRw0ini+nu3YpO6PS3a42RbwHHcxer59z8gO/F5MyM8cLzTTDnNfRPGACgnKoL7vEfzCPnfCZhJH5O7R8wNo+LIvKhigMyBC9KvnnQgMt2LsHsNvjcpRzIi2oXiX5nUgmSHG2VELt6d28KJvgP3b3xXBTKTDeWbVq9rlgvDw7p9WK9u4Hzn7e1s0N5OzXo5TZldnruNjniv0REPfzd4Prn6n/iOscKHbUEtsdtELY5Uwm7Fn6npanNWJ+z5DzHWnZxn5yYslRq97mOonqaauT/IaCuDdY5klnOSyZJu0xJXJb+4X3QNR084YlmCVhMOW6ZgtYTLxkvq0G14STWZcTdRviSCAkKaquwAzWnexl6cVsxGF1W3gQKBxuV5PSp5NzMOMBmRBtSaHTRdInnCXaHtCe4CbSPwILK99gTKFIS6349Xh1AYcbDU/PtRww325PfMBp/AYzd+htZR5tT05yHSFfA79A2G8j16jFz4Y4wnHhLDMUyJaCr3oO/mYaiV9Np7jwWPwp/DcFMUTsATd+dT2a+LTdfIctbroR8OHOgJhy5L/IdwEaU0lDA0lohQhsLYNvMGWWgJ//Jg4PiODSce+1rbYJhkvAJt54GWt8nIZtVR1SrXjH53Kphmo0EP34NB5pHPMZY18VQRES8p49ijHf9mLRJyVIRHHQ3hBCsID+kFAw0DzYCcaQQRpngcOEVEeN4iwrQ4ZxBhMULvNVFBQS+X4tfse4huil+F6ynPO0bX/9xcFBGVa6GEaGH9l+HRvZ53n4fHMN92EWdvoCNPDk9eUczG2Nb+OejVZZCmLym2CZxWRaI/EkClwXxxxdbbojAM0gnubBtNoe0K/G2X4S+saKQvQL/R7D+ADy77x/wM/buO+k24pQFxiGovQYjZn4ZbG3DrCNyCVk3ntGZOA+KdZCBiEKnGKK5tORIfm/vhEVplXO8Y8zXQ+xFx5fDOZYfVU31rjjCg+uDjoMw8xAvsGUfJexYF5LwLhbNOCY6MCa1lf6UkcM2VwDWGI7W0OZES6Z71vZRokX4k8sOao6sq+j3GhC3KelNQI/HqSDT3TJScMX38gk8cfhc5rywTwEkswLmr5MbSE1ijAc7d34UA54IBOBsa4NQtwCGE3NYaIpDOJgDnCQY4mXUjdQDO08eCWh/Aqe0I4ByxjEkDnMOOb7gAnEOOa7gBODcNwNl3GwCnzrqqKNCstIfsCnRAjEMRduPRLrlFnEQzgzsoPCzLClYBiLEDxNl5K7qYmC9efdmII9wnLH7RvYYB+Fn3+u/bC+rl7H+JDDdgsYrWyzrrhjEzUlDWn2DxjRNaZ7uFACs0Bbl76i3hpY+ZvW2iV9ppde1cPTb1uoau6fluUjFjoDXzWDBJTs4n2JMfV0BSspC0zBXSvj3XQ8Unu/egCbeX3/PJ/K58iv75+F6mrQ13BiLek6c/z+DYTw77HofWRqsO/o3MbiIyTLQW5XfJjsak7Gj0XMt8rg3Idwuuo8YfNqbpE/1kAPOO6BeogAwd2plWA7YnjIUbj5Y0O3WUvTkVeJoGj1cKNp+BW0LALTEW1rxqXexVLUd2miatpcXaRDv1lKe37BdTRzQYGHtQb96cvtIb9bk9GisTM0V2oe0WUtMYYmpCl9aQXOtEMB+0FlC6uSuePmFM0YmxUE9aeqGv6ANCUpufGhvsEWvS4k4d1nxRd+mQuYE8aR+buYiJ0nKm7Rrh6YbhyBgbboO4FU32xpq+oG7VVl/jSAj0kVlrVXWw8WnXfP4Mg+MntgTHEzsBx3VckcRtNux7xG2uLzjcZv12wHE+EBxPsoWaN0tL4PisgOPl9wMcgzTApd4Hjuu3CI6XXXC8UgXHqw44bpbAcXMQON7H4HjSgOO8Co57JXA8acDxow44fkyDY2Y1633gWCtitb9S6C1x0VvC4DhBR+utwPFwyh0uYVtt3MPk5tiQ9ncutr1A2Db+njPHIGcO15VbvDhKWHdNY90U10root2WQbupQbvddgna8Vp72DHqXSufCXwEG8lfCcsOH23x83iY4FFvcNlcyqbsiwZ/wq7ggSiPaeOriyP68ImW72rKjhh3TsKIGDfHlsqQ61EMdjG9idDKjEiTw1Xoz61dNW6W7I7srLFRMjzeX/qi4PJ1g8uP3CouD7+dH9cKJahDZO35kExSG6aYnR4cF5LrzoG/R92jnQ9rv27tzNBmZ4a263Ez3Sqd5ZSzmTP2nKesyGWyuoqvKXs2PNxtO+42q4rhhLNDu2hOdp4h0fyOc+iPLVnXyof+HhFbVhttWaaXPBxLpZOdi+LLf1qZCarYEWXjiV1rjnTaepqM1yRPpXWsOcIfnjbbptPGr0bvzPMupYy4NAJHvdQOOdfZ5pV7VvtjgH6W4M9EznXiym7TBK3KRGe3OtE8ycwaYBHa0ZnhwZm2x0G188hgUhC/llq5W550a027AwkBnLYEYByveVW4E3z/4Pk9wg6w007XHL+W00qfK9Gax4zxbDmnR3LV9WyZI+XCHqZ07MAIcJ9w8O2jjG8fhrcJ14aAUi2wHd8a2LZcgBrNF/+fBbKt4s8tkGUfkwT9ChLjYyIeFxnC50w8LuReG++1i9/5M/HCmJnvNgb5Wk+bNTMtAFecNOyCsbh1fDvcer9xaQgN4NsH05sgbAxnfw6xs0IoGyJIbcItC2VDhrKhbsARuJPhjIZiuT0EAvJwyXAbVsFqaHCsha1m/YVCcdYmHAoKsGbjUJuUH+Kf08cAvIaELxqmkHvilHWFo/6qqxucUxrkGhqvgNxDQnN5ee92M9vwB95bdzD8leNgPR5Uq3Iu7vBgUZDymiLU3NJKN1R2nOuctlXO7KjG1NFiB03BphPQ3MTgvPlm+3em+zUj9ggR+3TFBn3Xdwpirw1E7J7G8oMAu4Xzh9yn+8pwvu7Aee2NvWBOaKKJp4zns/lu3JNYdhUw36qAefdcJ4YncHD9ubIL9uuKgf0KyV2F9Sqpnyt1K+htUkEuFQxE93UAAILuV9QJUhIWlT21r+H9acfHTuP7Bddr2AJ8kMx3ox1phwjfHoDYepknZpk7HEuk4aWSwf6lclv5hF+5rYLOV43n8rO3iM6lUbFpVMyNisXNhczXAtpXyFNZYzkJMTFlPY7v5lHjDe8V4yV/s+IlP4UOyHcZzP6M2JS1uXamZJ2dNmbIDQPZpgWxrZRd5Ke1QVq48gl9Evcqrdi3HOc9jpNzruyoDCRGjguAER4y/WO97ds1O6xvIE+asuZ0hsMPmQaxqrBgp2PRccN/lgzsL7rutqb1oi1MYbuo288YI/BN64av/VEfLmlDJ6yeZFuSdqYcN/gbGuJuDHSDn2baym6RtlhRWNFe8Lie7dgsiCL1jGkStqikK5RJsKwrnDCqwkOG7KY11QHfN2RnNAUmApe0eKgHkNazDNmecbrn6AoPUaOdk34YTlnA2REZx+k+H3iAN3dpX/jBhvWewSRThoPddQvcyjeMoeQe/zB/9yH73cveHf2uMt81nvOOphNYTWd0a02nrjWdkMKDF194wTHFv/pCRdNpY4DwtutND7qFYjdyrVloZG9VnjEoYhzPr1DMZNfx/GNc4KFyAaMjvUh+519zlKBnucAzVgUa3U4FOof2BK0DfR6qWdxO4RE9Y5Jsn4ZpkqbRKykaIZMnqTIz2uVqyLxM6Mc6zloN6HVR5VaU0YFOO67hoeP23XY/9YxRg1aU1YPYsJBWtKHz2mdcK0QbrkJ0Q2FQqX7tk0J8XdJHgLrDqIEK2umM5DHuXGf4h08746n/Rj5kFvjbFBux6vpNQcTuEndvXs/nref3Rb1jNiye38/oo23aHPIKe3/HzL51+IGXlHjrtbRPuHiJJ9oDPJvLwznn9PRgD/DYeIA3jQd4ajzAW8YDPKl6gCMCQLt/h8z/tW6MmB4Ga/Lx+U7M6oJVN1BzcCJU0cPMPGQY6TynBnWhtgfF+O+x8T8sqxKTj5dViVvXY5Vuok/Is+rEbhzvgVE/S5OxpLcVW47xZdHdXVyQwznPcJQC9jKP2VFdHy1scuQCAZ5v6ZAHCfvZ85ql8K2pdlL3abXwMQYebj0cCHJC4Ct30zRgAtiQMTq50jdnJf5STdN0BvSd/YG/h3YXu0PwInu+N9npvimunORyGfOuo8+qmVEv6Fp0D3NN+5W5vSbnvt68G/56SC7afMzdjcOwoXDEYG0BsXa0F/7l8mHuluuB33C97xPX8z51Pe9XVNX1/tYoxD9uacQzNGK0ZvheaRHsbKcrJnV2052uwcRe0ptB6x7Zget9bB/GfQ+37NedNRT0d/g2DAV1ayio9xsK6tZQUB9kKFigc9olA05d73+Gev8z/K4NTrppnKZFtYmLfrK9i/6iclzYzpS19lcUerBJCCfW2tHznQLd1Sp7couitV92z+veZT2ezHndnrNRt1xV2pdIaZ+5RaWdBcGV8ped6KkrA6KnLle0vCX1XqKnUsQrPq1rgl6laFneLuiV3SHToY9uLfrp5oGvQgpF4gS+SrcNfBXeTuCrtBz4yr8Dsa5uMfLpnYh11emLdmXj3jjb3+zeT4sU5vb7bMgyHsrupASt2r1Z0KqMDyjyMXKKRrVHglYN69BUl3Q0Kh20akSjx/M6NJUOWrXfDVp1wA1a1ZagVaMStGpsQNCqg9/SoFWjGC7ICUfVKDur5K25fMwNJ9S6A0GrgKAzPmDIQaso09MII+Z97E2+n10dD7hBq0bx+TBD7L1u0Ko2B72i2OIHK0GrdueTOw5alZWCVg2VglYNbxa0auTOBa1i3lAOWvUAse/bD1pV0hz6glY5eoMOWhWIB25gg1Y18arJISffY4A5zZyj7aNftdjS1hzUK2v5qsRcC3Fb5w5Ev9KOjeFca1gsBjAKI4QZXbNIs98skqIihMe2iyVrFkmLxQFmkcwxi4gho4V2iZY1ZBw/BXBhgLo9Y1b9THmz94Y4M27ozV5xZixbOlqbBqIq7/a2ebfXNX6k/caPJhs/Nt3b1ZG6jLXjprNvS5DDYV2lQFgUV0VbOqzYYTtH4lo4ZthFEZhcz7ErHda7t4viW7wTD8UP/I5e7O7ouXsL7zFS1aDDPTsOWOVbtQBztW42uOa8j5uS8js5wFUw+LzPd1XahqYoSLGbtkErSkhsk2zwy3LfxrEqOThy+Crd4vwuE8nqMkey8ro0rWG3hfgPcVyH2MJlJWc/0PzTJlZCJhw+FWyupoJpidiII8dKVaxPCPkmKCHZAkCoXPNbfEiDfLt/nQZvujsFVVBO9KckEmtOjOlHzaGGKY2uu3f/KPDbuz++txVKVGPQS2RTkMTfZd4OwQMkuofbxeq6jAlvfMwFxLDIxbpXAOuu+lwXHcjI5jtt3LJWsCIOeUSgdAZk1UdNiazVCTYpO0QcWp/Gn9Gn8ekILnoyA6SiiQi1M91hjhoxxZEkMmEg5LdO+CdCjIQxKZTEmw2dWEoJ7yMleymAKOVdhL+4oRTqpYN7ZiF+t4bGtpCNZZM8fiQWQLMKMTxEyttJIVEvuReRP+1RY+kOi/uRolnPZYN4WByhW9Rm/Ip/GM8APcrO+TVqPLrto+XsbnaX3yc4OyI7G3vw665F2M4T3F3PDEhow0ySM7ioNyGqN5FNxRjiOjzkGSKOGbRrGLNegjHXXRizJjDmsjF7ijITFV+RQEdI0X4lrjyJ7+ACbU/6lDFRYxLE/XozRnum12lCKNwv2VHRfljPDmM3xvCgD8ABMo+O0Siwioq+6HCbQlXayPl1HjadkZvjiHJYb1/OJJQtplHFYhpVLKZ1ssTbrtGoS0JPjKs4kQLpgyyoYxYevemFGlAFJKUuSKJK5SRH3WAUDKHNlCHDwkKl25JhicisCsMS4bCkSBKpHhYcjFTi/dSRnnW4n7pQuo71Uxc+rveRIttV2meK7FDQUojsUIW0FWEualbEEG6KzIjlKKpgbMZTbUJersYDXarGA12sxgM9XY0HulCOB/pM1aJ8ztcOm37Fpox2Mw8WqJHqMyKpcaWYjZBLnn1BFnj5jakgQ77O0WnMq32yOs52gQIxgsEo+8L2JToktkhx1+lFeJLr8yLh6LX1LJQEjrfq8YJ4zm1KUxwX3HvDnNXOoNt3JP4Wa9asg14j+5BuMzvlXOV75jwdiAds7jM80XJibp+xtY0ZW1vTtbWFRyu2tle0XaHPn+P6AH+O9Yqlb+32/Tm0q4b7dTkrZ76Mm0oYO8pqrOu3fFhuC2q96uqnD1efXnefPlYCiQI86MnH6A0h6p1GAtpyrwKvm51Q49iuh9gWoXOd+Pgm0NkRQgKd68QuMT2xg4OpJmeblLZUDF5u9uPlpl2DzYHJHQgv097i97wPt/I+rBwmagqqTkvJ0C7rQ0UY+owD3oTdoeyvuxFi9W8KXDNnkkjVrV++jqFHbkULpbO+V+WN5XIqKzoQwG7+3azwHyBUusamnnbpuELP/yQZf+6f167a2hbRMnbMfF4HJpVwQsJYes7xW7RS7GPdH/UI8jSnoGnDDP1lQdW1HQUR/TArDSOAWRDMF6rTgv/qvJ+XtUJm+yvOERTLVLjjXYlNp/sWmm5TcDvp5hQz0LsMAxVmZn149pmjyRWmGvVLgEIhs+u/m3ZC3QPeLsgwhpE4g2b/Lm3R4jI1xt3QnK7XbzEGVHxUtoA+oGSB0QirpQruHxSYREtXJlv+1UZRhml4F8S9bLca6UzbVKH29uDmNYn4DoHWJnvNbOmXMEw2IEBo0kKH5bTQhaTFw62wLaso2GoPZQ65UIH8X9sYHkFRgmwkKw0iuyE0MmUu28nsLl3IGiiaolA/wyM5SVUt4/2346eIPnBxJUZcGPXsk0hJXCURrSwDafWwdFwOAUvPE6kga7FZVgpAi4allyH38ji8oviVt5wgolpCn1POyTSR0K87oe8dCW1Oq51VtyiiqTUZGiLbYkZu60amejAnWQge4j/HxTuvUBgpqlGsfhYUlzZ6DGFsBRb5mo9nRxz+xavRlkAuQwoQjznWwOENQgpvEJrwBityxup6OcYqzdeGGyPV5ARwVj9wOglpxZ+hzSTcaEkcxLgoiTGcSAbLhLxO7yiUQcNwiexoBfxs2MNN66XDTScdtfBh1gpPmGiyMH7Fv8RRykAhFNR/qYr6L1RR//kq6l+tov6VMupf7nMkmexqMLSv4khySJ7YNes8nJZCR/RLMwNeOq4f2gVU9szAzPZIKiPWtlg36psBSCEpfJsApJK7Vdm2aI2KJYBUv0PhIr9dg1efg0625lJKRkJMPDXsPHVOs2u4qrn9U4T1+p6L3ww/V/3PtzMGf+AmbMt0Zeo7BtEuETQdM9DUmH/Nu2XHmFSAqkaomP94FRBqdAitMiaGpc9xnVCidhNCqMeruQxISkQ67CD50mCk4qsGpUa4VRbCHxvPOoKrK/LCgqJLzchn4Pc1gYWF/yDVeVnHAY70OVrKb/AxgAtk3IsktwpGz+UE0HRRoycLyoTO7R3TNiffNCQ7ShE+2D6IeG9S+h9n07SF8hrQdO81oGLsY9cvJh5sUYjiXtdHsRkBPTCMb2oMG6IjLIk6RLCh1NfOE6jzB3U1TagGpKzPimEDB0+mFjpHTrm0uPH1SRKJDjokM1uP2+8jwo5Q4kw6H4qyo/whslVHPHDa0mlCLEYcYjFyQixGFGIRXkLio/qKr6EgSrUgikrJZnDwS/aofXhjqSyIopI9CkP/uPYomSMnHU02SYPSipvNAaYWtN6SCUXTGAtxS1IoxJGoNNn4hqJwEjUF7Qj+hzbwkBXspLvj9h5qIgP0gHDg3SDlgXHImy2gi/1dke5Jd6ake1P+x7p86IPGvT7AGmQhyd2DrEFIx6AhwDA0Cu/BJpnXhlCbqbSsvcOW9ZyWTdmWtXdop3LGFBQldA/Iygc/UaJ0ybQTWc9qX8TeoJXBZXq6zOFyGSIqBWI71TtIqIWKjaactSBmZYHFR63f6rO5hypeN4Hmmv1i0L8tZ9LUMdg4YtDX2pEVg2m/GEz1GCj42evvZzPblafZCFLAKkpEFAsUDDEP8pp2YYNJzuHqrLmagKvXzdUuuDpnrsbh6i1zVctr7Ba5HEBba9p9sla868/Dv5jCLHyq61mzea24AU88azevFe/QjUl74xrdyOyNq3SjZm8AH7nsw8c9unOFulpDkyM2LjCNQ0tj3jFXa/T89aDU+LMBbddQnYswKLiFdBoHZ8lHb/5acTqYL2785xe8DL9IW4Je9hCwXG4W9DHQQhnrg7LYILivuI24PVikH215XDjbk+K9wzBI30czCBf74OKQviCXn67oatRabjmJav4K1Lwc8NcwEMBZai2M9H+/CIx8N1wsB9D0bAZ+rVITbZ6GWrFCd1acO8t0x2Z3oIrRKXDJ52FZUzwsMEzSC2dAlnBusl/EdEU8Ir47Gtg+dzTw9WxP/qG5fD+T+X7q9x74tQcXkcr34SLyA1FNBRTzIioBPFhEPmKYU11Fi2jvXL6XFg+8s4/eOTCXT/JHJun64Fy+mx7vlqVVk5j2tXJMe36yT55Mup+tiWtFl69woHFAoE//Hj5bDpj4lzShUav1YMBEIZddRGJbgYLy4C5cPFxX9hXFH7/sc0VQM6yfbC/T95qvOQG8csXv0oFEJU25EMKqHkp5bvE6cGaY7px37nALVwNnzrFNOjLM9X8MlHSPLOBXfgkuzv8CTPhFNC699I/g8hguDGjcGr548R/pZ9opnZ246Fesb/ny42fu9kefD5/DMEz+qW6ArIi2SEPExtl1BZeXKOfLBpAbOQMH93qXVKGeRBNR2CFDHNz6sir+wgP8WLTlFtWism9gDZh+RWV/oPDFiwooJaD4gEHPv6C6MVTtYFt45byu3jfVv6k6aGRQT3YiKLxEE9EZg58bxNM64/DzJgDrEShDhqnguH8L/wfS/bfqyW5SHEYInBR/6T3QQiADN1uqqEMz9qR8Ca3K+DLmvuGRVuwCtnKVGt6axN9fghanUm9UdHFoRgvE1FD3XqhhN47RilN4hQvvwt9fVFyizS/Kpzbo7T9ROHALfifBv+8qHJGefxMdYANyhKXn5C4LqBaLK9YVolPtxB8bS8bGwrHUyY6W0BMvCPwgUOSl8+arQEcRG4TFcedfvkqwFIPCArxCO9yU583+7m+9+cuv/bO1L93wPtHyCjpHicirfGysHfhhMgrSD+/oGdPfeAxEX4AefCQF1pX0xdd9aU6keQNUAFPuDEDnojagnJwHskXz0bnWXvbX3Fvu1TA2phVLpXL/M9Qrp6OwfMVuz+/Jk8+k9Gnt6MlNviFN3sAmjw4YHcDWDdN96cNntqkoH2qNYl5zPfPflJntqmL8wRaWXXboZ9lZlPkQzHyDVs4XnIWpbws9LVFpXpZn8MYiL8ol+AJUCkupjo8WdcVep4HbsXDrZYUx5p/soE7VKC81XiagCR1mrxNeSolZSvVmK+VLWkp0KWziNLEJ7s1pXg30tc9TxqTIXUoZmT7+EtS/ZjEKlTRxlBac8gtcvoG/XzCriV5UdjUpu5rCympKZDZqZjXVqDiKBF5PCc5BUlz8aZjMBAgGQH6nhksAC4VF8gCxkvJjWhwJyb2ERQXAwwbatjRX0wU+kw/Ntdo4Og16KuQvT4H8i7Mg3s0S8BFDBlPQ4mP+GR+L6R5+E6UY000EdENE+JYuKujAFD0Hn8Kd71WfmTgiFpVR+VW/GH+gFaTmy+eNryoWD1Z9+nLD/TKyOH/ef16+34Aa9CKA55+WIR+WIR+SIW/w63NE4gskZrk1ssKH5b0h0wfyhed2DfNPhFFD3LXGUWxXatfRO846eqDVNrV04v5v+DgNMAfIRagKtArR6sBzskBcP4kUc6/3DJAbIB9U74J8grzrAzRz4KqegrXd2SWfJ8FYagJPiRxsmDDfHTXO3EMYpopaMJ6WavnD264F/Ujy4TdY9T4iQ+Whca5hcxgZL9hJo6KPDjjrOzGbn/4bWt/cxVYG8gVCRaPANNrIRvfC+7Oe7UFMhGnFvpkQ6seM5WszDltLO75woB9yuJrcFa42bZnaEbjsEUub7oZSXc8wsybhi5Cqm+oozc+as15nEv7btSmEeH4AdEiZ36V9/E41d7n8ji5DbmkuuAq+nxO3GsefHYsblMUNSuOGCRzASVtykkqO4c/dFjRMmI9QZBPL5tqy5lqy5tI+0ICjOSGgoQVYvx2FmZ8lmQsZ2nRfBR5gBlR7v4KiMXYAQ9rzvOLG1/6Hfxo/qAFDSiLx8ud+/ff/+P88d60EGFrlwzcEGED6TtJW1q4TsP6ayMk1D1x7VUMA4Q4dZw23BiABHHNTWtr6WHOk3HL4yuSs+oSBBfLkM7a+lvkK9cfpInAGaGYgJa+8Ss6FA0umPAMlvDA0YHBAUjQNXpAOf8b2sl2quwIbanOtDCslkQKTryXAkq8ZxQjy+zM+rtURtA0R62RZwJyWqebTmhFrYUjP7JiXKMm/I5/8pP5kNPiTzjTLV5t34Kt/25E4O/vqJuKEufBWkwST02JQCgS3myzerXziNXh592uYFPCNziQgjdESyQpBPYYmUJAm0IDds6oziQuNLyfgchcSJU9JXZpZk6823b46eMA0+OxmeOCM4AAeX2dwH2ip1Iwm9XTZtz0948MQoSgkP19HWg53iGllLC2JAROi2GLEiEPvdKEDPwlx8ppzMNBPtcjmhsIvQDOplclMNBUx9FxVCG14LIVI9ECrn2DRkQezBNcBmrO++mTxTXJyLalpf1wC6zgAWTPDr173rGw7WalxnITRTziyzXki1a97VsA9Rro0boMFmPTCRe0Pk1wI8eenyNVdxFtWFWvvAbBf9izgPmHx+sctXK9ZuF6rwvVLTumHLFr/yPsC1iMG61/WOmAFrEcM1suPB4J1IN0HXbj+Za09QmMzF6l/2Si4WyL19P1C6uGOkDoX019e9bu+AyXxW+d8BH+0ALk5piGAD28oy1lU9rjmon66Tafrm4HxzGBYYh/MAWCOaOUcP1VC3gUj7+OCvMPUllX2d+qAYUTmuJiGkUtQG9D+GlrlIbLKQ8KdrKPykFr25gt7U6S7QxmxP+BRry31COjPrX60MQegnZhYg5kYltT1C+cdHtA0ZHexsLthYnd1pPPMzlU8QAqM5eMyU2MoKceNR5mVAHG/BODPOwYMy/prwj09nqc6M9Gaw/rJ86mJf0JudSKtjrDV/QMAXH2UXSngUvSqCWoe/5RZx1k2BAp/FR34pu3BN38RFuUkj0I2M6tSJu4L6HGb/qsD/p7n/efEe5RtobjBHllbKO3TYqdUZ1ybKxes4SUSc+UL1ujCt6ge4WWsQTIDfxZZFgkaGLpnuikz8IgrJnkDvUUR0yGz/ZPI29GcijbPCTYg4s9dbIjsjLJltbOXWXuwqdZSPlRGrDpmARCLAKgbARCho8su1AnqRgrYeyl3CqVa6ko1Vkl+okPbA44yk5G3LoqCURAFERrLWKbp0o9S6VH8+WNaFNDnJlAIyucoUqfIg/PC/8+JFrOqcIFQom1aEisoDxSGYHLqIZO+QsunH/pDSI511xzqKw+o8rkCNyTXtYqwF2SKwru4jfmVJREVe3FRq7k8Zg0mltOdB54uDvwnhfdQqw0XwZOFOtUiKINWwJBsiiuijywZOXFex98KJEIpNJomVhY9Jw/PRzAQNmnyE6mtR5q583rQdofjMYZz4HSTbJVsfMGq160edM7Wu2rqpcpiHmge4BHMAuKMUAskTUgyBeuT2zusjzETTzfbP1cEUmnko+nmYWcV1mgVfqr4v80irBnSuUxlePmRtnGCmKiHeW8AbtXo+Dujk2EXnUBFACpAl02o8o90CFKhi3ANHuwOyqtJ8WpSxW8iNCT0B5M/OUdIcBKh+jA3B4Sa/sxx04NQjLdFh1TkBG7UZB1JhaN8iywlw32WklBGwFpJ6M6wsZAMawsJyRJtIxnqs5FksDBC6fEUMJ8Y+4zuzNms19mPLsQojeG/PcF2dpJ6eVyYy4SGy4RkGDEMhi6HjJ1kaJCdpJ6aSqt2kpCXRmZLZpYpDWu2Qm8NWY4yZDlKWziKLxxFCWGGhqO0MckYaCFArGRuYbdb5B1+2EKGEhpjCd70lDAUVVz9BcM6Qs1QFJ2xEzaDrutzwFOIoSg5BWkYShMuHIaSYebK/SdISde8QOoazAtaFSYZ5mM4pJmYBp324cLNSImgiuX+wJXLx1VMH9B+sR+tKTK0+snAsik3yVn2IdsSLtCcaKhyAc8CE1QZRSh5kXzAR1mrf1uVwApP5o9zbWJLwJ6mFXlhhoLh23v83qf19wLne84EDPoklhwWELxiPjiINdoxgulq83RBFfve6Ownm6iee5mlTee+KgdC0saobfukbWPyKCOTAgWr3i+WCgz90z1AF3vy/a9BLQde6ySzChrhjIQeQrdHb5PZ+lxZk8HYtRdFieDRd4ZebAxv215ccobiIo5hTYDmEAPNkIFmvQw0QxwfTGqN8FTlNdbuadM9u4c3vDq78e+yQqUPfTaipwGuobdixqeU9rNL6JgE6VF58ka+5w2OAlFD19A38pZcegVxCYRr890aSxWsQnPp3chT2G7bQmGScrOY4yxRWZF3f6Spoo5j0dhGYNbIRyF6uuPzmTZFXhtKx+frP9NGgQlwVz0/1fXJa6M9h8zKPcuW110RTDDWEmu0ObHaZo3AG4zed9bABl40tmtga5hPLAyXm/aHH6ym0UZJzWyUtE1Q1NAERW0an0eK3+nh/gvK13HbtTLweUADKbj/aVm3zQpHb2hGlLhMgCRUg3Efzqn+SXxoi3ESnEggOkLGjH9a2xSSlxCLoAwBnoV6W8Z6LNF53Rl1+IQMeV7H4/nGyU77pDtk67OvtHqQhr0FnwxTNgSdgQGaQ1CPs1An13W0NLRxcYCaCUs77oxYNpW6bErMHhP5LlGCJ3BOdlWU4AtUTLMofwsW1dQsCsC+Qs2DeDSBVTo4BhxAMSPwmBH40Bmfs2cChPbZkklwWu2UPm1MuC3pU44XoHY9QpfauoBHoNgCQV4tTebS8VGMtkw6+Ypo0V97GURMzsOYzQCd5+NcjPz80z9WKnyeQwtwYBNlXHxynzsc0i/EbTA6pBfTYTgy8fl8IlRcOPFXQD78+ItCwTU7lGG2hi46FKUGyCbITpIrMLreZyfzAIWwEr89+CDGnsIISEUox7Tde22ZX3OvtEIDs0LFyzhkkw27vUF3fz5SPnZ3mrq7mZ7NAYyDIj1V4Eg1TxWNj+wFENduKD8Iozip1RtU5+F5OWg9qyhBZfHWT1/w6EQn5hIGLRZd1cYksjxFeaJxwg1XHrvsCtn2qCaJkYjpQzkglNR5Tuq0JerblFjuK1HbpsS7P1UtkWxTYr2vRLxNiYt9JaJtSpzpKxFuU+LG56olgm1KXOor4W9T4mxfCbVNidPVEpy8AujxX4R+/Lx6jhdgfIjPGNF5UnWvR0GjMMpzQDFnJOO3Gwc6yu7lNzAlDp51mO8GSFwUEzqaLw7DGkEG493nhVSySxlXAi4d6NKBRJEO5osuriqENboqLnCqSH6EyxS1bKpaavbar/3cr//rN5b+x/+HMofRW7ol3FysQeka/P4aiv/6BoUvoce0PvB4DwxLdqqrcFgK74dVM+dT26hGBkXj74LwaTx+qph+6j6vjX4rsEpJXW3Po8cTHWGCMWk8QW+0ioDe+V3vR+ilJizdp+x7rK9f8/4uvdykF1DmpqfSDgb/1P2gMNp0Oj049VHuT+5n/xkdbXX6g8dPMEoTkwQon3CPTx9l6EJOQQ+y8HkOlB0X+0hwEiuJ8ejSWLfObhxNzcny+jHAGgpbdFQCcAP5/B7or4Z8Ek0+kSWfiIKE08kQJJ+aPqVGcV4AUt/Lb+D2CYPgmALDYCdqFfKJDPnEXDrWpeOUS8RCPhFFGeeqAiagmAYLw/wGMPmVUjg6FNIqQhGm2yADHgvhYKV+f1lNOPSYCCchkQBL41MwagkPc0Knj91hTvJkB8Oc8DD/w8AZ5kgPc2CHOcBG0QnsgKO1B3aYAxqoQJod8NiENDbShdIwB2aYQy4d6tKsEcN9GWZ4ZKriAqcK/0e4TIHDXCkFiPS3ftYEClIwXMX6z5poj1RIN0wTu4w9PvP7K9RjT49x7CXo2QnaxYNZCLLfUXwqiaKXoDaefQoFf8TTwgfR3GmhIzNj3aQ6LUlpWiKelq/V9LRseBwTbOC8RLcwL9EO5iXi0pEuHcmARGZeIlMVFzhVxDyMUZHoYbSlYF7Wf8bEbFKYwvt37TUV0g2TeYnMvER2XpxmmHmBx1J0E6xDJwUQ2fgq4tx2NULG8p0BPaXOmVGCj/0FkQ/FxAyKr6PLYz37ukJGeJyNOSi1SuO+dX332eryJFvnmuZkMp2qOIZASIfRMKKzCdwZTvkfPuaPsb3hdjvyf7Hvpu5IfPsd8Sgc6CylAMXKu4qy15mDIAKmf9NvRRwaK8BPTuM/M/B9jrZ2RKKtTbtHF+A6b/mVlj3IW32DqPMvPUue0NBCcl/TAB4ujd8hHD8Kj0+D8X/8NJmpfp8HgzwPqNDxU3hGSblRUykYhy6MjLjnf5gD7QGfyW5SDVkrKDx+Y9PJ881xCYpyVzkusUVJDs5HLxiuQg835SqpCa8HPOW3v6L8vc9Hz0mgwZFD7IzU2Y2nLhIdp2YDD6Fk/xsFYQ5x9ujnckxneDaC7gT+vRlkczs60vD8tkceMCJBzEHdVyg07GpsAz4s0Z1LsRPuYSpYiY8FyyHn7ZIni6iknY9JNyNdJZ7X4cAvx0Z3u8I/hzBMBBXsHMBeRnikCzq1EGJgip5/OsRNVr+4TiOBMbrv9a4HZlPDax5M8dY3gq7H+xow8GTJb8AzSqNFo4UVo2y411uOW37RloL0vYxVTXwvy+ZxnPi9OVZIvxBTkhx+/E1SNpdj+No4J+RaMY3v+WdjOtGJfC4ZGc5qSRxxfqmzWKD29yhy+usxHTE+wGXJ1B3lbD1to+E05pbN4Oe4vzNOdw9Qd+0eDt2RHkxjkT+gIkfIvac3z1m8Et5CbuAT2sdp7cafU9CxiM/P+MXNiHaNaVBithMsxnSr1ucdFBM0bvO2TbvvZEyj2XVPxtBlwk0EtpNIr3jbJsefHZSMsew4y45wg3adH2x1ilGooSOBe3Rh3rk5iD/Nzg29Jd+B3sDPP6HZOh1zbPkXaSKBtGK2FbwbdYjUbmJ6FY+Ko0rO58DJkT8qe+p77BuEsTcTDmBYfgx9mMsjMp9IhLCWyuuU0gzJp+TIPz7X+hCOS52e8uBbR36iEgwHF5cyGLwbHUMao7QN3MNvSmicm5GmyJqEisQzZLVSqEcyEizGrEXC3EJxzqcRi2uQ/upSbAJOU7qAmL560BbTX10060Dh6TkqQqG9apWvvhvxV7nRn+YWk08QfzO1R0d9aT98kfOlx+JhTm92xawEA5rM0+HS7n7mRegfk3BUn6XErNd3tlmvRPpLyXw2yiS2Foldnyq8EnGFlyNOUJGRzQqJbtLYq3YTlSpeg/tlGeMmCMd3AlS4j6JdAP8ZpRXcNZd4DovpclToclzoss6JOYjcyVfGxy2MGP/IFgaVLVaTeYfxUnpVunPeubOcVBi5ZttLMlxrEVkQAurlWkgMGBvoIIelhI+Q4trYTVFXIwwXsJutUrs5tA2MnUnAgUO6h/k46Ct5SqP773j/hLrwGujcTz/lMMOuHjfNErnHMD0eDSUP4XqgZ4DnYD1gXxi++nqAPJHsycQB1gLLDa8GxMIvB8QP14Ju20zkZakEf3816Hi8mx1bhliXwXAZIcgYPnd0mKNjMAOMDQP0yK5sGCBdtrlZl6ANbWFil/jbNCZfDjqUtrnkFeOJV0wCPFCCbZ53yp/n8jRWbwZoNw31Z6DF8JP539WI+d5axHzvivC9y2QojTC+NzqqPIU83AQsG3+AMyKuR502W9ySo7COpGq9sC5HdmFdjUwYO6YE/uoV+iouRyB4XRGR3oXAirgLgVlQvxLgeMJvnEgk/iJpTqR45k1WKq2iTmp6qbmRbUzdcKN6mRtZLtTOXL5JR5hXZWgLj1fal5Ac4O8qDzOa31LmybqfC7HtJ6zaCBNB+R0K995maRHyrKLoxwOHPh0rdol4pUTEX6wQ8bJDxGeZiJeYiJddIl5yiPjVbwERLzpEuOgQ8cs7JOIFp/yCQ8QvvO9EHN8pIo6FiE8Hrlg4bcn484EjGIiMY/IxK9Ewnje502R80y+T8Z/7TMY3/TtDxnsoqJrvdnvDdxCqIoT6p74DUZWBqNd9S9Dv+ESi6xyR4Lrf3VXaElr3zYlvXenXfU3bdUvbY5a28fTWcP85b0ORJTejukPpDdePkS53iRSBxu0SSl3jAazh79+AlqQDvsHKB1zgNxRVNpRKQHFdzyWup0Vs39folV7cZQl/lxA+0G5dFoCSBZCUFwBtwrbzhDdiPePEmIQp/s9PcTYbxuMKnygf/6fdGZNi9fNywHkvwGDxPkqK//nzxiepQe6MblqKvGG9jxpwYb2PaJ3T+QBTLbr+jLKTPE+WPPkMrzP0H9kvgZ70atv/GqP2y9BP9EZxmtOCFTjMkam4Nnmy09oaqRljWHROQnleepRyDN1/zYxdcOg7r9F2EsgpX454lCbtj12WgvaHzjC2Xj9+XFpU47fwHBy8kKam5bwrBGyIdcRaxzOsiB/xaykD2CuRVR7rqDy2ec9Od85ti5IECLpT591Fm6a86N7cQaeQs0iWIn78aaHP9iYMmjI1rDM7rXNnhc/WLZ9t67ni6TkXi5cEQVdYu5jealjOjDJORAebNjnYiA5QRMzdMb9pProXwzud3YrZ81DqkXQ4PDVxJSEvbxPoF7G2sqHfYDDpRmZBLyLtijYSiZi47Fusc5nXP/3+qu+AHeQT0bz2b+A6L0SlWHg6xdH5iERKRPo/E9hWQ1orC54uaaqc3uwpDus6Sscsc5SyHsglDHHGP/GZhBTVK6YipsZM2NmxcthZK6Z2uWKK/CNI6lRW6rt6pfJm6qoQKwfVBTwmgmzVN15cVjgRd4F6U4IBOmk50EdeJxLpHNACrGxrITVqxZmdFXdZJLTSv+jKssTIsmVHlp1lWbbEsmzZ705KdUuuFAupuleNFBu3UmyXlWKjPIOdMSizd/uYJYOl27gj3QB2jDvSDS4nBcdBc3VDF33xsUccx9Jtc5k2rlMm6tILTukXHJlmv4XUM2ll2nhFpjUHyLThvAm0O16SacEQ/i8ack8ej+tgJQEHK2kWby9oUaH47HHTkUVy9rjpCBRz7BjapSpp08bbQRAlbRZro2ixqZm50h96zPBs8YMct6vQcEP0r3KbFmAMNYoAjpXJ/T4ZNm65E4svXCHDXJftUx3PLe9Avm5S21B5OIDG9+5Evm5SWys18725fMUjR5p6NpQjXxORr3+qRBSVCKhfvu51v6fla+LI173MHwfK12Tn8nUcGYYjzCcr8lUSJ5pO3XQ6RUm/AIrvsEvMKeSxlq7Dm0nXwErXcR6Lm3rsK7bBMePJNtbvyVb6nkht/hDu10ELLGlzO1iqXIjFQYysThxqg8V3w4pv3PQHliyy+60YQ0DsRRrbSpznWn6H2yhtm8rxlpbjnohNLcejqhyPtpHjoVb3HElx2rfK3gAx7lXFuOeKcc8V40ghu1PWja2UPuBIdYefDLtAqYEyHI81ixhP8xqL8QbI7hqFvOSf+KzJmxEOUtPKbd0lgH4JvysfFbpBkiF/96qEn9xOwo+7En6Y4eN1WS4FdfBe7xuKJfx15Uj4wI4KHlBKmZHiWqRI/BoApAIAanMwKAgAajpKZexELc6H38jHtwQEwynnP3HU23XVp95+XQ1Ub9eUY3RUbHRUbHRU3WZJvb2s+tTbr6oBppvEAgMlwKC2dTCz7Q07Wdmwg7JE6BZdPLWaytGS2qSmqm0AQZZy9HNT+rxT+k1lAYH9FhJb0wKC9tZWntaQ3pkBWR8EaURarecepwk8X5+niayY3csgETXaqPjqguzX7LW7NWQ/krifjkbriUYb4CHdUWbhdXh1vBVb8S/1PWY5cNuu2XgABsBDdMPshTycDoQRO6unSbG5LZZIUr3RVMESWxq0RB+muszQtGBpjhvRL7d3WFU+2hJt5CbN7qDtqcTdnkoGiKDmYBHkjEyZUFhduzMf9Hf0QbIAVqTdqJV2sd6joq0tK+AakktOxFpwB2yRqZVwcUnCxVUJF7vi6GxiGobCzjaMhF2gDfTKMdAra6BXZWFXlW190s8IO/IvSLqVXbKoCIAIJwybr5r692qplcoENIzUMgJNg6NReTTuzm6/QEvEf8Rjjz01QKA1Bwi0rWymoaRSJg5othBEoK26Ao3TxBjBNc4H2OED41pisQDTCVrJ6prplDulzQNl7f5fdCWSb5VURyKdZYm0xBJpWbk7CE5Nr6o7toOQlAVNYncQlLODoOwOwMtqix2EmPhwrDOamR0EJWFNfDesH734vmwkEHTx78Di1RUxsnQW22m72D6vqrth6JZfhYpj78M2glfeRvhJpuRndryJ4JcNNELHQ5KSxfT1CTt5TzoUHNstA89S8OO8Y+ARAZ/sagrg8AAB/vyxO0a7jTLtNgw1rXmW9h62WwKf2oJy60S5ZJq95JTmCDcJ/vyIpdv6+0S3pK6pO0C3uiK2bDpzecKQ7cerVKuA2l0oH2rQqKl2pzQbbkKzAWWSKpFswSSrg8FUFYmU/DNkPd86JddSrY8AfMImw5u0LJcjzFoKou58JPI4mmepaOTvCt25EDnOddFgBfiVSPx2opIr2x9qv5Y9W/i1LEZmts6H892GKLUYiLorbkIsr0PU0FNXhF9GJ2Qdzt6gg/WQG3M1ZH+kq+GxYJVyu4FGv/zZC9K7a3B14wV9dRWu1szVCnVhJbQ9R/DUsgYEdDgKpZ3sjeS8exnuHOCfb8cSoRI4BL13E10H5WBMLLG7OY8UVEfbAvuO+qv4F/DNpZh7soZrYREN+WZuTieUtES+uABXNXN1E1Gc60ezCnVvxOzDSKYkmKJOmyje6zRmYT4wJsKHvGKRI2lvGm0F/W5aO/DQdN5BRhqzrzh5HHr1WhIrv6kjkuLhMvwnzL4PD2w/M+t9gg4Mc+aPTofP5t3r4Qm6QJJbdXI+0Yg/D/JBUaaqAFOEdPbj2UjJJcKpOeloJwWkQXRSiQHPETNyjqcDi/Mgx+ABMuzhgY37vBPw5wBmnAnyDvotU9SXrpf9to6J42W/R+dcn2m1cjpB/+xR/ybHWVqgtt/nvavfpTg/xX91GuPiURCMrOCi7dILv4wvoIf+Rc+8MeS+kavsI3w7KxW89LNQsEmhMbJ/n16Ya2HoHTwPiIlb3TPszx7zQw5jU56Jv84VSxwVPcrLfD405RPoehpeUmKkDCS5JAXXQJ6FPX6FR7vGdtoAc0OwhljryCTz2UgcM2RRAaYMgRmgM5lve4L/aRRghujnjCwuOtd5gqPkHudYSUfgD501w9nzD5tx6WGCOeqSylu643mrMiaU5pBDb3g2mxId0ncUh0D0BI9r7wzLgYv6IZQCMxSPxCu+8lmeXxhNTiTI29qwLDhbZ73nz3QTNKxklLyak23gCdVf+gcXvCmPTo55xS/aC0zwPLuICXgorFkdXb5pJjG3NDp60GZnHWm5iwd66kDKmJvxuoKfa0Skx+AXJ7KFCagjEfPgQ2MeoRSxktaliXcebvl74Jbkw6xJJVQ/8nV8o5uKGNRpcxq21phrrbE9pEkxQZyDrRFtXwAKaAoKqGNCmNpRyWTNkcWoj03dR3ZTr9MZUtouoaHDTAB4HhwICsPpAqxKqbHQIl0JAjGuGat4hKt4mMcNB7jIuHPZTKFSZM4Ztv1+PCiFVkr4nUW5l7a4QbwE6nLSV5vK4KWxbo2sb+58vvNb/8VfxHhuZZh9EIeBrmZflCRKeNmUSRzGqcdJREMpDlXEQxXxyOgpy3mY8UgPfqsF66xF36PQHaoA+PhHnzUko4rfNxeICwAvFnX3dfjm733WnHlSxW+a19N8GAcrhIZJ+yZlPIcxHkBDd4bXZ7kf/CtFBRFP0T0AaC+kjU70ujCZHVr6R13PYp0zp1PatC6x4zpcUtK07kGm+Unh83VOndbZDx/MhTNQEw8e0w3bzwNcE24xLCmZ6nyygRmjDtisuViXGQu6qBNfMI67HCVMfqJeIBwIWUlXBMV+TJFFPHiwaEiNaDjtl0TDS75hVJgK48Wfx0NDLGSE88t5n9M+xly7FwqElN2jxmaHGp94qdmzODU68FKTAy81PoHl4WmcmnMUFn2ktpAL9PQiNYvZfVcY8P3zRrp2hVMfmTcSG8aQqxFx0CVO3DLT1DLT1MJpOsC/aji69ItSYu5KuYT+NI42FdQf5huZ/SzfoAg3JsexHGYBlWP/a2xBZYGv5vIDrzkhimA5UYCM/DVMnZTP5qdPPGWzFc7lB+Hl1h5WWPakVtAdKEkwLQn3G7GHCRf7e6H5dgsX0n4zEOqoHogD/B4NxFhKsVuYBYsbByUSmakIqemBQqonlKtsEusAjUqh0CrIrwmSjx2FYkzxuUHBNygKEuCCIVYWHvMfx+S4R/2TeSj5mPgwUvZVRamw4Z8zqnQACfM5ZUUQFSEyZsxEjNE1mIGG6GALNRZ/RsfDpVI53oRHxgtP/mQLWD8AB+ZEIe5yvY63OKwDniXD2Dgh5ozCcB8UogPNCwnFgkHTxQydGC9ueKWk3WHOH8ZMgBl1j/YGuFP7hLFDdSfbge8rOma14eksWXD/8XKKLPvUM081EdHJsVBnYg14fILzMD4zKTfxJB/UAm0+b1DC8Bndks/Sx5qdUT4lrkoHpQhNwIeLGnD1IYq10cijvaBsHsCNgo/shYEfwoF7PB/CgXosH8KwGI/CnxRl4RCO4sNwpRBLDaFRtcd/oBxaiz+JX31FmXgzIeapm4E11Qq5fflQ9jdolLqjmHIEs/OpUxj+Q4iko2RS2a4BF5w+KzfTQJtPNUnchWNDGzw1S900cKRddzX2ClnzhiHMRykYG27SeWZiazq3Cn58XTGNYj+6o2yHaMVO6yNpselETIajUMNc1CcojMtQzz/B08rUimN7xeNs0dmwh4mLOnExXYQoYum8yX4EmorN7iFJfqC0R/BkIA57xNuhjaKJgp6+1xm2IxfbkavjazR6g4acO8C7bTLA9eoA16sDXK8OcL08wHU7wF7fANf1AMfVAU4ptkkr2Xx8H5TgUcPII95SRnaHxRUTcpdEeIjRacwNOsZ40dwIMbcYMFs8GFo0OQD0DKVFk8W2jDJPLzdS8TybPjUki5Bn86uGKL9naBqo4gNY8SN54wE2W8lXOLwUzk+nyeEYkkMYNUshafQK9fcK9R/jT49/yiYoTApTDkLKPqKhYAnARxLkj0pv/eDhbmDbGCuI4ug0cRGHeZOQLGXkK5S9Qe5s9CulE/+HiFutedzM/FR3jJX6HH1gMZ7rR21W325SqKe7GH4G/vsosg5cwyH8qr0x23yO9kFOFD7mVNv/Gu5l5gk6aSB6plAzY5gx/XEM7DJGOQ4BP2P7xrDBGfylyDZj0Kisl49xfvMxmypR4T34IENA/N3hlkm/WFaO0RF3qDb7J3TeFZQPyjUBvWk+jvrOAcoLymg05D42kM1FbFKjNUlok1jlWT40u6os0THOE9K5qJyl4jmEaChnv2biQMBYdEYOVY3CGDUD3UKiIVzGQD3oojOU7Yb/0PMBc40j2+rN8ycMWU7P8xesnIAm0UWO1dwPX2gQZ6Geg7xTOlOkzTRJkrs2Z7wL8JAvjFGD407FUBCNsKhmIDJXgsyb1RayD22MEY7RTJTmEyaHOYWYInVlgtWECRLOnIeq2oW+Tjp9wkozysWbc+gqzCwimZPpmvhCz143ZQ+TWhDxL0b2ITpraWTfGmHF3QBVMe9kDpwVO48DXDlcuDB9xm4HDWbNB2JWC9VGOXaVhmr7bgOqoUPHAKi2pgyMm3Se6To1khtj4EZQbsFnKMecHRFet9GjmAmYArKOBDJKDJ/SD/MnraGCgQXS2wXFHE9zYxfeXVQUQRCaCIOlWOkPCcYc9VeVfJpWWfZTtBQu4ZYdVUqgoI4ZicPiny5wOCDCT4wkUXV2wd+LFvwBVHoJbwFCOS3g71ms86LitKdjj7uxRxvIT+iPx9DwCQy6BgRCADE2AHFVMYJDuShLG6j7In0I2GG89yg0WqNc6JYLDy8ogw+xiwIOqT0uOuRnnn1msSGjzryEDSePBatKsCF+Gjg38HzCM8y2sBUMDUNmNGh0ywl6xBQAF4AeDtq+PMZBGgNJnaJpI8YV3IRnFJAoZv4a8yomcDeJ+KmCIo8CpkZB/xJO1SuKh2dR0XRPwnSfsdMN6y37YezBZTUbfJxjNi1ChwUeIJ0MR0D/GEwb2h5SMLjaHh4MCoTAw3qGLMbNB3nIlnjsuO89+jRWp2HXBUUAOKLIOPDtC5LLmzjPdYy+o/N4M4OBhdZNzS2aVVwXNXOL6B3zQCbmFuGPSxbBazR3FochomiZeiqXyjh/UeFklhaEO0KAH4bINAJA0O8MFdOd0QAl9RDAJoAfPBxvlYbjvAzHBg/HKg3HOT0cDH7IMgmif2KA6B8W0d/YTPRHb8xOa9EfOKIfZQ8y5aLGzL9RTJPon8iHreifENE/QaJ/gkX/BIv+CVf0Tziif4JF/7AOUgfw0DsqIqEs+pc5qV4+ikLNTDam7Mr1NFPur9RcTNrdEQqRl5iL6qTiZs1KdarwdZgpkJWjwLxBAsPMzMP6gracBVje9FJNggQxcsEaUP6IEJuxnoSUeR6JzVhPQrR8ErEZ60loGoXWk30Ef1j+jBnryZiRRGPGejLGVkYlA4zxJgUU+MyIOEzKqizHc2Y5DliK3Lu0Qz8muzVELMQDPCuRSbpf96zIFukurOxhLLoPwTFUDXT9OIxZBL3lxIvElSkuaX9a3gaOM66A6VPdIUItAOEeJy/SSPJ4R8I8GZ+te1akM0ILJYE7i3Vahw8jUjvOo3lgwGjKGOqIKGMaU+txhd48rR3ueVU2haPX3MajdO2gC74MPjvO5KNWEphaqA7R6/nLQ+bLKYPrCBkzgWmvEli7bhFfvTJ+IR57MFgo+5ZjoZFU7KQl4HPdG4h8HpUcLQOQz01lUNEg5LMmVlYK0gRrqhPjHqY61W0eQiXiOhkv0ZaV4hRJptVujcKy6t16oCyNfrqexT92LxN0mpO0h0G5A9GIJA1p4omix48FmXxKUeL4bkNngs+xOireCuCV3uDSeZ6yATHVug/us2Aqd/gnn88OwJ9prLyJOy7059FcsBpeTHdBeZwNOh0+LfI2FT7tsJwmGXGb2hx7kO/dj7duepbnQHtwxoTnHKFgbzzPiVkliZnxBBdLLU9miffGhK9QeeaRwA/MYEezg+Yrndy0q3PQNKfTgWEIngB1G/6cBEJrSnQnnUGbBB3cfMQGesKI8aAn5x2Uns/BQgI00MRQXQdn6StU7awX5QdSBKjJLFEbtT3nX0TLgfSsA794mg/Jt/JyEm+4MyZPMneRxXp9N3hVSkBmvSojUD5DHpNvx6Qgq0nQlmxmacsR2Kz/t9l7CjCDse64DuQ8h1j3odhc1maP6lFXlez6uAnf9UpW84B39klLmgqeOdFqC6cRm/9U0GPuk2O4FWe/QLl7BeIvwfGpb4U7IYtJJQYWhiWNmXdqK7m4L6BGMRVkJ8j/u4YdjVE6yXqP4Uq0XqxgRhZCzJITFkCMYosVlVh2UXFhfRL/wY3UWLbC9s/6n6BP4I6crZxqBnjPud8Qc30VDxoiW67lKa+BlImGfmWy0ZDimEHpJ/gCQRT2lysuz65kpiOrApKXtKjcC1BdYBlT/bHVaXQ7WPSWm0LUibUtCJHAX2CEPNFN9snweOtPi64ZY7sTyWWUaiO7iA54b042nwKz+RQY4RUMEF6Z7NTdpKD376rs/6UdPKD9hNN/LVqfiKWK58kmm1L7DXUeqDaDPtlOb8lOgHbaQeJS+yQ0gFbXvVPd9BAO9IwYAFRPwvF1a+zroQbo/cdRDs1QQlMOzHTRUDDm+vTvp3QCKKoi1vnZ/6qLR1k/xB9D0B9lh7gq4h1phXekYh4Cbp2KYQhGE/D6cRhJ+DNDHL7BRNvAPXMvz/MDJ7reXroDlwdz/F3jj4TykYpbjzBiUGdbAXrkpQi+U5Svhg+nCL51c5gNp7hDp5vFbBiL0tpFLjwGLdJcuGG4cMNw4QZz4YbhwvqLQB0NBk/SKyYBqo0IpMHsmktu2y+dJrImQ7rO+9paxuZCkgdlIcXC4gzk01vYGhXS/nXLyAii24MD6NZdKi2zg3yT9ikwfpwlSiJYP2Tq3vataMvd6HDLp8GWT2nQXiQ7GLu/dM0LwaM4pc+yLxBvy9KejfgC4QAgyMQhWVfl3f0eb+7rHNA92qTHX4fNDv+0s8Hf0/v7f0ZnVRiwsodWj/wQqPlHSq0/rPvGu/+892/ZkeKeNXl9bzqwynafc5E63b+pBvcfbpBBV2cbJRHdLDUO+M11yULwLvvWIcssU+q0dVmkz11nEY4cHtr69iKMxD72z/qbt73hb+U9kSRlpVzfrMVr0uLHpMGPlttbq7R3TRk9CNr7D7G9wOrfe2PZM4HcFO/XOlyALmFua3r+Q+S61/M/jPfrrMLXtcOix9K1ax0XtZA82CckD/QJyf3Gt22/0QblLS2bAiM2XWEa6AJIvr9Nw8lulkTE68Rh8NHvSG6cm+bO78nYP2NWyrNH/etlN8l3rJvkdTVf/Ir2gpw0TpClF2AuPuq48qxzNsLrJLjfQcHNnOEdbzBrwExDQDSP8jritwawKHrHLKjHuF/b1ZmiEyyRGDUNVh5R5DteqcBjqOPysFzVi2itsohIt3Sp8qYSpZmo8guY0uIHxF/oDlCmyy/WVYVfrKnN+CU7aorHLW407GPCrtHsiQyrMQ3XJBO8ZxB/ZqE6EWXkAv+eQTYw37mZ7809OTX3qt0RNyLNWZLUfINyXy4Yf1h0XlWb+H6JK7Trx/Us2SuY5PGYF4flhrnGX90GKGXGkysB5H0vv9FAfa5hYmkntHMjnlw0ZdfU1iL2Kk0tVs5aC2cOJlexRFzFEjdyd+JE7vYk0Hb9R7hM0cimqqXgm//tzzvOq7X54n/6eRNhnQrptlcidycSubvaDIncTY85mDSNawKY55oqj6oMpzlra5jBszCgtfB50Eyn8VyON9cZMqOEXkmdKEDjJB0JwS2y7hAaJPX4N/IhGB683xlK2SZPDUHbZT6kg6JzsxrG1Y+kPx75YtnvuP05fn58ZpV2JDRvC0ov4MZYUYf5YTduSmZnntIeRfYxekL9PzKYHR1msuU8iRUI0WthZN1pyg9B20XToN7i+T8P/V0pBYT3YPZv6N1HKfEnepYkhSfl1xShyluEFoWspCMsjCpEepg59qa98bd8qrbk44MYeB/geswupT5eDUtI46GI33KfX1U7Q0TR5ojo116BKe/eIUQk7o+cgQmIHxW+Q/NI7z6lwpA0VWx8d9wFmCRySgvksfF9ju3vT8F8k7tA7LDC1LLChmWFa7fPCj3DCqMyKyxxKsepNXGdWndOAsQJKXGG1O/p+j1hQZ7hhJ75GBeQDDD4oKYZly01+/V/9XN/8a+/8kv/nDPA0Fu6rcL6PMP6PMv6nO8a1udVWF9KrG8g4zPr/NlunKfA81A3Ry+RGrM9NNmh2o4eI5rlxczyIhnkmPhdLPwuNvwuHsDvYjkxwsOLyQGY+REzEZ+T2oOb8JMeZcFFHm35yaPEAG8ZebBuuDVPOLI1PRzejiEgfItuD75VV/zN0or/N78gCcnu4IpPyUFIT73SK95uF0UVk0KEkxXxZFG0FnQucg8hUPAKk9quLantnBranDIBrd5t6Io8jRjukWbPenDN5A0RR3VPO6p7KTun6zVXc9ackhUT/AiXKUJYMdVS1371qz9LZy3oBe3vXlluNVlu1cKy3GrOclvTMiB7W3Oxmp5f/LuuhOSvKuNZbqTxprYIhcfqPUqy6Tma/HtTs2sD1Gyrtv4ZKgidO6O2drwB5gQ1WOYru0gBh9Oa3VL5tu7TQdl9eufU57nUZ2tepM1QHWT8WmhPkHIg8necOxys/EZYjkvhF++G9pCpHCpdSvgQ+1pIZ1uv03HZc4ktuU53XnfurNGds/YO1nUmkbDmGBVewpzrk7QU5nyxFOYczyKXwpwvDghzvuSc48Uw7ntAqKI1Zzc7Uu3mw5zEDtlMxAUtb0y5by+SDZJTXThjCjduBGiT4AwfrnkC/Vh0SPy2jTAS25O1EY9iAyOMUCSJcbZkciiJAbkn+Cw5BlofGA1JDrTne4oaBWw3J5Q7FJxqxRzHxS9jUJN8j5wvX4ch+O8Qc03q0c5mDA3cDKsB6zfCasD662EpYP16ODBg/eah6kEK3kKk+tZcvo/3Y/bRUA3N5QEF4Qj0pMB05aGbBVcmyssnZHAvJOxOoxPKcPyBSkKZETImAHrbTVoSkMIIMEysdQQhBj0ufgMrQMeS/wB5gvPgCj5A3v+3UizXo2JrHnK3EStfR/IRlK/BCa6dmMJIhSmMoPGjGxnuhmWCE2j9GMGtRFX8Mp7fu+Lxh2H2/ib8Qk494vibjtCW2IjdfYvgYsY8FcPDo8V1HIN7gJZe+SX4cekX7GDk89wSg0ioHWg6DiapJbncJQsZjkT2FeTZI8yqpGfNcs9otyv9XOD7nLVr2iRTw9RcygJfRam5lKTmUpSay0jFWGdqIp81Rcnjvs66MaYVmxOnnlur8T6uEF3lUPhJ1RHuDPv4p4eSD/4eQr7HCALzGKltP+Ux9+n/IiVjoniuSEabJEHL+9IVIUYQf/hby54mBVnZgWn4E19Pg808ifpHqSeR7knEuRSdLpiEWXHfNMTuNNxSjfc5FYY63aJA7dgZ8C0qNQNerdsM+KY5F7caN979vY2Cqc7V2PRkDxKYYLqc+nUefdxh56RS6MNls++6UQh0BA/+/fFuwIHeMCkBuqh5sy8sLCws0+4bCaI1qukTFAiFDgHSC+v2hT/zKOfSf9SlJLo+pgD5D7vBD6snOIqLzuh7zSOxhBn74O1HMA0ecN4fRuWmwNgMnIEXup0e03l3JRcvDVk91emCqUHdIPuE9rU2TcMALfJCINFGHsbU2Rw8g53cOimli4dHj2DMD8xWF4TM6R+Bdxeee7LcWt2HtBNUm8cJgoF6UHqGTx3lfTb9/b+NafKoCXOlz+vchRtAdTrXC0DYPQWFB6xzQoE98MI3FLtbptrXkjZ0MTIARwSTs+hBqW7oRXqU6CVzMxhjozk2Cjfuk5s3LnMbl5UaN7xV45RuXOO2GufruDn0cXRx17FzKCZjKGGaP2LCB9GdgEkCE8tJ9KAPU1SUGQoedLwbu9m1OADRD3VCmxBrQ07W8cDQUTETPCikMD8JBw9K+hJghdhRmwCLLmOTo0t/eNpG//mBDmWpw0obOnYQHrbRsYNCjh2U28K5zbrR0aGD6K3YroRYQgc9xijvUY6K+wiTOM1ugpiGHD+h/Yn2YzVhg052Ag4fw5TxjiybUC+ba2Ymp6DalBvZ43nSucZ47U1JPCChDqAJ3yFYr0hlhXh48kl6y134ZvmjNT4gp8P51SuBgchFhwMDPUFFKC7QJI+bzqS0uxPqHE54iAk/S4yLQgcA6SCJcVSgdy2p3vQsXn66kyCDCCkVa+Hj5CVv5BEjY+wPsqeBtEzZyCVR+MK3MTH637GJ0f/OtzQx+mcRlfnPmdToTDCKF3ZQFkYO+YAouvdUO1RB4AeGSoheWkfZD0EZyhJWGLBF+wdOkXms/rcoYmn7KG/bK5OOTmV/iqaB6VNvzP5b9fcxJTZ/PLcB8Trw9emPwEs/9FFQCYLjujT2fNabbcx62e+TkjJ5gkaY2kQjwxhBWiU0OhVkZPCSLz7bBZ7zyZbJz/mnyuH8xPbp67Q7e99HyIzEAtDp5eZfRFrGAeOJkWTg/43PJHd8XmagNl+hupoZ+XqJ6nqG6mYM1R0xVDdtqe4wU11PU53PWCvITvE6ZeSVnSrTnm+WYUZM38CJjEPV5UJqPjoSSY90+BJSQcc4MFmWahmW8YTU5ulNsbUw/SLTGmP8RErhPjn/KqY+lBwwVi8rrxSnKTrVjvzAozjzSmdvvebjMQBcEEiCiP+G8Kkkqb3mc8A8uCMJTjHiPNrDSu/TWsGhfQdfCrIflSVGjzz7avoNpdTzguhQr4GRxnNHEY5DjY4B4NEmVDOOzBcUmjsCbgtjExUv/uMLFIUlwlE6jCd6jvr3YzpsPHkekYpw1M/p1wz8mqZfeOqsB3+h5ENQlUJP/whRZBfB7/FTRvlmbSb7X3yQRqIDR2QarujAGI07OM5DP2ZYR+S4dEbCHP/SzTte04mXY5t4mezpCYFmxOt17TzLFve6trijXARZgaeOjM29Xkm8HBsDasKlE106SblEIgZUeGSqkrzjCeUdhweUd7xSyuQdjzHVsG6D2E8TsZ9ipX5/WW0/pceS+zqco40n9AMVZxC+oGzkXyfarnHi6xoHz3M0iRqe4B/rNqqaRKOU+LrGzPpK7Ec8/Jc9Cl82OO97aPK+x+W876XM7U5C8mhQ4uuonJA8ooTkkWQCj9yE5NGAhOR1zt0e0vZ5pRRg9z9ecmL31OaLf7Nkts+pkG5YJSF5JAnJq80wyeAlITmlt+6E7CzE8rarZCedLbOcWVryE3cozfOHOz49RSN3iOcwHsfjFhRzco52+ijtMe2i63igfNjCt2OMcOFeuo+ntvFYkjLtyZXdVYJm+bKJflxvoj90n3c/b6F/GJd/wDmYZ+aLhVeRAf3/7L0NtB1XdSZYdU5V3bqv7n2vJD3bz5bAdavVzfO0Ieppj6UmBlRqJFlRFJEsT5KVxepkzWQm9H1MmvfQKDTtWA8saCVRGnfjgAnCFkFgJ9hpQYwx4AYZC2KISRQwYEAmIq1MvDIaIsCASQs0+9t7n1N1f5705B8ga1mGd+vn1PndZ5/9v2n+KylvG+9ufBtLoCLoNVyBWkv+0KAS56XQEiW1lnwDmr3G68jjStxVUVXREn0WgUolMzmDfZMM6rZmumrNeJXE8PeNxarirpXY47rCAva1fTe1zYzSViMCr2kUGlFYrcmcc8/aQfG8WVOmMDBt7qiUd1QvUnIQWoNjnPp5bxgaPX4t25WyPsVuCp3BTonhO6SKY/JToVBuRlJsI9+2ZOy2aslqRwTzOLymvCiSl24QCx+wDrXW4rHRnPbRBeS0j5aR0z6SryP3daRZwyOf0350axtJQR9V1qWgr7+iJXz0t/1WDmk3Vn/12z7uFn/kOja0ta1u7eFu+Jz2bmuztM54aZ0VaV04LK0TDxrWAALzXpjQrMa8KjX7aOJWB5jXL0+rXh5Wa3MyX1bop4MK/dQp3FMo9FPMaeIV+unQ8rT88iTydeK+TlRtnnh1feKr0pMv4ZOvhbPNKdvrr/zJ1wKQuD7oSiReUZ/UivpGi15Rn+hKROIJD5qDnkZDSDZWJBs7JBvhURPJhlW8ixEOY1grxAth2MgCgdUY1g5iWOswLChUFKwxrHUzGXsMGwuGpdVWDBtzN5jA4tMBW/H4mxiLsjNJJZ/YxutHFtk4M8l/it/xoBjj1UiNocnhVxHtAr/Gil9jxq8sEuwl4AEQQWGuDAXHRoxoxT/byHwojo09jo3FxTatG4xqHHuO7rDAeG3fTW4Tx8ZNHKuFrhqoQXAs77O4iWP55ZqyPYxj24JjIf8WNVisOPak8Vx1aymyJfFkSzpItqSO8EhBttSbJx63eeLBzTNE9DQ3T7zU5ol18wx95TdP3Ng88dDmiXXzDLfoKRS3edhHDUTVCfiktwRLtSQlQgNLtZAuYbqMhrFUNIClWkIfvp+Yoz0joWyjuclukIREOyb8z0ITMhsE1dc//oH3JpzhCEAbaiRWcEMRx4cm8AiCTSc//bt/9oW7brnnW8HPUVEEUKGi70PRnBmtyoJV5Ar/v89+6F0tBFMRCUD1ln3KcHVpd0E0k2Q9xzZB2kFMVPZWs3QQ3mRush3GLRO0osS2UOMbX0c1TnDOSWXwWNqs5tOcLUMZOQjKQrUs5CEhgwiecz1/ivKTzAqC1Dv8er3tQnKcoBjPyOdRrOP4yRjPMS3q2cCfW+Ekv4aSXcdJtlDSNnjI03idDvKQEQqFQ9yk4y6D7EG7tCAqaEYdfvqFUmpXaucmk6BN/0Ke4wd/i/lgDLrNswvo+Jsv/9Z7P7n/S+8/SdDRGuS5aWVUOMsVxfQvjIcq4jwNIxVZrajiSK8jErDWGAlYcqESMKmZlyeqHkKPTP7zVWNBaGsxzSJRSo0IRYz/yPqPtOGRpfQytkPjV/KZX0WsIWvKqr+qpxxKy+P1bdgY0cmhEaXZ0Iq2MlnP5Vca+Uqr0C/SUgsbj1nY6IIX1g6tgyza6JI6L2tdpRM/EsHvC2rB7wuGBL9O+KYyXyd8U3GvhEsQjdu5p8aP8GP1IcyMjhPzGg+F1o/TDo7T+nGqj0MPlNe0jwia69itjNPyODmYoGITmvufAdBwBkDsIwlyEnKQXoIYqIzAddMB2zPNk65eYIjVIhm7ivMhJxwcKtFRKjWPVA5dy5j9lOX+s4FWMH/oXCZNiVvQWhEdSuDetw2fr3K6tgNCbIbQm41HT9Z48GQlctWjvObJairud6hRzSUvJguTmycrDQvHaDx6jH5ChZCnA7e4LIS0IoQEgyyQYkX0aKtDKnq0Inq0LBSAsNHyYnNscXDCG4QTXifO6iyar8177KiEkb14RiWM9gq7bljCaEVqLVPNwYovfBgP/lgO40eDS/5tjUv+7RK4xA7iEvukccnv29DuaWqNCrHMLC1nvBGTugIafUkvOlNri+t5mPHzcCmVHFQoNY8EuukqZreSwETBP5Q9M6hTcieH8Tpn1pN/g6aZutvz2ZryWqO0ooygUYq8Rok/ZGuBauKV4Jl2u6q72is1JaAacQHBB+415WuqDQ5rjiLRHEVec1TIadjz1KLUH6pSyVxh1q53a2LE9tMfdoLwwl6o9Xh90k1WNlF+7hQXhLmmgjRNE5u2UpOmcRqmim7++u8+9a2E0xfj7luf/tC7CJsBQhajnwzZlgSB93DJlOGHQQ6vJJzFZMEJd8cE4WKqxegywSXT5d9bdOQy6PXFCbxgwvxtr1OCnau6yd1JsUktRpcdXCaD2BFk42KOF7w+H32951HwYiVeONT7+Mk3fOueP//S+78Z/KzTBX2WihfGUfCL0yjOntGAoDOSv/fna1qEN37qwjXygli5UULwJ8NAxJO0IndHJt4T3aDBCjxiiwSxBYIpJCA1wmlAVyaiE6ZaQJT6dQuBPv753KQNiXHixD9bxT2aruZwkoYsdO5xSL2ZPkRUBM/yHJ/C86ma2ImYnEW71pZy4MO0cX+Fpbuf44hgxI/TbcD+ZdctcL+M9It5QTTGrff4sxzZzO+6HhltrisR43mCb9s/X9CTX1rNgV6zugqj8oW2jz2Xep1gLMRiyFRbxIhHiJRU1Ihet4qpz33QM+tViywtxQftFwbPEyF0pUf78UBDu/FRcg3s3n/niBwUwIPX8QFyLOhDyYbL5/URx9gCH75Mo0xISBeTvwdbPlogbHsHU0VUiciCr1RZ8GwZ1kF9+BDZsL6JcDsiAhfwycRb5EdmivBv6lPk3/xQTRGOQwJuRjaJO/0FocVrnUzebZLoKW2SJXdHjHBKbjfEtBtepjE0l4D8WDYKQL1VpL/U5ah4NYxzzPOWh+yoCdkxIwmB7HwMZM80IXnFMiD5zt9dFiQzffTDAuYDxukuHTizqYDQBEi5bGuagOqvumJ9IsRBxMSBCcNAbUVgaQHzIVDDkz0oBzwNwH1zxz7bb7hDWj45z9Fv1JzE3rVp4oayBeN7Kti6vUwah70tkm3dYJyJiGkc9EYOeqx/hvFUHM4xEK8ANgGJHOz/VAhwdqGNxYsuYnKKJZK8FfIrROKOnSjCbhxNLJFE/i/b58w+2ReMUGY5T7OLnE/QuhjuZFIswJ6i23wbb4PFxQjwDl3lS+ap0MILg0m+6+yuTuCuw3fJbv+6KyK/QGTzQS2qDVg2H6hsPvCyed9dcOM2G2ir62o/wm1VfBo3C0zx3crd1emxnfF9rXsXgT0KzzmZ4ZjJNMwO6nyGMp9iG7MW8/reMIybFK9IjEPNexQEQvIGYndrdMu66MjWJ7eIGsktNCwRckWIVL6nRj2mDtfOlLWp47mzYVMAc3wYIcQFaAjZSitS7i6TgNPMGNYd5Gipt1kzIVvwYCikoaBQ0J/VQHdj393Ed7flu5v67rYZiWBM4hSrs8GGuyGjVgk/NlFkiP9O2ONVm9ly6pZwMPAAO2aJ71kzHsKr1tt9gpmQN5jHyx5bRZsGy6gHMRgcMnf5bB6rK5FgNCcaD9gt7JHGA3YLO9Z4wBREM4i3rR0quFcbyq5E0uu+TPSyHR4UtgNfdVz8S8TopxVlgsfoHBPOh4BDwhB7QcNBNq+5LRpeID3s1ao+kJnmKY6b69Uakzul7ddrwq+XuNC53CSNyvxKRUVcr5R5Uis1gWyR0DDySmXNlTLPzBIlT3qJEiyREAXMkNnGBDS3sqnn2ix7K0v0GlvvZTXbSAdmLkBMfbeXjUwh9jJTUtx65gHkF4Sx8wRhIEcIdn8dT00Ovkb2SFHz2ZTVqNWhtx+Rkyv/kHHHz049fhhJKtq0Hm0GjDYtoNWhzUAV9EHzDKL3egZNep+HX7+Mbn9puNvMxj4tPW8zosvfYLLfboXJHieeo9csDcCx+QZTthDgH5GnFxevr9Iqzd9EJDH/9Ktcfueq35iv7Bzx8YE+qswu6jDGt211YXdQFTlbLbjXMa3l9tV8jR2d32ZK0OBvNmWcHzBiudpguMP8LbyPiVTcwTKAJ269HxMh6REedzcwxrgZrHOEmhJEG6Hhb6MH9IPkIglx3tuQkyZfZIdjtMg0Ph7D5szMVa9bTLfxnBXRjvmueJWVMcwp8j5n4r28j3MfPSfyuWQBvkFTHOF7rhTZwdWc0cXSYGC2GPGR2pnDLVavOkNd5j9sqVEkc5Lvs7rltvvlD0MTDizME94s4s2ivgESDDC34jKiswprLWKFt0MtR2tH8xjzxVsNK0v15/Wcx+G0th3Dcc7sqD+J3CeRVEcbHC4f/AFjXJ575k2QMuPUQD3bukR4DvVGvY3eaqCsV7pTG8O0os2k2c3fN3ARIuRa3TBPDWe8vEz3cWNF5FNIMNYo206zX0ac3wXJXTuERmEpgzPj+Ntp4vAHodFvQEj73b8xz+If188d3MWR0buf14uQo0jpAf12WZJ2NhRWyChJ9GZTvaa6ngF1NUAhxLrR3hZ/V5txShfIQ9wLF0C7JSbcb6EHYX4rUbuvhxh3SFTO/FU4NxmHxkYxy/5Tj1AZ5RA0Q/7OpznW17hrC9t+vTZZlbprmplcr1kiLjIVtej/sJp1FXqScr+NhoVX2hCQsauM+FW0bTUEfejW9tWcNcGwId2MEzmj9mmgwTr+u9X477YQJUj+Hxgt8neN6O+2Ef0d1z1TS/CGlQ2sF3kL+j4ksttThSXIyODabnAZk5plxPwGVUinV4hVpRlkJodVbcAJQEivKdngGRwr/XqdS9eo80PE/hUma+g+AOO1mXot/aU5tTUmlzn1ofbdnNpzzalVaXClRuKWjcSbc2p0ThnzypwamVPTnFPTmFNc9+zAnKo1emNOXyHCFEJswVp09pZ3HGFDv6C6UqTfpw5IUuRATu9AF4q5mcaHIpMIRCPBsZ8Wb0UCD3A7+X5q6H/FYRo6yNZgAEYoOOomnT+RJKbkjSSIVfVR9739SFCD8BSi7acaY/85Qs/TCcKu4YMls0dw+PE+6rVof7SL2CVkYiocJlwlbag+wqWA7UuKFNcpITs2OoGhK2cTTefKdpcpjulXlhnOq6TX4pCiSNte52vXTZ3SpkZaJdrWvK8RaEK3dUu2cEt2b0s2bkv2bAu4BAbU5cT2LuPKYqJfcqCZlIgr6kkLeVWraeoNjARCYqAXDyCGYnWcfvK7gfr0wZ3DDx4afnCfe9DoeEv0kS3WR6ZeH9nivZFCg80mWYEYgwZFSyY7FR9ToK6yTaiabYFdhgnmpK1aBjL8eLOggM2CXiuwlQpQJRkvQzFRpbvo2zOteURN3bVQ5bt/khV7CS8YB+FytQn/SrMldYmrsQS6TfocQ42xsswnf8pdDYu2RDwxRUbc5BYmxKdf2QvtiMepX84ooAWVpYtk6SwvnYjRUk2oRWMmeMp/M+C1zpY/6lY96tb4UQ+rWofPDzUKBFxKd8RHjDjBtgjo9FpcWeQ6UiEgrlPBNnydZ6UdnmPbmGNIUHumMdVttQULGrZgIeAVJn0c1kl1xpgaogmG6o6XmBWc1VItEXqQnWSb6CStE1ZrEgtcloOZLOAt7VJgCbpExXiU/fkEIQcxcG4tqQ+CoZqTl0Y4ZKx6NkBqpSJLJJ7Z3OXwfBHwdgskTc72cJGaldLzmY6rgpNr6RqpeTjaiTiv79i62+eru4iApthUDtLlok0TSdhtpse2tHlcIA0s86D6EZWmeZzhMMvK9GmnyhR9DId6hi5pJDHtE8fgSpFzm/sEJ5wJIqS0eshZW2Bq0/x6dGEd/mzoi3K+xTc4IdsoF0mDKNXrLDUF6dM0BZ3hKcDbq8RSeR0HOUdGEok6ozCQNGFABEMITMaJxjm0fsEZ3/xiSYfWSkcL39FeIi9mYWA5R92KJGUjjDdpJoBjJqqzEMkTiteQDvCdYpk5zYZl7xQiEeY4CiQrfyRsZNJcOePTT4DS5sSRyejqtUZXr33BqyflsGzUQ1YDoPakhlfMQYI5SAYXaxY95w5xJoKI2uHFKjBHs2ZW8vskSIfq+sSTFPOUD69XyIFjJCSBE8UNzkENVEkNVEkNVE+5n+3RfnJaFuEDmFBkKCz5O4a5gu15mWLLV7QD2QVs8tohlMpW5sTp8EEc+4PYAxm8fBxc0ZnlaCd2xMDu4J+OUFKpUFIgqNpsFiuuABLsj26mQc4oljz5jiYBRV0XDw0GHCYq3QW3ecj1CRcfNB6fLiEJdgYQxHTX+hw5bjYMSXfXiXS3tEPy3VlxIvEyptLSOSv2lIWIKX5G7OM51TDPXjRkVkXsAbYrXCREsM0KwAL+LHATLVu1KbiBmTFLlROfccjLKEc0d7C7glqKb6Y5MVegwnKdRWhkHqYZzt/nuoOJe7sJJ5osGXM1AdRvxNE0ZGkqyFThZBsMDQgtuGmxgrhorwAtIPK81mYOcwCYI1y+rav+BRBj6CSxURpHbJyRGLbTvc7SUwbPf2j/dMoizgTW4pxtBGvcWOiDDiUieM58miMV91aBMKRJA8S8ORmkhaOTc03TaEMN7oiP36t+RalqaPMbnY3q1aY2MPgZ+lg3B0v0PcyKqU++vhY2S84sVTYwkcDuE7LYRixXu8Gmv/zjW46+7cb3f3fvnuzNK82kd01qrw04V33Z5SSQCrVttv/xenfOwSuSPXfvJHt6r7GIUtX2Sq6RjXNlhFhMnCCEVgzRBDgdiSp+xcUEibFF47SHLQY5K2JKk8pJpgKNT0OL20EyLHqlWih4yT1wKxtu13GDWMi7zHo5Sk2zyoYtJR/FGiRfFiz3wb+nxcMAogR2hKoT6oqQldM0ic8gGKpIHLRFChuiN4Z7Y1xvDPfmSg3hIr2Bt0AKpMVOEPiaqz3H9+Xo9xIkMJyrkm3iy1gldAx4b0b1YfyDW9mYEacAF9FvfY+V+Mc7M+5z8YTg1+IJAa4EKn2HRlMON8hPmHPl+J4tzswesaAdeXgVczV9IHJNBJZ3w3/cM3zH+BnGlPSe/ETLiRXC/Ua42lBcHLFNy0n6OXUrm0Mi00gxqU6OrcbxxutScx3Cb4SM8sHW772NLSdDeEzdcpCu9x10hpOpW8fUr2O6nHU0tctQvY4c8cn4dVT+m7hahhND6xDyOrDtrF9HiSCFdTDNdQz9Oi79fTn6vayjmavsNhG8VuAWpWfyWWH61R/fyhbxWEcuot/6HusC4p0Z87kuIL+ufYaQtQXejy1HafHPDNZGSZxQfU4veAMVbuLZ+IxPHZicdJBeQOgwDdEQi/guFmOPNS7ki838G26e/c006CKXrZ3P2O7rfPWF5y+T6bHKuFwS0i4HlXNQsAFcTkRGB52agGsbT9SEREHoNHqz5Eu86kj31JaH6HHJj8VZvxJY6TRSWJnrYItMZV4qQRM2KjXxSCMDAqe6Wrfevoz9EntWj8XI72OcNFUp0lxGaJ8GvJViQj9mj4PuOHJQTJ4haPhq2JUorFV5tSr89EqNE32yAnkrhWaayyjJIVmDFLhJZ8OaJm4gyql0xPQjB2skceqddH38nd66muMp1Qk3OZtpI7NWIJm2ZvrNnKbWx2udEr5ouu+TkdWx2uzGkkigzoAHXc7RWgPJQ5loUqG2ABbNZht7CoPo+vu1moySLSwu8gJvEbUwNlyeHc9rl2XH88iPyo5nD9vxXM/PaftJL13UN34qO+bHxZLntRdqyfN0aNHvOPhUtOivXZYW/a8GIEDkhc8CwtMICE+TXcI4WIBdghhv/Gt0t63xB/UwDBAwqZHplblo16D3TNIGVfnDvYMM3OyqHvujI4zhiLj4nMnOtmQcYpk2ojisZbysPg7nJjMWoSettD2R8Xxc6fRxSKC+hh7sf7ekqjfVNTwhPPOiqjOQFhmWiIsyBLOVP2wk0uFITacPuZpetOyaJsbWdMzX9OJl19QeW9O9T6ImjrtHR+VLRLF4pZrfGoZFCKIMrG9R+02+9pe42vNxtad8lQ+10xrb45PvuvAeJ4M1ae/ufBI1xTr2F4+OPRoa+2jtFzD2aNntPPYHT6UdO3aOj/o6RTK4rKkxY6s67Ku6f/lVhVqVBsI+884jLHj3ld6ilfovvLXnAfWaU4GkHBTcQmX9VOqkrnVXTF9BLs4H4AZqx65n3Hf69iPahY/T75pC3DERmMxwy7wQwAx9N5IN7HFnWKqoPaTuuZBt/1sTO9WdW9OETDoDqr1/KAp5XtO10q0rC8GoPJk8DrQkXg7SBE/AocQLz8xSGq5zYkBCtnfSsKup/ItGMLwsGPr1nndz9A+GzPuoUP4xcxkjO/rot25nH6Nzf3TAfTQhH519DwcxGP3olvdwoCf+aN979KO2fPTN97DH1DI/SuWjT7xnaEypfvQwXqT8URlWx/Uzv49Q5NR7eAT1W0ZN8PZ6D/tCLbMniXz0x9zgmI/uwYto6KNYPnr7Uh+9i7vgur9vXPe1M/Vbxi50f/rd7GA7WumZdz+JSpX0eeTdS/S0CQcn3q0fGfnovqV60vzoQfeR0lA3v5u968790Z36EX2S/6lRgif75YGN6MidjiCFGoFNe+RD+7x6wO/CWb/LO7zz1Tyn3oU7m5vQb3T0mXZ2taLuszT67j/ktGADKz/Q398Nl6pw3x1Dm2FGJ+H37uBMYrqGB++o11DeH76D4X5oeTv69b2jb5fVnSP47pLh8Q3C0yONvvhtqHA89NZB22N3cFSiJbrzSWvCG6I9rh9h/nkxE8+/YJyq4FEz5ZJ5w7kQuU16iHPbA6+O3NOx2gcFoux1Epy5ah3yJdxOXMzUPByitq0uEtbDmk35L4kD4FwZcynLUZJhoAwr2Sra3RffLzOHydm0aK6jv+m+npEsruwdNifpLV4XbhNfy7B66Ae1OuT4DyTbAsxVF4nsncs/baS/0J482fF8MVjWgL4Y/JBHlH0EXJ6sohlZRTz5IK0iBqMjh7qBwxsay4xPvzob9GXBMLiIBxdpn0PuczW1HZzK7h6M3Ll7RChQZ4V9XKqzFp0lckT7a90KLKMvXwx+OJ3JLpV9qMnpnWA8f8Q0wu5/sHnzqMlWBN6ehvZ6/iWT/XHoGUEWq1Ud1qSxpl/0ypEY6kWsQoPQKw9KM6TaZXYUmmmnMYX7NgsLRRoGjSHrzHgSO05DB78CzV1Q3fxRJfGAh8HTP/wxoYk4SOZxusnvpW/+pO5vIOQOrBK01zHsBDgGbSo/kYSiDfR9rTxP5ScS5TnHA8tDlh6zBpgFcmslItEaH8j46J3SxUC6GFQPHXZ2lNTFw+/TLvrx+YurXAd4c/rhB9LTAdvdIsjF6Dj7EEYqzkSiU/fDhNoXTiaiQeLVafHqZI250LHGMtZYxhpxoRbn5qCdntsebXJVnbLchCcj9IL0ltP/0hCPvM9ZDRg20BwdJleFi7dak4rWVMhyo0qTqAxVfwJoCTmhPVx0MOMGcV+vki6sY2KbdfXr+mWcf1hdGkEO4+PEZWiyMwgfm/IJXbacF9mVotboceKitaz53+ByE1Erdh2LgKnSVFxZWj6a+lp4CMyaNWJeMKN5qaKGY2rIkeM5GwpGkKhRiosjIa2wTKPtI0qEYxyBo0GjgSb3Izuhwf0c+JhjqWb61SG3E879zcPNb/zusUGYnbJiHL5uzgnSB9gEJPza0dxRsQRlTuUnko1F483jMkI8Vm9MUBUuok084BIrjGx1/H0+7i1YmOpk8z7vV6ea99Tpx9/XSDOb9zcdXKR/kUtrweyxpBFV44W4ER3Hpb2IfOA671fsViF2nmoqw/emyCGiCzLuUqzlWNxQ5pZQ1fsVVVWfC8DYhiy/EroQIb+dDIs41feYeiq00yNqxFgVBusGsSNPp9jNu4vQr3joV9z3yq14OLDib4tM6A0YRtZ7aLVhNTMW7Vd0FGGaaddGWpaX2Ww6wkI946c7T0orJuq8x1t8EGBzCVZFJNL1tQuwrkok8cWqtecEoAPvHwSgQ+8fBKA73z8IQHc37wtiYOl+NgiudgB1CHFhhgBKQswG0gcPEFYBwi4BEMefXoCIlgAIXoRBjLv2KYDG/mZWqlDImRTYkrGiAIhbbIk+KkIlcd6WmFFfDtz2C7UokwF205cZLiyXMhK6tFVGmhCW3TdYvQnQsMOgwZsYAMNJBdwetbJH7ege1aCiI8ty5gKXZan1MM7fX6Z3eFm+PLIsT2Y1vmqahJhOZsqh7FKZ+VRmPpUd6Xeh5htI5cevjF8NKAg0PnxL4q7IGTUqLC94dfO0jJyQKKB/rSAbyHNEhHzCynMfjDCsNAhh4OPbNSk7RzZ5yu6+P2lQdkf/xJ1nXLWRql1IICu3phEXyQUqjGS5NZAEAxEjmbRJa9Zrcpd1iLBoIEJHUbG5xyhBVc9yOHaWR2eRrUaEuGqXKUIolHayFQZwEIl5kHbgiMJkpbdjnVK/M9qDBxlDuozwQif34cbkBj4qnDg+ybVhHz3NM4GZa40l1ZdJsx9o0uw1pfIk6Pwb7Y/Ldph4prfDmbsbE7D3A+MmbeSbg81v7rh7YAs9fXvmjC4CAn+L8VQqoYA/wiZBec+K4U5aHxNm9KAQxyHoFUF2y6eFeODP9OLBlZH46AL9VqKFhPCSRwoM+XKduPDP9lo10cI+uEK0JEK0tJZaU8MG1VmZjF3T5ILWFIFoBhboWlmga/yibhBrj0ONRT3XRwebH938gSe3qkK1zporPe9m9ckab99s9EnHm4iHEq26ufoXxrV2hGv97C+byyTc103hEMGptV3KGW0ZRC4VELlU6KxL865iWuDBy5yDZ2+NECbP0V7DXKU3rVA5RVA5xR5pxWXFc/LHQrqb7fdyYT1X0NsVRbsOHbXCh46iq7A0VcnpxTipoClyl1RQOIt8MArpCtjotPN7Q3xbgJLJG3FJucBEH++eVxqsw4pixU8E/xQpBlN6Nau+QCuIMpC8tznKroUhXi4JBnMkGORPc9AlzwXSzzmz2NV85XIythGjZwXsg20zCuGM9E5DCWmiwUvZ5Z1fSfayGaQi07wJkg8hcAZQ3E7H5Zomun2NGD8x4722jvOoLsGRxhY1rgANq3zu+lDzHa8pL18fppIlm5/agh5E+r3T3xUr1Lx7hQ/dQbPSkSdFvzcpR8DKtcjwSiOO4YWuaw/TSHa7aJemXuKWTxnVkoRVvMRWlzgeXOJ4cIlb7KKQfzCUejZIIDoXRBXByenP0UBH6kKUX0Mj5ZRGbtFiGikMrGK/ZIaWTNZqgjo9wcHuuRlYYps9xYSu2ARWzLoCtGITWLEUWfAMPWV7MAIderoGzs5slyczj6ciHcH3zw/W9NJi4ieC5+D68irftZCVBkAWF6mEiufMxvlucUHyPXdkCXuGghlCp6Q3Hwi5LYml0mgLfUEaJHSVx8DwIMGt2BEXXchlSSYkOyM7YRLHkPUSqKasJE/kawhU+NrqNcoYmcGKnX56oPeTIpOEIBO6s+DJTdDWM/RCnKhYVuHjsMU148/Q7awaZWx3L3ts6ejYUj+29tMwtuBpGRtnC8CTCdFPEdwyfqddNKPBWlZqKBfjMhjTgJHA2LF+dTZoxqDFSsGdQNArEXcPCSGNIKNJNk9Ec5OeX5/0QphJOc4nK2co6x+EUvAcH2N6JutNKuHqrIpuJjlXo8Qq0BTxgltWil3sJDJqWNpehGQKUYsQkmdCmBErhyTiR1EfPt65NN4Gyc2ttbkb3hbJnQK9CTleMmoj47QWgqUm0WbzuJn0x83kmOMmGcRFySAu4ilo5x8K8S2vQzJ43ExWyL3+/GBKjpvJYvIngi6Om4inVESbk7TIgh0SlO1wdjE5bhJ/3CR+/yeesE0GjptBLMzdGgzQAJAQYKFd4AoR/gIMuXyZK8UnpvfcyoGapraNQIeZTNJnR5zc1jJ4Ss8VPBE7Sno13GEjtq6cPKSwnOE2zmSJoCtD9Ew+Km/yeYcRdLORdtjFxZMzcwXWB2avPqZkm7O2crblgqPcdajwC4OfFh7jWk1kzIlh86M+t+fLxNXiMcnYepGkBO1dYoc8u3+2nKks5mdm0hCPCoFzzPlQu5qkNRbxF5TRnW7ma6xO38MZ/I6HbHxCfx4PnBEdpx6clYP4lUiFMtH47tv3sCPQcr4rUnCjLCptaw2Yh2vLGQ51zIlZy9UuB+v+UGvznnVSzV4wz6uvNouh0AuLVG4mv4endBFhkrts/cR92Re6uLIs318M0QvpFrqgszLbHMijoSuAJCnck9nmBA28l9Z5DHEjXPNiWK6SYVyCTu/FJisukWSNNCw/oFVXm1fKIDAVMQ5FzAGH/ecRXOSxRT2ZF0m2Gg6ek2aStXUV54XtcfKeV4obdKNrrcGuXbycrl080LUWzrQL6VqLbVzQtYula13pGhvlNcFbQFtCKsiaHa/hBz28rrFkENA30FbkbgXNsYo62NrrYGGL7uaFzZ5nSZELuOgs8CNlWjTT5yqf6TP1mT5jyfTZ4Uyfsu+OSpbci1nJgqsuG25JfA4OKdoRS3/1UCScsEquCLmkniiOHQmHq7XCzsIUpCX2YV1RsswCSUhS4tnyIkdhawNKNxP1eLH3I+jK1XRfWNXzNu9o8isbNPlVIzT5RS6uJiu91nIIZMU0nckoCG1EU552xYyOy6zpS1iLtBsMPQxFMzH4VMTjm8WHWaWjiIrHaHad0hORROvuwetwVoP0RVCupS5ntZzHwqevgViAffup+FXi7wtpLW55wcsOZLWRrl1X4skySRLVMcYjl5RcSRLkrJdJhtuEOKiwh4SVK5cIgY+S+Gp3lLTkKEkxj4knWPyD8Lwfs6t+g2DhQNSYEpo9W0uWeDFiwD/HQ8ulzHRfkujG7FHSfAj2A4sx8FQU7xplKfDu8UwURbJq3K5pyrQ8GPiWrVRnBlr2Dwdadk9rMDAODBKlvSJxfIl+ZAfwx5+RA5h9ahmpPT2H8Jl72GruH/8hrAN59hD+IR7CH3/2EH72EH72EH72ED7PIWzHHcJHxh3Cowcwhyg63wF8vezI1zi0idDI+ScGjvXFUIIpCVa8JeSzGEfpwbDf6+LN8Hn8OhwDdr6yW7owHVgFEYEJA54Y4+uo9n4Q1vNygp5k1HgoHECBBwjbvVyOzFsEp7+mXOWPzFtCoAg5M+8L9fPmmYnPgb6xnw/roXmYCq7SQ/NwfWhK8/cOnpqHuflEDcUM/Jsb3abzkI7Rlngq4axIhcunqpBAV25OBJ77n+UArdWpoHbMW9cvW4NHPQLcdJBVXUvQ/ni5DObliG/DffAo8hfLrozfYbWXe6yWDqO0rnMNzP8kBBljNQjOIGJt+c9oi8feeZq2Z0fTw7TdJPJiNM/+w2HZku500Ze7+YDtygF7X2NhaGYOhB6W/OF/S6hHLJai0zhjqWlc8UJQuUOhnPYHQ0KH9HuA8xIMQq9ArTtcZW33D4IWzv+XY2VpERe6YeYPR6TexSeiIdCYRubl5eWIdG292MqyhkDnl1UujQM5HDiuUeuRZ3H7s7h9CLebcbh90eP2dJTBEj2FXLcHWCyP3gOH3iNG7y8V9L5RyE4G7/wB3h/XbuYAoHS1DTaDzFmhgo1MNTPtWsYOvZ7ib88MsiS71ptfFY/PE0wpC1L9Ff4KIblHW9QNyVHDHmlW5uPjz6KKn6azJh6keHmLD1CHMXB3uEyCDnYkY6hmuwkWqetUHK8dOzU4yl+lTmWigVUquWx54+VZoIhc2m15YlMRRFzTxYqgnkUBz6KAARQQ/kjIu0/+cMi7ff84ybt9P0TyLnqWvLtg8u6Tz5J3z+L2H3/c7mwYoOZnW4bMQ0em0JHQldqHFBmgI9YuZgodGTT5a+gnAXRkVLwBHbgV6JgEdGQKHSvpykFHVkNHNgQdE4COlWJfQtAxKVcOOib8AnOosESunGXBhJA2Ex46/IPwvB9zlLIGdGQCHdkgdMQeOhL0XZY889CRdIOhh6F6KA48HQsdEwIdY9v1LUdPU8uBaznTycGiATrolk5Z4+xaxDZQbFqAjwKxHMw1eZq7n9Hwu+6ek6v5ODx55WLT5VpHJHaIA3U4oxC5gg0jDJCjhXKJT2Awwz2eUrlxm66uUvidUpiOiinIjSV67ZTKjqew9Gvppw1R7xQVZgEyoHcN34poucwA3FMa9qw3QZcCyTlbgrJxaP53IVdbrgBvERbTYro6LWfbNCZiQq4IqjO5mlFYngZU53KVqynmtAfM6SZg+mrD8xenKeSbKeU9uPRUzXu4SooVfDRjQtpNf8MpES9PQbxc57CPPPi1u7CEnZEyaxQ5tbvB0MNQDNEGn45BTlNqPTYtcBcSoybxJ9cKDHmDSBitOyiDWWTAGcMcQJTFegn7guue+NDO6JnJnpKXO2+sohBXoB5+1iBH02UYObIeI6pg4kHMuvrg1hkKjoWLTq/d8D41G6t9GuSYI5g/fh9CdGqMYyPRAo1EC0TfSxzKT/yhRAtsF1n+TR8tcF/owwXua9jBKu/oaaKWVzGYZrzANkKwTMNPvi2POX74rIk8eSEhA/e5wMjVTX/EMQOhdakewfWDf+RiBoZVKB4AYJTDOnYgIg824xMnzeDEoUYNXCdBEn9RgiS+TKyqkfELC10t3uPGbvI3h5xcmpb1OWIcT4Na451cL6vjY19hX+bXMWww6D4M85jgNGzQP5lNToZmUoLS8MBoRD02kA+AIzuy6D3xvWKbPsSgGXk2MeZZe8yzVJ5J+ELqwFVqAH9UW904R4VayymULKdQPKYL0Q/foaa65R4NP7mPGKwTuDl2j48/OXzeXCqm9qxUkoBujM0XNRGoRjHfwwkaNXWshO3O362xyWOtb0aijrc4FLlXI0YIHh55RSORR1s1WSyofxdCPBoJIZ69yueF1jDqMP+0I61zeqi69cS1zjvNh8JvZD8M+OPB8OLc4Kt92EEfRWkyCo2N1TFDXNXSOhpmpP7yeV+cNca/UseNrAzqyKE+lOZf/0iyX38mrNNffyYcyn89aJwaNIRrDe9359h6juTXPuX1UdNcSQ5iyGbV9Wlm/Ujt4EitH6nVkXJOH5960hm/cvD7uBFDnll171vnjI1932AfzF4+bji5L+Fjp/oTPMo0FCXH2ZeQ+mYopL7hLATOU8ZnETAcmFe80juNpiOGCQgbGaac34E/DOokZX47fCyTfAwHvdRnQ78BLUuEAiPI2aDCYLn7V6WtvhLMTf6TKEzCc/2Lw4S3Rjk3mZnA/ZOUREMJoQVC2z3Lu1Piyly5hS4fDbYs0M/36afbUtj1X8KVV0Fc9iU7PnUmdWoCMb7JZZB1PutI5FoEI7HbDU8EfjvsDX2G4cXQbYhZcz12yKx5DVJHSoiHi7QFuULSuI5Ym3cEbn2rBbeauPnr0extiTa6pjm7t0jUZnpWJGprWKL2SnGLewVk5+ghO7MUjbwHLC3iUBZlognC6+2Q+u3QLuPqyq0szY9pQreKu0vUlfDPTH8gpaDIEOCzhmOoxXG/mRHhbVS4Foa2miSciXyue6s3TpqBFrcwIUUPV3nbCJjxQ3jG+ShiMb/QZO+Bq1L8WaeFs8+b0ay5NhYGZJIsPCpidlIU/pdm8DWSYfzfa5Yp3iAKD7eESEzOhksNtYDL3HsTr8T1bIfeZfMjgY3/NxRBVSh91eXvZBK+5vr1HksoAGkgUxRymggHD+sYHlq4/BcsXU0dLMzWsDDrYOFKhoXrBBZepv1hNUb+gDpwvWbAdi0SAw9cxqJ2+ffsHscJianmlxGw1MK2m0LaahdJNs1YWTee+riOQe5tlBKVd74C32wRKRsoyqiZISViAnujTHazs9JVlaWJxmb8GmyUJUC/uhP1EpwauwTZcpZgAiCQSQZV92Hq0UTLAwiLYKVTBOku8ETjgIoHDgFsFK0jkm4Q/Ph+WN8HtzO0bA2QoX61sdH5B2tqmM/DTATkhMA/bpc86kcSwC3r0I/9oR8NH/rWHfpwShKGsTJzxDO22yEI5Z+gRu7/yJGAfrd020InP/ARNt87ibS84gkrTrCYdRF5SBVxHDK+sUPVxJx8s1GN9Q61QhvzXVA7tXqXW33m1tA/y/2KdTyZUefniWq3esmJSR18EI2b/CvAdVZJPOoBh3Rgj1kOlSQxSNxXUf2VNl1/qDPgSZkftzU8898G1/AH/+1JraGvRtewruZHsIZ7P/pk1tB/dd41/PsfCcl9rEFyHxsmuYcn1YyZ1HBwUpeiumVG4ib9/UkbtnTAsXJSmtuAkLTdHjHTgxiAcyUc6jloV6s/GyBx8MwuDF1zWC7gene1+AM7j2nYvbBQpnMlkVQ7XN7XiKWhLXbcbBVRDw70JquOQFXWq87cqylKQZC4HFZ06XNYLUlbc1TTxKWruqwA7RhlvahOVJuIp7ryka3hiFwQWCOORJFyKm4CM5emyvPXcbX/g8Jfx8Jfx9UdHxL+Ouaobx9S/lrceyVNrh2IBbZGw8oECArzbZWJWJF+3fE9F0EOL9YitryG/A00vuksriAC5fg0R75XiwBCjWuC3O8eyVR2V5kQgAnjEPUx+UwzWIiqEMS+tNs57XqKdzGy3sZ6fp+lf1jErV1OvAU1YGV29Utk2FY8wQsSd2UXugWJXWwoxh5RnTk2biRRM5L0N+n3kkbm2CHQIfDQDGicTHxuOwfijwrj8pFGzCRzRP4I2dCMpgylAfVLjinA2UbtXGUlCysBsPtWsjoj6Y1GmZBsBf0GLKMXuxaK1gKCRCWaQBa+mpwROe4ESEt84l5OrXvMwe0UgfL9/Gjvn7r0uzcJbB/xsB3rcv1q2BQmyHwGQwAeOAAPszqYX+jTmkjSBhecakrKDwRpua3OVc0RGAqXqEPiKwSSP/pGjuqkIisF/B+SMOop5Il+5CPLzRM9WDJ7W+jSyfaMz2ndWAyj8bFtaCyP6g8+wqF7P8fYOKz24/Zi3PKEPfFhup3GLR9CNNIPN0Jbs3qeY9kG1Vf5BaPl6rEPazjbIP9TFQURLn6LGejauvN0rRmT0mGnOiblh484MJFA4XKWnOOLwyNfmPN8cdPIF6F+IYjVlTv2IYfdjit2k1m5cgjPudDmWhvqYq/1NyYi3VjXyDTHB1Hk7Fqss2txdysIpVwpZh/fZ7Y4BFtsBk7OtidHFpOfDCWYC0ohdooTL6EFx3LjVAbPLQqTkLnojJFt6VqCMVmziVz5BwioemGTrohGaMOx9EXk6YuoSV8knr6IPX0RCX3RcvRFSylDp5OsYhB3YWg4K+ri/UrFcWZUpLAX4x25Ik6P+vKG+zly3s+y6UMFH3H26hESqtXMJZ6ct/LEV56MVp5I5Qmrv3HFwnKextDTPcngs0klDf0zFz4g9Mxc6JXN+ELsCiJduVC2rxCPoebgZQsIVa2FA4QhFn5GCDa6urRBO0dKZ1oNlCJkl0TjkHse0RAlt2oMJWeGKTkdOcCH98HHrIjd1zVMuySKqghwomEvuvp+RRmXkeyIaHhHuK0Q+WMb09Pyu8F6GHTtONmeCtzaDnTcjohZzhfKvgj9vnAbgiX9dZ8d4EuIDDH7kQ1ADyblgfUSNSv7YK2nrova6WiNENm8UOFmoqMXuol4zDHwXLQFsSrVWiLJNJ3WGFo59rRyQxQgi5ZxlFPbCFM3EIvJrx+YIqbpI46xLQv4+mcR2dOEyGywTDxWHbyfowOcZDpqOWjsXFUPYLGhqp9FYstCYk9Efg+IwarbAy54E2zQGnsgwh6wsgfssvZANLgHEFZH5J5mwNjNsrGbSBHqPWBlD9hz7IGosQdEZ9WIOzVOW2X8LjRNbVXLa6sSr62KRVvFSkvAvpFU5gh5EkEyGhPnXT1+hCPYbu0Zv+ohQrhAisCFW8spXCSYg1jFDCOQasZAajgIqS0PqYmH1NhDqmnmpow85EXjIS9qQl709EJe9CzkPU2Q99iFQN5jz0KeQl4ulhM2lZ8g+6gxdo+5AVztb5btIvx5HKS/idvr7vrNMi0MHqQ/u7oKRR0SSXCp04FkAadzDZbetGRwHKGTE1XHBVsuxRWHGYaYyhZ0t3GubLFEy5ky4QgtWvmnzGbVG3KsSS6/ri6/zpeXCGP4oBvI0TZTJDD8ZtssvloHPi8R1dKsT/LK9uFiFyMitNMwHmPrDrVnilmxNWTQJOYDU0qepT7PaVuu2Cqjzeof6lJ2LVhmmrfrS1uE15VxEd+Fubz++pJg7ToAnM5i9eB9LJw5ST/5EYlgaYVHp5Gn2S+Y8AauCjlVylDri4roLm6eHxaG6jX0fHn1Ylmyr60yXVpqSF96Hdm66VqRUPQyL2tNylZlf51IZhW+hVvZgM3s6iG6YFjZV85p6kwAQxlsX4AcKxUZEMIrhq++Wiyr2KxfMRhdRuWAtK7lpEu88mH+BoM0EtRGfpvJ34IVblUIiv83huM7GNYDIN1J9fi3johkgumk1du6tBR0cdlciaEm21f32nYjgopVl/V3MmRF7I1SBiKBi3ew0UVcnTlNE/V+DmR+mmfu1GknHYuKFlIFIzhr1i/BJpZTmza8scw3vXDf7ZI5PmDyi4rkxdSm2Tey79Xi4pGzwY17qdhV+26vXjJflzSu5IyWPPGSG+kulbvTl9+4F1+9YOgry19tmh16HMnjcuhxgsdU5z7U+cQU6p/B9ZnWjXvRR7r+gcXTDfuotanby4nq4t0DNSAAGwyeB5/GXG+R7920ZqhFjr4bUcNLTVB72RM08aQmKBs/QZ3xE9R1bSx3ikZHPMlzMWbqpsZOXS4T1FlyglYse4JWPqkJWjV+gqbHT9DFTxmCLhk7DRctCUEzMkErl5ygS5c9QZc9qQlaPX6C1oyfoOc8dQh6rkJQNDx1l8tUDEwdeNA2U0ul3akproDXkMTcYS9hGPFfZV9VTsyV7Z2ModtIQRz08FF18Bss/t//DUVwRkwULXLaWJSLioSVKg6vh6wsE1wJdefj3xjClSddVdBjEW51uBLEX9mtzG4/BMFillAgXk02RycItFtFu3Bw8Hsa665qze6FgWJGa9hVTOL1cwdec8oxOiTbO7sgZIG8k+rh4f4erYe+xH+SynmC3f+CkL2E2jug/yzind2oMjgHC8aQbRoo+hoMDDPaVa2bB/FDIymj7d0QiY7j6tA3qeHDmCiuL5X62sN1RY262qiBjrKd3QmpzeIT6CNbAiM0X4Hvw8h84bShdeVe2x5042ZXdc18hnlCDchq7YoWluj4DH3a3kWcX/tqAFEQ7eH+QQhHFdCY5sqEE4sZmL5H1YtElhTOse8STGexgMQLcB4xOuipSuJptnVjmMW0aUH2+mkAON3s7zBFjw+8O/X3LucYQPrwt/RddYaeV/9TdcdpR96g2rsHPj3q70ARPOzvaAjVSX+Xsm8X0RZfMSBMwGN0JER/RzSEHSHrU6bbJWhJrqrU6tCdToXwfDGifPy9kqI1ENU6K+asKgcbH0Ko1xHVj+bnOv2JI6BcaPry/U2NHFFR6RWmgxDOKfqTy0+nYD/NtPr8e5GqkkdR3U29qU6+VynW7Hd9TombQs+Y4VMr7fLdNXIH/8CNc/RnQz//cihGqRs5HwqQn0VceNCD6lRgrzAvLSP0qWF7WkTrfc4cCZ6EYjDfZzfNXyksaPlfpDvYEILrg1Oqo+YtB5AK8++F0mrBRdh3VB08qUe/6BwXJHsuezDCQ/1MoLodNGFeSU8OsabvFXR1IoAfqpXm4C1smfOEdwGGXBrpkMuxQhzpHbiaZr+JWfNSyQmzUW2jQ83A4jyv1ohEy3EO4FqHGQerduovglaRISFUZdoSAewFKIqwTmdWBNk7Q8mLVcy5lGU+Vxk7+K4ZSrY1I8m2Oj7ZVippiY43EnSd45sDzW9qZapPoBdqghtJjiY2G38WDudvMlVrbrIbRvKP6P/IsozwjUc4Oe9J1qlWb3F3XYAPs+3OGicUKeR7jqhEk2UcVhh7ev7dj3EWXUg6Va54F0quQklGwiqLVIsbUx05wrJTb3EzNWRw4+6DbE2dFd5ZqniTQ8fn3WGy/0NWZWOf95czLdgUip8tM8BWGGCARokB3vQJhfgiIk6Rlv6OTyjsbOhXez9J1yc+UcMOu1v+gs82ovlhnUe0T01vnd6ldjwy0n3OP0ec/81Us2Rn/pBfsV8arpfH97RU/Rfn1mcPqY4TzXaBJbzvKIfs+5xqR95/lBXXnzMCCu886tTeDAG/c9SpvVlk88QDvPxOC37ygSEt+JEHltCCf/qBWgv+8APjtOAXDyS0lAyVj5ixj79ksg/Yc+rMlxx+U7F9/P4hxfa9DwwrtpPzfHFo5Iv4PF/sH/kiOs8Xpz9+HpX+yBfHPn4elf7IF3d+fHkq/VP3PzWV/sdnzeSe9g0CsN2RfHTOLqjl5CGtLYqFe0QlEGFVEpf+607hiQ9EWjnJnrRsNzPJSpmuGH11xTe5K2ijRVVA0LCdvjn5VYLHf1md+itH3lDFu8vwrk3JDcS2FPtuJ6Sf366Zz6LtiFxQBWyI1EVvJvGTwk49LiaRnJV9iaL8bwzC2xdxvy+CTy1s6EkvQ7cy0BRBL67OfF3kKslg+qiqNV+aySSI4WMUZVXaw3JXE2wfVGWsuqs6PQhokGtKrPNa21eXbWCZiaKNrkJVmUKEY6wkveHYEbDjgghwB2dJbVV3f8oR7SceZKL90Kcck5GC6cm2dzHRNxBhSCQb4VYQwKb/L+hvvuls+LNI0lGYu/ayGynTpXWBlc0C4N1SX8w0iq0aLpb7YrZRbHq42IwvFjWKXTRcrPDF4kaxi4eLzfpiSaPYJcPF1vlirUaxGSr2czSjvtiGvRlxwb0cpHhKwEEE0MpNV72R2NsXvnFvsWrTC+jvNPHXe4uLNpX09+JNa+jvJZsupr8zm/I3gm3egOKDLDg9aHLa+QCnjVvPIucNFjn3LHLOLPLe9QH23A2b2J2LB5MKI1ivaze4DK8flNftxuuVjdfH5PVE4/WqxutH5HXWeD3deH1CXncary9qvH5MXncbry9uvD4trycbry/R1/xiqvFC14cnB/7ohb1r716/QAZivB/P5VkMeSz5EsuzT16vWGJ5bpLXK5dYnlvk9aolluegvJ5eYnnukNcXLbE8h+X1xUstzyXjl+fecMzydH5cl+eIDHJmqd0jry9davfI68uW2j3yevVSu0der1lq98jr5yy1e+T1c5dansuX2D3jlmflj9vycJZPGK1DKpdCb5oWK7guc31vBazPEXCkNNu6bUivqsVPsajuYX/0tbpIH8LEBBvVvhNn4wuqYw86QkHOxuqoPz0XH+QqTjnrXwg0mBrgeQyrF23pBmz6DEXt2XAr7u6iERbRXZuKN+6lqTTZprCXsyK1C4EGEmAiXgCss3Gk03E9sXNhwByGRYowQafjJd7Gybtb2+kYSgmhEWOfbutakUxZyIUSNnLvIqkeneqxyjBjnOrtEfiF5MyJB/n5Cj0JY29lgxJmGLS5hGmUsMPQzSVso0Q0DOBcImqUiIdhnEvEjRLJMJhziaRRojUE6TiukQEL5JvllYjdSuiZTSDjgXolA/UqBuppBuqLGKgvZqC+5IcC1FCpQcTEomYYSvXigmNdEVwMAvLdn3ZQCKX848Mk3kkH5+7BXl8e2sRDuPuAyPAyuWt+fbMvDKFbTOCa9tj3E8KmcPtqZHXE+k6AIJ7j1PV7zuWJPO4/u1HGyi65DNQr8bO1u4LoWVjXdTYFtFeCXovJ6KCXqqqyDcs7ereiszpzH05UlmYNWyKG4H2KQJ7gfxXTxC1YXShpy2L02G8CAIihXZgTDU3/nX6olnoS/5BWhD2mWeUpuySudwnvQLMD6Z28DD5uYH/ahpXd0eUsTLo/4gb2j+l1tKOb8Ouo8Vqwf4texxBq43XceC3Yv43dv6M7wa+TxmvB/kBdRPx3+HWr8VqwfxcCiDnGj0S0Yq9f+C5YEt6Jo3oRp5qzc8uG/BcHiHREG3mCORiguh3dGhgfryEdQntasZ3djnt502ccnBv67+Bn3AIaoEQuOuGKHvZFaUWqI42iVoumrugxX5QYj+pEo2ikRRNX9LQvStiqWvzzumisRSPf1z93RRP672CjaKJFje+rL0qMYnWkUVQU6Nu6rQzIjFBa6FBax8/Yw37GWgT0vSmG/V6q+ynSfYQ91cH+smBHQ+TWbFG9LgCanmlbGcsGP80nj9XGQ2l10+I/BGh5KmOO1szr2UGF4msh1oU6YDVhkDYcfnoA+hBxEafgvo/Tjz27jJSrgp9a7RRkzcrzGiv92RBOOzT84O4/80dzNbEFUQfoNG6ebHx8EoerrTTP5sl6+nwtK6ge6nGneu0rqxfP30V7hEqC6+YR1aMhvAyEpJM7grCGhB+dyXYewMWDJVUiNhQtyHRTDAMR56G/VC0IS9/XQHT1kEp0OESPZDc/8pCKlTel1AkYgXSyTblcwsm+Q92bqW+rEA+K5gPqa8jhdjbNjj6m/7fpwNy0bvwrNphuyzm098+ckgl3Rz/t7ggdVyf9KRPSf4tuU/k950FeT7ijw6t731+4B0HWS0VBm7H7Yl6seOPLOG8jHQMckhNugkVGm0+wnBF8tGHfNYxr6MxqcWC/ltiqi9iD/eXkUDI4gA1AA2ByNryRQGXvJgM4iX0Hjz1UbzNqDP/fvlr8yAj9oL112h7VGCO9S4BexVIgnGNEyAXgEcrvJvhdAcGUfokTrT30ZZ/RqQ4FBaLBAgYFci1g+1kZSt96WU12+mn3g0AguxP+BJSCLBqDsX9lAeUEdZM+qEo2GlRFfOKRfDCADYmb8AAGKxjsi/gm7vPR8GKYM8IxDPZJk6IWEiVNVwTFPzAiVUe0a7GKY6VbzHodseBkhHOVBMKgq7XqghlvMpKq9XHePzldYf9cCcM6aOpiaF820A/M2SDAjNmQ7Wqzjq9S9sdkw7lrxXAOzRxjZRsM6KpbjjUs58L8AVanwFBOgwFM10EH6pgAnOQDXQwHuvjIQBdfyh3YOOc6ha6oDd866cpsoyuz/TFdCaUrs6NdWefULnTNgaansurwMbXUeyLoVw9+lm4eO6ZKk0+GMv+wShyj9PRDsTIUW938WRmK1dmGglDm16kKZ0WFuUFUmOtEcRiy6bgfiXUjiTa63rFicah3UKGxZeLgKG1tkGjFIPHCx3Hvj+c43qXjEPcg0YEGEj+kVkA+8tkhBeTpzzqJv6kl/l7z5QT/vvgjn3X6yq8HkoPHqLgfVyLuN14Z4Ct1iZ6zK6iP1WLKInoW2vO1KGQ3Labra0fNM6GJRKteOIPtSzCMQEy32ZC2iMSslrq6aeL1t1frFl4YrK5WcbZXenIduzut7vcSjicm5jdqMrGT38GpieMIbppYLFu+Dgz4ZHAdnNU3a0CyE59jpL73YXfIECTMZT24R6u2whtzxnPbxYynsPlr3VMwmVBgFDHS2FuN+xR482Xio/oS/4bVel/pil9+Lgmu2QU5Zlch19wWthaJ8uuLmH2hI6m/X5XsBsJP2SYGtbbQUgfmBhzQEfYnE+IYLu7NHJ+b5uxKtgVig1EO1sQeVmHf+2S9ZB4piKvL53uwj/pl0EnEee8q0gUuaVxJQyXBhexa4PKv2gYpDBXt7JKClgu2q5XwuD4dzOMb67+RMsjGa5AXeySGBm2yucnVxkatOGmN+ReyRvd4IPb0i4tHg63dFnj6BAsQLTlzx4MxU7e8b+QLeM09A22UzSaSZ6SJvx4YRvyMtPH4QBvRM9LG1wfasM9IG//PQBvmGWnjmwNthJnbBbDY2SlgHW7jcKSLOcR+APNoZxesEvYRvSU0Nsl3nd3VCdx1+C7Z7V93K/sMrcK3n8Q3656eT2w1NV+2q4ltSKR+zs9xcBLlGu1WlH9BbRPuWrdAf9b3i3T1BYG1BKppQGhzxbpujY7wilUSOLxRYIrvVu6mro9bUr/i9RpHckhJp/RkivhkitnbUo8l+BYyYcEnky0QlDKS8F0TWzkyiDvmGiPTs20YVTXOtVLMNmiocgwx5f4yjvvQODVLy35YGq4DVAPCdVi26nChOAurZIXYhRWGNvvfve+/J0QQZF22E2Kv4q+F2XVcIuU4to2j0qDD9Jz4BNfbr4gRqZqAOauItK+uRlycu55mP8+OJsur9n8sv9qbjBg25ULjcAPxYAOxbyAeaIBD9jUrKyI/B5IdgKm/Rp95mpfs9QsHOlcapn55ppc70HEjdFlBAjhaRT4YGnS+jtsIxHcrEuDI1fXKE4KX1PZeGkJTnr/A2fmVbK1LQ9zJniboOHEuJ74gDOwXlGD75dBScaOLyFMdlWabsyuxdmO1EsQ2q2fatBzVJdsrAvNd1ZsJtc5vXhChASMI1xveGNVFYHWze0yY7IHQw9RzjiYIK6u7T1LLtg01xiVNoQJaanJybRC0WsEoPdN8ZEN42lneJG6VNG5ukklQxq1wy9fX29mS3IitzkXiWDXmHdVAh4cd7E/Zkilo1VMw0u42hGG0o7M98kB7hrVcpf5dEgPv4wgm3IwEXc+cX5zY1vMl8u5E5ytJ6H/D/5qPEAZ9ZK6waqZnmT7QhAbnmjDX5dFB6RjeFobpHlh9V3+49wi8BzAMiZAeYdk1bpaEKK5jjPJaJDtLZLyBVY3raJvjSvGpHs5xtgi29YZssmj34F6/pQtHukC+77oPpdMTrtO4yD6IiGbnmdq4ObWY2P85CKyl/w3/G/NI/51rmt001aCHwGKjk8kxfty0ZydXmc4ec4MwtOmgiZiMpTW0h2E632E+xhYdhWJmAuDSxg6xl2EqEbaigriF9hHbK70awcJYHN3XSWyxToeDQm2T+LMc6XidBjqWsox2WNRUJIxoIR/nDbKdNmDK+VIIGYu5+0xXjOBgZC7upptcFGX+LpLvYtFVZyoqhpg4gci4ZuudwW/Rl8hsPjyaxIbiEFzM87OIwgBVdiTCaCoPZ+RnjVezdcQBpNimKZzsiLMG9MAIzwGB4zwTncexZ2j+JiC/7qTiv7xujkWBE/ANRKA7W90fzE3+MwkOnC35z72HJ812FlCuIRZZ6CQIkOF0Sjx6RQDFMSHWlGiKaDxtLJKG+DbBCtjqa+52Z3cF3X4xmKNesotyGz1Dx4cYynJu8rpgqvFv4OZ8/6RwSP83+sTS/6OpuDPFWTw6QjRp/Ivr8ShnogkhLpQixDPe5ywsP983VTr4TbqcbzqD37SW883E4DfJcr7pDn4TL+eb9uA39LxL8LiC4LF94VNIUNkV5B5VTzzs/VGq9QQHAqvpbkIOBEWJB1mWo3o42smi4wYcQZ4KOEok9PH6OQ4G0ulKdblWN3Gh1U346iYa1c3sFhiPm9XZwersYHUC5RxfmccZS3Vwy94lgpdCOhftWigTCdGzAEEZ+/MunrbEMBy2KjHRuy0I3x9ix8gW74pY6Cze3gvPuCqV9dGHZz9IG7jFOCvsdQvba2EdW/rFYcsDomu0v7WbVlOMJBYfJEqSrXyTaoI6h8peQvUIT0tYmPpz9iXSIRXncMhw02CLVvOdY4tm+K7BFl3GDxps0aUKUspxCFQx0wEY6ilYgSlCPCFiMSpJmRXVvDh3REdexKvRzVA581w5c3DkZqCfviMnxvbz0oppEgNwnqlCjZTU7HWDO5ypVFY7PA1UfaP40pPiWEOdiu1+Ipg7HJkIib7kuUPeZQknbaCTJlPLi4mMdaI9BP0L58oQinqcBXJyYD8X3e5AKFRCKVUC6WgmouZMvMFQYnNXisD3J86qg59nEey+z3uCQUXHEi9x6MiTvCgDR14VQtcV4UjOIO30GbJCyebkotBmLp5EJVoZDukOBVRWTVFJqkZDqEKkLfkXvafaic87y/jnCFN0/+eX9FTrnNNT7c5H2VOt4zzVMsT9DpmY2MxGbXm/jtXKnnPsLVJOSqCJRU23ImTHpE/KYjWCRdrwNcE3/vsp/h6TIR8VU+t9Vgfm5JgWOi1p61KegynWcVb7v+jMhkAK8t37Vf9ZnflC8x3f4d3/xWFLl6JNwenYQaJ/DFNixlOegVCeCXsd8QGR/UvmAQdas9uiPU6gQG3gSJEPaLdswzd/ZwfVKss3YVLJx9zktLidtNL2BOHkyal8xcpV0wxAv/0ogGO2KjvTuP3Gcbm9tLMKt5/X2zWdlbj9sN6u7qzA7dv19vJOjttvf0Vu/xnTHNVn9HYWSRNM9Ra9XS/B2//+y3L7PElp8EG93SAR7c9+yd2ycedf6u0LJLPjh/R2homO6o/0dkrS+N6qtx2JuH7jl1yfOQPjY4+4W06p+Ta9/QuOs2KqR78o99dIKt1DevuvVCdF68WRcEV2AM/ahoaq+ntVSLFOrnaw+6IqrDjym1NPicrKq6ecduopBCQ98uhyA5IOlsz+9bKlVY8GTeFaU4p0qaCXMf5Ry6/9+0vW/h+GRF/nFiN9P7hwOdLSbd9txu2+IuBgR8gYK8Ykmj5H5JX0Mnxh0BLgMAIcPuaykZjLpnroq06T+Z1RTSbAzLA5lfgvmdp/qqlNve+rQ9rUu786Xpt64d07/eiFd89rWf9jJJF/h3EWb6HSTtrA2MFj675vu2NLLTju+vbosWU0gnLz2DLDx9ZD3+Zjy7pjiwen87X/cd7QMl9r4A/LD4jUKSQmIA0CYjZb2V1ySAa9gJlU3tbTbNHBZ/mV42o7+LiGHa7ryoQQAEIwUugOLYTcE0xo1NM5LdJl/7Ww7D32Fp9jZ/tUnO0r4CulzzA81ZGPtPA9bSGoU2GgLd+C5N/o9LmgwoHxYIC6joytq3SgxNYG6Ui9HhCGvSYjwQpPAc+d+PZy8dxgyaxHG9lBINv0BHXyO6ausv/eM1Oi8c+9xAch0UFWEzF9PTWU5m+iZeKffpXL71z1G/Mw7CK40EeV2QWLKljEry6CHS7KKV4R1Xri7fdLorMQcQDEPHmj2cNBARYh77msupwuz54929oOu6moYveo3b9WBnO7iYwFKbRrrnpxPyvhilidesf94rQfSC7e/L+YXSy1Ea+7IH+zgQ0W8v0hmDnE+xDZYe5jEMiwZxZXzmkxH4AtAIdSeM7uKprvS4C2Mti6Gi9gL0nsFbVQBAj7YNkUXIKqSrwmw9RRfpNxI50vAwRcC/L/bF4x2GEkprIsM5duQgwMAmqO3QXmS2oN5pchmqXNkB80JTcKP3D4Rpy69X4Brx0FZ9Sa2wnxEIKCHjA4nfNFQ4ySLErBtpt49zbDXt2/D9hbNCK0D/PXqS+xBe9rd1UnqfN9Wpw91XEZBmyRC7urtPOq1YAID+8wLQu8czMWjAca191jpo6Q16kgY+IA+vktmK/8VsNADpfKXEPtCQDFc0WwfbVCTDNSSd0Z+CbuLsPdZVBZFo756diBBBsEXTr9mObWmNk3NOMMf9QRTCxLhwN5iPnH1tteWp55UKNYC78EmZvlmGfZzzFEiDrHMc9xvUab2e2f+pzU0xtUj8tr2vRuZC2a5mRXmcxvloj3qXihBNWeVwP6of5AegFbnXq7jsRxIWAwud6SBQlGeBq2p6oXK65uKILfmL9aWAFURYtBXb0VlvYIx4rDoLp8vgwBw1jAXfOYu5FWNacm21U1Wg1dq2GjVTe4Rts6SzKNtJyoHjMfDUway+oHQbKesyZwJg3gDAaBM1mQ0BI40VxEEIbKUGBU5N4ZVytsJ5oXVtTIvCRaWYKkBFJZokANayIZcCA/ybjKHPM2Av7dcFTcW29s9pE+7SajgA2sYmGqZRgRQ+BBvwQO+e6NdHATc8hbkX6w0xevB+rcs6UMV3PUuooZ0l1FyEk3Um4OOJmG2878HAcetLE43B+84kPLdbMX8lXl8kIBoAKZuDZrHrFRTD0RMjly0AoiChQtyUfE16Ts1l2dQUEOo2f5mjNncNOLt90vfwTwmRTi9CGMJZ6QstTZvVSkF/DOfhc1plkkUt7EwDu33Oa2J3q+faHLSUeD/J0cWSP/AwNRmZ7ixtVbJjsgC+XDtF8k2xH6h1A5V1bXyDg5lJwmHHLIaG9U8C+0xFYFWOqRRLoaaBupwFyrje/914y9MTKzHUeCHxpiBjLlS+/KKYWUcnKuuoQIRwBeIquaEKJlIwG3zKa/bXWZYB1aBNmTfJAoyPXaWk8v09K9DvcNuBJ1TkgVE3NlF3sa+i8GXgmB2uGoT/2i258r25KCvF2FCxDopK7aaVet1t9FIaqr6NLnROnM9fsofzMv/uKiJLKnXr5NpuYKzjjdAhm8X24hQWkVkMNUN93mduQ+XEEOwx8JSKI8B0CyHPAT4wZ2bGGrTBUhJwjd3hWN3xaWfiZw+5ej+4DJ3w4iR05TPKHTlLOg4YhqoK4GwoK3VrirDEcQFoGKwzGhqtOF/OsIFd4REVvKcOrSqWloIkm70meKESsSyDQSIOHOyl3CZgrBHHT2OlB/ZBEym5O4ZlF/jqPRK/Bt1Y3PhOyWLmeAoRN4vgq3wpFR6Bfr6Ak6EiVyRUdJqsAF2hRvr1gsxZPxRwQh+916SkDUyamELEMixJBPeDQC2HLYEZlnlH0NBKoc7m5lAoQBIzB8hxr8Vhb0VDpspN8OIqREtrZgcZZq1RPtO4CYYo1ag3r+aa6J2uCddFq2i2n0pHBoc3AzODqbKAPdDLzO2Awx2+KM2wxgix7388NI+dTo/ADj6uSw2hhpaN5umPzeKfZJBL+NEtHwCbwEURiMIwrPd+66dggXH8BIzl5+9Xk362nAC/rCc4ibU3pzqvlm8QDdPK43jzeL7cObM3qDX1/sJrzZe0Bu9jaL3YKb/fpmf7PYQdzcrDc3N4vdgZsDenOgWewwbg7pzaFmsTubb+7FzZ16c3fz5ghu7tab+5o3D+LmPr052rw5hpujevNQ8+YR3DykNw83b07g5mG9Od68eQw3x/XmZPPmNG5O6s0TuDmlN6eabxbfgYnXm8ebxfbhzRm9OXOgUewmvNn7Dl2fZrFbcLNf3+xvFjuIm5v15uZmsTtwc0BvDjSLHcbNIb051Cx2L27u1Js7m8WO4OZuvbm7WexB3NynN/c1ix3DzVG9Odos9ghuHtKbh5rFTuDmYb15uFnsMdwc15vjzWInm2+GUUzsUEwycJ7X2AtoR+iu+jxPWC/QJ4ZEkNnThMIy9i9u0Lw7usFTReCibYF9H8zEYjZbmxHGUnB5R+J8TzMbOt0vJeDcauFzlCh25BUTXp1SMZnyVnzsQLuzWjItgy8sEXFWTSvZQIUKgEGGYo/FBWyVxTZ4IPo3s5aZu7PGM6qlURIxoimchlEh9XDLao1FGHZVR6l3AfO8jvEFs0V18Uk6xXiePRORF9iImafX183U4g8RCCFWbp3mdSbL3oVE4WI1k8OMT3gKJ64Ja3FNWLFLw+5fK42Ia4wX15irWabmxgarJ/nPs+oRnSZmVxnPSzRCzjCT/xcQMBaMeYig+lZiMOEThHhaENvUQI9mfN+L2NEkqgU44rsBsQlkibtgzFW6GpmZZzNGR13Vxo4N0SrEgMhJWDijSat+nlIYn2ZfjniSGMRdCnUCwd8zykGwnVeQv0XAgSkGJm3egb2m1NVWUc8ybWVh5ePZJrGxpZOaF9NiXCJ4WorsijzZFbOfMACggzk7L9ll8puNpsdEg9RIzVQVRrLU1P0VkiMYITngauxYwt+nXtfkziDp1ijndm+zds9b1pwnVGxMcNK3PQ7j6WhvnQLjp8CJKaTXbgrMeadARWQjPRFpKifpawrPplR2ZsbLzqwAthmRnRml9kM426jszAzJztDZbH+LEVd+m2HiEtJCpt3PA2Xsa2TGQlk4AmUiY2amnKHMPKNQBr2zgzNpsuOEIR7WQklhdX5YM8uENbM0rG0RbBoKYJk+x9p3ow511KEftZO6SRfdqMNlAJYZAqzG7IOAHwPvGR+RPCEw+zm/MD4YFMarJAIyd51ZXOoxHbhjOnTHtKnoKPJncMRSq4BPa4794AUSYVMgEQ4KJMJxAgkn25BJvKyD5/leM4eF1ebcSHfQI6YL9uh+59OGOWLabsIrHJCisHSRw6qL2i6byrj80pJss5Qku7EbzynJzv5d2NnDMgN3ujeZF5gq88Qgx6opm8bIVtQ+kYMjpMtNNKIPUwRcD8zDLuc/20U4l/1HG9qGlXaFaOcNobNQJ/lZyQfrlpFGdX5IiQYhhSWy21cX4Rw0NxzNfynJfBnVosdojhrHAYvluc30OHIvO3oWhqXzgWaWA0ahWufmUcrJzcEh4jQ2VaCyicJuR7gJ5pzn+LU/NPO3GgYC/Xm9ICOWVdbaMmx0EXEjrUYom9qL6aO+RHhXPQkupDYRQL9VBJJSswVmJyqSa7os6wSbvvPXT7zvm1/7r38bZzYIs98xzk9W8wJqvl8s92bv3cChZctYFbHwSk41mgrUqjCNYIdkH4e26DOR7ePQWr6aYSVpdfC7HId2BnFoLxMv2lg1nBFy3qfrXYbp0vJrfQmYkx5EV3DyoVACWZgiobp9kttmlOYQ9c2s916yWhNxJ99pahedvvOusKn4lqmwg1MRylRE55qKcGgqxoTkHTsVkmrP+WXXU9Hsrm10d7PqYSPZnkFD9UqTkDYmQaBKUxQ+NjD2bNWYZ28yPvdvvBZm1En1CE6ER2olT5+F1dVB2u/PDyCqvsNhM0l0x2/YoSfjV5xrSaOTBtci3932BdFpwriQYyZMSxCGvHrII7rgWsLXDzFuU2sQua0edpRJtKc6Jtes9gR7skLc8a6w7N0d68pP02NXM4xHaHtLoiFCQARS3TAL1KZBc7fX1HSQfcWw7ddQnGRJbx6q6SafdbBcXMx3MqYPG455nOul4ZhnlGoXtzS2iGFqJ38+P++JHac6FBgR0BWcUorVnDAOFeKt4dvHGUe8b5+2WPv28Q4a8O1z8ZZHypwYW0W3shDqhq7LEk4p4mUQ+0+IyPIrGIZ5BNpvCT/Pxp8Mh4LbJGJz9bTFt9bNNBDfOmdSqU9rLWg7m2L/sF2gMAg7L2QTclEE89lKUB2X4vVuuq8u37Ka3oqg+DXz7CT4/CCqzDy99y/C+SzTF3Z+c/Y8J8VmVedCZZSZD9WTMRKiLXuuUHB2idedxms2wmjIBUJhnglUgXbwzQ3z+makTEtGr79z/Evzo79z2aUa/TovwfiFseOiMx1fB+Pzl7szpdBFcZRdJh170Ompq7P0YPUKeGNs9Csq9kF1zOiHvzsUM/qx7zrTIaRX+K7GGjptw3RPHbwh1IRzbe8K1wjybHdpqnrES+SQz+F8KY5CVWu+F8NWt2qJf4otOAlnUl0DtsJWT3CAaAmmZCXSNwt25DfX3xn9LfR3Vn/X6e+GOQF0/cfn5Uak2Uhh8pOy3qW6Zi5Dek1Ox2ZcW1YKp+hNzJF8wNA7vxnOsdATvqLgTFsJzXyXo9RvA31qEX/CcDYYtlhl3x526NEEfLFYSsKvh1N7ituas3jW4JQhewrZrHaUtAJH4lgp0Tyioc0YDW3GyG9G2LlXd/7DkYAPb9qMsL95AoGy+UG1n15VDz3hIpRoyIq/Hok/QkijxM4SnZREqhPLt2lv71aI0TZbuXU4BZBQUs68LQXAzAyYRqmZ1bEb7w9c4BEJuuJPYuHAv90Up9Q11/XVoU1Q34Gl6/P2VP9n6E0QvdGD+l8pmcVp1kKXZk1XLuRg5CEnbPxbU6vVBhxap+oFfYXMZH2SVce+R1Pe1YD6Tg1XPYqnMQsbyrA6+T2Np2946qXI41IkrM74t/mfGsbENJ5Hlz4Vx5+LHNzNeTZc2MnTsU/6xLTZeQ7joWPwSZykP87nIm/FoXPxg/XKQeTweeFO8i+YzSoSOm6mMo2OxSkzaO+xHQJzQGcRPaFaTz2dmidSeGLbauJJGtmFIAmNdrPl45RonRERik6I1ylALIbVQz9w4dvC6jhdVxICEAU57mf+aQ5LIYGkztOTLwY/rK5k3wrVb7wJ8gXH4mWXiU2CIao33ExEatvhDTo/V9hg9V7NZyHJLP4Tioggirbf/u/zBqvTXVRvc1Ucogt6VRpChiwupItY5NxwySKE4Uw8Qhg2R/PKrcxUb5XRDPRCOFl+/Ra8DodfOwjU6oOt2T9Yk4gzreIUPfA1NJGDIzMyC7eNaUBmIY68XW6HMRCnKN1IM8H8hiZ25zy4NNg6OT1vKjn3ZZxEuLOStyu55S2avVWatc1m4dnJ2WvFdVdL/meZoIGSatIXspiDEMgl9HNVvzr8/SPKhvJuu0StfVtiMkwc7gynkbmCUBH/5KBWkE23eGGwoeA0RBE0CCFykcLaNkWK1ZA3LuKvJZxZr7rjHzijw4owEBnnuupNuoiz5ipdokhiEttG4Z6c8y8M2IAP8Q9CTkrDEQd6QYO44HklrimMZTahTKoOy4xB4SJtZA7HT8pqX2Y3dgLikP6dP6Ul2Bn7Pon+gmdRTllbm6Rz3LMOsj+dEULP8ou1HEpLTNIt6I1ZfhBJIDTJ8ARC8Mm3t//19y/dHjc0Ky0/Te3d+aTa+0bCLkxNE/u0TKtwq9DlxBFsVfPQcKu4h/d7La/tSgAjBA4iqpwR6dPAbuZzM2SVEvLttbZ0DTzcEebRXskp7IKfgd4LYYapkV/ZJjcWN6/aJgbMwAI+1JbVUFtWwnQhfJeV2F7wEl1YEA/Lrow5Q0o72OQQkkgAgQlDYIR+EEp28cKo7K9sW+BIXwubXfCwuslIm4zqJqMxTYr0nWhspvQjkdchXUkl+fBMGYmMXO4hA+9TD6qN14K8ijgYtoWKTK1lMduwn80QXDN0Ut9ei4nsXExNTP6XRptqNkvMYC/mcsSRWGE9IlQvb6+fZwtvfoKF4aWoPrbnp/q8Mo0b07yx/oa9CVg4lSBMvcwqjoTB2iTDH4o1tj9NvuOFWiwwdJFFKj5cC2RBruyW1WwdxWkVecYSROvWBDm7NaoErpLMtaGA1xPjKjkWZlS6LlHzNkv4SNYDE87aDIFxOCURSWK3ihqLJ1K0HSprRkNFvmTQua69wZq4jSLZNpU5uef4LcFJnxtZ0MFN6PY++g8amlEEi7z718jul10801fR3FPEFSeeFK74p2z+hCPeQIBxt5oy0/AO6mX+J4aFB/8Ljqb8qyY7UgvymIaUBNws3JquuafDjJpxDssMpDVlw6RsCIsBBvDTcM/559W93/FOtMBXUePVg9+po5uYgRR50RIOQY2Mi47Ptw0mgklqze5pu0bsK6gtXmU5I5kkQEBZy459tm5TRZ77WTTErsg4/nLxLWLGxMuAg+qJ74wptRiHE81Vrtaq9YJFhjtaJolVHkkOuUCWTACGPYprwiUtJySepuDuaLOoylmmDKMKcRRSAQbEFy1G207QEYtRQaFxIHG9VvdIJBoEgRX1FgMBYZ0HEgdpDDUkPkyHGzrmQLxp4l09zubHHXgJ2u+1tHuNTgQDnQianbBs7lhMQE+wRnj1WU7iGYEv2VT8lghjZ3iBExlyqn7fLjBJLHMjeMewoMbuKggCOxB0vZkNKDriqkiIh/AG21gmAGZbaKDbvK9+X1pjZ7DGQGtM6hoTrZFFIYhHUASy79tYxlSirdld/bIxyfQ1Zti4qRU5RumdhzmvFhXaJn5QPGfM9kFexTqk1Wymw/L7xjSC1ddxscygCLKFMKq3sIaIwvb+iOkGXjAROcFE7V4oe7nhXnjmfwgFFjluULIv9rku5kuZOSxs9lFFG2C6ojp4juw1OvzmBZAL+Ot4ZNMLOpFTZYn/EtvhDvFolnk0O8CjEWuGjhCbNsShsbjAs2TRAEvWE8Z+iebWP/2tcSy5AXZx6DYSHpGWrBNset29f/Tmb3/rb05NZ4sJq9iqx6GgqR2CGtrQucnLExPHYTzmn8WfiEDzOE5s6h+dkZDqVd8EcUe/X1ciz1Ts0E4HZslqVFY5z0Pg+Dw+uDXyDwIYsQEUO+9lu3pxVfQIdgFWVvcMn/GwNYhg7XT3zXK4UGF4DuB9AkeEmh7o91gWaeY4zBSkkewKoG+04cslVIZBiw/ELPa8XOL/3+sauIgIC6E1jKbCkzi7xU62fGr2hZBUQFQUBzyhKu6uqyD43PPq/mbJljOHuqg5/rN9NUcMgTOmk/fCRSFiY767f49qIKwFpWOynbNri8oJO5rGKr6g8zLTRfXgm+93yZDp7jF/h7FVj7hb6oWbea+zwUUqsPa5370f2ZFv/0/0cySs/vZN9HuPzT9qupoo8+599GS22vtb9HPQVId+h37/q6ECPpPqCcxDdeIzE1uQN/PrE3PVa7Yv0OUP+Pmtp/n54Xdkc9X89gW8WDxN1yd+bTv3ozNXvWMXl198/Ya56tOHrqNC3LXTN27Y1g0cr6yUKzQMv1aZ3VXr1cLoHwv29gihSYmsFhxHPnp7CxrMvzJhC8Ht2gIKm13IsV2II0yb6AdEaqa7+fxB1OCuGGQgCxBCVIZE65cGKZgyXHuTlQzZr1M6pTpliCiToYTDTHewI2XKcU0R1CsUhxM+bgUFhBwtDdAZFt2tYt7RRoiBodq4uupmWgSJPQHZNt9xXIpkM+svE6F9WY8QWjlzhOXm9H5I9T3zfzOfBeM66CgtqFx6iwMZq5TuWmDxv+lnHJMR5vXQfBp4mLwasZLhxSOBpPeeYSrrEHrBVBaCa2VvtiYWAc3GvmpsW+LnHoneKqZaxPUHf1KVnSReBPJm+lO0V1fEudAPHbtNyQmfkEJJJ15AoE+rd3yf8eXAC4sMYLgLRd4imgwuvh+t2XENBL2U82lD4BI3BS4cfD5WgUtcpDjTaNpV4JJA4DKBn7wH5i1RgUvMuhKc43GRcWD7YgICF4l7X6YQubBnSv4JnIN4qGORB5ZpFTeMLsdc9bKYuJbFtDQHMha2BblLrHKX7H/3YnjPHqifXXrOtBxHzri0HDcz/xFoWPiBtBzKEqwI1HCJKRKQ/9OqoxMaW3qf/UIzK7WnGayjGWb6LPJripODpjg5UHGyHRYjL6rSRqBOkid0xMg0HdTp07Q4FUxcXdOvfq/OU0ArVB38vtAqMY/5Kl6ldZIogdffJVQQUZmsDE/A1+KwvUfdz5mpEDgHXgFv0eIN2aKdiM06UT2IFY6KtiO2AuY/+cRxBzN/gdQuvbjh0pju1LRjxLwX8RxnA8fjOU7CwqRIxG58EZ0ygedZJSbiBB3ZGhOwQBRLpr8jDiQIzleLME9Nx5GwwxBw6EODh0YeGvfQ4qGVh9Y9jPAwkoeRe4gjDkEa8TB2DxM8TORhUhG+i0RNEnGQAjr/xLM7pp0CjJHRmVpk1W/ffMex4NXV616/N51DtHVhClK8TAdfLlSLdPEaMZ6SSL52B1LZFGITz009+Lr7HSVVRML6R+y2hUS38fAksh25C62o+Fk0qEIFJCDjEOuvCLYBVW1bkMC++nUXtDcHmKV3O2gSEvg4qkjlpyVfHzwKmYZBUDSgf8m/ayDlIBApWcrEZxcMR05BZP9JdH+CbbYUqqB45aRF9KHGlIXcKWIlk29PlFL9nhiMlUb4BraNFiXAGVf7gXYYuwwTssus7DKjmUo8mMZqj/I6tEs03iLVdGWwaCAMgqX72RD3Z0N3/wO+/4G//36Y0exxZHDaAFu7LA0LZRODu2KWAhmIOK6V8F365sQb7sebOBOMq1Jxsw31EUW4wI79iJY2QAJovGY1XYXVWy2QsyC5eJAIuhMi1NJGIckSzpRs2TqP6l5Nr5BjmEVEvORJnwGjTOfYz5kI2baKxHAMgQZoqTUfyrc5J0+zgPEFUilghgrY4QJ2qEA0WCCp4jmcFEyPCLjKDGjEalAE7BBZWA8gSSYvIpWE8IhCiEwJvVyLzzSlQgJjlXnmbH55OxM5ya4iWWA/AywPaKqrzVoJOBJqdoWEsyvgU86uACoZ2RVU9+1Fr6GKXrn4QmlUSJfoyqyFXTjHkifowakAFS9d2ioSfmTbamhGYxHwx6rjvJIQ6VHi0mI5DU7R5c1yHFQnG9fH6fotev3/d/ct8HFVZeL3Ne9JMum7TR83sbRpm8fknUwfdNI3LW3pGwokk5mbZJJ5pPNoGyhlWiqgvBUVQbCwLqCiiD9XXAUBFUTXBWRBWPUv1AXxv+squy7q/q1kv8e5M3cmSUGpv/1r+ru9c+55fec753zne51zXoDfHxNLhq0DF4jgbdc8wffWkA5tCy0PT0t8ow2tEO3KYH716M1fx7OPfi2EX9vpF6rdNuJpU+Mrv9VS+VuCFUG4NYZDYzi+dfU7wtGbh4Nr9+Zrd1LtNrY/033ETFBICa3bq/iqIKxUnRgu8RsPfEFgrn1nYPblgdmeR8pGL2lv7MEfXyN4XcFoAjxClyeTPtwEDxZnsQAfIR8iskwSo0kSDnLxMu2zkXFfz5x3b508o23SU4Mne3sKhsl77cT3Ckc8hXd0TkOHCql7bOyqt+/9yanKfRx64qXGPcBR2/h0ULrSaJiPqJdxlYMRO4zrN4g1Jyhbrqbw++gVNc7u16RcjQv+P34fCC7BnwB4Q42StFxC9sw+rDu7b35Gyk0S78T4x0+snCzejfG5b7zUmLsPRuHI+AReSvD0gyfPmSxFOaU4eevf3jAPktCZmROkw+MbMF3u/1710E9mYEJ5wnROHZt69Ir70Fxyb+4JPGr5W7kn8kct21A3YGIM4a7hN+QAVL4mJYBIT1CshphSg4CpxBlAtCEPoqHFA1CWmAxEHK6vSbFh9nW3DeGlaGpJIlqFEaKbnpFILOTT5FHwwqN0hkjdjtDU0CtGJ7oyXAl0ch2PPKzFDnwB1sxJx9fIp3oCgv6FKlXZKITtUkSlGlWgTV4KnSAEn928I59yKuJ4qSEzsjhPBY9quTihH1Vfnhs1WTsKbLxK1hlk7VX2X7hZNsWQxe3K9bwLUDmqKzBC9IuIdcOJ3i11//qLLz9x112Pfu8jV3ZLvp/hWqNzxPOnPvPDf7/vO9f8RjIjnpOGoICJsqwepojxWYBELUHXCCBG/O7EN3LLS1T9CHq47frcEdyHv0RdfQQ+2yCIolTwZc6IIoq6/YiuwPdC8u5V1yKD261cDdWuuvYErW3d9VcD3FOvPdH96D3H/+bGz2o5D2aABr/6hYc/+fAn3pK6rySglqg+XTsCdbwuoTh0vTzke1qhg87VE9tJc/rfqGlE0na9HJw27Htd4Tu2rqddcViPgvXUaPmakGGZqCJoQGlFej7XLqrrZ5a6ZK5LV/m6KYMNGdeTggY5tKDECXEDAhY6FFysy+TFgh2OcttVDrxtYBkfQmtuhD9QY68CuUlD0cdBagyi1UH2GBln9eTzkGjLBJo77VZzJ97HmTd1ujCk4g1Otrwx02Y1c9qsZk6b1czpFPc44yXPwzUusl/a2cxpKY2SySU2ZofuhGZ48kZ14Q+pS8SsK77nFWI687yzI78jzI4NIDOb8wCJaHiuhAPKxdsp2USKp9JYTKSyonpKC0d5As9e1+3iCmk0lhKEZDZ1eEyYTbOpk+VXO5tNXeJqbjTboubKBTA4x5lNsbyC2bTQMDZ9ojlGsuplMMDGt1kko4K8gNezIr++Ho+3NyFCXxSLYRWhAIRuEldxIJTor+snXR+gg27ptLEaRLfCIRWQJ5sbSk0U2pGNHmdlVsyRIzO6ZIEuZRy67AyIaI2jBF10OesE6JIFuqQJMcS7l/nowFl8QrE4rMaOGLbT3gZ21bOgBwcd3VuLbJKLUeDEfeFIkm2mHZqqKmJmXpOL/TSDYqMWGuZKXCjH+U4qRb6TSpHvpDKx7yT6QnrNU6Gt3pDKeG9IpcgbUinyhlRKvSGV8d6QvifzPqJ7S50Y/wQPxhdyT4zzYCzP67lQYed5oxiZvFkymPcu++vB51lyCp0Ipa240Kg0gE2jdn4LPa8xvryLON6ygHyGZ8whO4WAytqxGtJnAE+2GV0ZaJMPzBfkrOgQQzsuFnjKu2xKwSp+cSrs5X1leohXEHHjq4oriKazfU/Wlfw6oVhXEMW6gijWFYSdcqsV5vg0WhqcvIJYSqvmI6DJY19mj32hW5JMz3uE/MiBobyYD8TEgeo6ujm2TpK5HPyo5D8q4iPSCOWg4FPJqI9Gf3Ud3dHyuEz/baqCNRjXUVwOM2IBPg2LspO8PXghNl2Vh8hqjsRSyp+lRXavoOMgyv8HU6SGO5D3Bpgs0nmmSO+kkaRs8KFSzyVu90LFBinNh3lDw8Hg2LHTDjw+gd5DwWM5LRb0HeQDkexEOOmW+wzms5PXgzpEp/cT88yXMgFCaNYKFyqhnTiNpzWAgJm3+v4vNZ8cKzQ+pt4jLjcA4IfJY+IMUFXziaKUXZxy73kHnKFecJ1wf5JxmChihyqhhhfMI2R/wmUmPxUk6ySRrJNEKvYmy8Oj5eExvcmkomRk2SLbrMLeZJ7N5PEvVlY8Z0s2Ha/yy52PvFnneGh/A50+QCkUXS1ZEmdLkzltFVswpLwFQ8pbMN4V7RtnwWDzGPQmXuWXD+kHgraDnkUQKjg0TwxY1QnPMw65Qiw9bjK9lZkeP7NqvMEa8snAoVCBDp3lZEzCzhOblmg2A11l8wNivLoS0Em+keZeHtKnsD2dLAdC8edCE/oBdNPhu1QdqPhzpSilYqYkbZ+LtH2YnrR9LrysL8MJ+S5Vx3hvSxer/Dx5h06N7lTFO889ODJ9jyp55tkttqUPl6uKLEF5bvSictdL3iGkkTIplzaXqRMrPm0FxefqjWWah65EYvs9p7JvKBO3wNkL+nqPTtvZ6T7cYb0iz+RirXhlBJp/nAybBrI8tYKdzumWeYUcKsSGVAWZeNQs0cUmZNJW6AKlP0iFY15of1m5TcMmOjxBrdpGReCZB2o1Ktx49zqeR/R7iQzmQdyp76yqZt9GonZ4pgxIbTBynbwpEaKd2BRVL2eG0qt5JA+B6SoC07xKCXAsq5LNhNU1AaycDN1GZMVhgUizQKpaWiBYb0cJ0OS04xBgW5xpzgA8HkpJWj9PQSvssWqFPUIrTGZzNKpUDusac9U+YXQX+3VIwXMtWohI5ajyCqiKG7Qsw0ct1psr+YEhWwcGXoVRQ2BWl8H45B0OZRV51WbwNrMqD7FVuozW1FfU/EXKtoVCn4nz2o4idZ681ThoVs/ReStE8JgCk4P0vLhZRSU9Lztp2fjgVzLW4Lh0mlQT+RGQyX5MBzCbx6IQUyU63OERdyqTcRH6UcYOV6zJuMNddGsadriCHf4WlqiaHa5SDdzh0Mu0olKHa1UQRx3uJE8b6nCJOlxi9ok6HJJpZArTHWK0KjxaS4HH1cacVJPDnYe8MKkEhKoFcsXSIiu4NKk0y6SaHEyPh+7w1rHf8JOHVOBA/5+xKY4r5aPCJkWGJUfesFSNG//Y5CsPE8ulmhZiFif4vkcYDezk4WB67YJxB2s0zMIr16fKiM/VndsEz6nyaU6k2IC3aSelK3/wKlN0XOEDmtXzyxSRBce2tLFMFTvcalQyIjs83XiHmlwwVFtsgfbgq1exRxN2hAoDo5w9p/FAlE1l6H9u65aq3d4yj/kzH72tzEvKTqgWmTUQhIB9X0cScNl68k2aIIunkMUCxJvYu7IkSXSTS7BiiNS5ymYdHWJS8P/qbamyMi+dB/6mxLF+qJ89y2668rwyj4f84EsqIZOlk5zix8dsKbN1q4wZL/mh9R4InrxyQ5mL6zl55dYyJ696C7hG7zZaPo8eCCY2FEHmZDiwMocVDkcRHEK/W/hgE85vKosw8pDYnbiZ7MCebkUAJ+d7sOA8FfQMBcWFFq4h3b1SEp5UNv4mm9df5m9NNc/Wp5N20Pu7SRLe3xhA7SIFHlMUW/6kD20hugUiEymh3WIXCVxosUQGBOtVLCYRNGzUOPCF6n1bQUNuH2+GUIbRMDypYhulMXLCZIMMLDl8HLkDlfT/IvElUqjrJiiG6Lt5P9hrpKY/s+Kd9eXWEkpNAixCyNYErCMvKE8FAoBU8N4/jXfvzhWb2nK4L89WYpnymuoI39cUzxOW3ZWTedGqwotWFV60ZqcR1bbucnxXHrTYWbjLUR2/y/GMXq3kZzhRZR1/jrretQet4nlDMz3afPkN4eSAjq48pgHx9IefQG+ecQZEhaN/N0F0QHKaBw4qOM1crCVCpxvm7eWh0h2JtA0CDxGol5wa8fVatcbLCf+27Eo0deayZXvhHehbp1WJdatkV6I8hzbyPfC2uZGPXYPYzX5W8OMT7E/k3USseaItjTbhgjYTXha/OYn9uNhvjjbzowdZ0UZFB29UpC3/wm9Oym9UlHCHIm5jd6DfnCSuC/Hj+f7kh2YBWph48/5xUt4/zsMI1wivGtmAFtKeTiepVhQ6HN1ywhIyaopw4Me5u4F3gLrWmaKZdkAob4OfEHsWi/HJsmXwzgkiq2WL6djUp73KJ2qiJzS6TinIguQ9ockH+KBOqgglE/zd7QVPaBu7mdrQE1oxN3ahPw/KOuxlWvCEFjFCB8nMK2p5tOB0cupW+YzM07eXOELTDd1ErJiusa6yCBR2hLaxC5RW+D4dj+4WjtASqmVwIkzHZzNtbsPJbPqpkQsO7XcKXntHwQ1a2yyOscETDskNWqBQPkBqCM3iBQ2wWbygleD0ghP0Gjr7y1QoYCfi1ju6YJfPLZWFKkSo4VC1IBzISZ0ECPV8grZdK0Bx+EABXUIOq0alLW589QXt9RcXbPPN0liAotPdLkcoLdIs6TzTQ4G0MTFzBx7fIa7h+i4JDoz0LB5dHPHHp3YUV8P3+3oSsv0o2fxQ/1NxFd7RYv60H61B+4rcrV9b4zxag2YcFX/bj6KBUr/6SI2bN4U7dPeez6GR5ygkd+36HMTpkODaE0eOIGtxFFty9MgRmLqer6A7NWK0RgtWnF/QlRbhxUZ3u7CS0M42DNqTI5lmDPZu123cWBviYBjkEcCUg88OJF4VlbPEG0lbiEVVM1DpLNQ9oGYWlbp4bjj67eFXjR15sT60+7gO8loH0l2GD6aj5MT74g07m4QrJJUO+CP9lY3yTJIaj8JVsR727PbwlU4oQbI7vyzaWBhN4nwUUuh6PCfukF14Vu/jkufXSjiZyKRC4UxPNNGfXCMCe4xUOppMmHEHORiKxZKHQomwAZ8gGE2EU0YobfTkvycPJSDliJGIGKlQPJlNZCQpYpSm6gvF8AUlJ9L9RqqnP5WMZ5LDRoJA6MumEvQpDcXQj2jiYCgWjeh9UEp7a0CXpHskH/yTpBXnHo7HdLMgzAmJM5hRklx8J7KEbLcbj+OBxwtPmVQcVw5PBTxYHh7bMwWeqfBMg2d6SdoZ8MRDqWEjE00MELTZkUgoY/TkP8aSA/AtlgxFevBnNB4aMBpHEgP8I31wYBlADLi/CnD/UGsokzHiIxk9k9TT2T5CtX4omhnUk4DxfkDX1lDc0KNpPZHM6NGEnhk0dOPwiBHOGBG9P5mKhzJ6bUt9m1/fvWt9fafeN5ox0kt2RcPDRkpPj8b7kjFL7tKc+0P1lwXrL7q4/pLLW+qamq9Ya4QBzFhaj2fTGcpkHA4bkL6pMxuLhVPQ0HRDNBkIH2r212Nn+BuaWhpaNyWimWgoBi0YGYmN6gPQ2xmoPjMYSujh0MhaQEc0DJ8ABE4o+l8PRSIpI5020lJE8QGLKEmbRE8DwvRBIwSjSJJuhrgpljjs8RGoI94XM7Al+s49Gx6ANHMhzRZAud4XTYRSozr0S0g0IK23be7WY9F4FMbjc5C2BtKeDyMFOgxATFiaihgGoCH+NKSbB++tST0/cqm+zCCgNBQO8/CWFqqcLphPBNGA6mjKiGyBuGkW2C8zUlAaT4xBiMNxtobrTxs0DGAGWco+AWlmw3t3IpTNDCZT0cuMyP3wDcdxL41YSRJYXIc1hnBaJgwYPKFMTyYah57oGTSiA4NQ2CnIh2P5h/B2wPtFeNvgPZJKDsGwiBjpcCo6ggXkB3MCRh+PoogYGqILe0QXpnG6QWWxWGF2pynETUhHoD35ySBJKYnrvhreOCeDmk+yw3uZxLBtgDDOx90at9EvczgEYZy36UwolekJ9UOd1JtGvM+IRIxINhWTnoY0KqR5HN5ObFdiAKabJL0ivv9YvHGMbIKZ+w2J030X3hq8nxfvgMTjrVe8RyWu++MCxpvF+xmRfpXMtGgHvJHGpABVI1EjkYmnB3gYpHchccM6G8PJCJCDUHgYqEG6MZ1JpuBH/UgsC4FUuHHYGE03pNLSiM0nLcZxI2iONVxuCZ8n6FkmmYFO4Ql4PnXJWhj9MI5N0rkbPjY1d+qLF+v1QD9PQX6kdf9p4za8E1wjocwgwuW0c71LBFzWcLklXC/gmikhlyBRHbPgwbE8B54qeLp5CO0w0iPJRNrI48j8YAW9vVVf/Ak749mEOT/fzAzc8HzIHMTWMteK4YhjwPwWh2nSkxkdMfIFYg4I5MNpM2lhjGO0GOJmZGM2nWqMJcOhWGM4lBpINqaMgWg6kxolDA4AVc/2NYST8fomIxxub+7qivR1GeHO5hZAfjp+KJSO16czkfqmBn+Dn7LA4EmmMjQetjh80n5o87DAnxn+QEn4ZyK8JhmFJTiRjAOpDgRKF3Ug34HAgayRGg0EJmhIUfy4buFYGNtQLvxcd9gIZzPG+emBomwlnYtxPbhiBAIwhTOGpdxSaIr7NJxMQeIkkaVAYBu9VxRlKe71VSYuewCXgQB2axrSAH2E8TyuuomGAydAchUI4PfiAmEyZ2MZKDLPNfGXApJ3UHhFcTZekgAt9F5lQQchclMCsAKrUYgRWZQVFurBQCDL8zcQEBN5wmauSxw8K9Dms6UETgKBAn5LQL8AMVna+xNOnuJem2h2NqaA7wg3dnS0dBj+vrZwa5O/pbmpPdLeH+kM93e1NvV1hPq6+iJ9oVDY6Ag3xqJ9KUBnI07LME2ZNHAaBkyYG90+oo0Xa8zDmeEhCM+3hNMa0yUznNGYRpnhQxrPp7MAWSYFrcW5PFfwoUjDkG9AeBbgGqevjaZHYqFRPRofiRlxWEFoOddTRgYYW+BNgJ8yUingQLIJk5WLjUq1Hp+0GfL3u5gGU5LkMHZnGKBOxvtCieFueKCXMskewS7shWjstpgRSsE3WMfzYwRTCLaWIui/eHQA+b+EcagH14qeaCRaGLTiS382EUnHQn1GzGCqsA5429F1B6ElOEKB2U1F++BzOmj+gvUOiHw2P90NTAsjBpaxbYl0NhzGiRs7FBpN78z2AbgDoXQPLfx9gNdh4vtNUSRiHGZOB9me8GAoCtJEJE2SSDYxnEC+6mAoFQWI9d7eugIvLP3My2vhb73Mc8Sj6TTyhf1RIxaBtNPKfCQfvA/eKANE8vysSAHfWsu4DDONVWbA9Q8WhRjU1btDTL9s4lAqNFK7pFeH/oVu7V2XSvXqhAqpWuRB3qRGlKWJB3nkhfCcA88ikQa/45o7+eo9aMRGgPTD4PsewLeQ+C2WdSzyB/R6sehhTYswmOHVIq81bI1fUxK/RsQnEyAcIIuCi5pOrCWAbKT17AjWHzMSA1C7//B6+DPz7hF5J28b8ICpnkIDIe395T7iR2rhsYn3NIEn/L5UtKlO8CkmDhtwniO8QKd2GGEjehCJcdoiywLBExGpwrKX4i9M3UQghQSzNKHfMu+b4GmGp+VPn/dnkyRJX6sopiGtJeO31TIG2+Bph6cDnk5Lm7qId/7/p003+YrbtLykTad9LD/BUijUGwwR6he0Sub910YPRiMGiNUkuQV0vZJ50G1ijmDazkqWZdZRc9IG0JhY9DKkIEj0dEwibYE0yAuH4a3k046EUkRpYElPcuLDED/Lko6E8H4Ye5ECvCdFfUJujBD1RflfiP9cHCMCK38E0i+yyKAkF6dBkgzkieBKEDkz2VBs5S8qWY52TmHZyMzTTZqXQqH6FG7PBlgQUtFwHnGrpzCthNGPZEQfyfYBiS/gdR/Eo9wAnGi0H4moBeuHp7CsXOgPE8vpZDYVNtZaxuC6fN90j14EPWONW2/pH+v3DfDsFL1jQAdwqcT5S9Z0G3ENSA9sh87BZCBxDhgZSrY1mVmPfTEMq43AzO5Mf6f4iRLXTijaRKq1TJTbGMUiMSNUoA9qEQjbTviCMLbPkv+8EpxhCms8jvOdg7Gdg6ntyUPnZ2OwWgYjETFCmKzDjIvoP5nK8vfrU1nu/reprAMw8UXjMjlisCKhGAak4xSViDSJd/P4vqISivJtgYdWtvyApTllTiopPo1l/Mun8Ziz9msBnkTkbBKH8y10ayu2H57t74EHe2BaMa1ZW0JrfgR4fhmeF+F5Hp5n4fkePH+6zMi60HrSwAlxMYGEAFpnTlokCVB3brpP2i1oOM5tlJcGYG6a67x+aNBARV0snI2FSCPWl+3vR/0hDGZL/kaxrl9gWU93wLNry/K1OwL6Huziguawz9CRsxhFveNOXrRB9jMgIku6yHgSEoahEWl9NJlFJZyeTRuFpCkjDgDqyGQaoUiDviUJgOHqPxrQNxgZgpMroLGV1lFRrAv2wNR5HjJiMZPlwL7LkHovnsR+bdB3wltP9utAB3QSIhOhGP/oJ75EKAYjUcSGwZwutCtzyAB8haCCRL1xGHoLonSkcjjBcHgUoGrQdyBHCkkP1ZnNxCJTBrBCSVbn9hmDoYNRhAFAsbaoQd+V1EdSSWCvM5SZWphJJbOo+IyRjjWZqINGYrNH9EEAEhuVSo0KNSWiL4wzNBGFwWFU63sNfRAAgsoBM2FsPpYLqwXx/sSRY2gNSIMoH9Tp8dAwLWSo8YyDKK6nkziykglDB6ZcF7Uk4b9Uw9oZMH9h0TrrehCYiqYeZNcs1nPEhH5pl4XO7Bb84l549tE4H8kiZwusJY4dRAlKNj00OUI4qiwBntRGBBap07N4bZssP/QhyBthWkbGfbCUs3q2j/RclGYwGw8liuMjs7keoZzYlUzSGM/PoMHQyIiRgFGAyEeNM0ydAdMIsOf8hhOQH+e3iROXzLYLM7xIhAU52BhKD65nvf+7rkJ6DepYbilztSiT+RdiPJqBEsLMjQC5QN23OXZ0oExtZygZ+KY5PiloKfvcEvh7S8I9Inw214ELLevARfDsf4/rwJfmFK8Du0rWAcqSMg7A9M6YyhUcH8hRSMXyWBwExSjaU4qEMin4+MOPS563XO9oOTrr0zBtkKQtpKxTVT7pYqFt9JWEbe8gWZppu4RWeI1JFUMwirgWIQ5K0vVzfVSmmadDSIS7hUxvspaPz2XO01z8UsxQjSKTDaImEEugjfmVgClsQPcT0W6C4fgy5G+35E9HBxIh6GtDGMtmzWPO3IwfhOkkoqTOeWzJETDB5CCoSFFyiYVCXVrIL/i90e0Infi206ySp+m4eVuss0sOUyVPzGNJ4ZvzmJO7xCLR9kh/BmqM+shGoY6EoXCmfv45wITakQYxcyfRMqZHYQ2N51WTOyl4ZsXke9K+rhKok07PZ9y9PZ9xV2pnnraApb2zj0NgblKjgL0dUBAM9pEksR3EtmRjsasXsJRUB++LxDyxkVRFqckIlkZuBhObmSH+SwvYEmnmO1fkY4wSzRZN7BE0qBBkWpRI9qSz4cEeE79Cc5ZN5JkoM+dvF/B8s+uMoxnivUhnCaNe5zmBlG1QZ4sNUrqM+C0oIVeLXKbOffB+naUAUU3++0kqN/j4E0D9PjrlTKOulDL8WH9vlOG/9GLKADJtDERe5PjE/AfeuprttJNRj33Vk1OPw9WMqSJZGsK3VrPdsTuUCQ+Krw9Us41xIkoTeveUhsXMIjLzTsSnIKoSPPA+m+twn2UdDqOO9T2uw2tritfhkIUq4mjrF9+sa7MVfwPwDCJFeA/8Bpqu8irKRphO0Uy6MRQOZ+O8gta9j+WqGwQMZ1MWZKUQ13OrqCchZLh3xWdsm1Q4TGYzyBcLGVEs02YdHxW+NmeanyX1T8y9WOBWZV71reGFlrAms17XDFfLLKea4aUl8RieYQk3lMRjuNYSrpeZqzHDLSXlB2UeY2Z4rcz6eGt4iiW8QWYOxgzvk9nfyAz3l8BzWGZZxwwfL6n/gzLbuMzwjTLrlzeB2JROR0FYDDDHTwp4EDYNIG6A+E6dJRxTaQgiJYrkg0Dz67gzEkndXBK5n9OvneMjntas686Stt9fAutDJW19XmZblxl+uST8o5L8p0riXyuJ/9eS+H8vif91SfxvSuJPl8SPlcTblOJ4lG+t8eUl8ZUi/uzQjFAkNALvdKORyMZRJ0czuncxy0N+wQmfTTo8ZKHDw0LOfi90+HuLi+lwXs0iFmcDw5A7mwDmPzwYQs0GUi7UFR+u9ZGtZiLrHSocDD0ED4xREYG07oFatsM9WsvrrdXQZ8b9vHZiO5+2hPmEqUsmt/MtXMJlmGniJWvIviWso+9m6gj8XD+waADHEtZx/uk0Pm2kIkb9UDqZqCeG0t/Q2tAk5LJUYzwZwe4LvvpPwB79nfxuyOthAAnZhJfMYfRnAC1iNMJwSIdDI7wWTVvqo6X+HOFaaYZbyDQXPPkiQP+Rqnd2ioSaBo3DenDnmk2bgGKFMAmgWxhKzFI/LpyS/kwtEziXpDehvkuEYdb1DoufmfYKYdw1w8eEQfITy3gAnbdz21bkEvUQzId4PKSTzxtpT4hME5uKRBvmXSiVYl1cPDTSkM+I6slDg0BHyMqKPrLRGLk7muhKW8pkbSUZN6DGGOr30lmYogMw/GExGIwCB4oqWtJ3YrVUDapyhUYT1b2kf45gs8kZtWFbH/oVEqMs9LEhYUFqMPngbCJKSiT6jwSZfBQaXMzfQP76gE03gzyi9DSKCImw0bDOnOKkpyyMBzKDgawE9RK83MpC6iRZ4ADyKNITSNWbSWUNoBm9/aFYGn8k6SuKWb1nqqXPWsbiusW9IuPiKxZb8iFiDxXwqteuXeP3/zT34bXr169f8scWj78uKS4dVbtFxXdy8d3vXDyWFsDStq3H3gYqbNomi1E3QbTo0QmiEnqSRsCE2WIwkBpIak/GSqcwDjBR7IiFcT+AYiE67Vi+ZSxCFU0M4fQMXdffj+YGEOCea2DD4msN7Lj57w1MvNeZA9Y4nB/HxB6F9Pb6vigqpOIhdCxJNUjORh85DZh1IdOEBH9FIwtppWVPzj/zWEZlP7FaxHkRI/Zn4f8/1siMySOCMa+ued/CcxYtrl2ydFldvb+puaW1rb2js2t1sHvN2nXrN2zcdN7mLedv3X7Bjp27du/Zd+FF+3tDfeGIMRgdGo7FRw6kitNtEwn3QkpK1z/AKRNJSJvOZA8eOjx6WaGaZXUNje+thIbGwu8/paT3Vnt9z3tsf+PYO/1JsqJqNrvD6XJ7vGNjZeUVvsopU6dNn8HRM2fNnlM1d978BTr15JjoyrF6QAzGc1VjY1BZYPmKsbGVq84d+wv9I8gZb9CUlRPhp4AdwAvHW7FjjnMeNH+BKJBks/X5bpys9XOqOH6y1re2/UW2v9Bc8am01Za5QH+lrR6HwL+kGfBHj/9z/4rG/ypsz1/b/D/S7pOOtMHTCk8LPM3wNP2ZHEFQMdHB6/+HhJNoFp06zuT60d6aN72ZeT9OvEPw8TdBOjs57UzSjZnjy0IcNsMPC9dAa/gcS/i3whD4rlWDIt9podK0hudawn8QrorWcLUlPFVmt09r2GUJTysJe0rSe0riy2TeSmiGvSXxFSJcUM0VeMwTXcylmmnzakoRXi7y/jEqlMe7WIWyAkbYab9PegSeI/CsgOc0cIa9KOgBJ1oWYKNNHeSZG2CjmDfAnKz5JpmmtxDuDLALmRl+r1I2WseaWjqKpWvjMOpggBUfCYGkKO0LMC5+7mSV6mUWSeByeI4Iydr8dtTier1N7CEpdr3We7cCDoTrtakZS2ciYtcTVDosVGNVy9k1cr1Q+ZnhDQq78OcsqjOU5o9b4LgKt/IJQzmG309b4IrTXAPPteKbaYbA7T0fhOc6VMWNU9ulQod6DhphAA7E4RBgadQ6R15Yzqqqrwg47YowzAu7E013skq8o05vfNX98QzipGUFq9l2KzzvloxPCQCKvlyipweT2VgE5c0VK5HK6LUgivaGMr16GroZ9QoR4zB9xG12UDbqiEZXsJvMxSt4nF2ygtvzcQerWtenknH0wiTzJumyJel6Cw5vMI2NUvH3G0XYqr6zxt9UEr4ZnlsEJRUy3CGzObStEx2EUOlCAdReiFToQZSOA0aQpPVHeR8vOZWWporh14lTmXr4SBRmUqmULGRXVmaY7n3kLcb+ZEKWbpD+eyXP7T9iTki3WXCEK8Halayh4s5KZjNIQPoQoHSA9VPQsdCFpB1iHzRMSJ26cZWP8Dy4it2rb7Pg93akMUC0zPLvXMWw3maZV3eghgzjsL/gb5zaHMZlY182GouI7Q6ivkZB982wX2zz1i9317nrdP1y/Qr9ilp3bd0S934rTHfheJuwkgRZ8ZrOZRcvQ7hE+g/7/f4mf7O/xd/qb/O3+zv8nf6uJn9TU1NzU0tTa1NbU3tTR1NnU1ezv7mpubm5pbm1ua25vbmjubO5q8Xf0tTS3NLS0trS1tLe0tHS2dLV6m9tam1ubWltbW1rbW/taO1s7WrztzW1Nbe1tLW2tbW1t3W0dbZ1tfvbm9qb21vaW9vb2tvbO9o727s6/B1NHc0dLR2tHW0d7R0dHZ0dXZ3+zqbO5s6WztbOts72zo7Ozs6uLgCxC6rvgqK7IFsXfAqlgSoTNegPRWPor7Y0nE2l9FV6U5ckme1+XWaaYsXZJ9FYD8/dFppVhDqhN42t5jKudjL9NMM3OHndG5eX9nah60R4MAUF3L+a+3K/cHJIhRIDhtD38ZAzByfH4PSkIvCT2Gzy8moeh/+6mreEc0qD5haWMDfITg1mPOfnuIIXBo10yEQBaUWQnTd2BFkzhC6YSF8zhp7N9Is9+nndJU9TLlGSRoK8XpuznTPk0wLgwlpnyfWpIDtIfT3IbZH/l/+k4D3vf0LytChn/FNL/jT8k+j+JM8b0/c3NDRcQngSPQnUo4jS4C/gRV7vZneIN7sZ559YxWtEH7AeCVxksCtr8ccSZnWxA3Hdg7z6GjbJNKxhh5TmNdzXZhkFnTVqJ7leGI/LdaTNqLVLkxd7LXfIEoLIhCeyhrdcfHANO7N8aA3zSmbZ48d2Jm/DeXwNz4O3xPbAcWmFzrxxBIh6Btk95vR/AfnOEVq+uZbwHMEDS7Jqs9ntisPudLgq3XM9s71zynzlZRWaT50yZaprhjxTmyXPVuc4quS5yoIZurpMrfc0yH61SWmW71M+rXxG+6zz/ym/t/1BeVsdc33u8Oh1N9zj37vvuutvnvt/yis2b/n96YbGcy++pOenJ2648ZYPffqhr37tyae+892fvPb6mKRVTlnS1NoRWL5y03mXnLgRIr/01a899d1nnn3tdUkrK6fYwPJ16zedd2nEOHHLHXd+55lnyyqXwKdNe/dffGlPxLjhlk9Dlie/88prr79ZVrluU8TInfjiI19/7MWX3vyPq95/3afu/fpjT377mWd/+KONtz36j0898+ymrdv2XnhpzwduvOmhLz/82BNPffulyhkz91/8m9++PZaLH/jJK+ULEsm583quOPr5B6/82iMzZs5fsH7D1m37Lrr40qNX/t2TL7z44zf/461U+qZM9qOLGhrve/Dhx7797Euv3L76Y7f5b1rw/AvPjG3ddtF+h7PCt7jxl79KJDtWntu97uZbdg5kn/7Oc99/+Z/feHtM0ntqjr+iHV/rrNLslcceKM991rbAdaxKne2UtUatVXOossPuqHRvr5ji2O1Qtblul+pUHSrODa9mUz12uXy6baujyrHXodhnlG3X1qj1qqxV2iu8AW3eOT16XBs6J/e07fgX1Dn2439QL3TMcM1yTfNO8w7Z3fY59gsdy2zr3XWaV5PVJk+dNsfuUXMPQFRj0/lq7lPOFWqFusLR6VxmOz5WOcvZWFmvVldUV+Su145/bLZn+rW32hptyx1K+SxX7us1GW/uB3O8ttyYLfeK9z/vVDtcxy6elvuKM/cPNves5arb3ulc7/TaM5756kXaha7cVbPmume4tmi5D9o/+ynvTK3pbu3YDxc5vDZb7l7fsbccsr7UDrE3aLmvq1VqRZlkl2VonGJzOBSn06W4bR6lXPPJlcoU29TKafJ0ZaYyu2yubZ5zoTykDSsPqo8ozyrfV17wvuj6gfKS8kP5Vdsp5Q3t58ov9Te13ykwUGXv4uWrtm676a67Pnn5dR/+6D1f/OrVD9kdrvaVq/b8+rnva9NmtXfs2XvlZz7/4KNtr0655gM33pUfiTgQt26LGBd/+eGquQ6n2zNtZntX4P5Pv/zPro6bb7nf4V6+qj9604eSPY/98lcX9f3X6bHb72hoXFy7+86Td//Np+67/3NffeRbdo93+rzAuesuuPe+7/3jScfsOTXnrDr3jV/8auzJpzT9fecsqm3pDGw8b8v2nbv34KDrDRv9w+nDV1z5wU995sEvPP7c5x9MJD98ac3lNlWrV/tVubEhd3ye2lQxV1vomm9bZlurlS/Nfca+UFuo1TpbPVvXHOtwzXA7Zy1f16WGnS7/DFu1WmWTV3dqm22NmtvhcqzWF2teV7sasM1xaF7H9k0dLWUtjgan+9iiHVtrnUtnzFk0d9pM11aoYG3ZbIfbvtG52JX1nBtcal9uc9svsMs2n2rLXdc3f6PTnbv30pp1Hre9bGrA7m6v02bm/n5FZKd3o8u9fl3VRufOsk3HHOvd89QNmzrUcqfb3uVwH2ufnXtYrmguu+qO/qwn960PbgmXnWi86fvHN9z998e7HEu1i+2L3Ovdtbapx7+w39isdTkqV+MY+NjvnCd+sNR1zxvHWurVSs157PoPaMO2MtXl8H2od4MrsyL3G3faOTJ9fe72ad69rtm5a45tUN/fXTH9xPYFuVPLci/Wq3M05djqBZUBm3zi1dxvl2zR3JpyVeXaLStz31hhl7XdtqpW5Vh5nRbx7nHnPt85r6xOc8G4t+duv+plaHSZmvFe6IBZVOHVOqExtc6arcd2eaerNtXhmqd6bHa32+4Eqpr7h3PcJ+yTEmzx7sENeEyz79zkI1ejzWKbqhneK47XMMO4zWYVOnIm4wby5iTr5IUeduHMjvRkkuwNCNxNMU92D9J/FeRQTZdusfVKl0w9KU2ZqS/w6r0LflV3ctlSv16XvPfVOuX+3vr5v+9tkN7W2+8a623/g3yqXXZXdywsO9Xx2fJQV+Osu7v8c09t+PX86i1vDp3ati1Zvf3OR+7eLj0busD4/t0XSD+s3iG9emqn/1Ro9+d/evee535+ao8uJfa+KY/tlUYkh1QPDIIC/+SNHv90n2wAYVMUWXufPL9qvyfgcsmzNNkFdMC2TF3hXDpL1jsgg+YEAuZwK/PkAGbXnJDErcyRFaULCIaGzIQ8X1FlD4ZtkECepswAchLAuiC1Q3Ur8+XlkNcLOWuheCgVOk/WHIqHSkWQoFIFw3OVLqVQyzx5o6zJULjslC+QFYfX2YdnC9vPU6qI2+kol6FGm0de6JL7NdkOQCmzFU31aWXw0y5XyIB3dZ4yH/6tVmSHU1Y8LhnIuJxVauSDqqa4ZLv6I0ACQOvAEhWn3a3I/gVNmh/CNrnW5VV0aKSsdsoEiBpwKsptqlwmO7BCVXlqtSR/s1pSb5B7dckeVSRNduvKdkVCgirPVmzyx5Q5U8rkRc7ZngbVLyPKFstr7MiHeaFdjXILlKooNmj3UsUp/xLRJgOj4vOhCCb/VP6ITVKhlVqtqsl/C+VLysc9TdrlcnvFEmilW22CEh3ySnWhTXaukr1KqwtmmNyjIiLt8klZdU4nrMryDLncodq+6cSGzESM2rGTsAP+DeCyw7tK2e3EL0MyZZYNFTrUJrlk5S3oDxgN8s1Qmybr7lo79ZJdURsA2ZIDkCHvmAGAQCmX2VUsFTC4EauSoR2wlknyudoF+LtBmQmMsqrZnE7FMV+7VZU6tGanXC7PsMkVUFIllWKDESuv1CRH3CH15t6UpNwMEjxlyd8ry/4Diss2RY7IcxBXnnmA50aZ2Dvi/eaJt/n8E8i1X4bnZniG4AE5938AeSXThfgoBAAScgpOCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAgoQkTQf5WZL+heC1eBHeWiQaMkWsEyzZewxU3VWhNmhEgQKAggBEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAeOt9Dh5lI5S9PbpOn+D3/vrzcAL89SIDm3hVkOtEPU90w7/usMPxGFK5qs9oiVWu1teEcuG+70t3oc/yFW8Skw== \ No newline at end of file diff --git a/sidecar/src/services/tx.ts b/sidecar/src/services/tx.ts index f0d31d47..d56c4dda 100644 --- a/sidecar/src/services/tx.ts +++ b/sidecar/src/services/tx.ts @@ -22,6 +22,8 @@ export class TxService implements ApiService { } public async broadcastTx(txBytes: string): Promise { + console.debug(`txBytes: ${txBytes}`); + const rawTx = `0x${Buffer.from(txBytes, 'base64').toString('hex')}`; let txHash = (await this.chainApi.rpc['cosmos']['broadcastTx'](rawTx)).toString(); @@ -33,7 +35,7 @@ export class TxService implements ApiService { while (true) { const txs = this.searchTx(txHash); - console.debug(`txs: ${JSON.stringify(txs)}`); + // console.debug(`txs: ${JSON.stringify(txs)}`); if (txs.length > 0) { const tx = txs.at(0); From 798b461bd19f9e6ff41c70747e89268f7910d104 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 15:56:26 +0900 Subject: [PATCH 44/55] test: Add MsgInstantiateContract2 test --- frame/cosmos/src/tests.rs | 43 +++++++++++++++++++++- frame/cosmos/txs/msg_instantiate_contract2 | 1 + frame/cosmos/x/wasm/Cargo.toml | 2 + frame/cosmos/x/wasm/src/msgs.rs | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 frame/cosmos/txs/msg_instantiate_contract2 diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index b016343d..c81288ba 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -115,9 +115,50 @@ fn pallet_cosmos_msg_store_code_test() { assert_eq!(value, "1"); } if key == "code_checksum" { - assert_eq!(value, "db366741dcbad5f2e4933cda49133cd2a11fdb32b08c67cb1d22379bd392448e"); + assert_eq!( + value, + "db366741dcbad5f2e4933cda49133cd2a11fdb32b08c67cb1d22379bd392448e" + ); } } } }); } + +#[test] +fn pallet_cosmos_msg_instantiate_contract2_test() { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + + let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + + let tx_raw = fs::read_to_string("./txs/msg_instantiate_contract2").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + }); +} diff --git a/frame/cosmos/txs/msg_instantiate_contract2 b/frame/cosmos/txs/msg_instantiate_contract2 new file mode 100644 index 00000000..84dd4f69 --- /dev/null +++ b/frame/cosmos/txs/msg_instantiate_contract2 @@ -0,0 +1 @@ +CrsCCrgCCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhKKAgotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqmgF7Im5hbWUiOiJUb2tlbiIsInN5bWJvbCI6IlRLTiIsImRlY2ltYWxzIjoxOCwiaW5pdGlhbF9iYWxhbmNlcyI6W3siYWRkcmVzcyI6ImNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdyIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAifV19OgRzYWx0EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgBEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAhCVijWT15UcE82/sH85rzj/S63RFgulTLRImqyHrGeYLYaKyO0NpQjlqTb++EcqvNewGEIdVIeK/uXwisNaBMw== \ No newline at end of file diff --git a/frame/cosmos/x/wasm/Cargo.toml b/frame/cosmos/x/wasm/Cargo.toml index dc92ca2b..c78c6f99 100644 --- a/frame/cosmos/x/wasm/Cargo.toml +++ b/frame/cosmos/x/wasm/Cargo.toml @@ -15,6 +15,7 @@ cosmos-sdk-proto = { workspace = true, default-features = false, features = [ ] } core2 = { workspace = true, default-features = false, features = ["alloc"] } hex = { workspace = true, default-features = false } +log = { workspace = true, default-features = false } libflate = { workspace = true, default-features = false } frame-support = { workspace = true, default-features = false } @@ -33,6 +34,7 @@ std = [ "cosmos-sdk-proto/std", "core2/std", "hex/std", + "log/std", "libflate/std", "frame-support/std", "sp-runtime/std", diff --git a/frame/cosmos/x/wasm/src/msgs.rs b/frame/cosmos/x/wasm/src/msgs.rs index 693d591a..82a361be 100644 --- a/frame/cosmos/x/wasm/src/msgs.rs +++ b/frame/cosmos/x/wasm/src/msgs.rs @@ -359,6 +359,7 @@ where } fn convert_funds(coins: &[Coin]) -> Result, CosmosError> { + // TODO: Handle native asset let mut funds = FundsOf::::default(); for coin in coins.iter() { let asset_id = From 4286a9c651d199cce9c3e3e48f7d2bd52347e807 Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 16:36:12 +0900 Subject: [PATCH 45/55] test: Add a condition to pallet_cosmos_msg_instantiate_contract2_test --- frame/cosmos/src/tests.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index c81288ba..37a1aa78 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -89,7 +89,8 @@ fn pallet_cosmos_msg_store_code_test() { assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); - let (_gas_wanted, _gas_used, events) = System::read_events_no_consensus() + let (_gas_wanted, _gas_used, events) = System::events() + .into_iter() .find_map(|record| { if let RuntimeEvent::Cosmos(pallet_cosmos::Event::Executed { gas_wanted, @@ -147,6 +148,9 @@ fn pallet_cosmos_msg_instantiate_contract2_test() { assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + System::set_block_number(2); + System::reset_events(); + let tx_raw = fs::read_to_string("./txs/msg_instantiate_contract2").unwrap(); let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); From d5ce277d4984521f3944832c2a348556db259fad Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 16:56:59 +0900 Subject: [PATCH 46/55] test: Fix test data --- frame/cosmos/txs/msg_instantiate_contract2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/cosmos/txs/msg_instantiate_contract2 b/frame/cosmos/txs/msg_instantiate_contract2 index 84dd4f69..f1128f87 100644 --- a/frame/cosmos/txs/msg_instantiate_contract2 +++ b/frame/cosmos/txs/msg_instantiate_contract2 @@ -1 +1 @@ -CrsCCrgCCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhKKAgotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqmgF7Im5hbWUiOiJUb2tlbiIsInN5bWJvbCI6IlRLTiIsImRlY2ltYWxzIjoxOCwiaW5pdGlhbF9iYWxhbmNlcyI6W3siYWRkcmVzcyI6ImNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdyIsImFtb3VudCI6IjEwMDAwMDAwMDAwMDAwMDAifV19OgRzYWx0EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgBEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAhCVijWT15UcE82/sH85rzj/S63RFgulTLRImqyHrGeYLYaKyO0NpQjlqTb++EcqvNewGEIdVIeK/uXwisNaBMw== \ No newline at end of file +CoACCv0BCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLPAQotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqYHsibmFtZSI6IlRva2VuIiwic3ltYm9sIjoiVEtOIiwiZGVjaW1hbHMiOjE4LCJpbml0aWFsX2JhbGFuY2VzIjpbXSwibWludCI6bnVsbCwibWFya2V0aW5nIjpudWxsfToEc2FsdBJ0ClAKRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiECChCRNB/lZkv6F4LV4Ed5aJBoyRawTLNl7DFTdVaE2aESBAoCCAEYARIgChgKBGFjZHQSEDEwMDAwMDAwMDAwMDAwMDAQgJTr3AMaQPsqNwZKEBWm9DyctlOZNNkg804Mg78GbG4K4uhHGTagce7z/2oxrx+SR3cSjc1HgEYZtVZwtfIom+BSdvevvKE= \ No newline at end of file From 7e48427f789013765b16665c0f60b3291673939a Mon Sep 17 00:00:00 2001 From: code0xff Date: Fri, 6 Sep 2024 19:30:35 +0900 Subject: [PATCH 47/55] test: Add MsgExecuteContract test --- frame/cosmos/src/tests.rs | 58 ++++++++++++++++++++++ frame/cosmos/txs/msg_execute_contract | 1 + frame/cosmos/txs/msg_instantiate_contract2 | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 frame/cosmos/txs/msg_execute_contract diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index 37a1aa78..a8b45dbb 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -166,3 +166,61 @@ fn pallet_cosmos_msg_instantiate_contract2_test() { assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); }); } + +#[test] +fn pallet_cosmos_msg_execute_contract_test() { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + + let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); + + let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + + System::set_block_number(2); + System::reset_events(); + + let tx_raw = fs::read_to_string("./txs/msg_instantiate_contract2").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + + System::set_block_number(3); + System::reset_events(); + + let tx_raw = fs::read_to_string("./txs/msg_execute_contract").unwrap(); + let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + + let call = pallet_cosmos::Call::::transact { tx_bytes }; + let source = call.check_self_contained().unwrap().unwrap(); + let extrinsic = CheckedExtrinsic:: { + signed: fp_self_contained::CheckedSignature::SelfContained(source), + function: RuntimeCall::Cosmos(call.clone()), + }; + let dispatch_info = extrinsic.get_dispatch_info(); + + assert_ok!(call.pre_dispatch_self_contained(&source, &dispatch_info, 0).unwrap()); + assert_ok!(extrinsic.function.apply_self_contained(alice).unwrap()); + }); +} diff --git a/frame/cosmos/txs/msg_execute_contract b/frame/cosmos/txs/msg_execute_contract new file mode 100644 index 00000000..f31b2c54 --- /dev/null +++ b/frame/cosmos/txs/msg_execute_contract @@ -0,0 +1 @@ +CvkBCvYBCiQvY29zbXdhc20ud2FzbS52MS5Nc2dFeGVjdXRlQ29udHJhY3QSzQEKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxJBY29zbW9zMXdyNzlrMzk5dnZ5dmc0OWo4cnc5dnVwbmx2ZHptbDZqYXR0NnpsdXdlZWR6ZWRrMnJqMnMzcGFqeWoaWXsibWludCI6eyJyZWNpcGllbnQiOiJjb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXciLCJhbW91bnQiOiIxMDAwMDAwIn19EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgCEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAIVQioGic084W1qb1thdkHSMno8mdzniMO7G1nNOxoMEjY3ralELjzx1H42g0ftQ5TmQtlICSuqB91ZaG92hOtQ== \ No newline at end of file diff --git a/frame/cosmos/txs/msg_instantiate_contract2 b/frame/cosmos/txs/msg_instantiate_contract2 index f1128f87..1faa8028 100644 --- a/frame/cosmos/txs/msg_instantiate_contract2 +++ b/frame/cosmos/txs/msg_instantiate_contract2 @@ -1 +1 @@ -CoACCv0BCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLPAQotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqYHsibmFtZSI6IlRva2VuIiwic3ltYm9sIjoiVEtOIiwiZGVjaW1hbHMiOjE4LCJpbml0aWFsX2JhbGFuY2VzIjpbXSwibWludCI6bnVsbCwibWFya2V0aW5nIjpudWxsfToEc2FsdBJ0ClAKRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiECChCRNB/lZkv6F4LV4Ed5aJBoyRawTLNl7DFTdVaE2aESBAoCCAEYARIgChgKBGFjZHQSEDEwMDAwMDAwMDAwMDAwMDAQgJTr3AMaQPsqNwZKEBWm9DyctlOZNNkg804Mg78GbG4K4uhHGTagce7z/2oxrx+SR3cSjc1HgEYZtVZwtfIom+BSdvevvKE= \ No newline at end of file +Cv8BCvwBCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLOAQotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqX3sibmFtZSI6IlRva2VuIiwic3ltYm9sIjoiVEtOIiwiZGVjaW1hbHMiOjYsImluaXRpYWxfYmFsYW5jZXMiOltdLCJtaW50IjpudWxsLCJtYXJrZXRpbmciOm51bGx9OgRzYWx0EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgBEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAJEZJO0l1XHZF+OJy7rzHL1aIXGZGn859URwCkvaWl5Mzhs5/zmAdS1sKLu61jMC1eh/iA/7+RxhMTuydh9x2Ow== \ No newline at end of file From c8bf2c9a09060a140c335a49f31dfa42509736c1 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sat, 7 Sep 2024 18:05:49 +0900 Subject: [PATCH 48/55] test: Add cw20_base.wasm and cw20-base.json --- frame/cosmos/contracts/cw20-base.json | 1376 +++++++++++++++++++++++++ frame/cosmos/contracts/cw20_base.wasm | Bin 0 -> 377867 bytes 2 files changed, 1376 insertions(+) create mode 100644 frame/cosmos/contracts/cw20-base.json create mode 100644 frame/cosmos/contracts/cw20_base.wasm diff --git a/frame/cosmos/contracts/cw20-base.json b/frame/cosmos/contracts/cw20-base.json new file mode 100644 index 00000000..d8552420 --- /dev/null +++ b/frame/cosmos/contracts/cw20-base.json @@ -0,0 +1,1376 @@ +{ + "contract_name": "cw20-base", + "contract_version": "2.0.0", + "idl_version": "1.0.0", + "instantiate": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "decimals", + "initial_balances", + "name", + "symbol" + ], + "properties": { + "decimals": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "initial_balances": { + "type": "array", + "items": { + "$ref": "#/definitions/Cw20Coin" + } + }, + "marketing": { + "anyOf": [ + { + "$ref": "#/definitions/InstantiateMarketingInfo" + }, + { + "type": "null" + } + ] + }, + "mint": { + "anyOf": [ + { + "$ref": "#/definitions/MinterResponse" + }, + { + "type": "null" + } + ] + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Cw20Coin": { + "type": "object", + "required": [ + "address", + "amount" + ], + "properties": { + "address": { + "type": "string" + }, + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + }, + "EmbeddedLogo": { + "description": "This is used to store the logo on the blockchain in an accepted format. Enforce maximum size of 5KB on all variants.", + "oneOf": [ + { + "description": "Store the Logo as an SVG file. The content must conform to the spec at https://en.wikipedia.org/wiki/Scalable_Vector_Graphics (The contract should do some light-weight sanity-check validation)", + "type": "object", + "required": [ + "svg" + ], + "properties": { + "svg": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + }, + { + "description": "Store the Logo as a PNG file. This will likely only support up to 64x64 or so within the 5KB limit.", + "type": "object", + "required": [ + "png" + ], + "properties": { + "png": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "InstantiateMarketingInfo": { + "type": "object", + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "logo": { + "anyOf": [ + { + "$ref": "#/definitions/Logo" + }, + { + "type": "null" + } + ] + }, + "marketing": { + "type": [ + "string", + "null" + ] + }, + "project": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "Logo": { + "description": "This is used for uploading logo data, or setting it in InstantiateData", + "oneOf": [ + { + "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Logo content stored on the blockchain. Enforce maximum size of 5KB on all variants", + "type": "object", + "required": [ + "embedded" + ], + "properties": { + "embedded": { + "$ref": "#/definitions/EmbeddedLogo" + } + }, + "additionalProperties": false + } + ] + }, + "MinterResponse": { + "type": "object", + "required": [ + "minter" + ], + "properties": { + "cap": { + "description": "cap is a hard cap on total supply that can be achieved by minting. Note that this refers to total_supply. If None, there is unlimited cap.", + "anyOf": [ + { + "$ref": "#/definitions/Uint128" + }, + { + "type": "null" + } + ] + }, + "minter": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "execute": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "description": "Transfer is a base message to move tokens to another account without triggering actions", + "type": "object", + "required": [ + "transfer" + ], + "properties": { + "transfer": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Burn is a base message to destroy tokens forever", + "type": "object", + "required": [ + "burn" + ], + "properties": { + "burn": { + "type": "object", + "required": [ + "amount" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Send is a base message to transfer tokens to a contract and trigger an action on the receiving contract.", + "type": "object", + "required": [ + "send" + ], + "properties": { + "send": { + "type": "object", + "required": [ + "amount", + "contract", + "msg" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "contract": { + "type": "string" + }, + "msg": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"approval\" extension. Allows spender to access an additional amount tokens from the owner's (env.sender) account. If expires is Some(), overwrites current allowance expiration with this one.", + "type": "object", + "required": [ + "increase_allowance" + ], + "properties": { + "increase_allowance": { + "type": "object", + "required": [ + "amount", + "spender" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "expires": { + "anyOf": [ + { + "$ref": "#/definitions/Expiration" + }, + { + "type": "null" + } + ] + }, + "spender": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"approval\" extension. Lowers the spender's access of tokens from the owner's (env.sender) account by amount. If expires is Some(), overwrites current allowance expiration with this one.", + "type": "object", + "required": [ + "decrease_allowance" + ], + "properties": { + "decrease_allowance": { + "type": "object", + "required": [ + "amount", + "spender" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "expires": { + "anyOf": [ + { + "$ref": "#/definitions/Expiration" + }, + { + "type": "null" + } + ] + }, + "spender": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"approval\" extension. Transfers amount tokens from owner -> recipient if `env.sender` has sufficient pre-approval.", + "type": "object", + "required": [ + "transfer_from" + ], + "properties": { + "transfer_from": { + "type": "object", + "required": [ + "amount", + "owner", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "owner": { + "type": "string" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"approval\" extension. Sends amount tokens from owner -> contract if `env.sender` has sufficient pre-approval.", + "type": "object", + "required": [ + "send_from" + ], + "properties": { + "send_from": { + "type": "object", + "required": [ + "amount", + "contract", + "msg", + "owner" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "contract": { + "type": "string" + }, + "msg": { + "$ref": "#/definitions/Binary" + }, + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"approval\" extension. Destroys tokens forever", + "type": "object", + "required": [ + "burn_from" + ], + "properties": { + "burn_from": { + "type": "object", + "required": [ + "amount", + "owner" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "owner": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with the \"mintable\" extension. If authorized, creates amount new tokens and adds to the recipient balance.", + "type": "object", + "required": [ + "mint" + ], + "properties": { + "mint": { + "type": "object", + "required": [ + "amount", + "recipient" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "recipient": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with the \"mintable\" extension. The current minter may set a new minter. Setting the minter to None will remove the token's minter forever.", + "type": "object", + "required": [ + "update_minter" + ], + "properties": { + "update_minter": { + "type": "object", + "properties": { + "new_minter": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with the \"marketing\" extension. If authorized, updates marketing metadata. Setting None/null for any of these will leave it unchanged. Setting Some(\"\") will clear this field on the contract storage", + "type": "object", + "required": [ + "update_marketing" + ], + "properties": { + "update_marketing": { + "type": "object", + "properties": { + "description": { + "description": "A longer description of the token and it's utility. Designed for tooltips or such", + "type": [ + "string", + "null" + ] + }, + "marketing": { + "description": "The address (if any) who can update this data structure", + "type": [ + "string", + "null" + ] + }, + "project": { + "description": "A URL pointing to the project behind this token.", + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "If set as the \"marketing\" role on the contract, upload a new URL, SVG, or PNG for the token", + "type": "object", + "required": [ + "upload_logo" + ], + "properties": { + "upload_logo": { + "$ref": "#/definitions/Logo" + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "EmbeddedLogo": { + "description": "This is used to store the logo on the blockchain in an accepted format. Enforce maximum size of 5KB on all variants.", + "oneOf": [ + { + "description": "Store the Logo as an SVG file. The content must conform to the spec at https://en.wikipedia.org/wiki/Scalable_Vector_Graphics (The contract should do some light-weight sanity-check validation)", + "type": "object", + "required": [ + "svg" + ], + "properties": { + "svg": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + }, + { + "description": "Store the Logo as a PNG file. This will likely only support up to 64x64 or so within the 5KB limit.", + "type": "object", + "required": [ + "png" + ], + "properties": { + "png": { + "$ref": "#/definitions/Binary" + } + }, + "additionalProperties": false + } + ] + }, + "Expiration": { + "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", + "oneOf": [ + { + "description": "AtHeight will expire when `env.block.height` >= height", + "type": "object", + "required": [ + "at_height" + ], + "properties": { + "at_height": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "description": "AtTime will expire when `env.block.time` >= time", + "type": "object", + "required": [ + "at_time" + ], + "properties": { + "at_time": { + "$ref": "#/definitions/Timestamp" + } + }, + "additionalProperties": false + }, + { + "description": "Never will never expire. Used to express the empty variant", + "type": "object", + "required": [ + "never" + ], + "properties": { + "never": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "Logo": { + "description": "This is used for uploading logo data, or setting it in InstantiateData", + "oneOf": [ + { + "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "Logo content stored on the blockchain. Enforce maximum size of 5KB on all variants", + "type": "object", + "required": [ + "embedded" + ], + "properties": { + "embedded": { + "$ref": "#/definitions/EmbeddedLogo" + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, + "query": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "description": "Returns the current balance of the given address, 0 if unset.", + "type": "object", + "required": [ + "balance" + ], + "properties": { + "balance": { + "type": "object", + "required": [ + "address" + ], + "properties": { + "address": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Returns metadata on the contract - name, decimals, supply, etc.", + "type": "object", + "required": [ + "token_info" + ], + "properties": { + "token_info": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"mintable\" extension. Returns who can mint and the hard cap on maximum tokens after minting.", + "type": "object", + "required": [ + "minter" + ], + "properties": { + "minter": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"allowance\" extension. Returns how much spender can use from owner account, 0 if unset.", + "type": "object", + "required": [ + "allowance" + ], + "properties": { + "allowance": { + "type": "object", + "required": [ + "owner", + "spender" + ], + "properties": { + "owner": { + "type": "string" + }, + "spender": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"enumerable\" extension (and \"allowances\") Returns all allowances this owner has approved. Supports pagination.", + "type": "object", + "required": [ + "all_allowances" + ], + "properties": { + "all_allowances": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"enumerable\" extension (and \"allowances\") Returns all allowances this spender has been granted. Supports pagination.", + "type": "object", + "required": [ + "all_spender_allowances" + ], + "properties": { + "all_spender_allowances": { + "type": "object", + "required": [ + "spender" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "spender": { + "type": "string" + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"enumerable\" extension Returns all accounts that have balances. Supports pagination.", + "type": "object", + "required": [ + "all_accounts" + ], + "properties": { + "all_accounts": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"marketing\" extension Returns more metadata on the contract to display in the client: - description, logo, project url, etc.", + "type": "object", + "required": [ + "marketing_info" + ], + "properties": { + "marketing_info": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Only with \"marketing\" extension Downloads the embedded logo data (if stored on chain). Errors if no logo data is stored for this contract.", + "type": "object", + "required": [ + "download_logo" + ], + "properties": { + "download_logo": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "migrate": null, + "sudo": null, + "responses": { + "all_accounts": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllAccountsResponse", + "type": "object", + "required": [ + "accounts" + ], + "properties": { + "accounts": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "all_allowances": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllAllowancesResponse", + "type": "object", + "required": [ + "allowances" + ], + "properties": { + "allowances": { + "type": "array", + "items": { + "$ref": "#/definitions/AllowanceInfo" + } + } + }, + "definitions": { + "AllowanceInfo": { + "type": "object", + "required": [ + "allowance", + "expires", + "spender" + ], + "properties": { + "allowance": { + "$ref": "#/definitions/Uint128" + }, + "expires": { + "$ref": "#/definitions/Expiration" + }, + "spender": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Expiration": { + "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", + "oneOf": [ + { + "description": "AtHeight will expire when `env.block.height` >= height", + "type": "object", + "required": [ + "at_height" + ], + "properties": { + "at_height": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "description": "AtTime will expire when `env.block.time` >= time", + "type": "object", + "required": [ + "at_time" + ], + "properties": { + "at_time": { + "$ref": "#/definitions/Timestamp" + } + }, + "additionalProperties": false + }, + { + "description": "Never will never expire. Used to express the empty variant", + "type": "object", + "required": [ + "never" + ], + "properties": { + "never": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, + "all_spender_allowances": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllSpenderAllowancesResponse", + "type": "object", + "required": [ + "allowances" + ], + "properties": { + "allowances": { + "type": "array", + "items": { + "$ref": "#/definitions/SpenderAllowanceInfo" + } + } + }, + "definitions": { + "Expiration": { + "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", + "oneOf": [ + { + "description": "AtHeight will expire when `env.block.height` >= height", + "type": "object", + "required": [ + "at_height" + ], + "properties": { + "at_height": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "description": "AtTime will expire when `env.block.time` >= time", + "type": "object", + "required": [ + "at_time" + ], + "properties": { + "at_time": { + "$ref": "#/definitions/Timestamp" + } + }, + "additionalProperties": false + }, + { + "description": "Never will never expire. Used to express the empty variant", + "type": "object", + "required": [ + "never" + ], + "properties": { + "never": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "SpenderAllowanceInfo": { + "type": "object", + "required": [ + "allowance", + "expires", + "owner" + ], + "properties": { + "allowance": { + "$ref": "#/definitions/Uint128" + }, + "expires": { + "$ref": "#/definitions/Expiration" + }, + "owner": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, + "allowance": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllowanceResponse", + "type": "object", + "required": [ + "allowance", + "expires" + ], + "properties": { + "allowance": { + "$ref": "#/definitions/Uint128" + }, + "expires": { + "$ref": "#/definitions/Expiration" + } + }, + "definitions": { + "Expiration": { + "description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)", + "oneOf": [ + { + "description": "AtHeight will expire when `env.block.height` >= height", + "type": "object", + "required": [ + "at_height" + ], + "properties": { + "at_height": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + { + "description": "AtTime will expire when `env.block.time` >= time", + "type": "object", + "required": [ + "at_time" + ], + "properties": { + "at_time": { + "$ref": "#/definitions/Timestamp" + } + }, + "additionalProperties": false + }, + { + "description": "Never will never expire. Used to express the empty variant", + "type": "object", + "required": [ + "never" + ], + "properties": { + "never": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, + "balance": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "BalanceResponse", + "type": "object", + "required": [ + "balance" + ], + "properties": { + "balance": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "download_logo": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "DownloadLogoResponse", + "description": "When we download an embedded logo, we get this response type. We expect a SPA to be able to accept this info and display it.", + "type": "object", + "required": [ + "data", + "mime_type" + ], + "properties": { + "data": { + "$ref": "#/definitions/Binary" + }, + "mime_type": { + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + } + } + }, + "marketing_info": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MarketingInfoResponse", + "type": "object", + "properties": { + "description": { + "description": "A longer description of the token and it's utility. Designed for tooltips or such", + "type": [ + "string", + "null" + ] + }, + "logo": { + "description": "A link to the logo, or a comment there is an on-chain logo stored", + "anyOf": [ + { + "$ref": "#/definitions/LogoInfo" + }, + { + "type": "null" + } + ] + }, + "marketing": { + "description": "The address (if any) who can update this data structure", + "anyOf": [ + { + "$ref": "#/definitions/Addr" + }, + { + "type": "null" + } + ] + }, + "project": { + "description": "A URL pointing to the project behind this token.", + "type": [ + "string", + "null" + ] + } + }, + "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, + "LogoInfo": { + "description": "This is used to display logo info, provide a link or inform there is one that can be downloaded from the blockchain itself", + "oneOf": [ + { + "description": "A reference to an externally hosted logo. Must be a valid HTTP or HTTPS URL.", + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "description": "There is an embedded logo on the chain, make another call to download it.", + "type": "string", + "enum": [ + "embedded" + ] + } + ] + } + } + }, + "minter": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MinterResponse", + "type": "object", + "required": [ + "minter" + ], + "properties": { + "cap": { + "description": "cap is a hard cap on total supply that can be achieved by minting. Note that this refers to total_supply. If None, there is unlimited cap.", + "anyOf": [ + { + "$ref": "#/definitions/Uint128" + }, + { + "type": "null" + } + ] + }, + "minter": { + "type": "string" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, + "token_info": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "TokenInfoResponse", + "type": "object", + "required": [ + "decimals", + "name", + "symbol", + "total_supply" + ], + "properties": { + "decimals": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "name": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "total_supply": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + } + } +} diff --git a/frame/cosmos/contracts/cw20_base.wasm b/frame/cosmos/contracts/cw20_base.wasm new file mode 100644 index 0000000000000000000000000000000000000000..95d9f2ac6a04041d7858ce7046a6df585eb95a8d GIT binary patch literal 377867 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 z z`gl8(Qa)>{O{F4fCNwO4z~QzYYa!?{T9+Ix>K!FyzEaP^ygawkoCC7Qm)@mWc=l`7 zc|^6GG2xnYt<9IpF{>_QTgs53Z0$tIvc||mlJ=-3_HvSxGNuOkI<4ZW+p-1g(R+l| zvhQfmb8qWZAHIc2>&i2&3%dl}n5`XIf3njc8MTUzBKp@iWb6DJ>sp%gstG2nix#fz?duo{Wn1b3U>_S(QhEuW)U0g=ZZui1);H}DjYuD5)Dv5LbpoU zd7S7oUPko<*Y(+aUWdqhzL;D~@VAHy<2rLnIj0tj^gZEuWjWbr0s`O6lKD8{;~==s ztp{|-pBAZHFIYt)MhY}Nz#Xba_JUhVx$gzHBEAwmZBI~z5ZjRn<~yj zx@nc(NH_@#3lof2exNh2w4a@LXQ)rR`aTSwOjM+(u|f;1AF2hu{uB2L&;p&woQ$ce zq+x(D0-i96?d0|d8U|uQzM!FtMNO9r{ue3Mh+DVA&h7FH(u(m|Sw<3h8VQ5}J=+H_ zN#j|X4|y<`6$>^d8JemG{gItwN92~H8M;~r5FrJ~m$eeAm}gBZ3JrV1SQ{Tn;Simw zsVkpVw=fgAE=TkmyTu|(WO^M=<;|?#F8ZlH!fXQ3LlU3-w6g%&US;mL1(T=^;y|>d zwCvU=Q^nH0H4rEzO5LL#95Y107&YY9vBbMNeJtd;J!(~L8UNAfBB<{G-(wD+gCaI_ zCy{ZYZh^S%TaDV9am#m&2*vY~mB7h{EZwa(SdM`1FllpCY`V8r!*2T?9d?gi`5OyA zK=wADkUdcg%_~CBh<*TVG4JOPN<2g2+EBc-uud6pbSfi>+q)SxsibitBx&Q2tdS9n zW|&R>FLXE=Rhm}aB1`YAS$fijHJ4neBq^A2nk*niOv?#{zIBw(1RQ{LwH*gBxV)B9 z?K<>5Oe_eZK+Aa(L9D(~gW;2z3K$8+i(uX?u>)vu1rY7jFbRGfsL6_B4kclH4JoWD zDX2|Q{2W-YOM!K{jSx0f_`B&cv#As)X7wD#pv{>`ixxmC*6Sh?3y516k(Z1NpAz)P zj&vCl8nm1*8>jYKm=wD=tS;Rn#sVEUx8_)zj-^|=Tti=)POVXlE3x^JzUYCzs#=px zx+ZG~)rtbzmIOWmE$`XVB}|VgEo=EILl_q88I6GHi-bDmZ-VY^gDGJYMFlp@mS#%n zd$XW%TSA#EwgaNGko2GFI1Q9z!^Zzq;5+h3|u_( zPRU6*vPV;{Yymi~D{B+B!ibbQrr+8_WotEUX_hr{jPxQE#ow=6eCLHG(+CzljtsXI z3nt?+)DMlb90@}R5f+Q~361&#h@?z`WmUN*1PNCuK)hxcBoyOSm}k&|>5c=L>RdcU z%zCC=6)MfBl4{mUgCQJE5lcA=PMBoK?EKTHLt`I~&68qEVl|>Xz)Ns2C^^(poY*-Viq`3DzeboWTP0$ohI7mS zR*4K& zJYuHqQ#8*r1SGA;bOc6J*pDa6O%M`7-3U_<;*(V8{&+aq0J|72l6QdA_DCn>D-})9 zVZCB>stVaFMkgaBY%eLFsW_JcmJ4a^kJG{%y%X<#4* zsR=tEHR1Pw+?X0X4#_7UE9A-B`KI)$tsVxM-~t^j#TZ%!T}Kls+JTB=OmAp1HIVB~ z5W*=^jKM5dFr08JtIy6hcJmg?ou?w_BU+HA0OBedbmN)$!9fL$tFc@|Hs3GPT+e7- zjmuzWe~?;ap3OzT6)+dUO=a!y5jWfg>`#xcO!Dw zYM~Dq3n9H54y=tZBVsX_79!Y17O3a$ka+T;)YGb1MBo$_FfFy#B-+v8H(yqgB3>Fu zRXc|*55X+w%p%3kj?jVh8)J1kFuEF{gQ7fxcfKyJ;|bd$SUwDPYKmxxA{tJwqKJ-D z1al!ebQnBZ?l8!j{m#O`S165SElI!xGo-Lw9S|&f^e3@wN(Z%fwxqEl?M|Jxp~#3c zkxWoji?>AMXiRrdDU`*XQWGqgWV-@ZjC}Kb6OtG|m!`!qN|#CT8bP2GX$D3cVGccH(Jb37d=sCb7L1;zB``R0>kwq)GE{tCxu-X7=vLhvCQF z9`EkiY43;#P(u&MIrZ4={XIscQe|0g($S_QP_rgT0;*-F>i%77i|DA(NkvEJhi+9C zGl+H2S^y3Xzaw28U9qbt(nNDK`VaK6Ffo-j@_44TwQO+$s86yu(HL8t$cJSW zm9*uD2Y+D^qQl}=%s#fX(&B`f(5W5S%4x2Y7iETJ5#olnHc^7o>bP2LK8eMP4~~!8 zN8HY}3X`%L!(b~v;#j?nz#djYMqwF&JucCNla#5;hG$WyEz{T`zLr2AVGm<9a;WYW z?8P|jw$QTJP1|Cq`Q4sItz@(i-mY`>qH|Wv!!XF;jWC&_eDDiR_WPnGn}U^9^wa{=&fwQ=e;25faWgJZ7$hr%4ROP0B-VN{lkdFVE5wTMc?@WFqR8%7}+24F^BD&X8rbK zMdTVXZmr`>B8k+iD;G&*3YorFQuv(Bd~$jbgF>+kN}svamfe_E3XMSzgj}UPF(Z_g zCm!(!ScW!a?L9GX7*qv&cy#itGeyQ#%4PrQLyG?MxfY~yI2_WmpAw|_1wbmRbT&I7 zq!>+%FSs9Vg=5OLLR462M2uupm`y0C7@JKwylmyMVp=E^Tn@`Nn*tt zLR^lIjEExY{D-g{GFrvVl(i8pp`I)vJ3`D}+K!(3<@)iL_C?G3$SH0emYTlM zr2?S~9^o{Je6=uZCNgc$Tiae&jcbT_*QC}spqyC_!2UtH2+vEaLOLs{9!PfgF6wrF zFH3W2KHooe;*9i)mgW)}mXn0KWszOF4kv|J9p(xQ=l_Jg1K-!HA$QQCk~;|8f2ACZy-pnKso~32PM_?L60))8RwRLFORG4?p+$< zsAkYu>OZ9J=qu8Y3cl^dAfxW%T(t(>eCqV8bSdPvQpFH6JR3s}< zlJlY;360pNR$>HqRoEn_5z2MCTfzVY*m85l+K0y7WLTWAw7a_Fef9Sjo7Fq`F`JOo zj*zB+VarZVl;uG!gd}`HkjSxxry^{jDH6G*qu44UwiK3=>GmDMRx!lZTF`{r;j>}F z)+DfjyCDkoOM(-`5o;9U$Tbr-gd_J?HA?-ut&vUa&u)jVt&%M zOlWPH3r~y+skNdDPd^$zLVk%0UkqJ%(}5^~5tL-$OQ#s<5D1fyeu7RUR(-2!H(+yA z(OwcSXZG0suncv_n!93I2Iqj(RS|*l275ya=L#ZN!imLLTVB|XRI&Hvv`AZZY%?~1 z+es~;i9VoAa!GU|oWkIP%;TXp@0O+McLo*Z%S<|+n%4rQz6!(VD>;q}*6SOjeA&rP zykQQr@O3BYd6c4%tfyQ|)v7n*6iPIj*=?Qj)}u+_D6nH!(|rKZ&h?887p$(ASQYXA=xXf)wO}#2=~F>B0|kM0D?8|M^U&Bv7+4JFx)t zBtu6}p`lPK+H)AV?f4c?Wq8|^HFUx{4Ov4ccx#=Q867*pP*xzytY@CpAXH?9$NHuZX}i)gdcb_Pqfp{%DZ5a}O;`Cq0A=v_pSHXfPTOBL8LbJ}urQC7^+G5P0{nMs9({m3VhKE{C|6CJwk9 z=Uuh967PO+Dr=*YQLiUBO=@2BFqiB!|JU!Y#Iad9m`4(=9af-|UDDocV{e| z_rs&%y!|1Zck@U%kBlBPmAFLdsEEB}ES@KiSRn%SpkLVq=bv_EDSHB>6gN(X4eaGvE zxWiUDK)>?lZ{|X*m?ThwMk1sb+W=Z3QA=YRE>zLB`3>?UGdNbBlyakNCmpSrGzFZ? znX2ssPqmF!nq>U592PeOBL6H0rkTQjIv1QfrR3;~N0tb=EY~$`nA9Hqc;3R2k96p4 zR>tFbF7z8SqX>Qo5=(6@SWYCJ(JARt?6W#aRr?3{>N82I3P0+Wbxw;o&hO#Q6MrgA z(p)mn82Or$Z=+ReuC*9bT^o=mQ9b*XhQXwA)Y>M@Oce@)>gV%SOk4P^6A?!I_RvlA z9gqJpsvxx&X{>4-O$2gztE5(0neSGfPQun;VD_gXqeE7qeyR2MI;v=!pH*5~{^qSY zMC856lF6^PItv~lW@o{dE!zcDPAs&oE!JfhzQup5ZY?|O`ZQr96=w4K z7^09KL$?q*NY+U|6B2+H3pZj6==SumhD8Pe?>Pj{Ud$d^r=ybd{frkTw&phhW>Y-c zwXIfgOyCo}6E`ehat(a?uWUjzMH^|YKM@6vfJCumvKdD~nl%bw6~QTBqk)81W+YJ3 zoj_V3m+&SV5l@^^w`9(!;wQN}k>^B#PReCydCDC^f7pkjua;+7#4A)V7YL)1V>P+Pn()p!0)@+1+v!KJrbFFqx1~uoAOBHHMvCdo6lO|eD%iLM z5-r|w6XxY7wL-=;=STcRfaO;2-T4SK5h`7QjOEHzNxR){=IvHHYquNiRN*#a0M(!W z)$e|-DaN*6U;FgOf1X3EWH2sK+wpfCKy}-XB4^IPU{c-cz3~?T_quLa$*g||b1JRw zR_Q4-_Z5oyllT*EtP6MIGUzAtR@R4g^xN^*Xj$$0FcUHWP4<&5p=y9(_t%Jx$a;b= zupXx^0zTt2G!fovhMsujO<()yAAJ5-{w{gB?=?@W$Ll&HwhbFehl{M=5QLMxmyH4x zS79R-%}@DX=}C5o!69QC!@|C+;jXL)R@fr;o!x;26Q5*L65q$6~MAh z4`i(E-1L*Wi#nxzpFAozSw-CKvm@mZY0Qng_hWtp_ z<-g=5vJBK+vq~3V=p*t6Hc z=6fW*{)04agxr~QLn5M3{~_E4MuZiDY&5Sf><*0R$8dsT{2Bx^3Pt2uvQhjxMfQxw z+fq#sDKn4-2vvwzDKmt~lrqC5q|6v&G9w}07ET{KMaqogL@a!LA@v0u7KUI18xK8{ z8R%9h(ZiR*(i%#IJJZn_EwaTf1PHjpTCh|7 z!vjiL^vzx$bhJqFz>c4iiOgG0yk`{pl8i69Lu-DtrWk7d>Q+Lr%tSh79KjIjGrBrI zIr{}ksypp3&q)xdaums2vQF_7ORD7CG{LmyH~iirNybfWDrM_ocxr=bKRUI&H7R(2 z^+ddd$I3~ypd6YF^w=L1F$q(5U zqvQ)#AYVk0k#B*9w%im~&$b1TYD!<+P^I7+vNJWWb(sz*P~C%YmeU$&7Tp-FRY%DDWzyCT$i5fC1!7oj>HQyubx7lg zHn=$5;T&V;v?@~iBT0yo?#BHEb5a*1lS@T`HYBkkOq5=<(t|GNK8kpIe<;GnK~vTC z)*N!e8F%(4zk_zt-h(>ptp#icwub5_M4(!V>BI*D_NKwa*5sE33fF({U~i_FO#^J#>x&gf@U1gym=cbwrWE=3 z(v|A}BX&E&>dtcDL|+78F9n?J3~dZdPD}tJaQOV5`Zx42*h@f~L+g=TjFcR?I-LMiNb%a+Tmix%z}q zBvbHBEll33zCc8AouOwj9x>;PN{4R2bnq)B+QN-x4{EeES=CAMrbUc)(=#@x0T=z zs^P+9n;52HfyNaI?c~+A-PM7&FDBKw+%t8(v$d_lsYf+HbECQsa?$a6f|aZSMSOpE zj^^-HmdK9&D(4?s`J8cS8jw9G@FJHO{gZBsF6={wVIGs{p0K)MV9m< z+;Nlv6Z^#+C2flw$K%x6vO+0#Tspgx_3Xl^Xgx3nHc;d`;8@aN2^gz;#MQ~ApWgRG3u154p7YgpcAhPWsuX_v*LVc8rrvS_+kp^`|OP4a9u zzeSU*zIPbMimgJ$0u;_B|618IfsBlOgc)d_>HXs@9xtQmZNj-t&0DK?C&2;V5RRVO zWf~Agrjy~CunzjMDg2w0K^-(oc9{-WqRhO?%w{h#ecW_T9x3MtA|JL!xAoI|R@o#s z)(ks>y0m$I(s2t7Z8cL{XcQuXrQrxYutpFFHoWFgVgQiBGqi(NUuK~R-IyY3!P6w= z`)Cw8vWF#eDv{j|@d^vJ?Ty)21<5Te;9yqOD^rf1bvKH8f9lh?`bgteTy{G#-^dI!S{;Y*67*9bjA&fYPGK!b)vm6No6fW zKp`f~tU9vtdH_R593mj)O9~mOBhu!YUfBdv_A*cCjk0Qk7SPu1-j`B(zD2-tQXdme zi91s8-Kh?nrk5ZJW1UNWf|KmAHsipwhGOtrc^_35mhT9EP^Os|BK%H(`0|RQzP&}2 zh~x4iomo`fmh5UubNeAq5!<6%X}zua{fM=+TTEjbSzSufUUjTfw<(raHX zYVJs&%u+^nNe5!XE*TjHV+wYO_B3{)UBct#c1dtS1Vp*iE)gI#8AH~cQO5&j?$l&0 zi<{va5~GYN`o? zyi$#cbhczW?G_!kCA*ww?`LDW(ge8Wg!_df3V$eDir??xw|~6J3*z^Jl<+?@Nq;>zO?vLm_%vp%> zdOuA7r1xI%rUhL7&MRqM^a&!9K1Dqg$QMd36iMrIX>=zNVg-|tb7v3rCAx?!;73u6N4wm-*fNz@>^VpnFu831> z(UZHYLwDfr-a|=wuz0E#&9O***88~PowhM>wYBKY($=5k-M2Thh6h9rKsyb(B$g|} z!FnM!rb`0Rno)FTmdzUi2AwLCG>azk{GRI9-?B(FgHc!rl&j}_eUBR0(Kla`yGuBd zjLW=N#!GAVFj9HmCl7_|i`ewd_9zI0-~ce7-;^?YiQ5haMfFMb)b4%2EVP|c1lF)Y zJZw0P4a+81!w}qsA~=Prtxd+FWs=dR|JoK00lwJX`#(kXX0mv;pDcdkuHfm#vIzwZMLPKL}#Jftw5u@&xj4514VK5j|`0a8{n|DJqFIbgn@-L%^IXH>MDQD+K8@+o%o<)Wn~w^Oz-kMn#!Ipde&CC!$`3 zrpU2Y)J1zQ0-+Mzgl%df7O??E4zU{cfhrNnon~83w2YSTkFp=FdHmydc!e zP=xIa1&k^mOkf?e7mhv~ayH6T)@+LOLQ}M)wJJ=Jz19?gN%48JoaEpg3I35;2om5Z?L!ECO?jhvy#GSDM^-}Fb%cC)=Cup98m1ZS{?K(W*oITj;lImM>yl#@cbPy zJElq`Ty1ttownK0!SFa8v*U3yJKo0W5v~MF4~uF1c4R7<)5;&gZV_KHL%Jhi!o~O! z-2!viYs9`ZP2>ljVVt^3Kw0SfE|$|0xJq75s0e>p;mB38dQ0jcn%Xkn_xf*u=F2?I!l_ zsW$JsFqzKwSMt;*I2-vKit*-pdofi>)O{s+nLp2zFpYfZfXHuL#4EFzVaO8w3*yenv(|%%@uO?v8ZLC zfWWvJ)xwObQt}P#_$S2}u|p5$BLpF%=oAFOhOC+(WSts{F(AmZ7@bP9Ph}%KeS*j$ zLFCJ46i+~(X9{99tvDa~F@Bp3=JY{QfGH0_Eun2<_Q}!*a#iaKiVnjFQT^fQk}Q|^ zcFDqog%f7sgvRVCWA8v<>6~tl8xad}|G&^;j3}Gr zcKz8aa1}W!6H@+oaO2=S`7(*(EQROn@$`B)4snL0KTm~j(ke`0K~|y)S(WxnH`HYu z?^Ncp?R+q$&yy?b(^2&VT=MK2=|IY;fcfwZSc3QllAzxEATK)ZzBqh1F8K!-l%;K< z9)`p@-!%5hzC?ob6Tn?QAT~1MK$yWEVAA2KneUdS+RMowpnJait<%-=c^|{Fzj3d% zCGNBCW_u-?O2}pa!y{B1`uK6fnhc+N9v-0Du+OGD;CLChbZn#mf=iWY6Sin5^&oaJ zz}c>Ju(!J5(~1p!|A(BnTW;_o`}$;P@s!W>$hWE6o3C;2?{qS)okuh6g);}?0BShX z@u{HecDcb^Z`0vxTn}mE4A+C~Dibf2aHQof*7n>fuC0ak~55?(_K0cfR-e4kj9QRd=ldXezuNnBWXyEmQXp zq>;N#lg=1E0Uhqj@&KTn*3@8xHQDpntsaN(@Ygb!*o`cT!2DLSXo^(uDK8YHHr029 zzPn?d44}3r`qe@fZFE*zaBUE*sE3f7+E98zyEYBIZCcdl=nu{r+emAq^adR-U>~Cg ze!i8{+H?xg82bD#MxQ0p40xLdQ_g99^w6lZTUStt{m@3G?E++1N{tS}{5QgsY0gHn z?G}6O%>Hr{2M}!zgbt|PbgrsY9?d%2Yrp`TwT2-nTE`%8yTa}EjX=V#R?zMa0+gE$ zy?`+p9k1ySM?4v9TP_4Pnc>q~_U@1|uZjgGM4ZZD?%O(Ofl_*U(s3OB))-O0A)*M$qVwpg{s;0J8=f z^84wipffNXrUsx?W#Vsx2{ePI;ktiJU*-I6;8FmQ$}K#c)&rt!xs?YL<}SB52teB1L&7~-){Jx4ekI$Si=(DMg{?k@s_dinUq09+ za+q%Qo1&07n~Kz&v&{!v&}9FxC^ru{A91i#Z=_q}l_As6uO_El(Bu&awJFKIrh4MN z-z+A+yjnZDp&xHbr#+sBexMHE5t$;*yQdJdV_l(lizQ6bLWw+fk!`IL+-(N#W^b(f zOU%KK>NPNCQr#VO)+UD}WZ?f`3)qC4yD9q_fV`M}6jA@-hZ6mTRK;Rws12RqtF&4l z!|Xz`F}a%qTQAdbB<6|u{w`4JGAqb&sl6_#gyRB10pjp_oDZYS}ZyikmLWf zusl$m9*Ah8XHi?_aK}MO`htL4$7P5=I)4#4h{uNf&^$Vqg4UXbC5L_k8YWQF{V-ZS zP7`u_AJP@e@?*M!wM$$jR8@bVV8>wqCo%_jD{Psu?E}9%w=;qIFLIltu~lx9nDGL) zHi)3aaqH~DU8loOoc9!^PKbjihFiOoLT0fyK9&@*b~Q@J>e5Dtr^QB`*7}+lkRoZ& zTHV1~LavTc22d-yx2JF%Q@2{COly(OHDyOAlL44a{Y}|n%Aok_SW|Y0GWP6frPpN= z(Vr%42%wdkd%CK<(GEDN-aImbMvMU#4~0c!Y&U4O>M0AJgRbKjoT9|trq?i6O~pfK z=&GH0x)n3ELlqo}p{}@6sI}uUngWDY2V^t_$Zgg|qM*vt>_qD3zehHk#(=5l1;s10 z6>Le$tY_$H7Oa4~9L5Z;rgRUGDYn_5KVXcL8WG`d5Xu76nk+3C+b}}_DA$x%+EkoP z^Ixuw^C=9$J7=fG=sSDZruzTXK6?x`d^U>MIRV@y#b%{2@8m~U zu%`6y*1B$bDT^)RP(A|1{D_%J#LLh3b`h4VKg(nH2j*nY1|X!4-vgN1ZXlxyH`|i( zZtIH91A*<@#_TOoY>?8HDAFM?MeL(sdy|9(CS<}n@RPX>#f(}N76cw?iytq*Uk(sC z(qX*J8r#+Cl=wIWV3^x}?11)Dfsh!>=?9R($f~W9Tovr?O_AD@0anSDMIp))w`J0M?2)>+zjv=EVpD#3H6Eho<&=8NA|tYx6WsBls`h!s=(wGN!H<)t_G7Zqf3 zvyXg8U8flATxz>$CW>1Y`33pvc1yJ&X^ch8bnw8coCLS~ziWTz z981S8MwV7AK81|<-arIXTQli6X1N?@KbmJPyelfDC<5m?k!<15KfaPIZbFO}0W_+e z(XUD&(4>3%lb@wT2OR;*=6!6hqiy^z>zmH_Hh$Bp-_|lHQ^Z={|EJCdo%g@wDj$$V2}Y_AabB0u(GBMPH03k(zWX)(=@r{v(uycd(MKzUCG1}ysPbx`B`lM>sRRAb!Zw2^ zbh3Q*Ez})NDZG#-w{+b!8)f*6XRm+LpDX;H7SinQ=$=dDjZ~^9-t}+W<2RSO2A3|l zRJ1&$F7|??%>@@Z^1v^WfK?feNB`XFrd|dYE=a)(jijU6r8;U#`MrES8?!5MnfK#p<;L#cL*Ym!gr}uNeZ~EQT4-ARI}r3!)7+jz zfygzChUFSOdrb|ajMB4TnBth-QTwC*4ZDnrEWad_V1OVS9vF{5Hg%}`et{jBfeGfG zLyqh?$O?w*zk4@Co}Dx;Jn3*0FBl@`;z^vKh8is;SgF)))P*h*N@|a1JsmmlKq1SK zswuK9MhAr;wm^x6HiLp5v!>FNNL+DuwWuIU9i^^@R4Spfp@}*aub`^~t<)#+YbL=R zMH-0#2d;esd&5{$XWTnxO44J!_+)xH2aqgWG*HsQIOmJ3h0%+4-069!c85y1uHf9uzPl-WH|a18q*Iu#nAljz zp8eD$iEqlBNDFe#ab!hVNFzox4ds=aVy}is;xJijiyN~HpHg-YFBQ@@G)8Qdp}$zS ze1{H1X0PIdEbocxhaDAGO+H+99%7eMK}TE|J6KwYILk}UJEG<2&upA5wY^{epV02~xP@@^Xm54cm z5Q0D=>nBc4y~Aj_Re1-0rU_oVO9#%$q;%Ijza(OaB>V`0_d5=5+MP|-|KV00`%lsy zA1>ZOJ|-IEc9rv6oWRtlX;vTo=WH;Q{$0drZRIo!aLrH3Cnklf>}eVqMwjkmHIv`B zQ_di+9wZ@~CZO!yF`qFbJq)dgbL^jndR99hu6F)6PHh1UrvMEzIav{6u;%x@nz#;= zBbYSrb&9DE??FMG6xQhv%^Um-KyagapxPNhRdOGPr#Da~XUijW)liMI ziuhYJcX1=A@}Z$BWxR%}i$SQW5=XGmU=ji$Zw`l~5xq1s z3%)S-{9;ATivf9m_U{#u6G}Q0Qgd1x%uNw%gK-V_El@$5Xo6ir9d5!KWQvImIu>PMA)%7i9D0SgX9+x=N$!a z5V`V;d2>wI7&y>d^>q?tp-un=?vvRukb|lM6p-(3$+OB`;PhQOLn0?^A;L#&Bf*&k zndl_Nk-I4`u_jCD7|>2kRVdVnEZkZr&8&2y`4k@z6B;ilk6G!+`KcndyU+QPH z8RJX+jQ!C&Lh5JmRXaielvG~h)7~LAT&z0fG)i>=J}Cf<^Jiiz6E^iO9-9bq0-GLP z2Mmat_)`Za?PUcFl<(Xy=x+->ugO9|wXWW&wgusK$EiXEEiHhn>Y&%B8frC7Gg_D0>aQWla25%-ARsXj%0yq2 z9WVw}qZ2zi65=>d!_7jWJ;j@E?UWjsS2-2$>6BsqhA>DQ<`VVkbxdcqabR?8Hf|@UI3t znF@B|6GjEdv<8BmjIRL&>fkXI0x|bHVv09Wjixx5$|nnQvX#(JzVulZWuXgl;=`pj zwjLZzGrO4!aPELBLy2^{DqRgS34O4IN@a+9);fn0&*Kg%Urye&8@t+&2yx`7a%wl3 zlxPE^Ix|BLX&VSuBIKOwN^|O-q#f0a+~b;MK#v+#%~aIL9*%PAU^z#P_lO>bo2`ei zDhUtfV5OqOheDNhyeYyBX_jon`WXX=7a~UPQ@^;9Rd1}8ekobj|4p+a4xYBLXXmx@ z>agsciMCV4ZcJMxg?q69(~lxw3?Z++PC&6eCb)VUGo}4H5m^CMhzW6(`FNEiE7j*p zY7hTVm2$!~RpPW6uM&A08;;hG@8pe?EB-v59RS@_A={{y|5yPNAubc7s0is{b7m6^ zg^%V}KotLJ(cTdZhTsLyq{yI#PT`4^y+)REAVSQy3N^tzF{k1dlt2yPRiL_%z7SoT zgS-rz)YAOOO8wUiT7zu8Zdk2D3FTrf8(n0LX}M?9h!28Pvl$*5{uVm8#2tnID#Jgn_4lqPjm_G!9G7x#_od9_u1KDRkl{5yiM z3Qe-rWYI|3b+~rPc{YM=QF zj@ru=KCdFy^3%-@4)zX&4;C3$2aqCQrGILwWE?s{H6fxRBe5ztPE@+89uy*~HUbTxR=r$e)bgSqRUY1l;@l;y6r`M7!0z_7g>gTd-6p*?BL|@d>zI)JdP| zxCx%oZ4#c}6}AKrU{7&v#3iuEim*d5fic_3kA3cU1jj%$(@jYei zBZ)c=WU0&={4{+fiF!9BQTK!Pq8joUi+1d1LTmAd?D)vNyr z=GJng&Dt<}t5FE|R9Q4bGxV(8JIo~+~rDQ0H;0Z9&LORu|)hkXC>qRQW4FL%R zSssF*AUY%zGYo%|+OEdRXI#xx!%I>zEkU_Dz4Z#Csxs2FjBYX}VcNNla&+U0;6TkHIQVvB*L83; za7Ng88|ADXVIvn|59X8&^`@%+4xC>&Vyog}qjbqq|nZsO#i`Pbjlp}0ppXKBz zy1vYL08*4P2ET_+bb;^|q){UVU+xv~zZ4~3Z4CI;u z0jA3toe}{GHRwb;H69t8B{18hHSu{`p83d!L-3cKK>ffA(WC|`wp;{KfbJXN#i4HiUcjZqTde5;HK^1GA)d+WgmfEdH?NIeQ?e?c zrjM^Xpo$nuQ~>>k^~U;wxuX>YYZ%OcH4NGB#$v~mE=lX%`up=mR+Gr_D=$nQ+_WX1 zoGP-ZiC&jeF7#gqsW`9x;b&H|Y6kshZCIS6LbOSq{qy`fnI@M@iUG;1m5=kQVn*5r zO%N0vM@Rhfll;0vziL4yW|dBP$g9KpbrZkJrJq;-Ox@5UaA;mmXIA9ZQ+jz$zam}N zRn;e0RKJUg>aAn|QMgCP^u7+yknC8$pU$*Ei~}I2^v3jf=*rr&I2_9I%{z1O0ZT^i zomJNU1Fs2M{6$e?wixdeG;KFJa#i`0KvU(Ko#Me&UL-f zSL%rRG_OJ8=@*E+mQ zBT)YUVYcsMpZUV?Jpasp|959F|Ib$2li5MADact6B-2YMHl<9-UJZ zR7ZG}ZaR1y51+PDIJlkL<8h1pQ#}>8-^1+*S38i{bI4sjF+QN<3}{KlY=**LhSh(I zWUIpy!*^Bl+6@N`CIo|l1gWEO`&Mq3-pJY`2D(`EVN6TZveo&bWhqnQfPY!*uc(KEMW}G{c1r+-Ju+)h@TpQbVb!P zC4wq2u7B4Q2%ere6p-V1mFno+WAZSaEz)H74m2^k0g;TDICf)hRTalbmcWKL$)tTQ zhUW2JgC2rl{~8B>FJ_-AnjPgjv5bYs*dCv7;FaYeQcS#!0?-?0E#uwh@#+ZE092-Z z(DVV&WZFZ{=TGpL-OvTwKnPc1_nxeihj?L=6z+V0TWm2q#GN;{v)OfDXK**WTf9Y> zpFUO$GJYJWi5GGIzMktT^4@hH8dTgqfe!E{uAqS8@g5rN{BhbsCGUDC^I;n0)7=zc6LPvWn> z|4A@-JBR+Il>(x3_Twa5L7mS)c<-NJ68)x_HR1KMl$M7;|0wvc>r!C@&x9P5yAxJr z>;|C%B{aw)p+PjjtahrG+2W%$rjK8S)p>m}1=^WO(SOL}<4sXgw+ys5X-kRL?9{-C zXC9woOBc_FbYwzckmqq}YF^eu8~(hoNNKyd|5ocXT4&|va!dcM4%MJs@rrzWtVes= zY9dSo57@!z2O2@8bR#nwA?xgFC1*I_d$zr@Hxov{9#fcxnU_Xaci?Q`07M~njuq$VEczQzZ`%@T?TT<=cED9P|n zO|r6dM3`CqCQPR)g`yzazYEO-zKyh6qs99hteBj;jPG@rYS>N3&;i3~s}kbunLA2`BS$i7i&LZFa6?V`MA><@4B-n25;l-h=7| zIZ+c%?@bNjW2Z;Nj15r72fJV$nPAUgssW4TLD)z9yeqw8PwWV^u?~lC4hsF|M4>z7 zP3#xfe6!v3l&;sZWn9;5*x9M;9(J7T$`17ty55}d<%WbWHzs`1e)Ast&7apxGdxW3 za8eIjc-Y0m(>zoX?FmC``Ih1(L5wwc zM%P(3_Uj6$R=sg7t+Vo-(oQ;O_1in)+Y1>P8UH;`i`k1kDvR_Jt-1FP!)Yy}PLXHi zMuC%i9?YI%w9O)NMh;2e=uI`y+X)#&Viq$cWDt`dgIKeMT!%8TOc+bOPAB__!X~%` zT^OD>=n6bnyYZ>c^cgW55s!6PYUq|$aE_V*jZxhFf3S1EtxFYD^jr<@KHL8N5 zCT*aoNgHCBNLy3|B`^?3R~S6H1_FR_CxVtR!_~qF3=7TjuhC}@V2~ufF&IpbGFIdj z^1wu&Z_<@MJ1~YmFT_}ztR|_0u!kNwfoMN^=Fh;vb)S#A%jwG+KTF!I(p>Tf;m<+||>E^fT9OCCcyd~F)<>vUzjJ`rPko!Upzs^^yRPASjP+VQUY zyggoVTahe}_jPH!B++2Jn>=1-bJvAOOw3t5V*A%1KcfDEW;od{VupA4b))s3G-9GE zJ>sikhMSZlqY>}gXvFJ2Z;x0EP(;}y#)jq@CS8a}Twb|fyXChuDFAkvbCaNBOL^7c zN(l$)7HIEMuddmzE#;$}0aKAP;B_$Tor7!iM!NO%(D-HApx(+G((^|3@(Q^8!r(Fy zy>u)5)ohxQq61}6W}rDO;@M6#U^(gPnhw<}0%&2?{GKFm-jf8*SVD~qRo;^X(2*oy zEa$Z(4Nx&!5c``Q^t3%R!;s%=%e1AqO=Pg(t7AQ_`w(Y1Q=!+A-P)22qq(}26cdz) zpU_LQiv|_ z#?YMfMgSeQ!0g{D2p|()KyV!-c~Fv>NL`iGvr7UMbaK9db<)}{wSsY23yoT+ME(&m zJ2b17zHxk{Z}d#x7qj2YtAC-)ZX}0M5#;9r;$W|p$>lgk*ZxrjU?$;^R0EB0$e~>p zKaS;EK{9llftlGiN)7FAZDjSXoCa#u1r-j4Z39-f!F;z!`orzIYf z?MaFL)h)IBlR}Ke>_Y;I^suOPx)z9WH(May3P|TeqBz_7`hyKD=abI-U@Z~5AT=mW zm%}8iBc0H!0UGFoQ4;z9_L=N?R*&^SH`(m z2I>9t&aH;Q3LpA(^}Jk7MgO~4AgTxWL@ihzr$@EypO+1flBOD4l;Dhqv?654>!EAH z&w&Fdg@z$He#Q#cl8|9l_o zD{3~~#_>W649YF&O5pe7y3+C?FHNg$kEhNYN}X|?kc*|M5XA*way5?NEBuvD%m8C4 zJ`Ud|fV`!x90C}^#9IIOu95!nUE})4<02B``&d*Jgzl+h^6q`ImcrD0mNfQ5yZ z?k}&GQ43h?7mL20KbQfmSWBqB=G$5Sy9Kagb;LXKWh^>Bh=JG=k}wrn zMqwr}jtz)`;b^Ab;Jy3u!M#LZKz_C~TqWUcG;ixSsN<0^Joi9j(L%ny+@8jwVKDQ} zSPba^K#1{a{2HU`ctSI36xhSeCUkILwc~0&$<$Bu21e1ty=1xS$tIvIRroN{%GT?e zgufHC;Qljfl z(0Og=uxV4Uyf*~6!Fz)-b1c`C;A{1d1?9P$Ra&F~o%kz68yA)|3a|jo>oBuz!F((Hc?}Qzk&tgc zAV>>!X6Ih#PM`tVn2p9~f`SIrO%q91wv^kz81(^moDH%LhJNHSZ3me@!ew!!$3Z=z1W{xU_a#Q~)!ybt($u`>tW!W9PA(++OO@xX zrzTM>NLyy~M?1vO{a(fz6yXnkj*66b^AdE0M#GfVaGV_%)Y}qaY2+*-KyCRuE0(XO z7qdUlFKj>T>?;O$TRm_}tGbpmwcyYl20_sUz*%IQ)mL#s!X_u#|7H!Cn z7FYZjQJFfC3_os&D_^Enb?B5kB!MOBO=f=1)}}xfyln_9#hftQd1~wLPu2tJ@@tqt zzt~v$U6L9VeRkp~fPu(jD?cI&jhnrjtwUxK34;1)XK@l)*aAQpEHOY5TBdzAL~@!- zt04!lgp=4MV7H)%`ZWE1?&Fk8XwgJ6m0O~oiHXeOZ4*92+^r@d8&!nlH{!w}w%`R} zj3rx!5hJK9?S*1ob%$=ySQryL!(%cvU`$Y|T9?JEF9^!PbdNo`*H1-#xrrB93Q3IS4J?@Uo?wnp44}k#gj0kt@OC2}OrRDxsPdPl)V8 zJQ2#t8CgQ#MqqN^*2o@EeMoR^DMj{R3W_zdht!?2kv;x|CkY(3ea5Y2kB=}1{14Ue zu_(cH6lpyIPw23BWNuVMmXwC4H&yoC&;CG~RT*s|DHMjPPZ3HQVhx>)a=6yuEOlcMuShhjUkgYVq znypPEnTj0%lBw*{Z_8Ep$QO}&g-Lg{TqTF@V^o^ts{5ZLSh~zVFVKvE2#UL`+aGiYQdLzIxan+gmR5M1j?rm6DaZ=gACDUS$TtL5*AQp z=|rE2B%G0`6GJL_IAvXrQm4d}6O^{elb#p(Gpu(QzezruMg9yq(bVeHn}{Kxgs8Z=RN`SetVmLEjW4T8 z*Wk4c9A8RKTV!Nbh0Qg|+1h`*W!LI3pSn?`Wr7uWa)W+a=E;reDLUVgZt3Z=`3H2i zP|0+k%x<=1H;{(NO8P2m)a&qY@4L@I;FFqMPzsT|_LD#CgR+A-!B&FccpU3^h3m zjh7DWG2&96e6Z?@xI6Nw|MuDP^8KvmkNh;u(-~;{LVvj8yw*a=i>1_-OH~Elps%IV z5!th!Xo7NgmH$MnnW0KWEz0ZmD@ic3k$$<_?<)=7jHCfEd+!sUlSEq1y=z|b%bbI@ zCO*IKFY=!jlb!wiz6FTay$m8L4X2GPgvc~=aK55oqIgb3dmg7h}Z-W#YF3f4+t`^xW z&GG)d<>cod8}gN;Kr;=%U_4lB(b6_ap%1p1z^%tXK+kwc^mP>xA0 zc^W>-0@1#xWnF3Nh^};?6`!dl$xck|=%Aw}p$Tph8sQ%y@oG{5e5uJp9q>Jx!-uNY z9s}rVZAn*Jd)X=5#LJ#Edh4ALC+3~W&%@ru+R|csnS+S_*Z*-Pt8m|Vbi0IxAe#Do zwkYoc+rQs9*x=I3oK&P0O?+Z?D0Y`RqLU&5NgGso7Ua1-Ho&ZK`?k0}DU{kn%%~;u z>Xb2zSkvaSRZ2K}RU?0a+wY0bguic(+as7!V}7fb(5GX3)k)um6%na~>Wwj8(L-J` z9&ok%&(&<;bJTiU)Ow8Dx5n*JZofBfm*Ft4FYk;8qFT#$__o{|h^D!5QrF{z6PENC zY#1o|PKzrK;Mn1C4b=8^{J%iB?<(8ZV|N$GG`yVX=E0!kk`3MvD%j{Rkzcv8ndVGF zUTr>5efHN@GRHh*JcD_^%CjtznVx^Kd8i-}DGO?j0zvY_-{iMNo%fmX{P|HW-Rel^ zK=t(DCN{lWJyky(#_lRU+pP|F4*2wJrD|a-mo`;r6d&ute|7$7*THBLoIk1`U(V+h z%g)^^VBZPuc!7{NxBs*r6uQP4BJ}HoY~tF?a~Y?G#1HN@mxoOElGuWhi25N#q8;>&gA3qq_$qb z-VN_h;)XH+b;BpBHk!)f%B^|52%t1* z7#(+p10fwh6YQ&Fz9ofrt7QS7E8PowvEQIsNRB&ktSd<2n~3Zpo&x7XYic{f7R#5l z%O9Ug^=H2TpttFP-080qcs_&+m{@DIworVS^zLsciFD!({6jS96yNlc+j02Dwz(a#+~Z!!CCg?Zg-wGb@H1)i2WSiclqVP};GmkWbt`#>zZn`J(HCj~ZZbKgxBF((?VuNImvsz;h z)aYwmgWiaNfLz^lH?Lk6nN@J}%^$2D(e}#A$c00z-nvLSH`pFtI2H^iq2V~E3AUXn zWyRth{P`;Rvi?QpJ-^kz&hJG*nw_m~i{+a>X7k9u|J7!lD^Yp%@7mAhf$C4%&pQuP zUu{444^)5Deui%RLHqglM-SR@tb^XQr-42~JXrFw1hdmZ@#T31xzyo2X<>P-PsE1Of-~9kXi2X1Jy5#$YzG3QGL9j zxBO1$KH7f%i+1Pwb?5qZ=a6JtokPxPb&jW|b2y&`RMRA3g>Td|6Q=@;IJ=m42k zYQo%|AR!x2wMyTJ`R}rHL^G#xWEeiP0Wph%>3vv4!0_X^hF^@?t9rs zU}u)TaJNY{5<4%cr&{Hs4haeA(L{&Pyz)x2%$Q+rMSC&`M@dJa5?$T5BfNtp*Mo2L~Gdw;4B;HM`f`fyrq(NL&Z4-&0;Nj{O zMozX6gOL~xdK~xLv=8t~oC|{+xJ(@+NRZ2c!6rQ6Lrn?oURjc;&ApgOlXM07bAWoG z>SwfNN}Uk`ka1BL@{#C~KH4ca%*(lSM_HM_+i7@=g^@Jp&iO*2w!nlVzvN1Z=K3_w zxsDm3$x*!ybljY3V&fM7im1yuQx2A!mC}bL)E8{}WdWGxK#U1G0-7Xu&V+`_uS@Kp3-R=;dZH%;II!VP-{7;;b~#g$8U6Gyk@)-t)cpKYKXIUW#h7W4$m~x| zyxW7bQp;Y~yLh_lZoGC}C+Qpgs2)?YqZ_N^Tp}W8vYL^+ud`&YAlV3S0u{QVPbdd8 z`ky)f2=0M$DE3JnrH2ETO+BZ)jBlo3nksg5Y2g)myZA(p*O1DcQ3jN4zaOACu(PcobX-R@^ z_aIYB9ePRgG;!c=AVJ^tUMJq0gx>Hw9rLd;0jVP1TT??Iu##!&jpE=SqE6G|WaETV zXK^vos~!0>HGu2rdC8w_xF|4e;}sQ?XSX}-lkt?M!NyK`oz~AyEd0Lb7Xd=w?BHRz zJ!ntyF#g>gywCQ^Ys(!6hcjw(o{`PyEh(v#leRD`_Le)U>^+oc?~zG%S9!yM!3-;V z21($?qzYm!J2ym%C!=zlj>RA1vRbr9a#bKNA3N zF1PQ7p6sDN+jlc%6M_N>!wzCv%F1imRf#DxCu|xRZ>QT6<#zRWMikY(-BDh9&qI*L zU9gD3we*&mjgFeYsVC9LQD1}9(XUZ&%UzKlY>&Eou-vnIxSd|QkIE9vvf|JvmQi)p zBUSf7&XzB;dkNj5({)K+UJFXjs-JRDM}mb}j-63xT1MG%>!N+`KJB}m+*x3nr5n}D zTI9c?W&LWtKJ=;jYwZa-q9+p!aUDOIVBj}aLRA5F<{(hKqP(f}Awk!HAd6y}Mockt z;iQO0=i%Yza*}zGVmX{}#!CE`eM-N4{W*nj82;q(E> z;xuTN^8x38GD|G&#n3!cPE4qUFnx!BNLVgpiw&@ws}Dcuxu#1K<+L{YQQagp2}#wg zUT}gowt~Qn=x_gEwe!Kjb>%cz;HGv!;`)zR$w520?%{_tA8A&1Fu6lkho_E3>T2n> z3HOdhG1}m5jTQ-IGjISICp7$w&PZg@8h&sHb4N6$tAdwU{SFOV+@DdVvF~uXfDwp} zl@*YYFpp93MMhm*az;O0%80FcHw%uDzHVCYF@%HK2&4WmTONJC+@aB{MW+Ft1fczg z0|bEfks1VisK)EjyINqwh+OIDb8=W4jR8dK8^MbnO-LAqMhYwVn#9Kp+FO67g zjGOJJ|e&MT*2a)R)6vQ6KI2nzY0t8j$`6{8qRmS-1tDO~Yqw?xIc5C#C z0KZZyD)d0&JdmpU{$kyCR;#?Zy~S)Va-DJxl)Zfz+WT>tDzCOHmO6HF+*MX-WByKR zL#SVEG6d|bcB$Yit%5Bo_;Ra2oBOLTjtUgpWPn{A7Vpc+Bg3d=2%3=5N;~RoyPD>^ ze=FX?b?-rKx6Snf?hR2I!&W~aHEe-q3UFJH=XIUXDcT;{j8qsPhximWEy=17U{R!G z_3CL*GkW05UTNbO@k%|VZLN-erZHpns!!Js5Af?U#+05z#Cp;c?{O!~-a>ISr+%)- zz++}^OaBM;w5-J(N4t$WR%ik^{#!`Q^~cingPuBqjt`VuuxcFuLt6XpG)J$O< z@k?9iJla@+Oo3kDP$@ccv%1EvJwBGjiprHsHztlE%&-*2taccSjx)P&NF>98?wbS< zKhAv91t$N;WepS>bRIAoDC(iluV_!M-gx0!ca}4nT?lxu`lQ!h8(n&`)4&fJjB(c# zE?lEb-CgWKlm*tb`>S4lDDbehQW^)HWI&y)z`uLk-3r9JJ34-E^jcjzFT??^s8NEh z7Bxebdzd|#0;U22c528|8a%aeK~L1kHQ?hq@TOLscWRrOHuNz>Ul37|XyWBrgG#TnQk#l;vmv z3GKVGvK2ymotKwPh2v*if0(Vv2*$#;NQ{Ze7I*_%wZRlAVo$fiaXP!=ylFn6nSR<< zrL}^!R==wa7G0EZ?jEnay(uW~*L=xdirtMXpjy%uz${=-k6RK3b3&g=Wi)wPc9MJP z(bY=5;MCZO`oZ=^?E93-sQZR;pu6lq|8HsVrwd3cqwfJe%yuu6$eXWaK=qC4rMF%@ zK<_)?LFwt*DWt!~i}cN~EEDTjh!0Hx~6;@K?h zEWihITYVzR3_R`7?N%Ri zNv!p*NO-q;G>S|_)a&dg)#=-4jse!hd#W1HZw4P7hWDfnv*=TY8CVQQY-UO#f(MH= z{U>knDCs>9AC3pX6E`syVGYcnY}t*qOj-O&gF_Evsm7ZudK11Ww<5`6g4d*ILNxSL zU4twTrao4hOnqPcwU)gVQ{V5lpON8zr~Uj}qld1Hkl=3y_nXo|l-v`$uKv<3>$aMv zipY7D(X*Hwrl~H&mP$^Z=pFz8T|5gc^cEgz8$--r%^_kM!dNaav3Y|j`GAlL!&1!i zSCt-!Hkq)m7BMT#fRQeqj9!K=unw3B&YovZ(Hixv%;0M#M>5-CK#fzZE^7|bLE%9r zrufbK3DZgzan^CHm49bu107&-)ChRS%%)rYd6XFeS5311)Fo-XIL5PEeJ#p@3Ti-K zDTdI&Qvy3ZuGx)oux2+?l7ABBfrDuw0fGBG`jRYKHRLsKB1Y^M2x6pd0}U}!gqR&? z%0<>94>)<{yb5Y3pV`M*WhQdirxjli*sab6yp6*nAh@>;1iS#~akmNp#3yvT9(@!9 zQh9O|XU9tJ9H_otlV8!Hm+FU;qu$967PMIX{Grs%KHd*ht#0)PCa~iZbkd}>>7FNO z#e{u)f=;;X91}#a?yH}m{`dsRYsZKd@Ok-0BM)wYNaHpANmzZcSFh+@V4-)1IH&}c z=52sRaDJyMBvy0ct7{o7a2xI;_8joS6CFIbO1??CVD?{E1QFu1tR6Ryl1WqR9&?K> z^2~iYe%PU}59v5()lv}e6Yfh{u0#e*_Lad&zDhYLYsvYFT38rdiJ6`(oS7{0ymJao zc1HFgCz#1ArEOQoC_{Rd7FZ!E7PYcMvYtw14Rb#OE(^Czn{@53%5Xomx@ z^$f49pGBa=DC=jcmg^&)r3NcWrjX}k2fbvTn6aWWf{;5K;E@}J7X=92B$pgxIT9}1 z`sXJ`Kl9_!=0`w-Sk8}Ke;b(o8^FOU>`P?Yqjt^LaE9w@r|vRh5oK~~o*9+N#rVa} z?fEfkHTlD5s+BA3fNF6))d?r#^Bo2F)vMy4uxRoYgFnvm46vw4(+Qrp>A5CLH_^m! z=JxzqDpx~?J0eoYI;?>)?mp9Scgu3-?m=`#%v_tfJMk@vZH&0P%{sx_sMgeA!rPS5 zcGIb`g^td)%~!5cHa73q?q|f8JBZ6;=alF&N;85Xq4sqcqyl)(=t}381RFN$zo=*U;;OD}Xn#Rh zamY>}Yci&mUZ@{TaYfC%DicjRT^#8D$OtW2*Fgo&;~(aGef1Nuz&{?CWu&PY z)FH~$m#=|Hl$ri5*}4A}m(*DBvODwTD627H4+y8ZKdZTCPR}hQorgh5NJ?{jN#j9A z4aB)QnJCqTeWZTIIw=>0@NJ(GXmYpnz`j)0k5|}Y>mQJMf?N?3CH0s<5i2UjD3;9A zQMl3+s*93CLM!5pMFfJlLabD$C3 zp#@jFa2ZGKzy?@@fNKzn7Tli^=_m zf{p^H#N83vca7L)r&{)S;FXE3J8X?|q?)Eg`zYvktK^VNmPREC<9oTz(+Fu;7qd%n z+>mKeoMkJ2;S%*Ye_{8c#^9L5Yf7#6cNi~kh-q!7u;XeSE1{(7ODoC?^DR zS_WIB&E_0*r7nEp6Dve%@~3}XhUim|^EjxMmno2)y50uZ6o95TA1Jr>uPwJOW;fFh zI<>W0MaSDZvd(NRxB9TA_fv?qu>XJN5ZJA8Uh3BV!{S>!S&rfwF<)Dy`sr9_zQN|g zU)20G$6IAGr359vDUqtV6&1fJh(6rbyg?s2H{aTMfA!)|Go~AOnXXiaALC*9XVQ58 z;m>u8*Z)*cX->~_df~LwoMI-wP4oUo*jd#i%A;@jJaU^(R~TVHmuZ@37~)scMAmn1 z!v??ctS835(t$MBQjmR5K{fs+#>m?^crrz9=9d8h($wGNDjmuT_E<4^ov!a6 zyn$aZUoo(S;)jNIk$pgEO{bXyHY3tr=Iy$K_1K>`T`jviXWV&1M7^LEK+!;r9#8@} zQVG=yuJ!K%yI|-EV+s#5*%mYUHYhS!>;3eZqsN~;48Hs>vD^lPDZ(5N5MM^xm_R)* z3IZf0faDK>1i%r*KRv5?Ud)KliUb&C7TFtS7!lHJjWPtZy;D#CAL3vT5|n7j@%6T$ zga@D^_YCrtyz&IrJN2omsTc1`y?Ch?xXvpRh+FUm-5hI2!T*`Usd{xb-_xX)obSI= z2pRuGLrza(@r;Zri`fg4uzR+x`o-UN(0BShwl4lE5h+lf#q6utCb&^jnLnPqJzr)w zhrf2b`06CeCsn^ViMT$)JN$loHjT#)C8Lh|oe^X$h0n+)XenJMa)pg?Cc-cHiG>F# zse8Qkic@d%gMez&?9B93Z*rpBDRMb+>oMG3`Yc*t>!FGp6AaC60Wg&QE5WO7>29?e zw~SXk6oU~ip4GFbZ$`GaJ^%w2oM9mdkON9u4F^nAvjT*ZAg1oq(YpJZv($Y9 z{srZ-t>ogYx_qb41xGHxoN9Fk%pIF-m<#%8XJQ&M>u^%T){swV$S^Aq)${y?2_g7= z#;@~A?V?aL4u%rOVv-~Ns=-+GL%Vc6KFcKBVsfFtxsv~43 z#7y|+vlFsv&>6XR>v!vGG&{UJ_C#Nv_C$ME7prF)Ke<8>)HUiP?op2^RUC3qlXdJf zYJ;|xW6(70;ouZ;>Qe0`Z-5~(jro36DBCy zsb1j+S$BrL=H15_x(q_hxpwt^@S_RfqR$B!S7vR(?u!MeU zRG^-oM9IkJF2^{y?{O6Vt1RN8IQZ;85*Oa*s$JI1DD?7rD=ZYOq8pW zks*QAznQMmP%N9)Ze7uH)@5&hxrsf@v)=V@wmlhpyJ>qy-${Li&{p!Q~K0SHtB{n;r&SJ~nZ2aM>ZvHmD*REon3+ ziRFrwF*gR6uYPnTt7esbBzj-vY=PGH^)(<_S4$ft2DCr|EvrFdt~m}8+Z$_;)R~jf z`7a2Rr4~?@)&u3yiv-GLMlK`El?f=9C7^5_14=8$rKc32bTA$|{&L%XZQz$Rh{A0?d%N6%#JPE}NpGZE{iZ>jO>33)23;g` zjPiMKJ*#z#K29L6u+4)dalj`daexbLOR5%?AWo4-hZopJwT_TlY*)YI2F( zL9g7nlCR|B@1lSaHqholnINUGVSDRmU z=g5u|7y>Zt)SA@5@X=Er?I$*>R@AQ~>8VW`i1p|wnpAJ}_+&krR3(jlv0KZCZX|U{ z9HX03{UIZ=N!SY?1U5CatO%FrnPE|OS|?f4hL5J^>^o^9dG+`q$fM4YBGru$MFJ4v z&eai>=VZtU{R(5dKbUBLz?k9#g($Q>pcG2Dj7(`G`h-nZ^Z=nV5cW|D5WgwV8UueC6q_%jAK;B%{>?7rj_dIR5uiCK;@Wc!IoG7K zIHnFR--6;XeqNWJ)srG z*lr+PZ$pIB#?B294&|AlfpA)Iy{KZcT?G&boSo$7x(dpSoy6K@O1~C}ZFQvnwviuD zv_NY@`vpu9{_~2HB1q_hRJ;+lH^3Y4oHg^iYiW5fbl#|1WB5*H9aoIJ`Z zoE9FFBpkFVhmRAHaa|MhqbA05G$~_^-o>}psFH#rqP<>?Li(mWxYc>pC_xInCSHEk z+zS1jrHoWnTXaGQu|}1&A+P165ita7M9VCKS|eK4A`sS+kk?6Hx&PKEMA)o0QivGi zM%s>YtyM?TK-ygTNLtmkspeB_xOA=o!V)mmAl0zDZk$WQ{S%iy?8<{nKY>k__V71r z4IPHv1~==E`17Gefh0x2d>xhoP(LOii`L+mQ~<^(4qM(ItW^Vz;f!|J=>zOJKNZ!T z>u<8dh$1qGAd=9|GyvImNbuUW@9UywBN<7L&6=CL29GxquakPh0 zsxg*GV$Kc>!Oz)mq17U_s;=yY=s&g_h$@4sZIaHk8LY9kO~T<8o>T?-egyoerTb9b z2Pz8TTS!5YENA0QM<#(T$)?{hP&NC4c*~@$seMP5I5%%~0?KlOZ3E@?LnrrRo!QL0lt*D8@ss#85blGxRf218q!ZL;Jo6G8-AD<3(U9LYw3fS*vh5CzD$3@sJ^_4YU9=Bg9uUaGc!sR!xUs+X?XbAqk zm}J6ZdfWp#2i96VklB1A(!aA_?-CB1^=@g#0y*=F#q}ub-PYjHIcaMdYw#u5$b4Qr za6Z~j9lh{mZRQa3pG?^sv7v_Ptt9p&p^i2dBENat5^Q5tG&QZ$06hT#73&oZP*i1_?$6oXRS(CeWw=4Iu1WlN z-gXntW4+KouvTJupOv_;*e`RjDp@f8v=bJLGg=nsw_tz~YDw0BS_WNX!N7chJlc=c z(&0i_CnROL@k^}+J!t$=U+avUBrYKAz`T>NbJ~@Mu=7I4!p?roI7IwavP~>Dl>Y{|56Rq!0)FT}UJ74$)2s;zR z>1H`bzM^_sB8s*y;wU|@sPpVPQ73A#pwrayS_nF+GN_4d5`QHH9T{CV(EYvvg3dX0 zND*s60Z(E;o42;j#? zEV#C+eAaRf@`nP)WV??roR+wQ&5>+4jcrE`Z@Gw*xWf(tdexz=_7+^1H>^h&4kYpc>G=6;dvg_c6v|UHh9;lmxsW4_>**V9*us&fq zutmoQ3L|B2!9cWWI5jdftl__f3=PSKgi0Gu5ey9~g88Tj9cwF=i_L8EvAi#HMI?6Y z*IeAS$mWqgsm&EC!rGu(FzDX!BrX%&bxkdw{aM75&Uh`D;OkmA-_BZ#tQ)Boq|7ND zI(%7$_qxgeA$F-cLMq1zrPCTVY1?NO#mp-QFG&5H2)`6z(A)-R_=Et@ys$e=Az7rj z(|5Mw5x>wJ&YVj*-c2pI-7ws>DmYY6C}uE64Pc~eBs!O*R)HC<#wk;{o`9}hPu9!O zsTj0J%KY1WC10G=9vdCXUYYmb6-p7}_%r5y7wOb*Fc0E|*2 zPVr15U>E?(@aM|V=JuPPQu}e(k_}Shrlc@?B!cVT7&B-*2b+8Ag*OEz~Nk zG72=nX>@cgm4xJr4qwyirlLF5rIQn>9?!;e6RlZm_nKJ?)93;K)5-T9O!@}*eMC*L zxN2)cG!cDm+9>DP5)yVNC5B@!$hb8@J*`a%j)}15J`smd$%Fu814Z33R;n7uM4hz2 z+qfYk1nFQz&RW!BQ7F8rS^YI14aANWGG-_cRpIUPLD>RK4A_Q(X1o`GsaAn(M}{eg zVVG{x6$IIm@c5hyN$;J;KiLMWg5Ct^1kFI+`Sof(IvaCI2UG1lN7a zWxmN?YaMW*>@l#onwKgP!!){dFfYNaVyIJMsKP^zeMi%mkqXa&o`Ruj`6E`mC;4`V^8V6VMr5u?N1WD8h5-RuaK!O*|8jk{|#S{f>8{{Yon03JZB-^-OT5BK1=#4qJ zWgo`oO+h5CpgxDgLK#EvA*(z|v;!3N)5sN2U1&&z6I+vUahJx*Lb%AhF8RUI5?zkef z?0`_fHEyMiVq1CHj^Tl{ZB}PBpjIsPpBLjcs|$qDAR;Cqj*SuAh7k7>J{kbW&Iqll zGsUnM4!Ui@Fa*6-w~K6%!BMeWnS?E7Un{`mj4la%#2rl(lcR1@FHxlPG3uTW{SeU5~uHG-UXKd9Lxg4M!P>WL^cCLsmk%ntKWEy-$oLy$DB0iR@A z*J3~0xZep1v+(4+#59riaWP??E%{lnw~)ggGGC|zM~ ze-onD>5Xk;uYL5ogZqwnC?Nv1{ej<3(d&S~MltqsnSu(%Po>qO`!8?A3%+^L>m2?& z&I{nnM6aXRd1J+;N3Ub)4i}ngxInm(HV};z0YPJ3>^kds+*Q|G=c>az&=#&I*9g~v z=_C2N38wCiRA1?o}-~rK`@yyS6we+nqGM$xiSD>7 z4~g!nkm!z4#Jn9RD_ux*t&po@ZWk#aypZ97CYEzdqDzuoGM5PpEX~dB>kbwq-PMEy z$?gK-S6*Wwr?f+`Se!Z=mfWNx3GH#6$k}U*WNYQT+SDdlABj_P9wg-YCsEj8@~?4V z&=shVNDBBX+F}|(6m2n$$9g9q0I!{=pGm7?IVSkrV%p^v)9kM}-1`1-JwYSq=_iVj zn1;@H{z$QNiD{^dz&d6Q(_eF-dr>98D=dt}_SN5yd9W|lM#pC&@?uTcSYCZvFLs)+ zF^H)H$BLZ2P_)phR%dLqs$~Z2pc6D?V#bg?^O|d@8S6nIJx-09X-SNnQ(M!JbA`i% z#Hg)d6}nq_W2o3fcv+^~b8F|MWW95QcZFDB0Bb-64?Kq#9bLhI>rPhs=Cl#Ovcd*FA{qWjdb|mv16DI$IPoy8E zTDX8PiIAFv$+P5`sm+65&%=yI5tDT`-$0l=<962xlYh!awvl=8JHq6p36rY;ycQxS0I|mn2N?5V{CE!s9G&axz|u@+KE{?R>VC z{XC9I;z8_~#N;vNn8fepkO&->4)Y~MV!dPX4mNLM=4snAvF^3)nLH*B@G{d>yNy4S z*5GoW#kob$*3MTFA2#0~uBTNZs1$E9o3%txN?tR!^Sj60&hOsH?L1X)Pt7AO-bHwm zBf=Ji_|k&_Le15*L2_1EivJ} z5cgBxTJi7IJCLy}ZDdQtfsF42Lsa+xwIzBwlvOP9m*84%5?TSHjoiv3s>ovhZ3mD< z1{LLgfQ;7GwslTdyAP9fsE#kKdmG_%GDP+w&h%0}vQ0&zO5Q}d&h1Iqt@*}l>lbet zRuqooPh0+ROnI-`@QER3%xWcD{|O8fbWh;qD4% z4uEgy3SaN)*ViQ5rPsJgllS>!i7y?}`b@H+-iyv$l4seGpj|Sz)RCa!QI?Zg?#XW> zBVfmQU$MF-0@aq=mV!_*O^ol{T=jvb}j;#_XBZuz!Kas8E7J9wBf_=B;KG zwk8_H9=6Zm=tBNp(}!W4DxbfDhDwko zY)e_Niu2=7u`&KQ{9FW0qH@C7G1t3XE=Iw;g|n0evZcuvoa=N5&!oHz;hhlmO%54c z?9xhfmd|=^L@REMluPE&geP@!-@kPJ6iF6G$&TV^cUpzKMQBgFxIQfM+uLW(@Ga-=JqV!>F&8=xJq0fpv+7%#BL&L8QIzDglBGF)qT>EG z5@s#iT+mZo>&O;HOgll6^CxN(vTq<&Y>=UiWqMThk8g*poa`_0TIRfpweG^(JlBn& z@YeCjvm8ovo@8GT{v;=m{J9nr-fUm+f~AC;H*ge^N5!&21fA78QupB8lF%{`c|Dh# z5P2`hvU7nrGZ-%+IV3^6^fX`P$lW#wZ(A8_;hX{XElUSmL26$e8Cx5dyPW)s*_KNP z+ky>!C&AZi9>@186MP|^Y{as@WqB{?&ui(RQ^a{nxcFC%a{&o+F7{;AoNK37tKH!&>|RX{z%_0>MArWt zvwNXXwWF`d3LwTa#gaI`N#w6?YOj1YG~VMqoms|K-V2{g#_>udS#O2y>Ts%m#eu3i z#p_Fj4m($-GY-1qB~JC!;aE~dh%4h@D9Utd(~GS#!UKjnnu&u#oA(IY8S3PxI6_PN zWI2vWCoysM6X&#YH2Ny1L~*uM@jPcsteewGQPOAl~{=HQ7Vn%hYhU#1m)j?UNtN(T^8JHorZ^(;Tt*9&h#YJP}0@9ixR|etS+X z2%mnn!U3F5=sv%lNJOqk;)iubXntJR-rKT6x>DC;x}ppF1TJkm(P>rv|C!Q-A`Za1 zgOJ2Duyw$A1=wy33_j7RTXz5yHTSHVK^I!l6_C6_*M86U0-1sJ`+B6O&*@4}Pjc0{ zUe#}Z5_67@GoyR`U8FwI4=5Ffd}@~vYq>d5Og|BxETDl>0wMwb>8U!`tN{6|)(Sal zRN^!@{FzOnXOMzo%q6t~KdnPmDQLEMPghU7pxNR*T~6JUWx_yBf%X1R>y}y3aD@bq z>k1Ma;#&QEKJT{CS9A3Vy}{%h(Ur-0f)(-xw3q9!Z%BBblQoL-?HG*ez}a1cxH?0b zzoE?%nAi-{@B#Cwz4* z8>K9`DsGi@h3_5++M^sUKIE^ivr-bCH^z?~@LiVimGba#=CCm9$fGO3?s<*vCFV6S zw>s%t<2$u~hy#3ifmhg>G~}IAdg3bV*43D&Q;>H?rDwR^6}OPVauBzxe7vK4eLO%i z%VFFq5tFHh>8BF|HvM1Ww~6LSNe6q)(c=IJy~adx4|2`4FYf^tnrboR8Dvgn*v zpy-~?F%&t~!G42Dj<7pi92{=GHXE6t*WU3id6Rr5qVl24=0&GFG1;4%o|z?!&t?!D zyaA20*+@g%th1WBf2IW=I?bxj<_ z%Q@zwz6h_6=v4m)Qa1`6-k9?`cK3a1Ay$JXbUD9o zSnPITESs{}U0z?_(En;qfH|Xh0C#|1{NP{@AL2$}GR3u0+t}{=KgX#A9(LI8uKUmE}amOL2%1#5QGy1e!v7C)eXMJ{F zS7dFNNiZXzN& zj!U&-aOoymGh`qXQ2}+`+Ib-AI+hPf_@QxjO;>a>_mAUlg=X{OkKYRa1w{Z8)xGFs&i(=^Ue5XALh+M0<>$xG^YMaykgAMWtRehRlJ%0@b2vR3Kv>5T1d>^p-;0PU<%@|>z_*Ao8 zhMT}U{W!j0hVpCHOXh2?Qyf!5K|KRgF#*Q+9E=ZqKO=l!+jF_()K1`>Tz0Cy8H2Dm z`WXthCq(!4#3fMkm4 z)79fl_O674eHJOZK224Jwm%IR{Gj96kMf|;5Clwq_{+kt9{V}Old1kb9%%%BU!Bm2 zsqk)e7JWsUx&ALe(e|??FR%Xfi~rldoxCMu5~{Czjf-UbnW`mp%D`rdUrNs+7xFF- zMWhi5z?-G~4xYz%R#HAEp<(5N<|jaIp;1V-*A-E9U#2l<80HYLb| zG@F1$_jE{UE=OaR>EbElX|u(^Ilg2zLgQe;cndO&cz?)up12fg$^GtuqWVbM|k0l z^r>IssPg`P9G|KvK2)e1sJKw+gsA~;A-6A*2UqCpe0z{Kb@ zz=iB@YW9K|avXF#!1xjigc&9lh&EiaKs5|cVSde1w75_CJjq7{%qwSu3;G%nWUb@MgC1x0twmIfwE@m(uCPSu-qHpk|qN_HO zinn;7SYYnSyP4+M#Ho-K2FySrp0Y%2mS&0gcq0){ol9y(C}vn~sa5WM=(?FX1Vpp= zL!vJW#Rnj=W6Zn&zd6?ns$YxFwaj|TD5cpviOiaZ%nA=+J(c;z%B*gEB(p|4K2}TB zT4s%Q8kzMrdJbyREfZ>hk~sKnA+Umr?r(@cLO&l2e*~JuC+WQUP(bfI%2#qSr19QTL1Ig;oN&KI*F(i% ztKMJ92aACZuy4~$D*``E7qzc_vAogT>#N3~BRV-d$-Ua&E~RRgqM#F7xZ7&@a5BTf zzT$qzuqp8sJ>fG3GRqxP4RmTr*XYcnx}|YRuxi}W1&trkGmSr?D~%u4 zmByt-FuVu2FscvHs)>zM$0YJ+2l{_2QHwb=a!t5k_6+Fh36gg2X=IY5%WHyWj z54l=*U-GKg>dN8Nl_%U4qJ~lzj=BrfttI$gvFAk~s8u0pZm`e@4GTKWo>msJ8*a&j zC=iq2%twk5Ylb?ed0Wq#FKe^r{<&FmOK;X#p)+c>fX--;HJx$C1StJ>Ts;=ZOtQGf znq$v+v(l8US8-areOsbjZx70~SMpWBSc|FFkX}G7>V{hI{CW-PMcQpNr000hXV2=Y zz(^xb^@l&Rl2u)6NJR8(pdj7W(vNmPTwD5)jQg@#H0qIQKDhd67L?Q_v5^Xa+-9;+ ztJ~^P-l#_ydK}I%t{!0oMm?gxOmm@8%5F@JX#!nf^(ZJtzyajul_cJZHi-}Nx2+z* z2eH;RVzS?YT2XSi#WSIHjZKkRwPkgM>^F_(u#*m*S9AC}U~X#;TDySf$7l$>fh8=8 z+5*mLD^)#oX5)aC;5cBIZ}5O-8^9pAH*gur^s=W@dm1xuB&~r#3iVxp)?kaNAFMSb z@xTSv8h~8$y0r#?TNel*^2;=8!#XuV`Pv&bp@(SGYt#fuZpP-G)C2}BH6g!bHKAch zKW^GmGb8|;rVC2Oo$O*_NG*PI)&mixYx5?+L&xY(&5&lrn$4=oGvcalx;48ds)zdS z1g>FuyQXb<+Zhk&Y0z`Q9<_sM*BxpH-{}sBlQdFyXfi0X+?8|Vs>nHM0IHOft@FzB zuQBwq3(NDzEzc8!w^>7K+r9+=*}Lhs23p&~`*GL5wNnZeOX~m&!Z5P+Z5C$CVjN#? zQ~|KBHjek@Tk3i-kn7&pbC}3O(m&af^qGTh1-VSU(X?XOzDOha+{j3d%tA#9?G2Sf z-Gg$!k`FD{EftV1UT+)8=|)(>`0$7bHrH5nLfBIyBe^6k&}5B~{D_m%^5$~r5Xbyh z*bv>iwizWmdEHbeYPQZ1O*J|PE>jB;xKb^emYYiVm?s3Tk)6B+JXLlGLB>n0k#{~A zf*bUw8PCYJ7-C}*lmJln+{jA)MV1AmF1qMit>3RTk_R-#jO1rL^p=tQi_D;9CVF@} zA6dyo!z6zHO3qS?#ri9Gd$nSCL74P1yd*=p2OB+WG^%Ditx<+!L8RYP+!|%03~l_` zDkDO^Ykk&&F7*Ydpi9yfAP3GZjvB;2R@+DkI-ivsiS-;-av?{ul7kG~Co6fv^2SQO zsg2{!ViT6rC7b*By8)OiWG8I+k5E~SN9v#D-vlYmXN)p%e5zS7VG#Fgjbn*MhFe>! z=4-B%ITy>a+|2t^hQA$Lq!(7-=^o-xSjp3(anF}o&W&B%Hda;MOtr8$`n`~8{$f0# z`>yG?2Jt|RosDR+jG}s8JNcm^$$*c?jg}iUD@lPEr)w$j#gP;!fpCqTT-r+`1wPM% zKC?6k1>%Vbt-g|^z?Q7H#ukpY3z<7Aq(HC}#SlxAvZZGu%L(8=vV(_#IP|13BXJIL z)^_kQ(=K(HxWFNj9X#n%F0eq8A|WWK#X4rGo)uA2%8#{5gc6$I=@fAoYjUim1nCkx$gjLq(F;MVqP*7tF6st+BOJG3ZN1twkfeB<{ z8Fk|hfW}@V7=)$%2+jf|#> zx5B2&F2Q4d^-CxO93jEIocI!O7m62>V!xW~P$>G?l@kA*f&?bJk8CWo8^mV_hO75p zsp7tO!Z~Nbo2vhag12mMx5LN`)o+{ahOu3OV3L1PKQO`QixO{S+#wSui5YEUBbnHg z`eF4RYqyOHvUY3lmO-$0ozvjb4D+wvWdN-0GSI98FQ!ZV3bUEmbK^4jkG0F-m_;}n zFdBEp2u;^pCSIk}KupBbE+)dwh>3*s5lhE(ygkopmW3@r(h_ZEzR{yRKv9&1;^8~Y zET!r8`tMN5hX?GYvFJCgJm{wkO-j@CCc=|w@n?Iokyq{ZG?0s?B z%kSV8%-|8E{Xno>(G64Kr2|QfE;b7|s8L~K%?xM^p$PBkU>MZHwTWlus9z0F6h4!z z65GRv!A2Bc1^ep#ja_ZFXf$uEbGKPfMiQ>y5a2G!yC#CtsLeTQ^SQliXwL_Sz4NQh zotEO}5RbKBNSSW6+;f`rY zNsb{bg@l^w%yJXZRaC3>17>DfSfKY@6wy^EG7rliEzni-Vcq`!?7a<;UFUhvN^FHq`ZdWPwz$(kQd_q=*Dl~T3U;iD^>-l;Y{ws}P zsXF1f4Q`%@o3;r!x^*NwQ<%~Ek^DfnUS3Ds4fUqg5m5ZD#m<#<1iyU{o2q^^OUPub z&JuEE0-#6|9QpB}NRmf1AI#SK>NOcgBQWIpZ1w9MT)e?}Q6FPeDPEvgKgz?B;|1#N zP4tAQO8@@)u^($*oMH0oM|rkJD$;ml{7`v&a!Z)N%`Tasb5BixmO8?T1!M`51h&di z#LE$RKJNpJqj7qUw8URXxx|jDCbIP;SJBBQ((?(7?oE9ha8h^fuRp>D^HjyWlW#Zm zg-aIfk&kwFo`wZY!-9J98{@Ev1@B*PzI+a3**#cN*o241VLeEIqQdxbb|TBb;QJ8z zA6Z#hIgYq1@g}i|^xnSvb!xA^cwx2gw-Uap?n=HFU|fBJ?RX8qq=tT%7JnQqrJktad-hg$^8sqls-_kODa_LIY1tUM z>W?TzfbF+aWRVYikq=zh929lE2mUHk&)GKNheB4+EdC(aGBIIGsS?pdrc{|_G!dcV z2gQSR*Ewuc%04~RE4(IC%HLr~2->{&cN#;A=cRagb`<1<2tDM2Q>-UBuB!jEkj=l6 zpqtR7lGum1QPm%fGFis7M*RJdOY(5ex(pu^U$%!MbI?7sB13GdbgCXg%mpLv^>q?V zeYZ`KA-+S>c)jli^DV<{B7ivOf&g+eCV(=8#Sqlp^+V8aS78VDHNePb0Pm%z%wh;wzNnTDA5G%ciSvX4oLLvq8 zGlMM&;6?1KB8G_-D5RRn*6F%o@RkTb*(B;%A{eMX0{>eGZp%9{{*(CqRhoD>A$Ui~ zfpo*CY$h;hy`Rbh!QbCt0`v25JRoB8Mbg}oHb*m|;Y~yoyHjY|n}{jLFA-B5r&38> zw-Ca{oww61b{dHC0;?6m7FSLu*#h(QDmorsg-=x@MKW-AN@KamM~2qbs=uqE99q`F zeXLi6nEZ{I(ojqm`O6jxQ3RJr-;XItC92{g6SpGjwD{)YVQEkh`OYTqof2BX2>#e{$9dM{z?PB&AMkDGm^#T9k8%x-h}Vy( z5Z(QeTsRtPjRL2yn1sw?pXy+M$_-7S&x{3kMr37IlcKo zPu&@tHRWrkjDVqPZ}DgPmHj-xsJIS){{pAIcu#tXH9E{P@IDB&xA;M?^oc6dp=!TY zT+((g;~H#*Y8p=GDf)LVOB`|8mDm5qWh}lh=0A(FecHz7tuvLFDB%~HV0nHTmI+kA zaA1wrAoi$v1u!H^`FIkP!3A*Ll#-F|87&W9|2>XY9U&=w&tPe=`|URf-GzypAdS}{ z#0!DAq+_EAU!i*kegL6ztkTprK@HiL#uKB*i#8~8^J3hnxu#!kdt(89UE69Iqww1U zIo~I)y;N=3b_xQImRYrES&Q7XEMv(xCiCx2GJh?qhoD8(5Sm4eA!u!uk$hi|?91*J zAdwv|f<^6cVbxb;_<__I!h(coA$j8m<+=+N0oa=E^Li&0sQ-XRpl+XqNR=D>e7}1v{FlHPGFmf7t)HwFItiG)wB}Q*Z(W4E5+h^ ziDbym9Rg&O8Gp~4uzbiRS%6$~*$1MmL2gch6_Y$GrVFQgMIz)nD7yR*{t@wR79d+g zI7S)Vul{Ij2pDB4nH++=bydB|5LT)f!h{H^!;piuUtS7cCqgm=C^%1k%+xEattAfoyiZLdHds-F)j+VZR#UKwE0|8Nump2eR0)&W2+CTsfUu^>cdU|6Y zKrs}MONAF$R1+HhOWFtC#|PL49&YRdLA;|nnawBc0}nU$0SP{`4@fYwy?|_N$v$8t zl|0zC5A?(#5cR(<_JNtUePCvO;o8foeG6nFp=UrcxR868G{4kc2tD2ZM$`N{()=(q zY?TdxRTyi2$wqTYRMNdoRMG={g_U6l)m;~zgf2J^OA@7%E(p`vD)0U%nbJqwK$Z1| z;ZZfQffugXT`o?ACy(jtBDV48>B;D%r(o8*C{{}t$&wzJ1D{l5swJ_=9JsMTHEJSt zxL|X!?89&xg~KCC7U1I>`afZpA$`KsYVTtGqadd|TW4)p5vy?Qq(A&(l)+K$^WpCo zToN2LJ77N_W#*{z9u}V~#Zm7IZiEz{7|`&_Z89xx)Y?yrsxQIabU*E(fL_v6{da_r*6lE{nt$VIox7u?B|LaP_-X!iv&ggmt z@?=*tfA=5qh8h742>*ywZ?1hp1U8*jv8|YQpQB?f%OadPv za*1nn*anVF<7kOyIFh6tCd%I!i%XcB;wdDNpK=XLzppFbN3}*x)Po{dL62H7Wvp+ktQLBy zA{J45YL@Vx_(mX=Wqr@wCh(^6&7vQ=cM=NN7y342=spFLGFpvG^8 z*c7fN8rmfp=>E3f48PpiZ?+gOvg?>6!u8bs^{T-wj5l%cCe+++Y#y% zthMdn;&p><<6te#b<3xgw|(E2-$zir4ng&g{-3nV`32)5lqhgTP ziHLe>A(uVmwBKw2kZ`a)d%*_DsHa$j2!JUM{5VEAP3=1O7>HZRB24RDWYDpDi~>ot zxW^nzQ>uTs$B1*ls-$=#{Yo5q5*6ZY#N7xs(vNb7O~fTJ(q?}`xWi241fZ_%3?DSG zrji7N)!lJRti!$3D{0Fx?vJzz77tQ2U1=4j&)_SWo%{@)wsaggWb!bUj)B(wLY}4S zEtZbC`MPdW?zN?5JPD#O)lqtXf(hUrf`5DQX-~$*6xld-apZqj(Q#8}1)oeE-SbBb5lW-!3V6_`X=<#xgp#0+Pv|b6kpn6THLLDQXbGp>&%MQu zs$){e#CbH#!*&bvq*`8sZbk;_X5kjE5?eDdcS?(9;;?ab4XWo z(D0u%9aVM|IV^aA5S$JOGeZXi|C$k5$}@ta7kP}0-1j8(`B0GR&p@`5hI)zxSG`#8 zt07+LVM^4rM|Dnu%sv%e0mOv5dzBzYfg6AvoG@+QwjjTLY|Vg{ie{Kdw2Updla{$X z&PJEn_(Obzol{yT!$&jmv64||%$FI;nlu^jYY!W3{Dq;9_sBeOFqD~xe3eWNnF&Ed z%ee{23se%c0~*{XT_(Z&L!v!8`eb_>;v4EIK$J+MkX-(*g9Z(J&4?aT_HP@ckI?Qs zbP&!dLhGFnw>d z7mq~MPr!8ae5n|ZC{}x2&ovBUx)OC0({e?JL9$`tb$oypBPiWCTxup`pE(GLl#vus z)+;Suqlyr^+G(jG*I!;0nQc@Nh42xw_Zw&*%MorjQ~%42RFSEcD#BDf1~jBCA~^0v zNhIMvDsbVMW9^c*f)aBBUp8Ay6umd!Y%TF}@ZA&o4salHZ}PiFYdOLyq}@5Zr^tV` zr~C%`ZlzJfwu_!`mm1cJ+uPob+w0cwUXxd+JAz1LvwTs{DsGRcMaAtEj@yIip_rf< zOEKX{5J@Yng{dLN_d>F(wf$y`Mj`XNB~`6%eqFJAdwAUxjFmU&`d1kytq`QwyUGIb zqy|P~CkZD_%o7}n{T!+?ZCL;|+l{~hQBvH!lic3Rd(u*}?H>8aY&a1S>akWLs{v9N zn+~M2JPa;upia^ebqTy5Z4bp!d*c_v`m0IlO62#tAV~=D2{M;{#!mTUErzKiJ#4rz zkc`U)5ICkxacRE?Xosxa?Dtq@(lf$l;&~fLCf@YRq>W;~ha>c#tf&z5Aj7XMcc+~< z#0i7@nRE<9AzSoLV=)$u!V(a;DGwba&l^7QQjIr!%qSk;8$SHH1&~l##y&XdqYWwlJH8;i3#VM-cRbsxAT+(wBzgsq8NC|lD0 z*x%7;f0>qPpzF224^C)TE0@u(*2!kDEX!uFEUsggWsy?7TN5cr-TSx579V#1j;4$l zE3J$e2~l7Rm-g?&6a71U<^5~r|L|TN@lmFad5--$fp^fhnSs*ij2!9Ct9m8{;1As4olx=zpHc0=={c^A z`AW7drS8s_uV)ZLQ(}#$C6S62jV)iK$Q^(BlrW$AOq4_csub93kJ-Xo4Pt=zJlkUc zxt&90yaEhjcg#FAh}|(FHuxWcOo~0n{+L1)-wUx-;FkBt6!e8qR$m12Jrp_qm{saC zz)KF~<{5DxL>WJWdov(l^E=dd1|)5s5i4g1?`WQ($TN`T^ek$njWRpwE`*70qmBj{ zS5Jhf%`+`~%SHa3mMgWKpJ~~#mHC;T2Td%Xu^FC&c7j$9Ak`)N5RG2BT__m{q{ zry&dtK?$lsM!OlhV&cKl4GWQ!CRK%qOCla5BoNtY_S|ehK+66D#F@5i8MJCgV{L!K~!Tz<$b8*#6jZ8IuK z;zwVVYccngBF6~J_L$2c<=(49jQ3UrKQZHDU#!50y*dz6Jgw`qBd;}Piwk@vvjsJ* zfGlZxMmsX6WpT3EqUB{3L%dMts9VnYlK>LAKr(n$FCcjKC{8UDBXTKa3j=^X=^Axq z$-?ki`XK^<{E?iPW}UV$kO5s~pmW{_{{fd|3j>B1e)%ebZjM%$LQ{ODlur_&@s(Q` zF7fw)d`{{B9_QA5 z4fmjxXCss_mrluN4q%?ULj|?RGdYp|~ZiXfswV`V4hP;n0=m3_!iP#nN|L{Vd zLA1=n3E(>Gk}((OtEJ)vST%_=b^8^x^LOf2V~={}=fs@Q_#ii|qWP{>n=MK7WuxjE zt$pJUl{n<=x({0;QJv8(YkP;~yt*{KU#x3o>bWOr?QaaNeP5f{V5izRzaOjNWr!?T z08b?N1K67ce-Ia5g7J^8fqZ2m!O;^9ZV+vrl5+_2M;+rnDMkWOv|T_{2ZNMT^^tvy zpKz5{k>c;TWiV|06??lWe6}?mucBvgI}g%Af(o3Pm^SD@7^LM8Dx^A zYv}9`-HMPNH?{#`0&;@qNzmmP@)qg-5+TyUt3O`>QjGHr>1MIy5DKl3ERrmf z@@;61u%aXod^CaN8DSsg&o=4)o^y$&gC#Wd@cD_d$@jO4`NdoEpKj;-`waZCG#6B7 zntXrm%WBF*@N}uZI2EBaR8kQFEFs!A3I9l+$Lh$F-%9xR&f7%@_*U6|zg<6{P3jF= zZliudFw^>7s@{Bi+xNCV9^j13wv-{*X6Ui&U2jkxD_>9^DPNiLSoczD1r29SJ>J4J z=7fJ?yV@k--+hUey(efHM8BD4;Z;^lu=Hfb3)Jg{k|?&uCBL&} z2fGF#3|mlZE9-|npigUKFshrx`UEjv&UvP+)UCE;vfE;-g1 zvIr==7LQP4$a>bCOfb#%RU5C&Y1ka|3`3JK>vUtx;@htMN^N6SZ_=3cI2~x*@AM`c zv$SnA_SD$@4l)*OMg7pm?)R{AA)8LP-?3+8eZ@ZZmbHhj1E|=T_B+CyQ6|n3;=7T#PHIR*=yY-|2L2U{0yijA)36EJg|;e{40KJRT<;J>$Q6?YU~CH1yoTDijgO-J0l1hkHzr z>}w-2m^ZZ%#X<|EcKG$dWbOWwjQICQyAPD#gMWGVr|R<1VrTw92bM(e9fR@vu^&Sm zgweQUyk~>jT=MZ|7e`tDmP?K|dp$}qb=5{m_)YfWri|VSP1$M6uAvNSo6FokgrfVRt8$f|B2*c>v_)?9T7Lg6O`kr`lXI^j{+0EcQYeuh zzBT!q{2<49_BV;k-9NadX%ogxchxi};V=ujJ4MU)a7!Q!x{r{0zy(oj7jguE5ScBw ziOd#;&S1m(dZ4`HO4bWvi;VLNx_`4x7r2Tvw2JtJ-P43MgfFDqom^G9tF8COD*lwrXFF&zlm+s>$ID zlwhsMd#a(RAh&VhC<4IW8dN4SL>~~Sj;(D#*au@A>-yRkwr{j8+^CrFmWnssUT6ai z43LLACCx#H_78EJllWUvF=PTlHIqe@+Rr4#8l#?Ipw9)M8E^qGPz&dW zC}pW!={=)u3QEYe47SDD0AB{UC`=aEJ$i6#C|%HK7O-tmMJFj{>F(B<)mIV`t)E>S- z6`QFQOBX^xB{ULc9)r-#m4MKrc>`6c9ql2bmi3ESMvW9tifv?baXcv7$_oMofQL=Z zUVH3j1`S~McaSfgnHrJ?Vkd|UICDCW&V9`8O#Q?sc+U`pHKn%rGwcFb*eqvmDXQ@< zEQY8kq)ny88H5#MDxS|7xfcZxaC=1|^VDO`21H5$>?7_8jtSE~pwuH@vjB8RU?9ob zY$6wE+-O|tIjtY?BtQVS6pZOb(ER(E^~gqgp1X3I2|$vmyi2o9#HL~l_z{v3c5|CE z4R86G%3F4LapL$zW`Fj=a0cow?SKo6mHS-eNZ#|X2ml<)NWG8Js=iYLa5+V9aSM5bz4eW&{m;#Yh?9y4ytzm=cnWvuS`}<9(4J7sOg8 zs*N`fMz&^VPD}%^4W=RZMWl%-lF-}iH3avZ;bgJ^S*j`6t~c0dP}YCyk(ACyfCZV} zffbZ#R`Qrswq`lutLElm*F`FF*;k^>+AA}$yZB=pb1^wwIs@ZzUVi^)JN#7RhLfYO?^7Gw~zusUC)oH{Oe7<-FfN?~mbfWpoYcrd z>nsa=|4F_VR0($2&yb!#<*+CS4&CrXST8u0W|rmMm|5qD7k+jwS7r5Zb}*>ua6bRI5bG~q$WDtaz|8lwCs^J2CQIDi}lue)7ibt=lc=YO);=%gxRaQJ0 zIZs*f=qb{tA5&w+!!3v6fqX5+qZf)tPuT^fcmN2YcyJSnhaogDM?)AiipR8G-jCC( z(K=i*);daQ9n;dZ6-3k>k^ey~#WOEonUmh+)n?{l$h{V$?Mc>xiB7_jn6FH2ZD`W! zA(rQv&Z=deN!|_?B<34{AmoSWWi4;29?F7-3}iA1>%sn$9$>!X)Laly=3pK3HAPPo zH>F9@#BtMNzGzPp)+jp*oLjx&U`!!y@)w3C0rG;DA^r5~pA4W}F8(zw=vy!gRhW5c zK`FR}Dh#xa%XB97A8?vFD!3Q?e8LbJ93Yl-a7|7iuII3@i#BLh&Q_$3+WOvl@z9p4 ztPn1G^)G;L+meyhtI=!~Gj=q=mb7vkt=&;#CUJ|$4Ch_xd}6;+_ysx;4s?(kP=0!d z{Mh1gPJx=J1j9Gb39GXjXTuQaVlad z@ghw&ws2A^_4L_ux~d26P5rylF%~)fMl*GwQgSE_AFP>*h>b}9sPzYiP)e|{GH8)& z1nX=-{_Q{f+^2P9sN$M>^`DqvvWzU^C;^dVGA|~xAEFRM!)2hB$}AIjNr`7#xTAbN zE$V%eg)Fow5w0N80>wfTaL3OoL#zm4LKv0=478bK$wa@P$9j)Aq-3>(5;bw#?)OJD zKzb>l&IAGuYhsX5S%9+Q+52O^mB(_?WBGEF<+1DrA=Lc~S1FPq!v>TnU_&ISfekqo z8%bKSw%(Fh)N6}Hlu0aNImcpAti6<&jj$kZ=7+qH`T{uA)gCU9RW-8Tf!gNb0xuQq zQ!+302TO$Etv*7=&U#J_6VE9v)%w?!b}_3_!s)9rs%ZwoJWQIGL$Z@aD`JJL8S21K zlqyMfm-h&?0;8y1Hr5oYePxnePi9v1Q-(+`U*M@N*;%QX*dm2C#2dGWFbJ~q7OBn%zLq)LW3L&v!$-I-^p3*pgJnAPw@$)eu-Pu0+>kPbXETb zPuaFw)qi8mgRA*Cj3=a%loS-vWGN&Ti%>(1PFzoZ(=((k4GOC)?z3;j&+9OP4- zNHoy4v}|rwb}ICwb{B6{7olI#MFel55gWGM$G7O}O`X&yJfM$vPxg_$%Bho^eyb+i zy-e*#FSn_enVz$Gn|5Ui#c>q99L+J6BJsl=nhIidowALy;OTeQ(Clu#W3U6Dj(IyA zj&M{O z9p!=#Gic!ob}ag2)=2f{q?wI$;gqM0?u3az1NOU%4~cRFVjn97{;QA;UObuz%=ZI% zvJUSqzP|x-WPFH#qz9ICb9rMxzQ!z3u!Mb2Qa~6Wn~lq9<%G>PE{=9QsNuf@{bEa9 zzV*R4aa8@;gcKhZonsb`ro7YH1W2t$; z>wX&`a7THBHP<(YW(GpB37L~PVK#Pmz(pEiv$~DWH zUU1-+#Zqq$GxQ*tT4gSb|Ci?)3kQdNVQYpG(n2uUbS$PVM*cBFQ=5k5U)fuw`PpMC zlfS=Jh4~Gi3QVQUgixcoI&)u2Os2R5x1r? zewQ^kexLI1qR;w$%EaU{Lf91C@e(0Shf}<4AuO7bc}>K0Y+noV#fGzxM9B|3&XLdd zwF9Q~RijNk0i-nA6dTzpeFng%d}ffrdhN#$ar-D!A>1;2$mDp{9M_;ZNrfi(c_}6q z3vBRbUMwr-e73=2rTOc`WJ0%?U96C=#>~kInL}ANJkA`HcWeaAbgOWZ30km^26-6Y ze1euc#aSdAejv!b%g}@@i$*5(kWWd1i)Urb7FZ7Pg!hs&6tNTHO?V4=KaZ$5$G*#enTjt!qw}8}&p&;SO1qU6K%=t#(fTop! z)c~?VT3rdHRH#WS`$We=DeoiaiVm+32z8PuD)Y5H+;=H)1`ozkCp<*-*JGhwx- zRT1}SuL_-_B-S&Fx2z~-v7QZ|ufO6o7k{U_%f$n%jiuWxO4#;>-fOwSj;~FnTRsfi zf%*GOFM!5(eK@`lkO7*%8?pn`-z+-`Gwwm|c)VdBcY@YJJO)v_N<-ld1YnIKb;iCj zj5O^+%h1>XHYha9{~cJR<{M(wXhWyNj5&c3t480+c}AUTI@8QEgVP+JOa_km_ShzL zhomtupft}(cYuLNYHD{lfCqHL;VRXs1w7$a^9~n9E=e$Hlz{o+cGkuLWfE!yWbuGl zBv?#BhZMM-AQM5+$W4lOk`Be33f2Vl8|%N90KG)8{(mou6R_XT0lYcvTNujx=8-YK z;XtYN{07!C<~I+~IoQp6Sbl|e2>WVzUp(iO9@cJc(0-NBq ziQxGSmRy>ChQIYoe)elw@>Vul&EMsy1%%=*RK;@G^Wyja-aPxf!=>H{`N%N_qp3u1 zNZ6623)PI6DnQ6T-qQYY0#x!F1{F&Te4aV(9(@+#k&s)nTZoG*;td$ouUQl2`0~MJ zq?)nQu#~bY(~@@Bzob+{1O&$|y<(?f1+&GpB+hImJ(yjpR-80s7V&T}s}R#<^O=?X zbhc*qc2h7=0pX@i0b0;({b;KIg=w}XFgw37nBC3ZdqRk05Wbe*@E3^I!fvN|!ep7A zW|ggj5)9H!$!V9+&s;)n9qpW1t#}hGINuq}S`uSF=ognyIV% zv$o+gpjJr?A+(fuCx#HBfJ@Y#d~bOOr_1pWR=L;ucnDD5ONQ{_v{D`fm<6|&NE7u0KSh*Ic zrLG(vf2EZpZvrbE%&iuowy6*i`KZIPYBvn(l6#YMxyAVCU=zmGH7NjfVPIgjB z2WE0sMh8<4u~X>#8EE#DY<~UMi#g?gdV|xonZ7A`v!-PHP53n>5-=r^Js0TZvjEmU zxHEO7AC|a>ORz>(lAn*;Ybjmv$_-z`En715g3g7HNgUoVm}1?A*HHqBsN;%fyk3_< zpJWYF4DfSR^m8zU7+sg|#p+adhYHnV*(obWbM>DUiV>WvM_lSTeng_l!=>W>hnXbp zpcxhQwQ#?B3$Ik^`zI*X&<9k0Xf*fc;)#-){-S&@@9lI|^_e5A*|1(c&Z<4mf~4-w z_W!w-fmt0cV$&)4ui(Eq*6HL_Hk%)wg1pdyJlS*_o_2VOY!%l!L~gk_GG(be-u$eE zoAkRdsH*>nHvb|(cF0n2JsZSR=%|gvsm0m8s(uq}K?o}j|T`m?p^|LYc93v%TW1jgLR%l@XY}G6y z)wqe1+%6Z-cZO;elCFWD?~DRU^wU~y8NaexM%;bxFipOG|8i$Ek5~Ct!ArOP^Fj$j zN>+N7*CAy(5Tb|%&r-YU1=!HtmWw}dqj;s=0)g$Ck?1dL`R9hfc_7dl(wTK1pNWq+ z$tx=RVn=TZygfKAebGOamLBSgEI4IkVcqMaaZ4#yv?*I%>x(o{GH;Kq0GdVr+rlQM zQhjmEUo<}sPzg0IC^p+HcEnI=3=8WN!DJZMqCvCh6{bPI6@Ly7JOhaF+aoA|GOK=x zM~*4!prT#-R_Hg=@*>kB=}W6w3x~CUgF;EfSXb+)H9G3yDXLNTX8XTFjkyvnL(|yt z$;Liq@K*hN$_(}28-t`aL4JMOwSA7yIqg^TtGd|F+0n9cZ@^iUGoY$hJRt$?5KFq! zHAOS{gA#yns{nie;Kl{aMrTb4FBZ1U4;H-<>LlU0n(4K!`n8ygSHm!riWlbVzRr8q zfSJ47i_dz5P+PY1pG2BiKWA|JG-qn^ByYu>Eb-;-#iv*q5PLU;dyUxY_!7l3m>Y{h zA@1bFZm@WEUg4#c{D%`Lx|$IM@J=ZD`B#LZBx!M92(tA>AyDhu@!avpZ&ft*J=hzJlxia^f8;M-WrqKy@|i6oT}l%fxG z5K&Z&x?K%B9a!Jx{zW%N{ou2G^I7eZ4c;zZOZF8%(h4L}kMqF_FQQbbI~wd)iI3Fv zVnxeVsXaXSw*@^uG!MUPv2Uivwn4~t>-+Qm&hp}nso*j(%<-+H5GE%zD*ij4`0ueP zymL$oa+Eo4maCAnkOL&T!Aoc0!Z86-)DLZ$DJ%W2fDy9k`~*CCUdGaL0d=EWe^Lcg z6dYUxI&nX04=Nv?Pk(UZoh{Y`DbTqR2~fk{{8n14*jKBo}BtvRrVcE6Lb$ zL4C^htmkZf7Vnm%P(2&GGm8X34#JWqv}x>wKMNTsog7&orp(6C-0%@i0KD|*)QA|E z<9gz{;!=rO99twDVX7n_DZtU}Q{Z?ZfurufQf(k@9BX>KDAf$i9?KFE!0CIdz|zLb zxIn$S*pakxU8Y%?lp#PNZLmWH^@wmib(TS$)fG|xSzRH$XSxEFNop5gUYnt>9Q4P~ zhnQT|8Ilm$o<+_G!(lgh3`jmEox+)s0{V2qz2oh1I9AUFH-@U$(n~}i7oKdpiw{13Ip&! ziA1+hay&f-`S^~3A*4oEQr!u|n!2$jE=Uu|ef?}wKN&^zky((54+LmYnl*z&qBQC{ znnqRs31ToowPP87zW*0nJqZc`yd>5`Ym6~^jF zl#PAZIA*x@Htm=c+lCAy=QN45UJm9C4i*j$rVl!}K%*Z_v+RQ{!|4IKta^}c^_#kL zHjSIFA&4kOiAtZ<9AF?4+t7RJ2IA>&Sv-yQ!z(WUUqyud;{>ngm~MJ8O-JhTt_S5R zRu?wVDaP_~q7Af>>_SH7^NBVPYXuKgCxRA0NO*0OhEMY+y9w*95WCz0^o^40C)HpM zf3l8idr;_u4R=1{WnXN#^A{^AxmV1c;rfX?+sf4s?)*%})FZGn&8+xo@>))C=hX~q zOfyR`orQO;0;VH4G#{TaaUSl}3#`Z1YJX<~hMm~-_F&W76D6At4HH!LVdwQs{|yPm zY&{XdPRc2PNQP58LqkbbMA~2nnIA>sIdmlk1#|SIU%;@M_5n> zb7OwA6_d32(TkVxqqh?LmPLr9y#t$ViGs(3cv#)I4T<7&306x zg@x@rgQuWI3bhKNEF_kF0$*3ikb!j2i7_QiYCa@u0HA~T^fIfNuY{LV^{d3oJ>9P! zFQ?p_#%I!c{x1Xyd1}4i) zGnQb|;=pr3JLe$uErCExHZVb!rC_heTWEK@jdo(r%f%;xy;hS5cPV>~C;}s&#d^ef zI_UA(YnTPuENZs}fw=`kWC$&p|6WqdxZ`hKwBVp=aWdcFzrl4pB?#g)E*WiNN??7q z`6ZF$$cIo1X8KJ}g8ytL3z^qO7uQWA6O1?8Mn0O|DKl>--Si`53m646=&>Pr8=!!M zW@(?Zg*etT$==NXBqenYigTBZ@GyrT0^vb&MQ_-VT`=7uJXn@s=AY{-f|U#-UGX`R zXmy9uR=n{nno~b75j1GVAG_xzozDVC z>~KN^*>cc9mft`E$n<;!!r+QB*@ECV0?1J###jLP=*ts85Nxt}z?CQSKnNf!6tO&q z*9#ykZZpgS%_8U&iB~}YdFrq==QkuAdzAzb)auI$9zYFvu!fbTv2VW|0R-<^BY=EW zvGkCyi{(q0G+F`(jla zx_{LKkh5vQvjFl3iB_N0;{O#EK&IwnqnW}-M7G)j$eAEtV+%+*X#pt^LQyv5pRhC7 z?qNq(*gqjvG|XefE^(VIAVl=Rb5|)s069&72CatXA~Ly}k#X#w_`H^iNYM%FN6%J| zy!CJc`v*!#sQ>d}0g)U3tvIgRjtca)wpoG4#N5wWfDx~x& zO04<*L>`gM3Ub$CR%mf`N;U`-z^uTV)@({$ugFo+DXJ2woP%savKl)nlGbsFlj8h3 zC&j#+6rEzaw1c9lrg2a-^<3UTf%@7R&S+5w)1&U#;k{wYBJjngDpYTqs&JLqRD}|2Qx&XRUXn(2!*qqo zYMle0V3LJvi19qAg;}p1%P76x6vJCqM-(thPHR-B1pw@dK9z^(Yq8=mfLBR~@(5l% zD-InGD~<_9vf?DX6XJa4)fA#$v#}5*zlvg~UcN_WrkNG z;gK=kEi_mMd1>O#LZ%x)fV1VmNq#b-$Z}u{!DWpV8c{K6R`8fYRcD^YW}@|Gg^Uwe z3_|g>#lS8RECx25VlhB*m-0VtBU0+hC1Q)bPh)2fi;^Yvf*uh**p_7(C{~ zcr*A0vUqgo?Lc(CrFK~1u{N933hAVYR}xkTG9N}g5hU#LVTDBZ2FRq3AGWyBge?8wU!{m8lIw_p zU8SHxYLg4f2@$et{s6Np`m$WScLTlrYK0VHgPYXLp=LPwk&Gv;{!vVb$A9#Y!j7Z< zF$x2XZS=fP(3nh9ft`Q%l^`cnJ0T}q{2QI%-NsEe{s}klZAJXPGqt)2W`6ILBBu5V zw&Q)@t_GKjdyHb2M@zPbO?-N{ziH6&ZGV-}l6aJ>h?dl5v}9XC#>)LnZeV5oDq>}W ze%W1@(QiYn#0&c$9V?0UbIi=XOO^C}hQ~%nf78oS(Xn#y47mSu!&2F)|`x zSeuhBwp=W!MY{;P_R%aCyJ2@?aWa4B@PsX$4V3aww}~rrjJ}0=oRT@NkyeP+@5(Xf zBHB<YIdAc z<+f~YcfrPrIilr+V(tJZbWaA~`1`H&mi3InkvjGN`2jo~+F^ZgQ3e3(1fLsm%@LjZL9+1`rZ&dOgm+$A;o&k zaXZ$U?LT#_2a2*4WE5vB$i#Zsw~5#DQU&?0#l=mOR>cc80epOG-84c36)ot|O@;_+ z=LU(Kq*XfttqMP@)RuK2f{t2Bn#bh=Bd93C#O4%K5zFns!Mvd&ytgyB9Ue-6aZ0f208dXZi z^;w++n(ctj>ZGC>aF3h+J44uVL6oxAt;Z6EGKTwa)4(?NsTZEAP7~P11cL|>TBoSV zvx(a0^>x+1m#W6hk*c9OS3`9WtEu|uP`>>Ju`QBr|_jd{OsMytBFz-NwpG@q3HYonKc6~a% z-*~&HCP#{_H+`m^p(nBG&mYCG%eG@tD5XDZo1Dl=+lKEv>825R0t>>8g_(-}4sOni|t zqLiJMRA)o*vL+$3rH%?n#GuL6trT%Opj*v@Lu}dL$}Ll@Qj+rdj0q;Ya~r8n3&9u< z0K-FEiaUzG&s(ImdtiQW9mMl`1-zQU1Je&g(ky1TASW&FrMzga8KsDPC{y*3F@8B8 ziol2tG~+^_F&@(E(PA!T2CIkSkf#gasn&Y`p}e(M$G#2_7(763Q!*>XfiUq-qUD{t ze3XyJ;Px0l->}yc#J2yzuJ~TTDzAy#V@NR2LXG2j$Vz}og-d!ISY=zp3|k`y4|<3%;e;w5uMSXY;PY zXuJG3$A8lYis21x;9VsfdgqoxEAsOHQSWiV7+qC#U3;%=$3`t3M3a`JV>rvZDCjOi zpMN@BA{Byy!)fjN*8U#SaCUVpOFQ>Ycbt3YZr%sL-7M6U*4ZY_7sw-=f(e$8uZ^?9 z1-S!`)#Bt@a7C|0hIT!^YcvNea>H?i$|^b{EJly_YBRP^Qv^HjFql%B4uX{@i;=pm z$KzHngV-u%a}xPzMc(6k*DDI>3J5>+UJo7~7p>-c-0%9EVle9@FG6S-R#%(Rz4&b4 zMeGw8_&5-xHtvLww@?654dV6GF&&tlI;LKvj`4*XL3r}HlaKS8syMDIt$?mRH2s*q z8Qfq0@uSd54jk12_OIhKKSJl#F_=+0H960*ppx_x53Bt4>Jfdfj|qy_Ew~)1k&!2y zB&a)Ds5y9!!&yWx1#0vk*=dSat$AJRYy9Ykt+YSV=t1q79 z>Yw#GoY!XqYJlk*a^6MR^XYm{*OMPnC)ZLDj6%HuqLA$4o{<|P<8atm$&Zt)6w#^w zb6WFHLN)TCZrYSe1-q4-{AW}rGSYwxN@KVFM-ZyW+vrz%dpmJ}YQfQc#n6OsjCOPEGy7~NU!<|#P2*ybDS?$-w`6al1r(>ptHhd)_>v-3WoS>Xdd0R2O zqaa_rb`QOAFUfzVYc|Ev-p!i!Y0jvjnLD#)GF{)IXEJS4mtk&qb<6OE`25zrY`>d^ z6c)tcOX6Yp?go{+8(hcT@LnzSI#OuQE#gtnIUg2Nnc#l9UercjE~;#bnX{_LMA4>)d4!Ah*5=LVk0#H;&#I>?jekxusFNxias zJ+X^j6Q$%B9))h0U05145{d01w)+5=PW`*UWG5w{8L>LNQ2#5Jk&nW109!#^Du%)y zFukzKt(h8o;&xXrmiqA5A;>DkSpd=Qz?u7>(k(O^)%q8?WmkK-ILlkyy~xa8po|w_ zpq@vLbBeb++D=xVd<=rZ+d9!$e@|8Yt*MT=i5EZnqr9l?mro(`{k3=nGTqUEcl?dC z8e*F2Ipiglf86s9hi0hfWF%a`Q)w=tTGYMe;)SaJFWtU!g3il--P4#K<$%r`dG||j z0dXQ2`cmP{svSv+h#;LhpHHcFPkTx~KynnM9Zy|P*wRVI9=mhYTYR(TC`}8WYG{aKtvmpEg&?uZ7>zrVj zor$b;Q8!tv@8tp7RMfIMcXaN?Xc{0@#-?sgCn#>Ygk6ib271-U0%&NeDak~;xOMVY zNK}z%1)QxA3l`859i7Mkys@aCjnb{E`qmMfb(Eh(q0JDeb}J+B!tHR#wB|ROVHiVr zxSG-JYq=$#wQg@3*FEhCljw;JNDxdmb}>+ks-;%xCUFs;_4?YlgNAr36e^#aMFbF) zppWnNRrAPT5@RmnxWD0CG_O&@LM3V-kU<~eo0_dbCYy|7cV`#EUse%P3QQQv6wRYtU+~!{*4DkUpy$S zU^6I9J$i+RiE#Sh;x-`SoFN>+jzO^k^s7@p=Q2cKm3hWG;@bQIzNpOe*%AAu>~NHM zwuPP@j#Yo%-s))~17mQVMhn-})2#V>JK+6QZ@~M7f>3m{_)UD4MP&D7-^wqn7+`1!eJcQdhUXe)q_!uWSDLp?(q+JyO5=d*Qb#_D?-(T z+?JMBY!Pt(DQG|!W^}uxV-c%ed#iWx+i`03===YZYI>JzSj+e!zJv_L-xG~;?5|N| zJ1Z6*fnCYlz569BYgySJ;R=U4SdBeC3$`T<$!1$)(2(T0P#1S2h_Z=CW5&*Av1SX# zrZ0EM#AJ}?iPYh6uTns!ryYGj&ba0|-8q6nNFm_QEh86UzaR9O*lj(g4-J7?=hCBN zTn3DAt3)Y1=v*p?4%9ni;?;?Un@fijH)jFh=GqVlLDl9MVyEh-{&&fn++|9%N9L%` zeE*o(xyED$uX=;Qt0R^edPB0Tx7RrkJZK4Pu&UMH;x1Yr(1KOU2OtJwe1`%@PaTJLP9%0@A&uv|JwDUjd_#y8% z)yxE{Tp!lII+7~st0N^Mfl{J^7kC69G28?wsp_bh+1*wm;_PW=Hbm79ncXyzqL!$3 z*+2qNXiN-5;=Lw=J%gNB7Mg|Nk0)Rex+LCbC|m&wkL#_I{uNm657hXR%wWAR#6zPe zG!yNb20?guVxsFOQrCrB{HVI5%cZVU@zJEhl0FU=EI1wr_`qs1>M;oBZdBFfL!((B zlmEWs29!cHue$5Ih4+9J3-zae?-zcrcw1dPq`jmuF z+$fyAk1MspUZH;dA1*}_yFnQXEu=w{FU3H*!E;UA;Kb6Y9@fbbK(vgz(}uzTPBAmM z14Dh(rp4*O7AeaRh42^3Zp7G6<)smPX~?lQTcFxfb}yZDEX@!MO(QtziL^QoaA}mH zx*B-~stDPMPPj8iISXN$`9XnsC$s32Q@izV7W8Gg_;0L|h=5x~%TS!d=0%=9x zdq??}0Fe9kb|CJsNG6TTy`oVNIZA;a~;q0tr(ZdwEI zZ*w$MzD4R6ceXF}Q4^$osmGv4XgxMxH1?)B(XcLkPQAsDe|w?R1!iwAdR(^NUUa#5 z{}=s43p7BY1q#R;EfDz7G+jnbq!LReb6NW$U7BT~IW4UO2vK$O{#i7{|wG2ONc}=03a3-zuZDC&9^vFjVW<)D1 zsqG_BOFl#_=-(tfSuHu74zaNE*0pvS)&-`k_&< zi*6@wH9|V*7%g>`&@Bg3!@yKf_vR%w&1=wNTeF#M-A?rl*D|O z*@ki5zK(AVa{to2a%^?rfH{@;RzLXGw%}W{=F#bZX>rNQh`y;YQ==lytsztnW?Q3Q z#^-a;+mOB+wnm?I~O{FW+mGcmxpC0iUIcjwhA6#9J7{yJTe@$icqtA z2QhDSqfSvr`pu3IyfeEy`|S@wYTymUBQgj_r=W037SA6`%eOv}zgB^!sCd)f&b_)* z;Ep8m@8>;PB+{XTuJ2w+;v~yMn$%7zmk|N;YP2C~Uot&yEER9My`WvzO%Hd<*~{SW z(TI0<-YG|w#{XL0Kqs_AEJ?#9ehzu1x8359=UK$ z-6{dtZZq`w-zn8vUoJ8HNy8ftpkdtfQk6B{F?-zI&6}E)po>})7KvWEH%o$J+;#y1 zSkU8H0cf`373!G9a`nm)YW}YMf(!(PbAL3KgzKnLO22$ijYC_`<@(>CE6O7)b5O)k zU`wG)9@&pZ8QlxJP4>}-M|Pc;*29n=N={iuw~9?lB&JN&_UhKL^Y+k&Q&#R-yUcqm zTOmW1Om*6j{7R?|Wael?X0T4T&qy!oQ`u6p!g@;S6H&^v2!YOuNw@#KT3N!#MmL}) zkEsh57+y)PQvsbFhO7ZlDL1r?##|VHyt4q~7)AwjhB(m&4s?@q6O8u}tK6*E?9I(1 zaU;7rO?lmJh_liYaT@y@4T&PkF$NQvKfzF)p^j6YCLql4m!M9RAAccwxM0xp5G`Ve zWV~SsCXxdK0(}Vcx4Ff{6worNk!Vx$AV0?wBv3BoaMWqEFM*^25znJ>fr`|l33qb1 zjt{uAFELkIe8V_7Z_9fYX8<9YV>)%?XEiJX-;_0eR+nL;psew;x(v$`WsRRzWsRS; zfp2#?`B`}*`B{AjAvMCw&kB7eTk|Uf>5~mepV$!?~c9ahf1M z#%Y2@3idOc8$R7wrr*(>#^M|t&B1Vj5ghig_!L(Fz{vgr&d4WdU%z8(OJl*o0Z8=r z2N!KIvMh?>7=46Xe(lraNgAAznbHc%hPJ#lC#;4&jl+id>M~ z{Hx+SGVv=+V66$NVWvP6u^^o_+~GUiXCb`dMM=V2w-F7KU?@P_B`;NogBA%IfDp(6 zDw#C5;{!PKBr^pY$CMO6STj`231H1%0}DdH-{M|Em5xxxOXav$EUcb`{`aUrryhl) z*uB9(pXEwm<$w`qaG-qqsC$FuHrwwg=JCcr5TEBqMQ;ho1a!`9z|xFDZN|ccfsU6k z*&!!}MNJY5gdjPa)gN+ zP_|TD*A~xiOyb!f#It=t3YILMY0f||roadwEJ1b@Vhp%23dw4mH&DFP9K=}ZYPKFq z;%3SfIg3aH46PGzI^QSs+pM2{`3wFYYtEQ6Q#wkH_ZQ=Z=zoM3@?!8W_Qoh+@Hml%MMN5cVwj+Ru?lsHxu<)p zrQF!=>C^OdMJ*eDm*qfxL=XCmA$IPsf9+>h*<{EAoTk4cKG)YNl8`7RmS^Kg!lxAj z*^VSc=BKBs8fl1TmT9aNN$4XcW3nCov~I#7Fz#TQ@Gr2edBQaeCJvy@6UVgEFYyW5 zVGBr1oL^v0M-;bqNaz*5-`hFL9iH@#1_=L(gOG!?0gmJ9SO`x>|3+W|47=|xe6uJazH*oYq1;^_zKu01mcm^)& zKrEcA?gx7uD9n=mn#+>ZWDaJnfVY#>WI-}(1xac$&&%UVQj>WeauxNZ+hg3OH;+T) z3y}lO`3cHXOYpwns9qq#+JF_!sR|EkZZ9C(tc#b;P@Jz?C1UL|Gz;(8H${aFcCwwy ztHj^a1knC_L9?_TPUL1mMP!O5gf=Z`di78Bs-oHGvtI4gPlUXlBW@>Z*0P^0``;Hm zLWOU)`sb=j29U!*h;is**}|d8Xj~$89V=kK1ytHN^kk*9YQ{x1q_Hj+&*W&_la)42 zqP#oom%pkw6D^r=#?!)ZsK7*vbV$0VrQ3-rmVJSKZa}m)>emWiifHkjaU0Z1&5mip zM&Aj~(s$5wruYiKJ3judh3gl6NMOdU&IQ7dA(DRKJTRoCqZ2LsrN12Y$+#8J9Jo$M zv)Bt{P1E0cm-kZqHbPAOvp>yB-o$I7hBvRn^_b#V&DkL49 zYz$ig;W4U^#XZvj!{~eFP7@>m#M4}T4T_UVK*D>GfQ0psfQWM1B2pKgm>oYfRY~ZxktabrC?4@nuB-{rqzAly4F&F3xF= zq|I1L4B zny2w@n6``>keEGpHph&m(YUrU*GA0m`r7J${6h0x#TGo4R$4e#zbC8< z1QoO7lxB8VgjB_gfK#l~Xl}4YIWiUevM?wP4pHHT1)3yNtBg8xu>f2=8*^R&6>0%^ zVgl4OCC&5;F4U1ZZ+{|*Sw*D=3Y;rk*$yRvgs4V#&65MgJLNOEKZ^(#$wHZ2EB;)U z?x*>NWWjW>O&2MvO-E2O8S~+0&)6 zZdry`Eo|zC6Fip%vel9^FAB6`qLoU9NubuD(E_1Cbul&IFK64;#a;cU_(}oY>|hU` zGR^UzEFq8Y%$~H(EYpNM2nJx4*Dr+BNmYzekS?+~xi{@;PyR}(_=vx{ zXlBcMt*<7z-VuN0opqK~wP0s97Yrp;lSU#5hUcMgJy67chN8Q1m~Ls=u4=h&2D@qUap{CauMi zOUOD%cN@s)XxCqhjBa^BQZA~bMCOpuCj@4Y9`hh7C|muK@I02$#{xq(VqK}_9j>be zy#sB%T99PXB%@nL$nEpNp?W5yY6S2sRYz@-U=MuxH-G%ke*d?B=70MS7Sg3+;JBLj zJPG9`hx8_)eEj)XDCg%(gmOt8N$F{c=SlV8sV$w> zxtEWuMvO&Sz_m zdPzoPGma>Vjnfyr5KmZH$zuF@mpzXAfkjPr#x<8c7G)Fe2a-bRy$ScjktmyRKLAT3 zZ6;?&ye*d^4;wllvSsB2FI?h&&<2%D6g&y`vb@+6A?YTpe@oT=EZdLGEJC;jG`_y} zUUjDqOYex#u|jm>ScDg8sr)m8ri0DTDJmoXoOcr20@Z%+$haEXc(SPkB^5IvKcd2F z&G9$P5El-N%tR6a)vO|7?4~HYRjsENnZ(VVZ&K^nd6b-Qk7nna7Ii}JTEVcGm!CvRCKia#liqds)z-T-SxJ?AGO3bF)l+zCSStnE#^hXP4vW?tiZZWu z@iB)7j|qJIZzTz~0UomZkFFN|UsK+=Gg=nX?h%$C5OAVD{xapcUi%!s&b`6DGgUwB5eC?6 z**8uC$N)$JcnxrSts(X`3b5EEKm~lGl0_CLS3nNDNFqqdsb*Saz)W*d|9?LMDC!Y< zLRO3Ze><*dDtQ)iWlZe4l!We$+VyO=tNjnER%z~F8T5x6#wV!x7SJ06Cw<`=d3@-G zH;+y!!$`a1&*Fi)Td$oK9CF2BC={KtrzfLUPI+fAAnvLDU;hE^KCAZBx0@5hVbO?T zDYGFzH6|&4k4dC@NY^y)gy%h^5pug|V*uIbn*ZAM%x z6=jqYge!3 zrBN^SW03m6F{E zjmsHbpK`fJbnKXuBj#qWqY>IlIh#>BQtcx=TlJ2*54q-eup9Us>zS*KS02P5tSLhS zb7q=c-#Bx4{MO1G?t;_-iD`GuLx?OEl|Bge&v@^uYmV?ZPL- zPlcM(N+8P|;`=T!xtF+7nEyyJ#klM8!Fe*Fd0Aua?8VT)aCt!NnVLvCFdup_79K$GlmG|-#Bu>3c$Wp=y(NCxA3xkF47#oO8+z%# z(D#B0_E-PFyebm5ve@JprX9Hpl<#ps3h?u~vJU5TW#jppu4JW9Ptb$=Kk#O{6TPl~ zR%*`mJOHUAzI3kdh~J}rPOeK?8JO}B1FVlX6WvwTJ)M}Q*<+0cK9t@hOOvjEWc>oI z;_uPcXD28b#gAwiI#^5Z9p^SOeb$ju_67Cu`IS{>*m*1?rL2cU^<k@iM z$EPQ*G5D0}l65h~1U`m4!5nnlVGq8r5(!{IdfGL4W%#4(L}0HUaOpZt>~Xk9g#=gC z9DIH&mw)(4b!Uk?2Kz=XzvzNJ+yR+>s;Bx-lw(feOypu=mG%kguhgf4ku!FUw$X51fpPp|>TU^j{~-j#;cHa54WuJ6<$H(QJ4kc!4|Ecjx;D7f zwdoiDoZg&!XrgXeuYU0tz_MQdla_4m0RSL&l7HEuA(&HwZe~oke&Zd=Mlm(miUsLL z$&-kS^&_9AikYU0MODFX1V57stoeLvQz>|Lr|P)9+Q)@VU2o(<{^mVgFoWI7MX)}vad3t*(#44zvz)k5ED&Ab z{trtQnk-R^tn;F4%u|@JgT>{7Rn!u5r|RGb?!=<_&NgvT#QYwz|61C2+WJ(?TfSG?$_2|;+eVRc+43(>!jG&%HCXb>8>kS z1WZ_s(J)m6N8CP9(UgRa?X8ONgHKe%7i^V-wn=g*YvnBzKOk54!f-SYAnkPgJ?7LB z^yF84G1xvB_8+$wwy6$6PFvSX=h-fzuz z{yW>fe@pZpXwO|z%r0$xC*km1?k0Z-m$wYBk(-@FVCvVN`!lxwlQN)}l7xK!L@#(2 zGFX2dhamQqnjdT>tjV3zSfCyni;q%x%TP;6ub^ecaJ%3@(k2(77G7fDwmvCpG^~$t z=|3)|EGXp~!k^DYNrbb|Bg;Ka<$T>l-x7g8ZzaU0YJHv+=z6i&jpESfeYyhdt87HGKA|S6$dJ9 zQKwZPNN@t-y?RYt!fYGP8GwjceT*Voz-GP(axM^Ts)7EpK>@H1{ngp#Vk03IAMK9- zsOvQ?$c^I#F{;dorFuIBn@~{r)nvgD+JodTWodLwDuffg{tRoqPvGhfsc-=E29PDf8b7`|zUqhc8 zZ}y7U_=ri5k;ia7@|c7*!F+50x$&$%5#l?)?>odyLzXVoy3(X;|@d6j6&Nzy!Q!UspdV1kAb!Ii*ySMh<6#* zPoCuAD16Np5GSy|DXEb&>Qo4Dnjq4#?_=6D{M)q#>gZdzkgK@o{Av&>JU4yZ1>bX5|fi^&1lE07ralt`UEP@Bkv{A zn3n`xGg>l0u7G|7gfY?a3NxVEmnj6TI)wyJ(1cA7CEI?4zW zJ~sks{%)p0oa7aL&KksL^%xq&QUBuXl^y0&Z5E#;75}HWU#~u!|p`a?yGl@6~T&;9^XCc*E=LvS%lY@506H=>>J(uUxRg{!Oh=| zf=t0m89(eF-TV#)H~!&p`r&T2KK%%gR0n zOJxe{kD&Ew-dHRiA6@G+w>Wm!q4N40;wS z1-+0UM4m>&j6%h#{#8F-jLv6Zx&Sc!vKl0!6O82F zW}w+0ju;h5DCo5E67ZrRQA3qxnn83{q}Aw@hK4B3(RL`i5Hd~cuhG>bZV6Hmy{8mz z5+e}Fc~%|b`i!oJJ;>9#<;zvBD%2p)kat78$jBOF9KhdFpN`MHrsA2bu3UsGI zNXp!-U(e^x@W!6h$EIJ{blk7gFQ;F-a=&&#?{dFx+^}D$6ruf3p`@X!_eA}w{n$m# zFAFfYFph)V@XNC1fF`Gr6kYN@H;=L>vxqYG$}EB*EI(l$x-#wLjYKaw?jE*S_4v>H{ybYqIZ7t%!eIHp@#V~uRphfeZppRu|&{}?JHg3kh* zVAAi(jLnNwh%8H3uyjO~XlpKMumv|tVxQ1etqd-itj;cFInnv3|T7Fxm@ zt7hO!!rE3U+S(G?yvH_mp&pIm)?_EYu=z+o2zNOsTiKQOtP)mo=aUx@`fD~OQS&_A z<-w9C+sR{($ds6dg7MQc=0Mpb_*(b?3cwG^HY`0-IeK^%N(n0U0Bsh7i?Wd5Wa0IA zmM?amX`y5waf$0KzS0O|h_@~DOMn$su>dP7qMMfBgjFn2`U0ycjn7iW09qYP(gi~m z{6VV#w%4#xzX9v35*HowJwdH`jTqhqXu265qNa#De9MPJnc*GLk6^|lx}G=9UC}Mj zi+IEhiicCoV?YfChYVtV_fuH0Ikt3?-;p%D_^>_;ICLL2vgS&aSjX)!-)ahi*?oUJ ztmAd8Q*b?U!#t^8A{KGOSjln2@<=N40&w%5B+EYFf|+<9)Z|99Gb;xBuy)kXMz)$X z`P7&|WmceL@vkYMJCuR1^=e^xPP=hNdlBAAvOh-lf}IZ-Ja zft>>N7sbQagM&Lxr}sG1ZFB0Jw>*ce<%-XM`OE2 zHxEWh#CJh5!mMDv+ab~IPTU-_c8~rskKA6|E zc);_TGuJdP`rz+5==%PFznUNLevjA1AY>k-!viFCE^Cz}bI$BSGRIo1ZUZ~~uoS# z4FhW6;jEVcxb6R%TU&@vdqYH*+9#Dv1MbtdurL^s2xvYHQF00eW$ei4L7oKEKvy}hcsNs`xkQ(vc=lSS@;DR??YupIs0$<4Vk6la#v+%VIWT<@1fJZiS8*;a@FahCt+&@$5|-l^TG zo%#<8#<5)dYV4(Q?j>hLNRz_7UXTu!OO&qva~u%+u0YY#Fa~B?K_@Y6K*7U(x*S$U z0=b?=Q7y*+r9jWZxUz84!CKt0FaxATYtB)-hF~Hg8qxyU){3DRAwE~aN?eLU zQ(TSmiuSqSX+`6fIj_eBlN~N!8StdvplmuOd^DT7R!I$U|J1t*2-kE8nbGvTwd|Z` z4C}|5t^jbroq7>4_jV)b^LR&PhhsVfy~8=pPXmcS|FEdg>YcrudcY>Zjh01=!mWz> zuamgA9z;cSE)SP#DFg9(5S1BbBvTch)C6U6H6xMAX_*%Y(~o`x?u04=5`#9oTn*X; zeHgSCbp^CJ2g;zm6;7CiRZk+aWmr-ek$NTWt!3tGq%L_P^O$uT)2S7o8!tD-$S}h) zykJG}IV3D(p!-MFcQ99Kk%UQ{m9m|c#o6<=8%CTR$nxr}l&aqM9_;y5{Zn6feEZw# z&O^g%nE8c3lsF(|fmf`5A@UlF0Gtrj0h3*<0p6u+Sc%qADGQSMd{hb`C|F|WW70kn z{^4P1j!JQuDH@W6wuz%sG=JcT1S~wfEcT%|(W|I$!CRw>kv9*?B&@qz59yE~-R(IP zr|V+}Fh#}^&FUeML}h$Y zFLk6gr#0c35@GOmAZWB9AQM^Xa?y%!qj7~ zETye=zz91RKCv3jXw0IW9XTZxJ>u9A9uK=v#;~A(-z{)CUX4h*54DI{-=AjPxy6|M zyFKIF99Hlr*CS03@`W-=UI_mQc6qIWXfg{sjpm3kPm<#=K})oKd==iClZT!VeWC1g zQD(^z{e_axxFk!^$6WUFQ5F&=*i(F>l4yC9;AKgUy;SXdJ%kTxii(0?P{3?zoYz5* zHZ^i`r({a~s#CSIBzYA^{`Y`KfhBV=n3liTCJF!)*nH1`K}_Fo)E9!(ea?5tShAoE zw4P&`08(i#3eZYZdMTbjyJ6NJlh;LZ-NX&Rk{A`j{kadWD)cqBw4ap$Bkj$Fp z6<_gt2t_K(D}Gz~t`QOuDzJyOU#tHBOFR#jswyvRsXPa5wE^Z1;;0NDaaH)KfDqxN zl?um+&C3ENXCpv?Wg!E_`KBUmkZE{bK%qm zU-n<8nRPfPf7=}vNuTVnNa;j}y=B4Y=(LA$;*}2J!xg@!D;Yy{d?0>2V`2h31r&W7 zaia>I?cXx!w!ph z%1)+!;a6=~0Yb|9lX`zj??W&1`*>9JzGPNR zZhE8B|27rm7ob<&`NJD@rKt2j9THyFv7_CM;oxtzRE{f3Ew%b>EjC&{vq8&gD3d*z z6|FD(zf;ZsgPC&LXP;@3==|(=vFL~#{5G1w5~S4e@R{EK&)&O7TXxlTzU#4H=j^@D z*{5DPsj8&b-WKV~?Lgv$`HHL znjXeWgj_8VZ=#)O&>&F}D~cE)LU^@70$m6wYJ>u!a=RnBpYQKC*V=3EvroN}2DC}R z+3PXaeEiW|Sy-Npwok@`4c~TejcKo9c zOHC=GjI&(J8w9}MFEb3whH4@eNrp(ap9lP`VzRa%*Zo+Kjllh@kJ9Cdk6B0}QqyumA)(&OB68^s8vHTtWJtxiSGGXD|V+ zqid|-cMZLk z*KLh?%WzHH>~}QBm6_M0h72)6_li;Qlo$m~h1=<&{Q+>{M*JD7Wfw$a^u z(gtDm7u)R(&#iJk+|K7;%DUZ4l5C&KiVw}#P2mpSBXwX(zWTJJSNFG4mBUCEgZNS) zy?-HN!D{coB`m5A3K=!J%Aez5gDz{R{E094LQ|+_v56A-fQH`?Q$O{pYr~X)!;ES` z#JI#3Jxt8#anV=4u{bSdRG@kzSy-Am{;K=OX__DP7zCN^8h|=-O%!yHvsMo}Wa=bA2MkkCnJMV-GmsjfU}=LQ zXo5#l4hWW~7E8d(B1t9VxP#5E37@jNJ?@ZU;_Xhl?@!Y#4ks^%LxTzgDWu{Ydo}|y zm&*r4_cS2dn;1|Y2P6VhDS=jc4PDTrJSO{?)On^1B^7CaKK3|oIt^J zH&8VL6h=n+W5}p=Hyh08E^J|GD&XJyN*~`hf%@zlIIjUQodv`*;QU{V5p&)+`B3VF zbBY8JBt6uJcx9SNaz_y_l8hv8x!Qfebs^Ki_bXLR^SS)U2qqisGCtAN@bk06t~y-p z@e)@Rd6`kNmnUQtLB0wxd>Zkf^k2z*Nc%TXe&K1Jk$dZNk`La;%^kGnOPuM&rTJcE zoRZLM!caV+*-j&Nb@G%FD!Na{LFpi_S%bQw8q~z_;y|C6Jv_nT8k#uyR*jxPaXlWd z5_%aO&uSyTVLbAEydffFL*KW$e(0{X8Q;G3<0EEK4RB2vw5-yu;6wl_Ov34WPM#600%k=R3&L`_gK*J3uDU4pvV;5Vg{ zBtE;Jsv8GwxWFAGG?DE1%aew%!^#Im7STyKUD8QB=x}KZUr=`1Hi%bxD#MQj0mx^} zSDfWDemh$KEwtn{>oS>I?!-PS*BuZ zP}{EfFF3Ia1d&I(^q)qzp2kZ}Q3GU`BH1w<+2&<&;u z5R>$Txn|t(qIaVf=V-FI4KW^INsO(Svk}XV<2#eMMPrptFgL_fTeI|v)=hnxZb|n{ zqnQ|rIEA6uf|&CfN;)+Zjo~JB|7KebigQZ@gMKN)pXlPR!*XwyCCQ8x0~ZruuRTwA z-F>aI7K4O-N7;3(oT8%IK(X+m8S4v}wTu)F{dhBNi%6uVWH!bKhSkzJ7>-_NEB=Wu zh&-r4wPU^=#eG&@5UkQqvwivp5gui#h^`)Geka`iTPF-AOn;e8oV<`cif{?!0l9+J z%Mw^vvBP}u>*hn|;2l%-AUg#7%T?+=7~20DG!JF);nE?&lYe_p$d9ZJlWuIW=`D6@ zEmG;Qp%!71szrnc3ZiN;jV%JV*kWVcqNcpPMWsi@7P0TMz$C*9`1xk7LCI{f$jPQw zrT}JNTaA2F76f;f@dG38@w?r8#k<1mc%|3zidr2%NI438zn6Qd-`&Cwe#eXa?tA^+ z4I)ta3M`u-ap;#)xlPNXraMlsT82#EaX1QN$)nog(BN_>)GD!D6%qD$J{XaliBwkt zQUdf+n!t{@Ze-pVf>Dl$pdx7Pb z!bBBvYljo3*rm4HxyWGJzNpyx<&kz}>7B%*{bA)+1f@K`8_tJ1o5 zXt*+SrD$}Y?xfw4yraLJ(OZ*sPCQ&UYV;!rSPUks(GSoe=2p>966uF@)kr_tn0|Er zw$qOiFe3eACB-^>dCTIlTFbU`@^ekKxl?WKRGZhR76B-#%|)5AuZ(KVI>oxw-EMzZ z@B`()k{>Al6&PNxVgDvk{tr?Pfl4Zp>UgQ&-NFxdFY>$Z^>a!l%AHKuuusZovzO9!o2 zbchcanmriNk@}LFf`T+Cg1JIAxQ)`L-G}W(6`};Fhab?6lGY@Prc_<}w7Y-R&00rW zijA?h!^BTvQB~@ao0r%`uW)0DzQTSo_*DcP&e(846e{YzYSgqCZ0fhyNL)jCQ1u99 z#HO+)-w-#Ju(ZXZIv(IgcZ-LwtHDtjsw;j}SpML1Td zHHI(cjb^O;A(}S$N~h&wmAAPKZHN$H% z^okT1qrV2-hIwdVM35TC%SK7#@s_;8oQ%dRTieIm)OcGEmYSxNjkjgvRaqY|{Om+U zA)0KCM_h7=eNj;qmT5Pmr6G7y*EZQgZDAp zOnkC()Q`yQnH!**6ysb_d@w;=>a|5GO|XhpFCV-uT{)^$F9}yUS1W6c;XIG}!h@)c ze)AHUI*t^=5cDY@JOCQ;IxyiOC~3$B-QhxURz;BK?-~4B$`y%gJu${gaocx$fDj=j z!&w-I3UP66f!yJQV%X-i>D$vYr z0Ghc;(9F#M&D=WB7@DR*GdBw~nz~e-fM#W_BbZ7;uxb-`Nh!AmM}ZRzdbk9YYD$rz z8n|>6CT@YI<#DcLUor6sq7>uhSHc88Z_HDAr>g8-T@yhHb?%ZX5_hS*BBxe)Als5h?%xX+m7rJSdH=3<>XKo(H6R_U#(1|4cv%w$c+6GOMMabC=V2P?( zR3Kx+lk(~|3LEce^!OR!_xaVNmY7dbG+piHN(W_T#M1_k(Q7d*VZ=+p`Jst4?I`RDvBSWc$(2_P#W#A>1IoS z&K|8m>!a1U>p-?u%BM%(6TdM9*|M!VJg1RIY^oeiB#MZ#F;P5tKJ{v<>kPzp$NAJN zMR10CpM2YSzyU?3dL=$Kg2TI}>-~eXU=H{_4Ig^&L=wJDJcxuy!+p9HOVXyZ`M1I4 zNKYAEX?VLhw#{p-F4W)P{*;R}yi<=e9uH-AcGntN^Jpe3P|2Nf(pRcp9yQr8SG!OB zcd1RSA;FQ&NM@{Uqy};%M^|aZ9H;zhnd?e|0%&Q$+sgdlQv@ejCHkTU$qKleBRmv* z^!rzyNniJBvK{7Mc0b#&bnn4PHTfs|A-A_Hom*F0$0Q2j&Kd8T_6`;zOy-`wl3Wl; zcfDH@mgS(OW=aJ#(?_ydu=eoyqCU!G?XmM&Q<9rfriJ7$$+OU&v9fN_ zPo{;eP&T&pC~wxSl|N)DO7BYW17^Y|HQ3bOHKlaMkUh4NsR#|ywQT0WfOE_I42abr;d+kPEqFa^&*VNpmBNhm;Et{ zIR$l@K=uNL1PVe*U(P3`x!eAvO!(t;P|{6+MDC zySDZtB(KSd2zUQBX#A#df*(htntKEI3~PF`GdxLfJ0jRQ{1;L@)=ZrwOen|PJaLxJ zCI^S9o~0AdLi=!$DvHA!lEZ4H!@~GYKKW+r_zkAKf5Z2L3~%U*5+p-*dKpLq1fKF? zoGgd&f1$g)kMiz_aVUNx^Twi(CN@ITQ%iJLt5c~ZFkt6p&=vwX)8qe_gL z!>Cerww;J}W5!X~qw?Y#acOp#z|x(+bHXN~;l8zaDU;)e-J$TbDg_PsMshw4Prm~y zY*0r1L7`P%!ItXkDT;`%p%b@n-_7q%y2Ov$t;?m|if5o&EIH|@NW_Rlgkr=ZD+Oz0 zp=tgKETps~x`OIe1RD_?QeDGvh`5lI*YJ@N&Fp!`3{H6sj}PLtGIaox!$>Yp_uHWo z9>odBvMC%_nqm@)99Dr-wOZ<4p(jcAJt^tQZeMv;f=XNOa21!*q#6sZW5Xv)T;2(O zaw`!uwJA`LsP7Rzt7J24RX8G7`J!S5rJ)hHa^WM9&Pz>^AXA1i>YA4IPV3RWsSOT# z69u^H3HQAd8S?W870(Y;r4lg@WIh)6BQ?|w#zJJKfdHh*@mS&@Y^LWbg`28nYZ);U z?pe=MuKLG9!(vqUz+ekmE0(Fik4W4{uF3BiBiG70SqhpN_mRU25D;LLSBd##6k>#@ zy)kKJnST0qBNb>osm`K=!l^a_kv?Kl+QJkCbhzqtG$UP$+L#K6fyOndaK??>@oB!6M?(4I3F47i)D^e0^Tdu;P2+>dpccLRS zMF5T;8to0|QS+&3CX8|V6)>iRH-(Cs;TGv(L+qDrtO0P%)O1LR<74k!=jhEvbrMTP zb%a0=E_&Z))J`roF@8iGe$)wwwQ2MWf=(=M>7f7>Uu5vuPz7pU4Cc@&jERpd1(_NT!#DfTNcVRHhe zvlsi5qm`CDy#lyBT1tCuOY@3s6wMd;t2(25BuPd0j0c7x#|EM&-$<0j9lGfEwY>mq z9d*|lyi0cmJ2H>9jJN{``m-BbhMzqFT7^`WI{4=jU!-hm0K|u zzxy02!XXlsjkB}Fyhf8n98n+`WiA^shY@m-_!;CF4G5_w6nW)<(6^4PKa5JVZ8YWV zRu1W52<&X13%Yvc(s{->RBra(=_)UpKn!UMPTrJC;lwmM%p&?K`w`g(`cOtHgl&d6 zLxdx$G@7zEZR-tmfNP9h61zK+3NSSxjZJaqm=KRznnWpe7J8?ROh8qLw-gwd0cPErRi-vHRaAO)0;(;%(2y+2&c@A5 zvWUvYjpd~LyK>x?d~K?b#?-DPwLE!WxmcDw_xT5$f;2i-~(f`@=WksLxrP1ee&X=%~ znGk27#}#bQQa+k!lB^V=ilT&SgqK*v=nxKyb32et!T_D6*h%T5C-od)C zM(inMMpIERy6a8a$3ODb9Dn2^K8MvD|3Yp7POyw^0jsu9AREl6u962Pqk$mS^Lx_t z>u^PysWyp>%oP`Lh1V#irQrR>%h4WH+zQWmY}6Mi|BzN++vR9xEYt+xy3v3`W2I6R zSoGq#SX%Yv-#Z~0{A`z2eS;Y>X%w2W_<*b$1<7C_5vZI^80k4$S~Uw}=KedMZ?LrL zESdf9H)nlc-iSRuN959Wm`t&$EqJ1P%xmSySNC{heV$aI7uyZf*7Esg7eoiFthR_& z3Oej}5`Pi%7K?r#RzKSU^NjYIfGNcXw*5Ak^^-B~R=Z{Ek&!=u&dfx|MpS~nNqIfN zT{*y+Ls9@bDD`)L|Ab~Le<{oMW&12?T`uUk)^|14(X+94i=WZ1?Nm(F@-)r6)s^j4 zEYqaitJozCbD%sU6veKq#L8t1;xfe5AQpfkvruB%hNt&fmC%iJny&^y#q(4asuU>B zkFN$f)3>%7Wb#`Nc%`eMrRhNh7F*H-s$Ll=YEzK>S;4PmcB+-}hO3V)y-qJoiA;a| z=BJYH1P}IJEMU%~Hkm17QG94-o}Gtn&utGuU|`$&#@&Ck+CfHqOG`r*l@q2gsoSt= zvB<1WsFsGbELdUK=%@c^q5hWHP|pDoZmwgSEJB|TJWJpM3_`0ZBuFGo$VkgIbb10# zIAA5*^)Rv7-^-zAj+z<7!w!W&BL`?hm{O<@n$a_}22+bwVq%2{_?)$N+T1#PR@d)B zsrXVmkgw0CFbfq=Vzy(FQ%^gm!E6*0Uzhxpm;98^;-_C0X5H@-TjbA@pCp63zHZz_-NI;j+(n(VH{vgJ zZck!|9!M@C?`#INl8oj!kbjUy3dyjiZre8BYD#J#4vDa0 z6mHt6-UmAG1Et$dfo6j*3Ni{NzaYmzn?nLAi!qt%BdFk~-?9&#B532y;BAK^+YFvE z`ydy7UJ%{9`eyJd$6{GFgV$anOtrXnRzj^5Ba%f8g^~N?9yR$e{2xZB4ip}+aSdQ!pJGsXaf@_<>=K|nPzKEN_ zH+>3Zgo6xlfWCg?M1kWM^wtA*20cDST~wPwxe%@ zht)lHgU-6G?g_TYm-c&+M#E--6z-;X8m&Q{CA>Yo6FO9)_AVng^F_35SxS)T;BzT= zI-5x!oK%ci2kuE=>tqS847F_1x!WG?89y>&>CQ2Z6?RS4oTN{iqYdOY5}x6tK21)^ zj4N2>(|H*YU2ZylGn5ndHQl%5$IO6Hgi$(D<`}w7P&D``7AP2>lcV^x-M54RAvT}W zeM|l(EoTUaQH>^W?!?qL2p9Z>@Rld*3hCib{_uqM0%P`_ka8N{quai25&Pr>>UOhk zi9My^=XATQTO@lLZq@CDx&;9oyzp*rpRZeln`S;e1VoBSb@d2E6jV>#T1g;&B|c(K zLhD*-nDDCLN(ssdJNs#&p=ciuRulU;63~A4{*0hSCLQ>mTm+F0-kU2jz{NfJqI{5Y zO}}V-m=Ls7RGI{q17UCY6IH!A+7@!xT>aLpqkaeJLDp8r-*^P7CF=9U zKMM;(Uv}#aYiXX&E6qq67XdI02vzCIgvidJiIim{ookt9KE!TkN_B9e=eSNy{hJWA zl|Y*M=@lp!S=fwD`UzT7{}htd!8&odhBTO%0TR-c@qwLhO2;)?sx<f-9@M@}FNBx6imeNngbx;1h2N!>2#*2L9&b-PWsCaxaRtqC&| zS8vhn7QF>cqH1l)!9-v9vp?j;e0b7+c#fa`WnJH<4>+VlM$4UC4<4o33}!+ieJ%w7 z^?$tJ5Zr#&m-i#%>t*Tw^JFzHfC#&*3@seBI7S z&9UPppF5gnArfa(dvk|L;{0DF{qmQg6dLyD#XE!xQ{glsO|GmLEA;Pd8LMcX!v9X6 z-Eu$ABv2I`Fvkma`0d#9gNy7IzRX^{gB1ek{kOgkPT3hA z<7eBRavmTa;N)}Ed5dD{pblE+bE6o;ZojDqqe2KYNTGg^RuiM&#=>7qSIhl ze;Rc8vAny@pNys+k2B@($-8fhLdR{(u@1Mo>`QqZIUa|(8}IzDjLmegspS7xx8_io zN|frb`L@t&pilPeeOZ%s`MZ-AQMxA%>WyZ;qkn? zHj$B~F_2QxPx5_SSYRR@{H6J9JzKvm?`>K6D#X4lR3=7^u@&X%bL%tepqF(E*n{0* zyReX}2-d^{rTs|tW(mC^ujk3qtjxFp>7CSN79Cj%sjlP(^V1m$MI4w!69x@m$BZZ9 zK-r^(1~%p|Knt|NpOSz1hV;}uS_I0eCM3ks6#de=N!zVo3$}E;H(bg?jEHY)V~(H8GiidTF1L9&gF(b-?SA-vJo_r4q6lOcT6lW>ZdCb}VA zXwMd>3yYpsbYa1CAmQ|p!3$)=M3P{ag^Xz{gBhUuOY>lm8$eH?Nh1sk+^`>L(tZ7w ztjEGTtU&h_WDj~ejXZuj*k*q1wI4pAOnjELfl}LbfR)VudXxv2nmm&qEVTX9cIwU! zD;FF}$V2{0#zyZ+;8jnUcnH$s>2*6;(qVL4q}J#ty{QWg5ZV)Z$>9MF*}n3hf~Ulz zG$5#y8pjEK*cLC;4!5+%Fz-s0+e$ut*-I#hL!@@FSr-m;D{S}evs*Xru;Y%jkZJn? zUos=*KycBfNZ?0ph|N#9`}MfwZw6W6f!E@Y?+mx=fv;F9n3#h{iY^JCmy)rxuyWO{ zqs5i0Z@VWv{Gk(eMniP}4-|{V!pfdoO;fI|op>gB-7!jDK}l9_Ocu_(@Nz7C@_Sy# zr>sFFMPcpKuGbyYhu=KwL#B}zSN6<$L#S_YWi;yz`KwfZn=1eEq8eJ(_0#Rw9aDd~ z{z|T=SKUUl3-^rX!ZzEabh5{!S2J@v;{`cu3&rBGm7TMiCX&gv6FSUfW5BVm$k_vq z{YO;z+yTe=7aIVMDES6}>w9Bo3%U(pumFHIg6iT%P{kflVE?p$vI94WX0Jv?>1;t&k5p1@ej^c>iu!+Ly0mpGSXAijT=L@(U8v>5A-8KN+Mc&x6 zq_~TX;+ix0c$eU_o{vePWqL@n5TnM;u3t=UB2S;bHA+WBGt=!M|Dn;`Dod+vVKZx; zP|Df99DhUemKf-94~y4UxWy)Kp5_!nuZnUN$_icgUP)1XzmI$sSycgx;Qj!gEFvN*IuGu=8I_OfG? z?cfc}o>pVWWd(bElXW$xp)_wbc^*2;mt)n;i``6cQoB7u2aGj83j+b;a5dxywICKlPnK^Ze3#TTi(7SO6Hr!& z*dD4cnLp$wKBO@_6;&R<<3Aa@hC|7y59p8xTQ@*RWN^Q&6wq25?NQo8%S9D#zr~C7 zT!s$o3bYJhi{B0SVY`%0_@lqVU(v#JVyBPm`jNkm@r`h|ZZ8jy>w%oOnA(Q{WFcKa z|1Iz0-OtNzd628{zl4)|P=V#0$mtCp{K+PxOAP(~hLX&B0g z{^`u)49dx>VnPON)#yub;OW7CGRSB9WW(MdJ22OrWgb3U%~{&C{rAS>$Ky?Y14U@i z_rd#d2-_x5eX+Kt`FrH?(5D!SL{+O=3`H83GvMK-7l3;Ps5UVzwF4hNxA1c()~xNm zC!3h2c%=9SoAcq!j08e$zsJeX^8JA9n{;JcJ~N8F8U&7txghGL&cV!m^0a$jj$IFN zaE@cE#`MZ-R=)&YNU}9-=2XHzIX<{lH)6xuJh}E@=n%PKl1L%oXkD`^jZX0owmXb4 zbs4IqIwAFS9MIqkwZ9|Zv%ZC8URd5NImHyF=L}LP2NXiNt+LgGI~4B6lSRvagkQ%J z@2_Ca9mh96nSu4?RB-aheYBbO9z625<%8oN;K4Agl_i{81S4_Fr*hxc6(^@!Hd7Kg(8!UuLL%L1K;`tW zgj7puD$HUn9~Qo1SLtO1Kwcd=bZFGpqHP1BoZhz3*c<})VGe3+aSBd+xI@DjhT~-? zCCCdl=k2g4O|2JDL_A`|<`kIWdZG3T!&L{~C9?U31BpehS|^f9Faj~3V2X1kw%j37 z0CNR!jhNNelCp-0hT3-i4WuZ6KqyM-10K9KphlGRzZ{AMaV*lSb)N=n3;3c#rq`WmrI`go5Gd+0Et^Q}gWf zN$`L2qmKHdLcM_qE;rQwX+(WB>gwX#tG-N6LDF45FDb-HU_eI%%Xetluu7^CgBZkC zIV7!zb*-tb!wn@+FujCo$ED(eJDXsI_k=hbKc$E_pyJsMVvsXIZviniS+v2sFNej{ z5_iQqR5!!?G-Gu9tE&hhfmn1lzR-7ilC$3K18fMOsmOik6-S&8W&9V3xMn*fL|kdz z5NI*Nv>(ZIYrHwY^u%Ig7B-|9fQXJF=1=JxxWhUICcJzW);@M3xztY#MWh}Gx7F{- zqq?JhzYGVC@4?prRVb;;R&O6=y4Jyg;8F4*nLLFI1KVd=Ih-(vN@q4tgC13ylHHr( z;Au|W8(n?&ivl7y>L}5=z|5r0bmu-EG#Qp;$!Qvp@fQq=ZDq^gENO`krTSHqh*ug` z3RSWZx>nt`zS8(q3odzSiY9XCpV5b%JQk}-tN>N*w`f0?@$(SSkdQHsEUcimgV;;6 zG7A99D3g_teKnvXHKJAb{P;p_kNkN$ZJi875=M{0mo6Z%(m0fqH4aNP&tfPjMUaN+ zQ}=tT0W-p}2r~SuzMp9M%ASo#dYYg?CWej^^n|1hClW_Da+Q5SD)NHdS9Id1p?HRX2r^lWjcDMj$VRe%BNs@I5?y5i2hgx8)+FERPtF!pJ0rNqWS(=Fvgo2o(1LnfB^L9xvce=eNzhi zlEybOJ;I-k8G=;{6+_@|uKa0@A<%?kiMB<<#R6uUzy;^Q6Xq_h7n z1R@w0iQ?NlS^P>e-#; zRq=JyPMFG3JDoIol0EFsh7!T!tIzVv41PjSZCOJNeppz-Mt(9L01Os{@NL?mtmf%+c+$=-K*o4Jdz6WFJOpKLC@Lw!X7F(F*IXCKP!{Sk6 zp`9jdbelA%5CV>c+!7({Qr4#s;*-hN`y%;$CVH-S%fXf6~Pa+B0C&>Pq|VR z!YUL}W)|)EOs;6hEt?wcjHhvDf9lh?Ge527a6j?2;B82KlAJP$5%KnX*#ty)2_HsjaJ#O3&U3wvlz3Ud>gSj%Ekwk?MfjQol0wBx6H{L|fR z!5KfrVMIUZ8+rfsDYFuMidbx{qZRr^H@c&?Z>?RU6@0dts(>T!DpgQhYT}}2-)f~R zOcz`=7Cp0c0Wz7*WAR<eQ1o37P)BQ`KtN_EFgyZJ3Z}KyToQfigGKn<1 zJz?!aVv)3&`sN&CA_#F+diPqI6-RUJlzazSA2mJYxGu>;JuRFT?We(=L~BtD`tp#W zX36}anHi$wkvmi0_!+CMHJftL%IldBIZoc0X`vk=rqaRj^(lw8bh(Hj$~n*cK=+aBk+4H@b+x{QoF}4hXpN6qtFFcCsb1`e@n9UJJX(j zHm}0V!v+25aH$J~Bp3towv8va~^0M(vnK@ zR(FQmB8E0IfXzb8b|27A?sv{W%+4BOxL${t?JKudhyl1e9VT~0ygGJ)&d!J?L5FI# z0QZF^228U>=e8F+1p$V*T|?x(0Y>GBv~Ab;cG^CM2{#N;!5=#Wm8n z*hwQ6gEXp_B8`ikG$>>cxVX4Dl7@XYufie?enc9Jymr!9tdqu~x*&V4Sgc56u_6r) z6b4$nvY~6vef*C|45!cuHH|z=lcqxQV&@J6>xfu-JWy75lLxkHRBSx{9z=7X%^p9P znyX92yZEjGdTb0i=z#lDG9 zF#D+La!EXI`N(Qf^=e&`=FkvZD!`K^JD@1mtz|>D39IVAzTXa;DTim#1csdC=rl3_ zas%ov!Bz}lXzHa~T%|}oq@6WA5XzRcdT4<8fXW{DlqG{3fMH}YB*3elx|9w#F~){~ z%?fEYzkQEIl&&9c;>0PR_M9s=p)j$)t?*Ye@p6mxf11p<|u9GF5{O?*|s(iX9nc!6j z>?K7G*iiQdw(ub$zqqeYP+Xrz0qezqzy%chtW6EW7L<57XHRk-hw{&L`$};^lVGzp zR(v@GMpKag6+DCd_ku-8b}K-$#(?(Qp=NKXjZU!_tYzl4y5|9Fb(^}fTO?PF@c8ac z5D06aM|{Qh{Ce(fvhrCSP;Y9BqM6L66QYd;YXV!Oai|>X#~G^iu3(S0IU_U?Q0&}P z_n>#{Oj68?Tx$KS_wJ4L-dV35Jl|gjk9XC27CRtrWK`cTDDTN$>JYwVs4NzzO&BqO z@WAaHRLPH4*J+QnyxUvgTrp#8*TWz*@;TeqnhuXRN?xL{r@?EhU57&DJuPd;RMV~G%6zY@sprXSSQG>+TAnkR4FS>^E54@UU639%z%q zVBy`O`>0ae$i%i(>O2qRF#0Y?X4XdCV5_E!xpFg&%9f`&8jjIsSq>zI=NO0 z1h}$Vr6G1%PZUa8Cjxq<2(U_xL9KgHZOpswqAMmXy=xMkfW6-9d1FGg5Fu$YtGacG zmdE~md)dEhT!C5luF!7KW%m|jAQTJN6E0Q~>1L*;tnmvs7#xZ{17tR}3#vd(i@<$Q}$f8kW?!MDo8Y8bK0qCBC>q z=ffrZx&AfO+hdtH={_NY?N_muKCJ7N6^VWN9v62^LeRSlPqSR z1Fn~gB!nG$By0kkXrBv8m3=Otwe{Mp(g7+!BwGJY!YF>>CbMd)OlBi0V2m2zs~4#? z_Bl`!;GS}3hjyiix;3fBa6}If0mKC{ZPYkK6)h~A+wgwJUR;{Lba;uF*1AyQd;y+Y z5GRO`DxO<#W?-CLU5Jr+`RYO=#UdDk*sl6A?f|wCMTtr~jYkb-;alTrOiJt67^lJGs4F-a|zkMRr3qQCFSvD3rJuv z&QC|Dn}K>Ptq$Ln{oP&crnc%(vrArz!i}%tGbDv1kpXNa9X_vyDMk(2ZrPA+4Nc-J zI6A)yP{YSFOzOo_Q#&S2RT~jSRlVdHe@jB=6|xDJWW!5Rc!IIKyd`O`65UIJUme{` zuEdSS-NA~o=;Nu35zbC=l;grINW9G<-uQ_wjEO+p7&TLKW1!P0TFoR7FpN_7xEo_M z3?BnKLC@S6r`#FF3TFblzp~*VHAL6{96Kb{5v5YErvH1=|GgTg^rZiLHT{oA5}g3M zGX2kLd?k07OJYud{1Mmxy|Mo1a=jDKo6`S1h^5r`f@!a=|9fNo-xGhA{c`>9{dso! zA6Q8L^W*wo-EsXt`%S5uQ^>!x&(G)t%&tnG&3;ohB91K^p={Lud8z-u5m)=i7FT=V z+~aB+e)2Vqt3C2RPh2ey^`A&w4U71z99Ltp-m{LYVbjkr0+@F8n$Ih)CO^SMu(VDY z2K`1{jfme1o}Ega9X%7MXTK@6-8re$*;Spnkx7->i7GWKRcar*wJ(=?OLVDy1MoeQ zF175af>oi>t>)_N-0Cegx4N9FYG819V2x_zR$CSvspG|{iARAUNq$B-RYkr<=~FN1 z>4n(Q=2Ksg)1~$QupcyWHRt}dj4?Tp3w$-tX=hwE1c30MqwTLGRdX)fLYkXbqa&cCu` zHM=&zf6sNuuJwM{0o#@Tt{Nvnsfgh^Ki;}vetdI=A1@z#%8wt{3C^1MgGrild>cJ_ zhkW{`?P-R;(ZS{$USOnbS8Q`a>km_g-xte&yTBJPQ1$}b#fPb&TIHqlUu&X$rY71O zG=ZlRn^5vz760sbY=CDmHlS_utGT<5#Re1s@-5)yVfvMREnJZ)j9#827f;S5(2ISXAK>mdYyjZ`6q3>yswjrB zG2aoz;HwwmpcBOa*kuf0O6uWv%P z^$DD58WkC;J~1<|^^Ye1=>7$gfn*`*C&nO{Ez-BHbgF68sDmv20RKA0F!s!&f64X3 z0e5!nb>s+-O&IVjHX%ax*n};wsTc#A1me&@Vl+S;h!e-JEe3uN`n*kKl`_7Xb!Bz3 z+i+WiUklZg)TM|`ql(z5tMwoT`$kuj7<~mX`ZY%BD~Qpr1u^y9K_&qeGsER6~yQxx#~fTem#iM9|tk|l0ap@Jc!}_d3F{Tuuu?#9}i-v zJ08TC{pP$ZuGv+IGiJXj8=17Y`jR(HVx-@&xSplO^_$hy2=c(@L^K`B^~=ers0_Aq zwYZj1`2S=rt~@zQgDX5Ci%fganoK)udn-0@W^-$H1K+T=%rN`$V_WX znc;G+am2#|UqG`B!(IINCN?MaVCVQj6^E&8bRG0=R70k{+p?s-V>Is^Te;iiBJLbp z!P_+>zO%BDmD#WTYI{ixR1}+Q=KE%u@0)Ap`(~N%n``F#=3;X+-|foG_swp;Z?4Su z&6WASd2GIOIbptUQ^z(}9V@n}%`)H1e!2PX{c-bsn>-dv zMBJtbNQ25X{i^WCHjn(xPDBJ2GT-@e^IhF>^L_T4(z2c=C~stgM8w%ui4JGKDI1w2 zsLgJ^+lmy=B4vR|q=^d!+T}55ZH>wD7__#&WVr&Zz@m?{EdrIVHQ@&kE`$C!O;7i1 z-AUU6bW4P1<^B%`es392=DdaRVj!lSJy?gA&UH#~McF%WpDzX)th~n8oPZiU;5do> zGnpo1IeS)Vg}FXd?oHu^@t(bK{g(Ka+*vIKG7cf=G%_|Z#=(f*q5vduNkxCy>6uW6 z#%#${YIL~G2jSDWkfBy2WeP15+#Za&mN=ggL};8a;n)pDkIv=i;e$Rr69yw?(^m{m#ymk6uE7K&PNIl;1af|zyB zG8?sOV4U};Xrdw)#38p3<&Np(?~=2})!}3hu^&^A^3-tZC}mP7Gx}5ROXpj6@j= zP{bIdfb8(Maf_9K2XiA3tAGPClr0_8RJVn4VKEREHyG~&$}*$bzA53i0qoxJPZ4&& zEk&>e0&H%S9f6;87!ZLOb%9LB;D1#9dzNP%PBz-L% z8;Bub`bCkvm>+T-h#M>grL0g{wR~h@PiJh&4|Pg>n-Qf%gh*^Gc}tM^QcUcd=gKDp z7F0_0FL~H$$>o*klFQWQCt}*X(rTR_+v*F+QA+z3XWEs?6doA$!30a5sApx>t_x8% z05EODL{Vggwn;$kc>~$2T?OZ)3j75c#9zQ?#uQ5qcdb#>;4bv=Z(VrPxk;&Ae`%{B zrzE@Nx-5ceYomtDi;5jlvs|Ph@2E5f3oHT4jjEzla#`MK zGE&Pt0sch-C=D!Ytk!@b_aaBGFX8M`sXA$>W$*ZXWE-}nN?Nj5S~ZKMC5xpci)FMB zp>Aiw-lD}5c4an8ODG)Jl2&m4>tI=x68u+I{w@xYHB+P5rSY_?@o>+0TjTNW55(Jc0Jq9cE*s;M|ky=1Yzax3NE$wq=vn%ffx1$5_5idmh5t^I|-*B5jjZEmq+P$Cxs?8Xh}| zdHs8&)v{pWx7jJ*-qe=6V>4td)}J?JArp(C%!BXJlCE zz#aRY{q7AQZ^)Bw_$-6uT%37O5RQM6>!%D5b3jH4*&mUcPiZxtyQDy@qp zzC^-8Vs*b)_rAMGM3q(#?cpJSf9d$N&KL0nN-9pQbVZnr%ap>JZC_0!&B;8LL@#K{~e1UBjjgHZzMaS@$pD%d_$rhjR0e zt9ZsMb#_nv7>C(kAAk1=3TtBl-#TRS>uL*-@DwAnLyT|ZoWA=WYPBHs{j#iluAG4o=#hg&EuD`55@f5RTd|W@p z>>?0i9T4%cU-ZepJYjg{aN|GByZ?vxIG!S?eh$T9>;WWGkt?>#H1u*J$7h9>+9@qh za!clO!Ovy@`ywD81EX!%zYt?{MNmv#&oH&dQtm4(~?Oby1h*%6d2KZ0^)@G@j2JAt#%+e%qN z2L+F(oKuO6KVs#;%&GvtvXJ!|r+@p3z|uV9P$oD5H)Zdt&m8|1C8bI=|&n?;?K*8Xj%eceb0xL_Ioi#NM1o zJr`&Irr7wkMu0oV5`CTp0dcQR+tS*#Nj}ylxwHv$tfe+VHLW|IC>4p1*$m#bZIgg& z!7GkJSq>T2=bke^m9<;?7hzg9<(89ZWtPg*Yp zgpK;!9g5}L9xSv$GMIq@KU!^7%FeARY?();ZrV2=D|NF^@~HnR%{^A?z7v*Hh+v34 zBzbMh32cowIs?|Iu0R@xOs2TETvW#SX_WE5C*Mc}N2XH-uh;hxwR3LD9m?3Uhm)1e zJFp$VglkwsebR^lLgiN3DjAVUEH47D_0$|Cct>B;J#;*=)5tbMsvSiF5;Mi*#3N0 z@%9>{XCandXQ5}D!rArSIbHAPJ#OJ>*m)TgKVd#b8edrqIJza)6fuJ?&&S1Ij=;Y0-#;aQDM4mub_s z@T5G`-NrHvrV>_rH1OrWpn=8k9t2Nl@w~@|+SsGvq#i`e_erj?d`)aor2O1Xw5)~Aw8d@78o)%U90e0coN`N?^Xh4qN8XMHN+Ly_{+ck0vr*?lVc!l&BcTCM)1 zK3xnys~_2F+KgV;59yBvPmDqj0Cn%c;E!`9GS-{^F_k;ZUP~5Ojo$Qs)9AWq*K4tR z?bFZc(@yw1{WN%fI#`LLDI$TV0e{Rt{ggFc`?P{P0~Xw?0gE+j-#?%ad*K~t{k_Q4 z+VS@9(ubWfh2Tye*P~fzHal%hTu*<-ny%=QPjB1kQ<+<}Rv*%*o5rm|(vRuUj8^#& zq{CJJC0Z@cRjQ5=V8w8+!yaVEhsVVieY1TDtuEoih;*6U=oi>5N_VB83|FJ9&!}`{ zpi^8AekC7b8Hp)-oV&qKACF*rz?9Q@g6=6O1;3&Fo4my@{rbZ=FtrvHKDEAlQE$@P z8~HIBiPG9xv|WyCe_dD@l%!2X8*B36E*RtXF5O2;u~WP6+aUX zJQaE>nE`m@*mob?lWjWM(KddVf3|3u&+{YvVb8AQdYUHS!(FCFxjhOwY10j!YB?}* zG?!yBEYujy1B{Rkdm8z?&Iqxo6?UZ1*@!&?Tv`dtG*PQahjR)lb%s0vKikPyO~dOr z6$i_1I0&zaSDV)h%GhK!>d?(mw$MtNSb{GU!Gis?I4i><)wP ziFr|UZrs7qT!oGjgZ?=miP39$}{PUaXd4&6PkLpO|NK6M~vC_kreVV)xN)=DwI`) z^68qEt3r8Is4-pW!m5x?6cWZWKrz*)?NuQT%8G?r(}i|ag*Xl<7HUry+DW1B>nnl1 zO(6xBwOi)|KG=BFu+T2>>lc||zv9+n>&n%)9xES zltGzuIy@lEO_wq>a$@Mby`GUiC=*S+bl4QagY+w1=HYeN^W z7wq-I^lL*DuNUq0;`Hl?qS?6Nq_l`0HVQoOwL?x^@iVZ_H>Vk^8J5r!Sy-BW?O5Re zM|-_#`n6-FsU<{wy?OezW2MRTzg};de(hLkhOPE`>-1~K3a2L8>uuAo9V^XnfxW(9 z`n9m4)81_B#;+Mq1mzqkY9OAN0rm^+^@Y=~OR#UZ*W0IGmtfyvuXjwpF2Sy?E#+8F zwOxY!B71$&^y?Dr7u)NLr(c&~-(|0NO}`$4odZt4W?*MCiN?+71b$Xgwc1IEbyQ15 zI^r};iCVUScn!wMFg$T=QVWGANYkFg(;|>dHZF~bVL0A{Hw2}v86v(H@Jo4va`A zfzD-8KlbDB=+5vEKW-^zI)rwMSfCxg%QD$?7~fp6cwj^$@R*Q12$^<)m8qzM$=PyI zIcGbDiv@-+=5Db`3u=KlAM&Zaq~uNgPTAnS{~xnh%JD*0mi?0396DPm#MSCL)LQw6(ZUm zL4J5l(}p^NcvZ$=tHRN7jl+DPRFX-y^fd`JgI~!9FZPNkQ!?hC8u%krd zCYcU|*{1s8wjJ9+h9>fi60U)3b+~yqM~T)=Y~9bQ*XcUk!jsk1zNybrTNLb6E2euz zo7g}iJBY_7ke^f4%K1FsC0;mdAN0E^Ewn+CnoyA`1}06=>%J|L>TfF5=A*|-)-y$s z^_R*wx4$mF2^s(H*4=Rtl`6q_qmsq4=zUeuJaA_AL{Sc3r)a+{`e;=Yw1p=oilX!= zI#%&j(Pn6drzeUwt>|1?>+R(zLW_TQ>#pi61Wc{%vgmzPQ4ky6Q5G#jqapg#0}v|-I-OA1kNUXZEQ9mxWd!r9lW(JRxuSjLI4>zY64f{cE%UTA&baa zxhCa^oGHV3Yi5aBD0|rfB%Dc3&>P7K#WstcUm;dm&~Ar4@j~)bVt}@isDp~FnpkF+ z0J2>z@n?bXl}=*y(`*&RdjsSCc%HW6lre{LjFqP)fukD_V<4I7i=B@pW5+td>oQED zov$r4Jfk~;zC;YG)%>EE(lxIil^hTw246z*Ogl4fjhxwxes5wXZ(03*R zlsPKQS~H78MMHknY2=qRQr6Bv%__?bdi`i=5-&!Wi)4NC!cGl^hTsRQjPf=5rUwm!3^V3_Xk*RR1U>{9;iLTYWc6uFiA&MuC!@%Gx_#% z=McTcJg5+wwYfWGX^4Yd9L*G@unM$d=F=~l` z=4)t1Kv{Lt4Wl-rwmNFKJ}Hp9Q)?y$#NQG>8tvPWzYVg2N}#L*h|#^=2+l+o?SYGp z28`&4)W-o(2octVOpua*Unix<%AUb}@!-}@MN?Yj;55~#XsT1uRL9Y#z2L_*b%3dq zl9D`YOtzwl9`J8DGKmjWNwA(*$+!&$saKe4j)&fO&^;}Ml0LJZ>m({&{CescRLp3k zBHtnraEwqC>KCdC&3^FI&&p0CB*1scHTBc6J%>|yvz~>y%$0GC$RpIxaGUk@@pn7V z&Hnmc-Wt!nb$otjvOB3TJx=@5Y|%(k{gg2CdpSOYXURY_3a7BdUs1KE--^RydxA7Z zJkqR}!ZH$EtYXrTl@?4AMtBtQz*Z|`%o!W(|`ON zHLbNyG}s$L6H4DIQ`ex*cnPXBx`MWaEl;9+Z)~0)ELkPNX~_I&$e#v)XBx7!MP{@6 zK-L@$6E2z27H(iX6D?+b0ZU6iaN?yIQS1W$C#P0q>D1|G$bwXI1~^Iiw$GhVN^hdX ztrNPw`}3gv0SWt(&L2**tU4*uQn#qH+@z||tdVar%~i@;H%LF#{#Y4s;EGMAIk-TZ zOe-2qHw=j75iq>6g>KSk>EQFJygIr~Sxfrj3F9VzT7!_+%{;J73Fv^CgJ@J_T6Y4) zS_8KHK`Oh!$_hcx^1Z%#L-^>rA$;_?8NxAkZ{83KrNo0wo)dhiJ_tF}HeqvfDd`gV zw}9r)z3)WA?{$8%OCC;fZ###{^zp5=panT~b6u+!eOZtSb{jSVwnHV!a90H9IOAYJ@MVf7##@78$K-m4VEF6s0n<5;2MV zPFp+@(ywJ%<1|<}3+Owlj3?y8Z^RU$c@}Ycw8RICX)!t2mIez@P!rL#!TymJXZ-{) zz-nWFpVV3rO~uRCm%xWBO*Q}`H{Wd$BjqEqjFl)M9T4%r$7TZ9$EwEI)RAILX{?w< z>s_6YexyQUzR&csro-$3O?{(v$a2+Uj7o@?vKfkmmVOKIQ=LV^6;p3=7?c!28<$5J zs*5oHcusn&+TKc}C@^X_?ns_?JPO8urBl~NSLBt5rs;epy{vAME%izf0CLKi= zR0G~DkHr8cvL%YB!Hf7@)@!khPCTQoD=>nkvqj^3eH%&07*fW3C^5UoR@*`eY+eam zi8UP@wsL!&m3V3RzL5=K2H0S)L+IG8P@L_4m@yQtelt_ms;N+=gs^p@rRe$cWN2%` z^gigUO}^By6v>U-JZiBu15}Pq#tH!q;z0(nCp(@JU9s~JoePxXMt3jG-jY@ec36;= zmZ`~!v6psmvzpasdZLCmTfj3`Z+q@}^$p+aj@B+sev#vQ?nuq$m!37^l1nXG)Ds5w;Bm>Pqt66QC%;f)~l0Oas#Wrf`(aA z!e18Q*%3kVGWTR_DZ~&@3F4b$SW|p%#K7BEj2Z)Nub9y}qYBE}BuKd1>Kapk5NXtL zr>UDvtC(*`K`BZqE=x42uU^;&PW7YS!*S|lO zTCN5yQKOVpcA5=CNV?Z@vF?Qsr+fqbVQl=EUqbNeD{0!sDYVy$6;lu` zIBIG^jyo&zCPq+6=)IDRF*JkrN)Z)NPIW3yr0CL6R>ftn91{Maz7$_TZ`+DvrAQ-g zbgAt*&Hhmto-O1_s;yQP$FL$Pm*wI{aYXe()s!#v_%cO*Xwic=;GWN8SJVdmQxtfJ zAyc$8F@1w<$k6t$`TptJ;;AAJDriu{)K~)*t^_vbply_g^DTw8I5cj%c%e0hfyOOeHT8j7d zQCCE{s53nN)Cra8$U)@S8vRJ-cB8DbUl-3euD>K-8yz1n+QYhgAb(kl=vC6 z3N0`=qMp1`S=0rdl}j$5(L-#IB{|S6E58K(xBztFdk(_4hptXIq?EhXk?H}7jXda$ zAN1|PrXxyzJf%-?wM@#_YNJd?T}P zDs-s8p@@k$9y>%SYSbbz%N|X-FPlae^~y?o4ls5DRWm^K)Y(^HuXT4E0*m-jchPaR zI46A#Nq0^-O9yYtyZ_2*fY61TV;s=R*?|ROlOl>T)Z?8nehhlt{Ur-}P_i-jZLFX0 zAP?}5ZDG@sx_$(TGyj-pmUsX5)B&^CY+Hzf&f7Getz|Hy+g4jfMmqJk9;eB|<8~ES zTl&HQ=$KVNrX(V4%TSM15i9c#6;iNqWZ|cIu^RwpFu>%3P(4#D|1yC~Z1RZd7cC>} zek=VBYmm2G2CXRb8#CQY5S2c{nkMqPU*_z>%KOoR%|^ID0XkSkyJ4>w$2Rn1i}Y6J zUwcp33wiHQvYPAAm3fwD%Ji0I&&{yp+s*;VZ)JXM)ULjPtyeys+)}iM1nSJV-+HqG zc5M4gWY^@X{&Yqjl*DdfPlGq5_G~D11r`)1wQXu4mzEQYKn97ZwCJ1Hk{JX-PW~Op z9fo6nUm8SM-hQVUnD_P5re-3LDLOvb8b*Ucuo5B2=)oJkX#!T>_JJ^x2=S+~IPsu3 zvR>`?G8;c5gpP-ue4h-F%MvBuCNGqDmyR~=lO8Z)kk{}%7|6WYbx@Ok;Rhthm`*%g zv~<83fwZz@MoH}H*5N}|{)hHckO+9_@jwN0E7%U34kNoxB?o18l{?@yBZZx;|JXmhlH?|1B z%_4jx&KZyZ)K0MurE$dc!nra$Vr=gr{#=PT-%$rEcsVMBm{BIVV@4U~TxEkTBJuNp z$>sKz-A$NidR;fs+#;)2!5Q6NCR${=t5p##vicYOvYD|(MmB1Mkr`uX4$RL|ZAI0= z>^q7AV=OnFg)MTR>*|B705|i`0A|-cro?M7b_Hb1n)b`$vP$?vg5E0mFVJ*~g1}`p zqGpMUJo%_E-Hfn_X-vKY;d6iW)=#xi{9Sod`i{>2Qr5jC)=QOEy$k$otR0*V z_YfqO5I{a?hDXXGUgNV6r!di0Fb>Mfjin_aaL0|aaY!7b0dyDsr1Y{uU1H__*6+}6jh+#-_ z3+?@-A`cn&(u*lDvgaMluT%fu3B{wH;K$-oFK2GGu$B1^M+%ycPV%=wRLi}Rd|%i^ z6_&FV=5Uh31vds*>TvieM8H7~T+diQr#>DSmAx_k3ELEm>b@-_0U;1#%l3IIMzl<5 zR;>_pOtO9c4?B(atT53?%g<`kDy!L&cANiA|5tyM6LO=S0y0r&49z5@FSe zp+YkLQnSYtH1Jsej)< z!?o&c?DhI_K`|Nzn+J7{2Bt^CW5-XBQ0;Wpf+|}|xF-7(ic=B}^g7JUXA#9#7$HU1 z%vtM#qV{oKab2kVM!Hkbh@%lQafyXgK_nrhb^{o8;f zBV3zxxC*M@mLz%3|EB+&@hBEK9gHOk1f?u*h6SFV6vl#Q(sNiWRE*MiGWnHS(EL8A-i-of&$4flw6_ohr7mDssqr9 zYvv5dBh;v(eS)%WIk;EzWeT^^0QscK_@y*}w!^3_kJz~7MmW)SJSD$jaKG(eI)Ejm zovKYZ6TDn%lR8rpk|}^2nK!cSHI6WJ_+b9(UTi24>h{&v}vUXh`BDE^(n;5u968mB^CIC^hR;!viw(&zAnF*uzZGU6R;;-3|XM--F8hMtpxo zN93QkT%peM9KqNO$V9TR*~Ab0053ZMTa5u>HDqnGuM&s~pDb^0CQ~>Kf0C@)$=`IC zO?;4R5w?Z1he+Vh#0UO44l7T@RmHWr&bafy_6E~PC~=#8l!bT9_( z4V0*H+B30#t{o!J@P+M+SNlS-xYM^0dXsH1J9nlpd{Z1($n;9{>St&}dl}Yxg=KW6 zFXkq{z{==CgG&|Yo0j`SAuy_Cn4!0=s@Vk=DLhXdCWqQ zid5jScAaukZbdmw@iMN3u2OB!YSj&nz%x|Wu4taeM)6LFas*qG)wQg;wyJBXIxRFR zt6PrMrRQ3mr9N485(1ixB+>CO97|Y-UW*|chYyheYBe7krcU^jT02FC>DmLiA~L*u zCO-&ctv&F&M}Ii1-SLj2`;`+(aN4lJ*g#Dz7S^kJ> za87eWbMfV`l0}ag3Tw>p*(2VpG1u>}=MNu}YbMD{hiISh(5m+Wf>?|M!RKWpeY0d* z-N)Kw4{C0jmIkD9>&i$v!qNyhIyCU2J2X7CAFJME=Yz^j#$?TwZ=HTqV(2#QEzAgK_+I8fB8fbhT(R8d}^1P&~qB#JpV^3Xa;93w}DR|+0BGOQV+$^hS#7w_6NmhzmEp4#)K5e$Zk_{R9 zee+wTyX<5uX|b>k$x@au*}*KCO%*B^O&wp90>@lL-D+0Lj>fXw4aKQt?a@<9De?61 zjCnUtI?k9Oa}PBOCmFBrBX=i~q1uE?@%3eP1rs!WPSV15Fpo2o${j^z+g94{9+9s~ zru%5Y<_TqwTaTl%YpQYF8yB}}h3yy7~ znm?fdoc^DAr4aAJ)|60mxhY$JVR5juY4et?Mmir{dssveM!l^tS@_L(dtq;jZvUTn zyR)}hx37)2JG1~V3!i$%2q^5*xu041op^hRPJ3jwCEo5awI4q56)${cZ$WS09&i7d zP9bD3{(tbdS4n1P;SZ}@tkNv}OuYSON!TpBCf+WaW(;3^+P_`2{f5Gy$J?GF-C1~V zyxn11J3LU`N+pL+{&)ZO{g$hhgtyO?Nu(3M6TddJQU}V zyF(ba%37{ZM*ZIqvgV#BeHlgWvzo?pQ#{&(m0eIGi?dUrESrhq*CwI@(iZW2#*op+ zJ-XuzpV~K&sEf9V9alD2Q;mQaQQ z7@o?#1sthc62weEMpp`ok^;gN)}+!Xmmab$o_&p^WIQzhSIKxuORmOE#G4TSm{Qq@aSTfm-F(dabek+YN#R&t}v*iuH;o1ot?uss#bWsCb*fI2oxchCXyO zSq}Yrc6wKP1M?nF4a;&cd@uw{I)LJBw;hq;{^ z&U96aU7)Grn$7JcEC1!w|M@F__sj!7dqDkp&+mNfPv3X^t$+UdquqZ_h)tc4rH;I`X+Ds@`*IdytwbHY&%3Y%Eo8roRFAq`DIY1scT~nXu;`7rH`H0?a z=V>086K!De4&@3HfNq6ojetSdKRlBU-VfbV=~QnNEI`SDo7^V%3ub;(&m=2n{27bXFG!P6) z!DX2OWcI=3NhA0M!2WzpVAQ6)g!SD>@pDa)Dx%;!;}GdD=^+ajZCGb@o?iHzdDIZClGALOtsXqpUP{IZ)j3mZ3GT` z8GIUn&GJK8Q_0}5%u;^iiy@Ip`~->&l~Q6CS^16-alB-wc=B5CJztF+l)-#pHN5Iz zAlXGzhOHZS6zOV_+$7o#Pyj4ce%R#sjXSL35rpmC;ZTiLI)X{g7un#cEK-#`z9O@o z1QXmvb3mzzT2~LMRMj&?_u#WK+IU5OlGUPd;|^SRu9z-Ff+d5$w#^bC_`#E6gslAe zfG@Z+Qs!g$p}`LYWCy^Ge2AD!sUCic(8~|_rgiz?3v`v@d91Av1pJyjJ*&BaSV{+9 z0_4=Rz5AtMw&-DJWOR3TlIs1{C&DgNwv?U;g0oW4^cz#fY0Xkb` zU;yy52t%MZEH=U&QIht-W5KpZIne{jp*6*ww})L^KJ&~oEKFr1M^^nyLLK>+qh$36 zzBU!5hgZXQGq=lz2#3Q{A9>i02^eYJM>0(Kzj^f=B74|~<22tX-0pn=L+FbmqvQx< z$qmtsaHqdxy?X)Z%WjVlyrS1X&t5Uv0U=(a0lK*!EwF$TqZp~_u_#3(knGwC{5)HH->^e9~4i7#9UlhsVgMyr(JkhGm6}7Go z+km`PZoO3uqpH<%e6*d#wwWLjjP&z`jDVi12N|Pm0%S55W1Lb0jq9L`?R>&~< zL_6(p(Gjc#q@?5MdYD=S3=rT(Sry%(LP;B$IsH?#0sciIq77jV zPAM@bRssA1PiX)duP_n-e>Q3zkiz`rWR|8q!|g4&B^qN?mqb&4-`p= z9X%Dvap)nn2kB+Ln~$`WTtXd7m$Q{kYf&-!F9@+*{wwE95&_{i<}=9kPRLi01F#K! zzZ`Cc2{=_Yt&z+URC!qdm~*Gtnvi>AC&7ApO|AMFa*q^;wzVC5k8-Qy$`UB#FAh988*9-^P4r9=@crXzbjq@c zkO*-I35Y+#ZnhJWmN7pEAz60$(ufp<{MYFcghUJlbwZx7_mtu{31Wm!nhSuX1P#!q zGcyJqnTEmUVFJQqS;EQE+LL;gJZGH~s)M-NqI#VWw514_O3G=M0H*sOmSVe6n+v11={WEhzg=VG8=RjimCK7X5rTRc(=E;Y- zQ_$d#x}2Z+dSUSFi}VhbaL9-jeV;#+UH##;dvnqscjh-i z~+6pZMm<*&in!<&95#^R#c;AGi6&C%(CL z_QxIm@QH8U=a1X-53k*ulm56fzwz1?yT>1QSu}A&!aDL;pEB3fQ9?5UKcE!HvkH_*GuU)ZI z{&*t4@!A!8${%0KZ@hNJPPk5<%x}DQ#cuP>)A^0puGp=!Z_dnT6Mf5ke4Z8tvre=s z_&5|T_;>*ykKos@4MEh7oTzS+>Bt_KrHB7<3Ta+hjktAh_^5e&q{mWslmh=k{Qgsj zdBIELcWa^{OaR&s^Zc@`A?w$sYC-Z3=7)tjY2+c(S~2qLsY*+W)=~~q2#0s8U~K1$ zD)5Of4&;kyB@#$@-p+hc)g$x8YV-$YNNO8IWUMw?u2DyxIegztx}qfleK3evk8=zH zp)Z6d0rH>eb(;UQZpE0abtoLRB||DvMC7QLJ0)$h)%bf5e;TQkU9+nXU6I1Vk(ACK`V_gx=+WP?99h{O-Wh#SlUfL ztJN`$p`@eLF|~WOp1QbnZwk~fv?R?`!fjOiQ07~W9y!g*0v{8;Yry9b zXUJ1!j3B~$c&sFtEDGrQOb|bWA>Fa=J;UJ#s#upshth>G2ReJ%9B2?#HU|>d#OIm= zt7HzWI&&Zp^IWYe+XT}zI2CP=Cpb>)>iA@!w4#p*$+^N*65=toyEsLpN8U4p5lxgX z#F%`9T{;_v5x$R!K!2awL?)42&&+5%#U27qV|-0DYTDCIFkvE{*^EPT$OCkEw+AR< z0CC2E3%U`|^rwQ8pAN4mS8omtC8oU9Y8OBYP=Y2HhfXC%C7K0B#BO$i`L%)=y#)4X zsR>z&C(nF+{1-ZNy)^vM#lT?<+GqeF&{xvQQXp0vXQY#87l&z^KA%P>?T<>rluj~B z)D0NQL?`|DFON>r>$0VksYxW>G@OoFmZ6f&Qjs%I%W6smpOsq9l-o`%QRKlc`V^#* zOvvz{jx=icRUpq!J4mCE2u^nDVoMsOH`ZTT8 z?$2wr8fjOkkeyc3Yg#J-ORcs1vqB*Bo#j7f`0~AmNM;4g+bnmSUS-u3tkTxR#pzlG4GvtbD?`m7*iH8MyjK)B&aEA0s8Hq^)9$wo!>DbC(# z2I&`FXq4TFsJ`jIc81s;|0p2l3jC4*Am7+L z`41U~NU$-t(-1P4d~**x;T_=-EB`wc|{fXZ<0r=q$EO&To-;{4hKaON=rntX_$ zprqOUu2V>eb)CYrQRqT%9*ap_ttl@`v=4Us0OOZ4T{Qpuzp^iICZmiltTuSXYQNOnH{61QRbL%!tLwO3SE@Q}-Qb20bhx6+`A6<<-kE#d8c z1d{1s3Ug%HY90)|i@TbSwzZNQe1rynJ@@HM{d+RTb>^N#pG*_+2AQ*KLJys4&Ar@}L?4Ee&lZ$L{B#(F8ynG{N3>{$Tap%Zup2SSW#k`!4+~aumbH^pcuMxm5JSx_Da~Fuu-98h}L_ebH zi@K_rYEV?I1LpjZJ8hsZKTh#|TsqbCjk-!&tNc&p~bkI}uK z0XpG@sD@}gurCpe#B7jzDJa`P<`+pra0Py5mO2NqxY`_pT8SRSCkmXY z)R@yi^tmB=OJHadx?lGXyjw*2yZ>;>#B=d*A4R~h+ik@yIKPUVioA3WcNh0 z%2Rqw1l0IEOA@QZ?elsYf`J1_l3-SVGli+Gp3kEg!1(JLm`!gZwYA@>;kYEP<*Ty( zy2F#RG8$aq_z{kQj>C#3>I>?#SR}&X>kWy+;>~AF_zAQxueX+yA*?8s9usJ~ueyzi zOgw=twY2T7xn2C*!^6iR?xcWcM-2=>eelt{nXHA;Z}ie+Iu~)*3KR>h1^Pwz7b4lD zAC7JzkY-=?h6!u#QvDxX6*+oLKhHPD=X!a~crV|)+`i*q9G@LvT5!oZ8l0cX9V>27 zbK|w1-31whFGsPtuI8oLi^g@m>iuXk-W;!acOg4NS4f#PenEmhAb9}@b*{T9ZaYxE z=M6&Aa37)t@qq2E&)z%X%n=ODtDGcsKHiRV5057`DRE-GRrUF3<&A!uvwhw3xqlfo z?{p8Z@C_-#U~#+avsHs5Mm>7HN;(~i!SojE5nGA5k5kQPEsli?2>Jb(eENRB2BuQS zlELY0Bmvz_cZfr=x%DpA;z`yb-;SC)yIJ zqC_ky?v1D=G5Lbz3_;Ug=3fdZzxVQtBTz43PSV4KTpS z#e@tPsek0Ar2g^P*hu}eZ0aAP9W9ws|4=eg|13r7AInGTA2!2A>K_ZH)IZD9)IWUF zGxbk=v&HF0?tF@)X&?c}^7goK>zwXFZuh(Ik~5Ohulq5`$ye%?l#{|;w9SL?M;yB; zc8Tu?^5YC@c2^HgG5lM1vC84blp$DT@d8}$JpJ6y|G}5pV+uZSe3m8#&ierSxgF@k!d1qT z>eXxKbd|iCL#ixHNE3Ne<5q#gT4}i#PwU}}0j2W|7BsB=HCZkXD;|Ca$U&VvwEB4A zZ~lFWZpU~n+V6@Id$s0D5GO~SR&JWS!1G0dY%N_11$@EX z6ZUlD%)V@kWB+nOEfCR!T5M0;F`*XcM>snB8mr3w)GKxf>)TvHt(6#^wkEy2s`^ygjxt8%4rNitPf_Vg!hfh6t=#`p-7;z4mo*D7R#=%Ur3HJn z*4)gY&=@{>Kcz#@emVtoRf>0P();gAgzLE+A7P!m(7#im;46NQb7gjG280Y*tuIl6TouAj%29xOAsGh zUgYv9nwQ|=!i0lp!AXeFVR*0Hmvc&wH+ybKE3Rd?h#(S%6)sHnvo01l)H0%6Hsr2Sf%5{Q=Vn!j&rYqB`Uc7sO-z4F^Kv*E>N zyxE+88U6X(GtU&)#}r=xrGu(RFJHB}eo2x3oR(Ild+?RK2St?+$SvJb!`f3X z(T=di;?u%)jGs-$$Rr>djon_sHpX=$eD-i5#SXzs;`b^S@Oz01Cq#Ls`yK_abu`e3 zTjI`S5J?z&Ttzc;Kc;KYe6$q`np@wG(Erz2C2lEy&>xTRUnr>{6NkHF7L)Pqj-6vd za(6mCp2l_~w$sj@Hf1fIEPrsEFm-_vbSWy# z5BfDhCEtrCc7aAFR6$fO#mcj&VN%dV#?Da-uRzOk@KN9d;iu?gsXwS)DrnfDR0;VH zZIG9thjI-Y3)dJP*JL30ZB*WU)yq+IbpL>o%p_vY^K0`HW6_5JI9+`u>?>$2sfkx{ zRVCyS9pcK&@_*ZIBlP$;O7&kgDK&!T`ZZiKFxoBDiMYnrC_?LmJX?hj$dUFjBhU&x zpsK9L@>Q}q%;qQx#^xj{L~_3n?H7INoOV#+->KHD%hw;$MsTh+ z6T~~)u<6q~7x??N>>QZWZ%#&@>t9-Hld#?)KfZ|JW`!M7Cp`*!z*JnMMqDpxM5dGM zdS4wcClQ*1*8s(0qd74&phYsh(LJQZs^8Nj+oa6Z(GuPXwWwFs__1$sD%Fx#6If&$ka3?6#nEt6$mC-}qzyKf8 zwDXG|%DAnExwAh-H|*hJY%1JOx%;;DkVhBg&hOOMTj(}1l+WGOwxgQRK=H-q$tj$k z<`%FNJbhm@e;s$p1o{r{c=fgzDx*%DUfZFj$)E^n2~N%pHOxL~GV)O0pN85z9QGY1 z!$I$HSL9-T_8iml7anRXJP=2R1cE3hl@{PV9+xsWwu8tPvw%jdC<$Bu0+{e15yN=N2hI-%5;Crg;{yfz~`uC&U-|_&(9D!iVb3iR-spt7Y%O>L$IkwK~V1)jhUWYsc(imjC4n zz8E{6j};h@(YQ;j%8w=|YDfZjf&(|>48E8WoF=rc*jl;{aa#m8yokBw=Zm>Wx|D9c zdog!4SCIcPK1)tAl9oBRPgR5gC1bXu+o;a$o_##KZM`=7?ALO+hQmSjrlm zkd=--#LWvx@R94pOGHZFlMq&RIr$?A#Fn4bQ2jB)mB08M{!O>;Ezgn1uccRb+URz$N1fe>L5;t>L`)+G;aVVSHVB+ z5qU(pkofF182+Lj{ut0%#x-VZV{VX_R%^H*A54T!e2}|U4^aA>?%X~mwLN7o)wxGL z8ci9qkO1^#00@ki=2(4T*gq>%D8>Iwupmr#$G%=lI7G}ARwN-Z2Iy@n3qat#c`5{f z>LDhSH1b=2RMcokK0HTs+4k(VstdIku)am%cIB{7NL{6H^`SG8HZi3>X!9TNcEXOw zf_D`=bg|}e9?l*vw7#1QeHlS)KNg)>`Pv+He1e2|~|+Fc&!&jOZU8?^Q0qXsH;E zfDWNce1lfSZtmeO!Bx69m7C42;Yzxxi|dDHbK9Kn>l-)u|LZT^%iBuz;R-s~5 zu_xxn?nQb1aF}1Pt$6rC?$Z}+zAd*Jw}8e>#r7*!W{Maaex2nANaij zZF+Gqf$;o;#gtd`4?^H1W2>?L|GR;9mDCI!7xd&F@$H#jU)XI07!a*acJ9UtaS z#)EMeLlTz)A&XVqZ&vhV(7C22bCy{IRk`{3`C^kzY>Cr0y>-!|PFv6>1*me){HA z1l9FmLM7H9O<elS+?INhmy~0tqyg0?PqMoRk$-3e9!_E<{Gkx~-kX%YLZb>o}V{%v_79*Ib@u z_A#Y&z3$r)^JUHrF?xMEs>Bc}oO|7~*A=~H)Y0pV0k109XUSrp>FWXnr-g3^-2n2l z^m86dQ$Lf$)j}5$U<*1VN|$xX+DjL?hoAbp0L@N7RA z8aFRDpmF3qh9(ytC>DWVh76}eZel^y%1Cvgx22kOy;3EVJl-)yI7bOM4i}hWXgG<; z;}EB=STZ?@AeM8du4LD%=^k_vSr8jA&Gn}?V7>_#Se(?7%0!lbe8_!LlEaJa8eHo; z!JsQH+v5N0^lWhz$vS5fMy9BTt9`I<+}d&5-ZJ4PF5TfJ^gixLiLMFvH^AL;^k7N@CCMcEd0c_zEc{J;JfKuD4l`rfyz6>4Sn{jK+kmO| z`@`Oq-Ca0B6*q)tNyiZ^|9A0-nEdcvTWAVv5oErx>ghkL8Dy1d&X*i*`% zG_ighEzI3`4dzAOu4OvQ)1`4F)#>BHi#}j#O@HaYS@qcyaM0O}9Jag6&M_ngKf>DC6cNGHE2O_aK~iZ@ihDK5l_uI#5`%MN*}|< zhPubuFCC8YbFyPxbImaFTFsyj6EQ^WIOpyOVFN4mkjxoFgaay!jd7s*A{=!8|N6zm=hOAmJw6Vj;v- z)o!uimzf9-lkPcArHCIB{In^kh6s;#3VXG4!$g4D%^lq&=7-MET|d#zY*E;ZlCL}G*fFz=g>S;(`{Apzy)aJ(zc8hJkIHRJxaTrIE03#SIyuFU0Xh7(g zHU<04F%(Y+FwSb6mO=y|o%l(B6n0pIXlcw+Q;b2_HM{9p+fIH5Pmr=3aICqNj}q;g zfpV&nEVNMpZZcOFgUTTod`8HIs0|+BxmThEFUh%Nd%a-hVc4h_E?rv*at|XBjWdN0 z3dlm0&MvZ6@+pe1H3>DP#1l)$yfW)>* zSfJl5O`#`h3BBw-UusD{_0WGkcA_jW(`CVj&U;a|f0%bwp^bVFv3u~f%M(4~&hS0O zX7&TOD2B+aHZzz(TY_B3b3J`{K_D}kv<8wj=zmlINSDA%XoU|`-J$bL>o#ne>=pLa zCix-?FfmNdo!y+avwW&uBhJuvbTPPE@!lHw`qbRl>Psh1W*p&bgpqcohz6HUV$XvJ zpO;mj8c<(uF49p##%ax;%Zf_-(yxoS^n$V}L@gh<1&_=9ea-ojPyVY9kKRpS6&knZ zYQhkWm>m#N%M^zw0VWF?DPyzonze|JgffbyT$~C34P;^}EWl@AQpB={`d7jx0@?sB zNJ&}@A8d!-nP0)goeYns{;d+AdkgOS7v9Yq9zSX|Zd_mvSz~sK+$lBOIi8Lr;pA*eK^(oo9)x)x8g1}`l*xpcvxA@WBDno3RUPA4akM+|0y&VQlQQr zgo(u^RnkEwrEslV1Z-E_J>)%C&Q@BnKu-8hM63P22Ehms)di8q!IVZ35tezCC)a=OH8EW{-tftJ*fGW@^JtA;mMH)V6A+om?Q{|&WnLTG7ScT(DuL-JLu35K!d~-njt|DXt6|VF7?|JE8|^z6$ZuAf2fCk#)GN*NHwkT}^%Z4rBOhUu9YD$Ab)Y!# zZKK~~Rp6XDP<)r`1AoJWsJnX)JX5}hrt9_ZNwk1Zd#O_lhGl$jz4qOK2;wAzSp-DX zpK+(({Hfb#XCNJA`w7@$PCeX9>V@;UqcOBWjz>@wHM%dyr!v503@Z4_ zboEUZ!ubZmrtRSi_1d>p(1EoyxEufqEXP00u~9!b+~7KSan8X9NLx@~Y^j-fhdFVkN|g;Od1rdjfC-7Bd<- z6P2jw^qJ^};JiOXE~5ED;dWi1jK$Fu7Z)${8NypwO_`z~2(C4#Kyy9|u9xRF5RbU3 ze(2^Dw+^KlZL-Da`w72?zuOu}%;ja`EJorN^zPLtA0F z4L2Ebh#&3$=3YJR7%6KT3*x#hNAKya;hOC_Z8}>wLP!3AYuwgQs0bkPQ7ky6zEuQ0h1W<#fdAxXn(; z<=lC)Oh4_yOrTMT5>{a9>}>ErqcQWb4RxQj1y_D*A&77bRoF|>{I0Wzv4@HCr(^J7 zu}U!fqTUP87V|hfpq&j60XC_bmj5(dW?r~IN!UqCXa^P(uYvB?Y8N*q=&^A4L`bhmvU3h2yx zL?WvGD=mx8V@xcxjFgsRAxzbTo)I>*d zOSW87VYcI%>u&(&>j!Rzt3giqj4)>AW6C`H%^dUW&oWOHYM5t=iVo%}FAHfo(eerg zH07TV9ptd@qEm)>z(31b{;9EdW{iR9b5e)f#E>pVvFX^wI|5pTEO11>xsmLGNQELF z8+?IioDI;%w;RjcM0opyA3{*n06EiQA`6WwV3Q}D{SHoKG5UMZLooH%ViQ%@N51$S zDryl5H6it3P1EWWQ_4mKvaK_x+L*F~*#=oSBs$kt6tpSKY>5u19cT_y0gz#5W~V9i z;-W|!h8%gCTeN{#gr2h-E+Af$O?wwCUrIC^e% zd!3#{E<2uSH`Ur6J;&a?#FF7k03(=L%#>kE*#qqGU{f{1$K}KdAijZPh$n%#%q;`= z@MzSbvAqi%u6x7pNl|@uf)Nu#HA*3g^HM4cd453uW@4{W@(b(5)smANka^{w>gEc) z=Mt?3G5G;}jz_AiZJmV@&vh2RWsh}XcOldCbvXRcQnedr*_27fUABjXY~TpXW?ggz z>C9nd90tE8Jr0{yVMVUkAG&qy5}!b*)e|st_et}QK~ck$7C#fmQ$adj4%0{4RX)ME zh2Cl%D;Th<3J(D9zBL3d_Ar9dIDRlWu_P$Tvha5;?6ZrKHJc9c%*a&?oO0>)PZ zWjeW_{fRxo96Cu{T5pLB|7DYMHLOD)7RFU?1GHEm+}=^M8HLTebDPh#DJasevhjM| z^xC`jQZH53Y)5CCe%0+T-5owcitZu?vnKw|8l(C!G~=OBtECP%JSUBKS@SOjfWzo1jGoD?N6rF!xYxX5nF5?{-@dS31Q*Q{hI?`$*{+vowxRR= z%roB|gt=C4`7;E+Cwsn&;L7U00wH|~aC94oz5z$1#`MuOS-HV<^Xu*2O zM?y;tiAGGxfMVKgj&yWG^ zZuovR^FonWkU$QzMQ4KKIas&J37$&dyqGL%Vp~ckwk0{GtKQHP9ZZ_!v8}mZ2g`i5 z#n0r%pg@@Ct1zj7`jpU-v4k@=9c0ltGAJ6Bv?z+n9;I0QHzY=&(Ui2}CL=;&nkw#} z(MzP>kO+GlfeRs8XEzz!u;XiB9bQ#1B~-1r%pgqn8wLt7NTUVCT;`IS@W&G#G=pkU zQd^Y+S~QFKg<(1901519`*D*OxC8x@gL2J~FR1-u*a%pPs}mZKuf^d5ao?Y;UY^!z zfjbrd14lsD?B9m?8f?Zo$M!r~H!N?wR&B6^`#7OlCu<-bi-wtMVh`k^5(qXx$kc}k zHK!F=9hXq}6&JuX_-$~!V7wX!Yqw`yK($q5v}nX|o@=BwTa|m(8ZdzgwPZZ=3nW~g zAt~f%5G17oo-u*>8RV;IAO#l}1VrX%ST{(zA+#?p&^RxhEbL88lxId>!=Uxu+KX_P zhoy(!aoqN0{I^OvdKWW4A#m)rtC!iY&m+c>=m8+eoF@Ff8ImRf2dB)6Dhf;kUQ zEmeDx-S7?qZa`{Y5Mxp_Cpc)K(;A^Ik+Np8TM1PeXEhk;BmjOcv&qB$WL<%ceVv9p zSPk>DIxZk-u;?8O`v?zVt|!PKh>vU@;v;XL27-{!LP>5us49GslsP{JTv`uTin}Jm^z>p~F6(;8#X3{3n(Xe|B35z&K#&_0blL8mfa!qa;PUe`L zAE2I8Mhq3Fin=;d7svz6Lq@>WN(ph|OJ6A2-e;dKF6Z(MM<%^-5!j>_i|htvZ7#Z|d71;b zx%*$zk=RELgGVD#Y*Z5*3#I|u^AHXsT&Z7?q?LVFti)GTw_}ZLZZ{YP>jJP9clpZm zPgv4J+LN`GG2~dMiszEd01Lxyo_Ie*;-o~v(Kk=FKf%|cE}L6b*O&Q<)xFLD@z&Mr z{w#UGb@R^FOs-35z&$B+?Rm~5jicH>A6KYXy zuu7ac>=1pEG%?r>rg6Qh3c(OdhG*YCob)!E5vR5QodcyrLDodS%^jp`vBxT;E*6wD z2&vQTA7LX1Qqu*<1P#)E6*Q=vp+SS4vVROh60&@Rqp_%h21&h6qd_PNL4)F(Y4#6I zY!OMrKzqq@kv)1nJ$fmI7miFDtalclL6{*=-pl62{(Emlq(>A@v0+_&;T-@nC0&F- z=`F%O?e?^O(qV@`Qq3F)O#qTa8@Z$p#wf=?ZbPSDWZi_o2lL zL1h19S+K%dDs&m+q02#%lB<*l8pDfRrwfu9VudpHylW^c#^L4<<#wSJcy&{1N^@3| z*PR2tnAkA;L`Rg2Ba4V+nGR+hP(hu=8$umR1^m-Ut|+JxUuF2wp9WgWcAu{*PMOq$ zmTWYtF8&oLLMea)ff7`c#n(qdJ(UOs-a3E)WhLG+V~fy`{Jn)Hs*1^m)hPc?fw`pj zXXyFqNV z0XI-`36XUmTtWaJrL5vd3Z74+lg1VtNXllFHU_2+=~jNi51V42wAz zk;pVzvxdL74a9XZjX6nx&gVS~;DnWc!D$x}g`f_Xf;KDKOv4FK(}`R_91~Y7BnCPa zrq<{vckRTuqS8UVjg8()$9XR6x=kP`l&z3l=&bVqi2lBycb`E6K%t6GX#-;&c z1D*@=tgQt3g?Y%^@7xudX(1}jPO}TJA$Q%2@R(;H|I9+Q+?{;5bWxE2i*YPta3~?z zNnWqqjV2awHEg3`%1})h1+YaFnswn~;-T#PH$a9Q+sGCR4S}ZJtoUWkN}wX(%)ju5 zM#)Ijln7SWa-ta2L>;b+uJt-)bQ&r_00YthA+VUtX+;tkW1lYQnCI{(CYZ=78Tbyp zPDE&?9m@Ha4oT1^gA@)N8YXDsE)&R;FH^2ynMA8Ato$|jWzUG#H9)= z`Wi2RmBV+X@>TOxOLo(SV#q2~k-f!B+8uN9%vtzSXMkaq z3tGECK`B%|S7^^`VLBhi25LZu(7U!}ez$!n6MDdB9|p}A+djPSf;M;p6J;!!gcB7@ zPvY-^=h_S5SfS_On&1xR!9oc{fq=SBdju?twBDvYtp4>>iIhR5hqu6~Aal)u2W%J-aOQ&4Ywa3WRss#`` zId1MK%Kc2(M?1uwuK?}IUZ8~}Zhd!eacN;`u$2E)Ray4>VRM@L0fG^H9&b;QofhrB_$Ld0KC`W&vil?KX zJHzZCPNn8U2l5yVvTOT_2h&wFcHSe>GGSKo^wYFwomU$P%fM=63>hFxGstsfRIA0} zV707k%7#1?XETIbGP_4~FSDu}S0#4iw{6hE1)1Q&3N#(_?NR5q<(^3yhH%F)<7tkj6p~i{^c9e#Mk9 zS-S%fcL%_<1sy0yKOou-1MBEh*SlQ4Ub`ESe0L($X{A-MOv;v|*$qZ3#?V!zbT6Q# zdaAUXP_1DEKICz@Qbn;R9Y!8`6;ygMz>g(mYI^KSeF)Bi*>>3=CLmA zLu#=OJ5VQIPT~6OSQjYLFkvX5uhb>cXWzK#``${G=Sce6!#X7c`=KwG_ zoa0XU%CK%ivcLilEYN0ZdK(p(Brlv&sTO$KsFcMKlqesRDymV_Yo2n#fVmT{L_50O zq)$KtXMCO`FeyGqLUIlK&xhS{h)=>NhIE0QO^c4muD=kBV)Z^7gkmKDp>hWZv7BZ+ zwPa)dDi#^%ou);$l4h8d!pPEG$Fu}TDv|SA4(;5vYw?n`<#r(l30g6bY03bQtFZL6 z6|dlp%70V+nE^zWM67txLJq1_C!kS$KZvH{AGK=L85&esrn1PwXQt#4N)VgCBX6U7 zgtDg0a>$)Ql?1oXuBm6ER5?S*p{I#$GXQY>-g-3!RjMd5 z7)AJqUx>$wzp3dMstEMlSP-j9$-k&XWRLsPav5Px)1k#N9@jOh*n|14c(G96eQeG#%*fK*if{=2Ch z#C3uO&c+VibakAut7-xm`R@Q6&F^X%8T^FtrN{W*Gx;3-ZBy;2+fgk6r#<_G^ z)IxSz$N9Uq#`jCJ(eaSiwPoM9OqYx)Xvg52fp3t7(k?XjR<&;ln~%rfmOV;V2m{=p z^s7@!kBHww+bPS(0Os)dR@Cn(y^2T*pU2tJ+o0xUhL*$Ulf`bSqx4x9+8#c?q{VKA z(l0f0lzwU6Vz<;$`lTtQ58)5%0>=hS!~a%0>4`hT=UYlY7e2p@(&zAbLo6AL3xF`p ztb>0A;q%Lh(l5`3&tvKngIeKup3+D7{Hm1RnL1pf@mTbC&&BRpj3`vNXHg@WRx%vxGK(9Z#s<;r z_s&%q>gYvCq`lSi=fi({vxtx6dETsC!q3&`P3z$Gx%02jWei;tlCfDO-dCd^>aCqS zEpf@(S#yf-xvOFJnA#HlwQxXEkrMz1W{yQ7ip~<#IQ7JVjTffEBjhxj0g!g)%m7(& zVD4K`wpXVCSLM$7oAni*up*_JS&aBQ)qqkPTG*k|A+teDy8R3mkHkGQhq}ShIWbfbH3j1P( zIaR22?vQ5};k53BJA{#TP7qp@mBg6XRo$vZ2xnPZ*sT*J7Iv~UPp5O1I0rJ$ zax<8=VHF_BZ4s?A0=3O`%YP}wG%{D4p|;LYiz4m5g{t|u=mO~#U4ph6x2^ffy}XD! zi{@a*gq~-3c8fukwir~2S~$xAcvL7RYnHo9-y|S`4apYdDJkTTav?9Tks7DvW0$Or zntwCXrQNHew8ZoB4zY?8ig3H;Z-yyYSEew#bk25zlDRNg0fVXXB)aAp;VN(=@NyRO z=M7*P^YMO!fhPHeGA!n-71Y}(_rfL<{0wx$WNv6j47?vI=5R~|vEgKrK7?V)BBQKu zeAU`nUM@P#2DTo1V_WXaux4PjHb)B1a+|$yn1vM^pLc}Stbvl4H+vDJW_`B)l{uT^ zdfJ5$VhxkW0SO@ogk!Rm1ipYIFe8`9)6I9EnRf`fp18oG%T4}o?w(sez29!K+i8xo z9XIe51F7A(lt{)IphV4cvgul)3G;wKAl>`w>H&{&EhdSU%FFnp~-T1xL%MISTH?8Vn+YGCnOn^@xNZN z{D53|ei$+17euz4-}#GJ3(5^wLsjdefe_;W%kr1}M#TgqexTprrab3rS?FA-3;k^)@4q*{#MDvs+cB(Hs6s z*(PEgb+(?|yhxTBteVe!2-xA06S_rR;@NGr86Rc5tc$;DUWmWV%gk@nra3w(pk`UF z48AVEZ&Dt(;Ctrl0vVViLloRPLyM2*>Uny1^Lf*H8COi)RFAl+G0P&GnXBP1_c$p! z=`ua?hk~uu24v=r0D;HVLCmaz=?2QaK#?|weWb++wP}zVfQp=}rkq6)L3-^+ zY-m`b6=VxylqsLI^Ix>?DAF?Ch32>Mt09t6N21J$uie(;YvPUeg$J6O7l+w}o0n5? z3evCNQU~lkO&y~>m2xN zW8mOWbelYW*Ylc%>$W*7Vgw-#06I{RHuqKEZAu@mZ%m~?Oa=*&i^vR+JorauZ9$rQ zJ~V_xkRljN($m1W*YVVVO$pPFi36?6Q66N=E$d5Y{NonM-XXS0C&8#)wICZSJS}wA zEx_B^aefAu6cZeSpqt@1x5F*%6fgZ5K`_Z~>e4qlCrEk~3WMaO?QdE>CeUfX&4l_< z)+$AV5idl8+7>AsSSdSO*+~E)OW&#%BQ**I& z(d94(L?5CnB;AOpIwm~DBN}EwuP!b)nwndOMhmWSP+Y1Pv0Tut)cK@}wH{E|VCMmi z(u@Sq6zHl9r?&y1<4Xx&e2IwIdTA;uxA>y|_C?&;A`~A)&f^FbOKzHodkq6sxM|8+ z;~g@oI(`IIMWn2ot7xq2H!66mbd)>r4k_<&Fqtw#)MW@w&()Kl&ZxS7)Lh# zBKVR$?13=TSfHvUYC(oW7)ZONPeT)BGrAM*qQ%sUHb%^>KoCkW1ML|CH)B>#+j4nl z+>o4kWxE6M4msx3mYm&(F6Bgn=b#fpz6uZfQ6gbXXTuUy0b{eq2wu1^LSE}=9RAEg zxuk%HX;2EdG5woy8$1luj-|nNT##@83L=J#%N{riS6qVfF_N(QN5}^pOd$|2!Ze&c za%u%7%HixBx))SjkHy+TmDen_M_h19?FY&!^tG|+sJ0MuBvHcwl@<Mg2y79z>ZNmOWQ2$^(<=Pe)wf74~eh&q*-I{^oZ)n6brSJQvij1 z00Sgu-;~yqIwqB@h!{|c7`nI!qPLb2=h2zk2D1>T62N(n95ov_3dQRst-OQ>VBG|V z`qO<5xAfDJfgudOk|l#wUoT3v>)4(gTcx1e-I7r=qRVN?=zWV-LZZB>=PfT8eRm2z z+n3B@S~464T^hT&ZOM2VMm%F*Tr8hHRy`vVmhQF_85^AhfK@dQ-VNjdtTGc;P(JZi z2}AK9mo{|_zvsY~w>V5q{nj>X?hjYIEzT|oB!FBgaw3r<`pi&ZXpmJ7q6|W*#`d6e z)iVuI0j&tRh8Z_bxFk*(mJpG`Wkd=~bf;0h#DTX_y~Q-DHw`KlUrsCj5CczX+d~H) zWF0tAz&V^jfyiO;5COu?*=)}me!gszD72Q#0+SBJ7~_aW5)^@=`H#O!@yJks#=puz zR?5YKVvUld=2_(u)KkA>^ZS-&Dw~J68U2f1^T+9P#M#5m)9KkbTD`bf)meFQ;Q`dR zw=qte7dPaXi;F!?KS*VC;ZOc`OfC1h3o`e3^JU+Z-sd-IR!X@cpjug^z+U^|oaFM{or6rV&KP*|Xfn6_)Buc>M&}$YEcN-T( z#EdPHwS$$v&^$$H&PUMYrP6Lxt>fHG*HOOi$=5nx_vP#Ue0^nHdx!HMTB$H3L<39g zO;QM`nr|gxFiV`tbkUBhwmJ4bTHe5O1srsMU>)WkpcgW03|7JEl|b^t2Evt?4tW{S zbHIi$H(?MYPh*|p)6^|1Y+GqNC3TN}w48*}%P9s_IeMS_Nqz1qPF5)xT$juTilXcf zMi+tS5Kfm7#8O8n=#}Hsf_Tp4gF#ow5o!Y_s0qX|Y>|90Ou$`CYx7sAWFP$3`=^}e z;J;`NDruiB6Yl6phV`MZVRaN{^eSw#uPUIFVpKXlg6CpU)%-Y=%{aNLSq!~Zq7&4H zCye98>2eX5k4FCBn!7+dKS?L1n(KysCZb{W))%0dt&HbZ#>L7`JV#~Dd<<+;>Sm%^ z`jwKdR2%$Gr{9J?>Xb??J)NrL(oR><7?=O&d!Pt|nwuPcp^&Dj^c$!0&9v2#PyiQ= zfMt?)n`dUJ?hI#FJjil%FZrb2!u;sLN%H|#pBeR9R{h|y0hq^u*{hq<|VJOwE$45f(&Sxv# ze2L@sns02L_z}QpGTQdRBkhBCc1s9_OU7YWLZ+2VvUF(1JI?aUcQ0<2Q?GgGXM`*Y zK_UWpx%m7dKJT&e^NA}-M(%-4=_D4Vzo6D%Rm-P-_PJY*CKb>TX=}RlwQ2c|`@V{n z|L!8fdbI)GIja+V(69DxBnx`Ak`Zsbg-kQShYc@FNCt<}ylWU8MLbvr-zDq$&{3Xl93vyP0BGy8{+l5 zd9;KD(}wt&laBaiHYo>b2SSS#5wNGjWMH_PY%GVGheC*Epieq_&H(JUoQEbn2B}Yr z5%!P{+v+kAwXNhHn$n2dkf`Wcdkzxzzku+futC>B9%LCpLh8^+u(bJ$y+iG8bm^$9 zOsU$#M(Gxebg%KxD=0Y`m3X+YXC<8z!TB*-){2Qr{%VF>ER_7L4 z{s3{@S6v8Na4E(`wLzDxswJc0QXHLC;3rgW$iXlzh6IlS?pe+cim7k~ej9t>hR?P= zqzX#4HANfs!ezVSTzcDfQtU*o${FqP`3|p!-_^;SLG)xa5H1i=f(J$OE}a*UX&Vou zj2Cj@bvj9EPlyiS)mKl=9{g%($_pGhlUbxxHg_Ro%Y;DN+w!f64LyVLuL`8mZ})~j zUzL&N@PrcN)Mz04+cN>hLr1Hc`g%B4_Z21*ZA>xC4SbDRV&2Gc!tq@DiMFM|U1HG+ zIn;WGO`%tT21+5E8pD768zWf?Pfs9j!{&)oEMZ{xeH0djU}asrY4~n)^s!#D$egLU zZ~of1hUiq#f#x3iGx{l|-EBWjEQHuu7sEg6mn%~|wQ$R3lDXwcM6l`Pcs?WGzg}a7h@wYQ9Ps-API6f8#sSBvBJNKYu z2-6-wIj22v39@Y2=HEwv07U~#5R=_WC8)U#0}Z?_2EGJhxq+sXf>#j8M0)80l&OLs zFEqX5H4+;MGez>|6Yxs%*KjLd#=Z|qK|PcJ1MKErO)~AY()4XtDaS`dr5xipQ>ihT zRvMu-#8Y+@fQZvQCV=B5ABObU0vX^5VR1e{tFxkJyMvqbmF|O)V18>s=5!KdXDzlB z5_rihvZn9B4i#1wB?BiNPEd(^7jkJ&KB**fo{)Td z7Tcl(@qD5Uk3(Zm@tcu-=pLr83bWJjb0vayuQ7H`e}@g3*=D^+D0+%P{VNE=$dyr>_WGSZe-Tx@Wa5 zaWYBN#&NzR)aE|Xpx^+C=GE~VB}bm2N&v0c9?EPYN>F&#MtqOPfOI|lrHT-twl7{8 zOz$xK8rdbngSbE|ffKxt1X>0Jfv0`e6&3_D<{0W7L<}@n($G*V*PM{_k=7KOSY|jE zLUHp)WO@i&v{tQK-hJ!RH91~9oCN6Ugnl2JESVc;Dc)~h-<+V_I}CMLOvq}9MN6=2 zo*HILXlcbm(tlleL|KSz=~4J0t6%sta^Fk(4Rq2bYOQ4hI>vCM_D0xJ1*f$o>fk6o zjOd-{BLWZ;+9qyb$rZyt9B_!P&g;$-Fp6RnyMbRZ3P0bN(?Lxo^$bs@?l=TTeH~3OWJI2cCWQ@e6q%lU8C8n7< zub6XuTGJQbLAXCN>|hZF7YPF3r8XllvqeM%#Y{CbW-hQ1K#nuf+i2A0v=d2_*lPIM5v7hj5zD13;e4Vh9FltU!Oo>lCf zavlqxDJ1+R4~VHwc9cA^3Eh(^#X(pl-&v(Pr1Bvji0&lfhisT+YJ+Y@Y@u3$b|^V0 zc{Nqx0GGS2_khL8{4Hx~{!k!rjQH+FH2bEJp5wNJP#?C+{7W+ISF*;@lBFi?eyaGobyl0&pqb{{1q^_i0Y(MMz(K zq(ui3CKm*!9N3__C>u5g9wQrbJMfg*UlCDw{jq=wLvg~{lGpqyFC4BmNNpS5rITdS zXafo{n$Qcb?QCB?M8}XJT0t-wt_mf}P6L@e#q7~w(@1uKYg}ylLWb`0vNL|D7Bb>4 zX(4BcFr6f!-2cDMS;!C#S_uK#49EjF^>}3yEy6z!slWYQr%lATdHG<@rq4m{sjaE# zVuQQsRYF`Yc}9nCe2!lH4|U+qUOAkV!Xx1DBq74Joega*O>XcFjzagyAMmquZ6J0(?mLE9Z5OquQvm}w<{!PdSitNGp zk_h7f!w@Wii=QPC`_JqzOkzsB5W)B;GP6yK1vv!>T`@Yw$fH0{qVYVYyrpr}kZGI- zkVNBnqGO252!xD+PrD7?> z4WT=ij6k=RtPPCL=ml9DeiO8V{)0ODHSh?4G$2>3x8`=$W?m)kn_l@p2s&ph*<|Nf!h`TSX=EAZC?pMB}yMpHrBlgaDa#z0RY;=~!=FZurd zTmSl*-mm!n#K%AT(i3+#PZZak-oR=Uc<5iAe8HJYtVfBHcmDJbKA$4G?slq4>BFW@ z{K0#E=6BAsAoAD_Es{c!q1^O+cZ*Z+{x`t>!saBG98@gCJmWk;%zg_ku6zL~pD2!i z<2zJ~`E?U;0jVR;(#6ow-PzCpG79e8MbMKbuEBK(o1sIt~>kf8=L>@@Mb*(=-AiVCw$6XyFTtghQOm!=s<;F{c#0 z)#Oq|^Jf|WrA)Wua^57(IL~$`;87i|RJJndckQSVp56>RZhJHIFZb<@(bDhFv{a^+ z>fYVW{;gLPhiDXre!IvV77uuDbZO!o()Yv73(-3>m9w z1nrrc#t?aJp3HRb`jwnEsceK$%ScH7qP3t=S)i%g}bj;DPE! znEbiRCV%d-$)CGy@~0%U9WIEb&;IhzLzZc2z7klKN;<{Z5w|&6j$#X#$S{Ug8+3<( zc?NIrLGB5I1OQ>@LPl`qSEGNAXEKBYKj4!EN~C~^@Eoi(OV_ihX|Y~_8ffZ}AJrh? zpvkTS7ukBH!RI-e@xU)YNmU6n=z2HObuQsuK>N&t$z4Rmq0bk#0$NdRF#1^1?pmoy zo~i=U`UJ9f0aYaC)L?jou9-pd6K?J&Mm!;8#O7tH#4#1#q3NFD`I@6mJVckJZbzS1 zfYSaD$brU~?R5;Kkd4>&*{Jju&dN&}&WKikF(z!=SO~R?lavu1m}CGMo)S-*u*;mR z99;%c>(ywYUZL%9kPIMn_}3^!yOtXMUfF3K$uG{zSmjF%kP%rxPIPD)!A)QDAg9pr z|3X1dp=VFOI4#I2mXHxzfOv?$$S5Kf;P0d{w!VM0JB^-5U^5{nq0h{OoM1)Bf?vfV zXg&f5=bJgbCdU}WjQwnH`1|v)bZYq`0Q&zcaDI)VzjlJ?%fMP)BrFWbK7ab(toAAp zQC+hhrp5*atE(47^jK~CGfz$}cAoQOL^R3};h`=sXL0u9)DeUpbH&8LEg01~pPmI? zRvTizTRfpx97n-#KE-5uI2^P!d|wnBgmczk&;wR$N2R&TRGPa?rMb&gnvzm!8T7$Us07qZUQcJ@dKj-l|C(lWBj!mY9m68z)j7*y3YE%3gCoGLkQYNFbygBwO3K5- zQ|MoO0eC1xRNz8}#{X-87~AO%z1)Gq+&oKf0)Aiut4X1t3>ZE;)ZiiAMkmbl933V6 zgp?q0fs`(gl7^9>y2Zg=UL4%z#lc-(9Lid`8}vSRBlUi!5+)43X>XYgr26P>Z}`_( z8X8-Imtz@e%9;{-x8(P+feyI^y9r%Se4SUp{(fUAImu2*ATY0m$ z#5=}yO9eM%U_cp*F@0dhPfYV)7rGs9!D@{RXX1W8*z_D3gv6Qys3Hq$7#VkqsZzC& zK*bvYXSIHxfc9EeRQjwf`_#uCz?Rbt$gUmMS4?|$i(OZQ$YVu_SeVvpT${x?`W;dy zrTA@OqwT|Plo}#yIZgM*Jc@DGb;`3?>3a;Ur+3`+I{(asKv2XjVE{M}0|Y>lpuq!_ zEN5pNa0x@eOF2G? zrj1Wx*v*?R2UHxSc)TvQl8sCE6Ur|!W=(9P;G+mtB3U$%Nq%}=$~Q&8uMY&spm_qV zLDQ)W;IWzeN4QUcp<(e2)5oBBkf-_fv48gflZlmE7KLp)O1~C(4%`d;ifSWnwZL8x zcbb8}JMLDwdqdo5seO$OowDiTnCNyyOGUT0u=1&auyrnD4})VtoB-DdpqCOpvkPCv z1q~J%pP%61v>}5ql9CrhqyJH}pL58cawj+pmyh={nltA^p{XoF&s`-lh; z4L5mD#}qn20D(o5_jF9(3~66MKFnFgtB3z#Iu0@po?#rTX&ks{9S1s%<5)f8IGV@5 zaKGDJhcEH^nQl^nHL)i`Dd(#i(CXZPG~Y%rM)P?*Ie<;?OTw98(98(j zBIoi-a_@HMiJWeD_adhhRvVBT493M|*i5|XPuAdslXdmQh#PH%ou&v=g?P*fXZ!+L zja}?n!{THKn%oA7B4DPVOeZ#C*_SdI)^8l=Cgm_uEV{?*zUL+_;X_XTMal;CHH364 zBvXVhLp-GTB`yQ%2Tf*347|!P}d#z%N zVHhiWO4&&H@Fcpi1MfxgWiErs!yd!s64AL+zDOdzRvc*gBK#?R2E{?9U`C}V$~tKO z_>P_R9!{Gv(hDoko&%c43Vc+&Y5zhy<#$p3Ngkbuo@X7;2__l1^M0>fH4UuQivTj zP6QlR7@s-HEuFA?{pJ|KDbGsTP6>KY zbOuT?iQa|KXviPdw&4(XOVVV@i z9NK@ibT}Q+mqKuIl#uiEOvJc_VT_*9qB$&Rns6R4R0)Sw9Ja}_sbh3BfKt;naqf*{ z4lo)p{W^sx6k28Tk+uuGM>5l;D1P>vd)gPMKLvyVyUSQvS5@sWkZ6i=3E+A$Z-g=N z;3ferba-jP!Yf~m`I_x#Ep0oYt-9t(H6}|etC7X`Q*=i<7K@6)emt$ zxXgnFi{>Yu9BwwhJM{VIKg;b;?#VBRsriXhE0^;8{r`mL>-jM;IgkGu-q(;mi{?K) z2wi`1^YMSr<-xLf?=N%xcyIKZJyvhQw?FqsE1S(i*D;sqsrMYeEHswp;a{NizUHp` zx%_0+{M(On{g+k#csK+xfpMuz{ny;r*09hRHavu2k_KCLFq6?_QDvw|RFmyPaPIK^ z@qhO>b2heGm-){bNoTy5ezG?ek(3otNIwHu9krB5Kqt+t;#Ta)Iq*kbrGZ=^Izg!z zK-zSj9#Usl#c<4|v5Fyby&hy81jO;3Ka=7V)9y3sL~kT;dV0DT!!i>%a%J-clnDs= z7Zg05!1W|>rcG*k&MI~=+*q2}>QfW|vpaGhhznlr!~#;3ZKkW79KX7~ ztE;K268^5M%Jwr|U3PA#U0vP`%V>0U^-Nt|dakb4D{$*TTY5bgXljyfbryI zMe*Kx*R9?%NPngKYUaL|?m6K%JJFCXISUL3yXZ?~k_6xdu4@1prx3^I;=~ucVn*Nw zUEah42-iy(GT_#Dfi-%ZPSI>JMK4Xlo{TeOAtCXslVB6hC7RWEO|FMnBRO?i8|e=*3U4iK&Ez7Za;2E zm5^$6I;wTr$x*GRQ4!W0uodIPt>+lkDu}b1M}=R?Dr3qWgA>5$FcOs&t#nt`~#I}cMN6HXAwry+>afXziS?Q-gh~bRSZW>zJ}6$OUClIJ`?Qj{_S0X!n2Xe2?jp4>r-qI1 z+#-@%Wn&tvP4Kj0@ zT%L>hUXGaWS5w>$MuEkM`lhGP)g3LXJ@#bwaG=GG0974$E#h#RX2>c^kPpg$aUg;7 z$+K0<0(Yz~DnP+?Blgyym59Clk5##-tQx8-$`_U^sv&SlWe-v1zY~VFbmQ2MH9AOp z5uy&G;9_0J_yClk^(bP1a1sHL7_U4^)Yv?&HiSo>j?QmSiyIkQGg;EX-xiDNC!l zu{3V~Rock5F>KR9nM)*a0d!6i08~NzTG+^vuov<J$4EhA01Hn3i+A4lB|L9F%XqbI~p@u@x zKT=(Rx|`W9<0#oGwGb-ILfW}`U}UgciqA{M!t+AOlX#LDeE-HMSTHKusScc|-pKz; zw~bkR$t+R002u*7yRHlu|Lo?}n(Zwd5YUnf9>u@*Y-%#2`;eiz`^K;{t#L3wiGSt5oOaRYq+B6=#Y*P8`>> z?_iD1LOV6~EW20#$J>JTZv*kRpMeY@2ziwIZK_eCXL=WD6A$Azt6m&QkpH-l@6SL! zX;3l%P!$%SbQp8=^V>_Bg@bp>6g?@>`Cb$)dITVi7nwC;!%MotJmG$)`98b@sX#{!A#mFQCFnSL6BXnt|uTooax!nfCeGVWe4j*Y zbK7Zdj9A{9S|H_2rfIr|exuhkfN!=M&=6m}aD*oD?0AI5^t1qzB(lVe7ZStd(J{}TiQ*$Og(9K=v$ zYC;Lu8Q-%2h=qheYsAPLpDb@Sdq@Ulpdg-knu2@O%NTF@t&VhjD*@hbmPRh}nXp{F474E^NjRB)Y-mLy&FZz0A7S{ma&S{kXW1O^%rm>*V+HN);3kL4@A|gM z;!V5({@yR$^e)o#*Y70^IUPC(aNc+?2)uL?0Per>Uf#u5x4w%w_zRyd&nqw(-(L*BFg|$v_@QgBJ6<0@S|7aXs`~9$ zAAehY^u|M5Z@K2^+b=tE)uDIPM{hV@AAL*x=A$7N`O;%sSH3ig zyyVKQgU1gYd&$*DFMh>aUiQsbebYC+`OODk_E-1sf7x4Jdgak$*S`JWv1>0rcKoV~ zzv(6WU$Q^GJG8ZRbnDnldHANdeaY6bqWELly_$Bf<=-CuwZDI0+wb>p`~Ab)e*dHV z`#i3~wa>rjx%lugV)?}sQ5a{@8h5Cd_DjElEC$j>yB<6KL(Tt$u6#-os;~t zz4rHg+kU@$+wVWmznzOKZ#Z`R=(TS?cx3Yc|6X_Ot#7_z>xgJ@{OFr93j7_4@#4yB z4jtU$*|k@92oxo5xb7-uJiUmw*IxZrap1_Ix4-GiqgNdQt*$-x)~k;kJAUxU@vC`} zA6|3t&4;cz^o~PU-f;ZT-@4(=v~bp;mRvP$3T#S*S!7UJC7aRyoAN~&P#4QbmaK)cV2gh)wp%_o2l$r)81_!dS}cG zlXu-wMny$Ojvu4D2XENA=FqioK6KSphpsA$f7=@sJz(+0)VG1ng4+B|gp>LYJ09;J-y;d5MFoBxTcYt_*Lnd67HSg-w2tlh0cS6+SH)ilX_ zLPMfl175p6kG}ngMT>9c`G9Nty#0M2 zNP#3Iiy<+Aki3NC!G_)C1t*(i`K7V{|GD>!uEsJD8}A$Ve9m`IZ(lp#z2dr_>Dk>2 zBA3oYyYWIk)5cG#0VyFW)e5wx=!K>EX2sGl|1&rc4K%y)I<*u0+4+#2?UyPPDZEz&=>%vj&{}fPI+(u%?}7rp-h+3qYz6 z*5+%N@~{T{h}$@O_aNliC~Q^4U&DUpx%>}vUvra@U-K8ubr`G?5pv5nP@a3~cV<1^ zIGa4f%S^ty732y;gH+4HZ95XFt~9GtW_yf1DdPBt{GEHT3Q!H;+()(LiELjoI-n(b z`#`HeMWUocT1L;|z2lx6AoX<&XIXpySg-*B!RM)DGXyd2s5e7TC9H|gDJOkKtu_L zxvR3_@H%iK9B+0{$~8uMMo0?CA;qi?<4HIy_Xp~QEV1Ae#gJPtt8f_kM9iESZpm<% z9UES<7l#*u2_`ep5DJI47?EKk-kjd8r;2CNI!|kc*mLo0VUpVo<}$)`51Scdod591 zI}<7FxNvx>2p0_>oH^SoQhP9>2?_<|i7V_P`5+bT)w2V= zo#`aRnnZ6j3GSYYCOfkEKFFvjU%XdFq9eWF9Ua`z#plWFbfFuC9T$~EHM?#kdWZtW zRTYZ%CbC)3ZLKSzC!xPYFh94CDi=EALkOvB=2N>T{wwAp|-yK%j~Hysz}_9)t<9Mftu&aK2NfKz9ec+|x6$>a*k?}E`Ioxi6{ zS%dMyZs;(jeLlpmuiThl#tjXhF-7@SnIY#ej_pbwP!K{MMj6@{_*<~Jzc;BBbeuw- z=a6TV(strbSUbMt`8j&R+2s!>pj)qpK43(k8_Yu$>v2f5L>Aj4rzKL{FGCxuE1dzK z(yAM4oBi6B%`0m|TIT?CwKZCH~^Kmko^#-Y`^p|C(-Lq8!(LBqicHr4qB zHK*pqvEn-wie%&2`a*4Dq2+Tf^&1uC3Z>5rv671sE-##dgxRJ^X=o?{o6PFjHRcA# zIL#F|tO)WsCRgjxqcF$FCtRdH^trb)iPM$NXzg29k>qIx1J$V4V!}BIS*`hkrJ7Kp zN&iR(V$l@W#hfIr4TiiPmMckOM3uQ7tY6gNd!R0cCdX9~-PGf_C!I;`qmq3}%~|d%bEd$~g>;tvPwZZ$34&gAzy$ zPHNy7$dK}xC1#$IqNir>vT;+=GxW)!(;`oX)ClAWyaDY}>b(OYDcu(lk}?{n1Sb_Z zxwBw=9nmgqEwKQVV+@V*JcQ&@QZp}pE;aj8J(uMQya{!kYL5Pfxnkes92rb-IX1}I zr+Z(d;nVQuw{qCBv#x}VTA(cBn zfZKl{0PGLWcp^_V+c9^Q!;%s-%Ro$`8zA?UpajJPp>FUjmn2zic7@@^V+HJa`;68aNJ=VgOqf44E{!7Mj)e@&X zB}-=X%LEwtVK#Rwb&hx`tE*PS4 zXO&AppMbQcche%py8nPYyetuhb`G#0g5)8$hu5`TgflqFFqln8NWnK@%09SJh*LHZ z(gf;Sj&#wUY0u&?dZXr4)IdPN#gvBfapdF0)&N58krDfE7Q5NZdp|<%XKil}^i&OV zFVrJNray&r(n(8Q)MPQBM5+(hctypOSCOCl$Cw+#NM=!>qL?FYWVvd%CQ4_jXUv#$ zhIG)VwU+uuLxYe*ITBsy8_JT&<;unA(^mkTAO7BrpUV8dLB5#)iT^*uxlR)QGvZtq ziT}Hq{(+BWXp4yfl};&FE4^hW!I7#LGzogYD6oFj?9 zjX3F<#IFH;;FvA#WqT4`IT$kV&#=2*r8AFXs`cu*C}nWS=(QPKZ9(m@oEeaySdZKd zCOzm)q#(x2lWEY1-sq(#JsUICFhp1F^jEQu63BZgl17le77zl=05Jb5GaqG`)qpjC z^8ut!XSi;$Q(kT)K)GNmPxis|jTQV3`q6{-xONnMt$kVxoPAmcpke8(^(k%~j*F%l zd+7^kt4e8m{z)peqb;j@lC)_pF%hLCeiZS>B3y8i|GnFBWwK^SI8ve^N0SoEM#L`! zYyzC_H9|Ye@^>~QmbcOOldlnQS*n9mW@z>{Vnc>mMcItLa3>SC0JZ|Q0cgNA^TU8^ zxGxxLDeSu^S7bJF#=Fh1O4Wh}2kKe`71nVnZtk@2O)porqiu7flM@5$9*l3>F1P2RT`t-qLghBz0E3gv5xo ztM{fe10=yWpq&o%gIW+zu-PA>To@F=RptKU+IB{TM@>ve zoE%rC?HC#pcAps1Mvlnr*v5P(I=j-^*LK;}VNX}1qs9ZXpXiV1B*ONAEc}iTfoa7M zq;SK8TZ=4qlQ5d{!bw~lrP44^$9gaZ!{KKLkL#xKH=m+4OiZ(^<@%Y%+T4MVeCJ^^ zd;%e9%(DpH2wy;WF2db#{24RL&;m@~4n+gbJT!Ot%``EevTI0NfalyBZ3rpFnS&@i z-)Yvd3u%(JQ5xWWi~vrTwnb5vzq3Kxj-$_3+E%QM`)3<-yBHzcAIV(45owgZWFBdz zFPO`rmKUs}$d@zoUx|?ORIIg|<+3v0-N;AD<}A?;+(y=$myw_#@5W%!haaLZJVX01 z8Fbr_+9~c`a77A>HFr6lr>e>oC{;=yLMJ}VdF*`}m7Ze87u9#`MGV!-?G;Cy-H8BB zcYAfAEPrQXdo8H8Zm+f@FJN>pRa!>Zi&;zHMryc#N~g{D`CEj1i<_E*Euq%%`~?fm zQi^J`JDe`J$LlL8EgLnuyyBd5$BZ2}zH)+*VdA98Q>ISSrq4KU=B(LO)pO>~tEsK4 z_Xipp-)FODH(T4%Wy@ErT(x@5`4_BRw|>LM3pcfI-m-PuMHg?6cE;j*S9ee1(%s44 zRJ!l7Og5L_v$ua>A3JZ%!@PQ|rAb-~_fd|y25~$)hbRko4)A@-(AY_n(N+}UBmfDr z6(<3eco=aWY||8jtAaSRP*GDsz<3mOQJ9rwLWp|-o7c`?zA3D2r6c3el?qG>rtY88 z+6{lEaF~{U_}NkU?@i{ykpSv(0U44GY}+T{h;$7I#Z{uO+((HV-y^6 zR_Sm(1!^>4uz16~#0!>S|A`LAf%R_&OfLjE{;;QdOw_4Y0jV^K?#GdHNxZ}dR3=wqMt0X z?yZr-WR=kI2IvLK-gN3c(LD+F0bQ|_&DLp~)3~)s!|gFA3JU{TE|Z4nqHB-Fv$rvFI*sL zXj=x^j;@7RnVJLfF9!4nquqj*bY*k=kwBv5*c#~+E~}F;5{Npi4=nY(hI)ARM4p~}Z!|@#f?!Re9Z#Lnj_DG#Ih_{!yl^qu z6YYZo4R!(-0RKmEe7dnm#o}&VS67YlJcn{l@+LEs_)R8m3Xwyy;m|>SuO^hM(8hdA z8xNUv3NaEpC$4J^T0Vu-3z~rqrx*5*hI`TGQ+FP9{v36;S?YeUsQ*7K!hc}m#Y(|N z^&f;%@IGY!k!Ad0dvG_#V-@nP`*R1<%(WOv$bT=1Udf@nlsNK;?*T*rrz>&nMOpqZ ztsnUH(xZN>#DRVX$bp2QChb<@AcWzsxCiDt-0BN+E{>lv8+n;~19I}62tHeaXH;yB zeFrxRT*xQ(3GxKT7>!w!&B!wz;ckQ!`i#8NVhh@y)_C=&4I-WVPUaI{0K!N-)X)3O z_LiA!KzN^Pa6mBq56CLgAieZ)WaHmKej0Pk^#widFQonfX*9jbG;!fh@FRFKULra{#ucQWT%Q9gup zn*X+92D|8RLo_l>U^_1S znZ_UY*#JP+%IADW*av7gS5?Qt87&I0r(yekKk~su1LZi&Y;YFq*5O@?WnG`nt)!u! zYNa`ATXJ0?GrC&uH)FibZpY-ysaF*CgL6&z5WrXpGrKYIL)x@Cv4%#D9w7e#fSi{P zBW|5r=D6IFK8SdGPqMuyvoXDQT|S977~0}-bC(&?cQ?#gDJ>0KC}axCadVptr8t0) z>m%n6b*D2TA6L;Bhg^eRj970U8Q`Y;!8x>ve%RVwyL-`FyoKgmTX z^2N>yn_0mV+c2RSMut=QVGC&*B&1LX$56bJF=DYIC+06Se_>N-xTnqU-ltLI zRc5@h{N0YVtXjG%N?f`sT9@={Ea^v0&`HWnL!LDCQEWEtf~4unHOR{wAs+i{0apAv z^VvnMP-KfW(^-p9A3U zJ^K&8`dZ45ZSBj}tg*Oum?CQ10^_bk)_oi5Jgf6>aZT<=+ns2y2Ecjc&oZ8q*u2b7 z)-VGgai0AaK+Qs9Po3YsVZE^1;5Gu9Bz5+<&eu3;vZiM$AHrUe!E2x5?I^=ZwN8}7 z?Ti*3=JUa<$tY}0!Vp818K#+NCSzDFdZT?q1!>5Ej|N1t$>W4Y9WOGGFC<$3#?0^w#O~S-jCnSh;a%fM&mPMB)Y%sIhGo){) z6oI>W+llv8`tq5+bXKp&TP)^vb=!%9-&9HhmcxHaVw_u2u3U!0PF<-5ALuxQf}eO- z?Z8@s61T*u4UvpW{1wEfS@2hj@c#>(RzjKo-;2`UEK2`*C7vk3X z9|ca+{BLbX`NmA?vT`Mbc9#G+eu*zdyuJwMcx5^@l*S@l zv)~k0!$tTk3w{UUTwht=zZBu0EW&RE4h5@_pZF3BehcE(`aWgiAB>0xFS9;yvTVH$ zMuB6U6C%sb<>d-3HhzE?4o+9|blNQE`Xr_4$Zc++RGeGW|1% z^E^v|q7Q2iVMuu%_0p;+pNp=TuU>)s8*f`;O5Z>}&hlRovR>yZ!(Cy8lzH_2f+!?L z8r6ceoeAEF^+x#}m`t6bq0Br>TO7Xzd^4W2@5ObW1zIC{obn;GxgBj%P33qZl=yH{ zSEFI9=GbH?gqg_DbH{4q#S)o*hW#`&d-1+ttKm9U5X)i7ggX;vu@5&)v6*O>eSY0z ztR-nYqC#yX{U^;Los!RvApTi^R4wm8{9eF)0RF6L_XGb2-U{}~uL9r&c;W3xw2F-^srFZQPg!V%Ds&F<1Y*q!}z9w?0t416|2W*kPOGrpP2ps1oAcj&_nTB z?4q}x{D$EOC*F}WP3+h-=1Df*cLohO-*85sg^>HYxHVz5!aOZUI&Ukspnu$hrX~T_ zm*^T0T8UV8ttXw{ZQO%Ljg4Sl-tsy>i8`7_XhW1_KD2Wm^3c3;HGu6%e5uX&nuf&N zfK$f#96*{<9!8w|MDD3a5PuZFndH8D4Dfk?H4kNpFPhH~C>WmdB|z~!)YaAF|H2}Q zePoaxScXlzz}gFp@$Eq+q#c_0!Mua#F5sMBxvs~tZWw}s7k~@TzKDEwJma2oU>-Pr zqYm?5I1e009*!prcoT88TUqJO?4-A_$3G6nJi9NQtyt&ge&hA>&umk&?fg1 z&xgc$4y^dXBD@RuBuoB2#3ukaHjaz%BtX`eL436Z&muk!5Jp2X&xe7t4v8N^yc$4h zPClbd&-s@4;UfH_z*kt(uR+|}PvWE@OXkjAu&8>@vKmWX^3Qq;PI@)Pf|H)ju;4kw z$69cXku+BBh4=Gi4LOc9%2D_FfERj?A7>@G(U2QC?sEVV=U9n%bZja-YbeUI9r#p0 zq^lR-xf54|k*t>ON$2ry3oJhL-7(}`A+_?;hA^Xu%qxXMGn9u2%3Jq5X@~5?1&C9I zmH3s2Pqg4%Pty0kd}@G#+y2@EewlYFHW_8__p7nUasia%-jjF}@KqN4Lf~B2_gin6 zcA9XQK3pAnTuS5ByM-E@sKop6F#ZXXCuk~U|A4Ua)Cf;G5zWF~OE{#%;`8=}<-(;t zu*q-@o{vvxV_zDz6J$_)n zR9qla<)ZxuEM-4}vK-6eD)6EOHQFLg!#st<`|%o8Z!DRH!Br2Rw_{g)Af;*Z@R=^K zJgA#+71W@CW}{s&GWKInrL-9{w60XOR=Y@({XPyRUyHgq`};NR0PUE6ObYED@FCFUf zmA$z(L#>a9{RF8uhW9?fgstc4DbyqDrwxkdbw3v$GA^nqEK8x{75zO?d>@0n9LrJQ z-;|LgV2VT<*qz|7#I0$>(bP$0Ss(LR^E2P~v4?*Icn)wo;0J&s06zN?;46U7nE1C5 zJ_0xjxDRj}fcXf|06q_>#QfcAK6?t`Lx4{MzG>;xw-Em};5z{8^QVDJxohb5I1}C5 zu}6<#@o?P}g~A0NNYi}*`A=*y&fsx`r151KDCZ_>zBnSBR>dvbdw!Zt^aVx5{0Ulk z(%02MKhclKRzo+4qb&{j=bYSWbl4P<=U9lc@hK#&8nS65nu}=oWE{2uHSm7%5Op0z z-K24!MaZ*%6+*7l)d)GhMG*E$cZGdISb~Pn;WJ2E34%u_9KjWUe-|KihVLQ%5AZ?r zP3XOnt%!GjK_MW!rfLPkn-DV>?~k(h+ES8+lrAwc&2SYG9$=PSNjeaXoJ*3Zc%mCM z6j|I&>D{;(kLqmrI2ZN4ORaK*TE;iD=2zkz* z2k^%-F97gb6<9!a`oe_^Pk!$(5lM996BGTV(HeyTh-BMNehOvT8~A;c`e&+te1{_)DissethBB-{5cbH~E|WL4S)sHM{mp^qhUUiRrsn46U~@}zsJS)h4+eq_!Ny=y zusIkEwgf}L))s$DprxUuv8Ab{xh2@r(h_QE4f#WXP(!FO)D&tC1w$>NP^h&PU2H}3 zt*E*c#ai*`KL9Ch>m;E@TpuRu;}nR(ur?CYe}I25WFF%4;Zh8G!OMyzFrPj0;fXB*@Qi8!4nQ zq6!-ROi!t!sDpd%IfOF`b@07^qXuQCVJnd7MtLJ`=p9IL08vQ15UFS=!~O>mlCI(} zvHXAiDQ%y89LDZO+q?ekML!3BO51T3{bnWKK;UOcVZnviYks?{a3O6-GvME3>>~t4Gu7_!tH^gZ<-5Jx%4e#vFy5E8~!|+7@Dbr&`c-+KyKuF&ujNC?tNt%a! z|D8jRz{~U!<9kq7A>=-hG^`V^`lk4;0&c%*M&=mKl-zXmWI)-kq6~GYXAtt-J&Um1 zQipK85RM0w{f+O=_~9jA_WRH_r~6Wx>4$+l_ZH2XYzZAqQ#w+Czu z>bf49Hm{apXRHP_wc-*(Y8*WNJs|BM=a!P>w4wXS~g&Rre9 zK78HBZoKLK#~%Os)6abW*Qp59CtXy;cC2{@mjkn$Y{pXIARm{PoHQRRVyrd(pUw7mEDDw38fBD+$C(0^T ztcmM`hd+Pxi6>ut>BR4@xbm92?|I_Mr@wpbm7lG?^&9{C%yY-qtlzNh;!8TN{@C@8 zefcX-e)E~{zEm-8{EnS}`tQHLGuV6CFMc^{S}HwxO2>f@Km5q$Uq3o-{M2bHSFPW0 z(e|B}eE9M&J$?MepP%^MA2ZqObNNrsuB*TIk*_@Y-D5BP@>5H0xz&IDv>zRR?w$1; zw(oFzMweIB|Msm^x@F_J?EiE?Gs&x{${_}JATPBo@z3OIXy>q_XHmcG)_{5A{>EKT$mO2ODaSr~n^!K;hTf7H% zjv4%_XYdD3U*&we&lU2l^pv`CB~$I&9T$5Cuc(~t8|Pi?82qT~!MjVxI|6q)4!$zm zUFviW-cx??k8V|)>q6>vj=?AFlkB6*6#R*C49@0syKNqi*XG0Dxg6yvS1WAiIM1yZ zqmH$Ww@oOU?4076rp{C^b?ml1Vt>qb)OO7Fg6(+ei{78uUb4NSzUusy?Kh4$Y`@h` zINrAX+5Q)`v}*pM^&76gTS8<#{1m9`HQ*| z*WXl;?s)RIZ*A}V!(ZQN-~6fD>gubix7>c@&d=O^?|q+p{OEUFC8cAhgcq;4@Sb~r z_^(IY6DH1>wP^8g-hAtwr=M|X=gpd3-53h5K7Z}T_AOhv_aZU9Yj?K)z~vvk`+-Lu zed_s#A4#R3`1mC=_B-v4T6>pWt*;wAG{qhmJ=rnSJJmVQx!f^o?%)HinU0x`YEM(i z`eg@OyyJYH%K0l=?JPn zvPO5E$9Hh{rVHkI=8l^IK~ftZ9%-fbhX#Fa>b<8p7ydeZr|XaR{EycSFLHW zkMj6jt#04J-~{)4`{b?a=!UW@ZtKdI41VXMYhz`H{pI7Xf8fxnJHK|Q)jij-(>2?- z(pT*~_t2v|^a~uV?usSc61TkVIsB8k-n)KtuyM3H#Wl*|Ie6{Wj@`~OyVqTQQ)HDl zw_xy3zO1Kj?8<#S3fsIB20wCemHo=4qsJcJIL+l6d~u$0(R8)1);`f;JGf+8McAnx ze17hse;fSoIcpt0hwX}r4?YO)<1RpW@4ZuJd59GX&A>D7YRD@eI2>9&{;bm(G4&2Gn84a8}~FD5vP4w;yV#1@1Cu)W1aPl)r1iJKl)||EB&bsQRY2%q;s=%Y&n$ zt@V|6w)!VWSO3@4JJ&90if%k{>75sDNKfB%`_Vf$DaWGi`U`iqE3Zu7ti1ZGEf4=X zy6w%^reFO08+Tr;DZjn=gnIdQr4L_9sD+4V!++}P693q8RR{I7*;L1Q>eNX)O2S^R zTIo=|AU4i<_644~m8#Z)0uB$Tq}ykkqJ~-A;XxLkZK7(kwSp=+Y@o{ORGS@t1QECs z8PqYhaiCeqjk-Om+wQYXRp+B@DN0tOdemxnf~2`^C8Ab#360u_Pqww9f3lS+>T1=Y zqH@)vUZ~pKrJhdJ<}Goru}wmKs@gJ2MT^c7b*5MCa;PqJ$~M8~u$MdVN7rpGb+n4P zw@SEza040Vs)Ve_gk`_C{5=&hSI+B`0wP4!O;IQ+n!YPGi% ze**~_>>(tgpgrud*>1I~WvZJE+HKD)QPgiwSM1lR5lwL=Y>GqmX||0vNEPV&1e;U6 z#WwMrGIh3RLP?$7kFnWoRq8U#ybXUk(xcX^ji?oWc@X2CYxAhT<+Q0#ILq;2T-5Sw z^%G9Tj!`^3%~Dp=hnr;{<&HCh1! zRn)}}*v4&2oozf67`*%M@z~r`9XH#R7Dt0e9i@(Qs-sbBg{aXPSC62~LI-BR-Ro8& zgC~@Nwt-EEiren}F*FJK$%&s$ST@i=+rRNSdf0aDaYmR^My|qN04v!*nUpdmLkYi! lJ>x~dBY>*`F#yDNA=j56Bv3xi;rxFda4+D~fC0Vye*mCuC2;@% literal 0 HcmV?d00001 From b148d172a2f4589fb0714fd12577333ef03cc619 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 8 Sep 2024 13:55:51 +0900 Subject: [PATCH 49/55] fix: Change test txs --- frame/cosmos/src/tests.rs | 20 +++++++++----- frame/cosmos/txs/msg_execute_contract | 2 +- frame/cosmos/txs/msg_instantiate_contract2 | 2 +- frame/cosmos/txs/msg_store_code | 2 +- sidecar/log.txt | 32 ++++++++++++++++++++++ 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 sidecar/log.txt diff --git a/frame/cosmos/src/tests.rs b/frame/cosmos/src/tests.rs index a8b45dbb..4fa0c1d3 100644 --- a/frame/cosmos/src/tests.rs +++ b/frame/cosmos/src/tests.rs @@ -76,7 +76,8 @@ fn pallet_cosmos_msg_store_code_test() { let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); @@ -118,7 +119,7 @@ fn pallet_cosmos_msg_store_code_test() { if key == "code_checksum" { assert_eq!( value, - "db366741dcbad5f2e4933cda49133cd2a11fdb32b08c67cb1d22379bd392448e" + "4d8e90dd340993033f1b9e8e3a3ee7f8673c582ca9bcdd8c8cf3c7470d6537d5" ); } } @@ -135,7 +136,8 @@ fn pallet_cosmos_msg_instantiate_contract2_test() { let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); @@ -152,7 +154,8 @@ fn pallet_cosmos_msg_instantiate_contract2_test() { System::reset_events(); let tx_raw = fs::read_to_string("./txs/msg_instantiate_contract2").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); @@ -176,7 +179,8 @@ fn pallet_cosmos_msg_execute_contract_test() { let alice = CosmosSigner(ecdsa::Pair::from_string("//Alice", None).unwrap().public()); let tx_raw = fs::read_to_string("./txs/msg_store_code").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); @@ -193,7 +197,8 @@ fn pallet_cosmos_msg_execute_contract_test() { System::reset_events(); let tx_raw = fs::read_to_string("./txs/msg_instantiate_contract2").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); @@ -210,7 +215,8 @@ fn pallet_cosmos_msg_execute_contract_test() { System::reset_events(); let tx_raw = fs::read_to_string("./txs/msg_execute_contract").unwrap(); - let tx_bytes = Base64::decode_vec(&tx_raw).unwrap(); + let tx_raw = tx_raw.trim(); + let tx_bytes = Base64::decode_vec(tx_raw).unwrap(); let call = pallet_cosmos::Call::::transact { tx_bytes }; let source = call.check_self_contained().unwrap().unwrap(); diff --git a/frame/cosmos/txs/msg_execute_contract b/frame/cosmos/txs/msg_execute_contract index f31b2c54..c86ddc7a 100644 --- a/frame/cosmos/txs/msg_execute_contract +++ b/frame/cosmos/txs/msg_execute_contract @@ -1 +1 @@ -CvkBCvYBCiQvY29zbXdhc20ud2FzbS52MS5Nc2dFeGVjdXRlQ29udHJhY3QSzQEKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxJBY29zbW9zMXdyNzlrMzk5dnZ5dmc0OWo4cnc5dnVwbmx2ZHptbDZqYXR0NnpsdXdlZWR6ZWRrMnJqMnMzcGFqeWoaWXsibWludCI6eyJyZWNpcGllbnQiOiJjb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXciLCJhbW91bnQiOiIxMDAwMDAwIn19EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgCEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAIVQioGic084W1qb1thdkHSMno8mdzniMO7G1nNOxoMEjY3ralELjzx1H42g0ftQ5TmQtlICSuqB91ZaG92hOtQ== \ No newline at end of file +CvkBCvYBCiQvY29zbXdhc20ud2FzbS52MS5Nc2dFeGVjdXRlQ29udHJhY3QSzQEKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxJBY29zbW9zMWR0bjZ4cXJzZTZ5MHZwbHEzMzlmN3ZtaGE1dTlndTRnNGVkMjJ0d3ZqMmtxOTB6YTltMHNuN2RnM3caWXsibWludCI6eyJhbW91bnQiOiIxMDAwMDAwIiwicmVjaXBpZW50IjoiY29zbW9zMWdtajJleGFnMDN0dGdhZnBya2RjM3Q4ODBncm1hOW53ZWZjZDJ3In19Em8KUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgCEhsKEwoEYWNkdBILMTAwMDAwMDAwMDAQgMivoCUaQI/lhtsEDakmygVb+PLZuVzGjFnNcDPtUPy9sz33RnpVB6oXgqpLXBkLJFWVcdWa6meAs3XW8/nLvDcq5Eh+GNI= diff --git a/frame/cosmos/txs/msg_instantiate_contract2 b/frame/cosmos/txs/msg_instantiate_contract2 index 1faa8028..0c49da37 100644 --- a/frame/cosmos/txs/msg_instantiate_contract2 +++ b/frame/cosmos/txs/msg_instantiate_contract2 @@ -1 +1 @@ -Cv8BCvwBCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLOAQotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwqX3sibmFtZSI6IlRva2VuIiwic3ltYm9sIjoiVEtOIiwiZGVjaW1hbHMiOjYsImluaXRpYWxfYmFsYW5jZXMiOltdLCJtaW50IjpudWxsLCJtYXJrZXRpbmciOm51bGx9OgRzYWx0EnQKUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgBEiAKGAoEYWNkdBIQMTAwMDAwMDAwMDAwMDAwMBCAlOvcAxpAJEZJO0l1XHZF+OJy7rzHL1aIXGZGn859URwCkvaWl5Mzhs5/zmAdS1sKLu61jMC1eh/iA/7+RxhMTuydh9x2Ow== \ No newline at end of file +CvMCCvACCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLCAgotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwq0gF7Im5hbWUiOiJUb2tlbiIsInN5bWJvbCI6IlRLTiIsImRlY2ltYWxzIjo2LCJpbml0aWFsX2JhbGFuY2VzIjpbeyJhZGRyZXNzIjoiY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3IiwiYW1vdW50IjoiMTAwMDAwMCJ9XSwibWludCI6eyJtaW50ZXIiOiJjb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcifX06BHNhbHQSbwpQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAgoQkTQf5WZL+heC1eBHeWiQaMkWsEyzZewxU3VWhNmhEgQKAggBGAESGwoTCgRhY2R0EgsxMDAwMDAwMDAwMBCAyK+gJRpAeXBD4nad7jBiF+XOKGcSqGVkPS37xo4vP8LrGusFARVB2bvqD52eg7u5PaHmOEp+ubZq9RMrPTSc5ozrcRQCMQ== diff --git a/frame/cosmos/txs/msg_store_code b/frame/cosmos/txs/msg_store_code index 03fb9995..04747c79 100644 --- a/frame/cosmos/txs/msg_store_code +++ b/frame/cosmos/txs/msg_store_code @@ -1 +1 @@ -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 \ No newline at end of file +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 diff --git a/sidecar/log.txt b/sidecar/log.txt new file mode 100644 index 00000000..e1aa9fca --- /dev/null +++ b/sidecar/log.txt @@ -0,0 +1,32 @@ + +> @horizon/sidecar@0.0.1 start +> npm run build && node --es-module-specifier-resolution=node ./dist/main.js + + +> @horizon/sidecar@0.0.1 build +> tsc + +txBytes: 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 +txHash: afa089b9ed0cbce62eacd932f83b44cfd01a0e07c40eb755a3c1beb3bc46e424 +txHash: afa089b9ed0cbce62eacd932f83b44cfd01a0e07c40eb755a3c1beb3bc46e424 +txHash: afa089b9ed0cbce62eacd932f83b44cfd01a0e07c40eb755a3c1beb3bc46e424 +gasWanted: 1000000000 +gasUsed: 124414000 +events: [{"r#type":"0x73746f72655f636f6465","attributes":[{"key":"0x636f64655f6964","value":"0x31"},{"key":"0x636f64655f636865636b73756d","value":"0x34643865393064643334303939333033336631623965386533613365653766383637336335383263613962636464386338636633633734373064363533376435"}]}] +cosmosEvents: [{"type":"store_code","attributes":[{"key":"code_id","value":"1"},{"key":"code_checksum","value":"4d8e90dd340993033f1b9e8e3a3ee7f8673c582ca9bcdd8c8cf3c7470d6537d5"}]}] +txBytes: CvMCCvACCikvY29zbXdhc20ud2FzbS52MS5Nc2dJbnN0YW50aWF0ZUNvbnRyYWN0MhLCAgotY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3Ei1jb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcYASIFbGFiZWwq0gF7Im5hbWUiOiJUb2tlbiIsInN5bWJvbCI6IlRLTiIsImRlY2ltYWxzIjo2LCJpbml0aWFsX2JhbGFuY2VzIjpbeyJhZGRyZXNzIjoiY29zbW9zMXFkNjludXdqOTVndGE0YWtqZ3l4dGo5dWptejR3OGVkbXF5c3F3IiwiYW1vdW50IjoiMTAwMDAwMCJ9XSwibWludCI6eyJtaW50ZXIiOiJjb3Ntb3MxcWQ2OW51d2o5NWd0YTRha2pneXh0ajl1am16NHc4ZWRtcXlzcXcifX06BHNhbHQSbwpQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAgoQkTQf5WZL+heC1eBHeWiQaMkWsEyzZewxU3VWhNmhEgQKAggBGAESGwoTCgRhY2R0EgsxMDAwMDAwMDAwMBCAyK+gJRpAeXBD4nad7jBiF+XOKGcSqGVkPS37xo4vP8LrGusFARVB2bvqD52eg7u5PaHmOEp+ubZq9RMrPTSc5ozrcRQCMQ== +txHash: 9c38d64fe8655ac63893b7d1d3cc800bccf660a1797687daabfa758cca96dedb +txHash: 9c38d64fe8655ac63893b7d1d3cc800bccf660a1797687daabfa758cca96dedb +gasWanted: 10000000000 +gasUsed: 124414000 +events: [{"r#type":"0x696e7374616e7469617465","attributes":[{"key":"0x5f636f6e74726163745f61646472657373","value":"0x636f736d6f733164746e36787172736536793076706c713333396637766d68613575396775346734656432327477766a326b7139307a61396d30736e3764673377"},{"key":"0x636f64655f6964","value":"0x31"}]}] +cosmosEvents: [{"type":"instantiate","attributes":[{"key":"_contract_address","value":"cosmos1dtn6xqrse6y0vplq339f7vmha5u9gu4g4ed22twvj2kq90za9m0sn7dg3w"},{"key":"code_id","value":"1"}]}] +txHash: 9c38d64fe8655ac63893b7d1d3cc800bccf660a1797687daabfa758cca96dedb +txBytes: CvkBCvYBCiQvY29zbXdhc20ud2FzbS52MS5Nc2dFeGVjdXRlQ29udHJhY3QSzQEKLWNvc21vczFxZDY5bnV3ajk1Z3RhNGFramd5eHRqOXVqbXo0dzhlZG1xeXNxdxJBY29zbW9zMWR0bjZ4cXJzZTZ5MHZwbHEzMzlmN3ZtaGE1dTlndTRnNGVkMjJ0d3ZqMmtxOTB6YTltMHNuN2RnM3caWXsibWludCI6eyJhbW91bnQiOiIxMDAwMDAwIiwicmVjaXBpZW50IjoiY29zbW9zMWdtajJleGFnMDN0dGdhZnBya2RjM3Q4ODBncm1hOW53ZWZjZDJ3In19Em8KUApGCh8vY29zbW9zLmNyeXB0by5zZWNwMjU2azEuUHViS2V5EiMKIQIKEJE0H+VmS/oXgtXgR3lokGjJFrBMs2XsMVN1VoTZoRIECgIIARgCEhsKEwoEYWNkdBILMTAwMDAwMDAwMDAQgMivoCUaQI/lhtsEDakmygVb+PLZuVzGjFnNcDPtUPy9sz33RnpVB6oXgqpLXBkLJFWVcdWa6meAs3XW8/nLvDcq5Eh+GNI= +txHash: cd0a03f75f5000a5c4906ec695052cd75bdb867d2cf3c9da3176563af7cd0078 +txHash: cd0a03f75f5000a5c4906ec695052cd75bdb867d2cf3c9da3176563af7cd0078 +gasWanted: 10000000000 +gasUsed: 124414000 +events: [{"r#type":"0x65786563757465","attributes":[{"key":"0x5f636f6e74726163745f61646472657373","value":"0x636f736d6f733164746e36787172736536793076706c713333396637766d68613575396775346734656432327477766a326b7139307a61396d30736e3764673377"}]}] +cosmosEvents: [{"type":"execute","attributes":[{"key":"_contract_address","value":"cosmos1dtn6xqrse6y0vplq339f7vmha5u9gu4g4ed22twvj2kq90za9m0sn7dg3w"}]}] +txHash: cd0a03f75f5000a5c4906ec695052cd75bdb867d2cf3c9da3176563af7cd0078 From 959d7dafcbf0b77b9fd1d8702e1f4473f01e2faf Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 8 Sep 2024 20:37:25 +0900 Subject: [PATCH 50/55] feat: Add query jsonrpc to sidecar --- sidecar/src/constants/rpc.ts | 20 ++++++++++++++++++++ sidecar/src/services/abci.ts | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/sidecar/src/constants/rpc.ts b/sidecar/src/constants/rpc.ts index 20b36166..91e77522 100644 --- a/sidecar/src/constants/rpc.ts +++ b/sidecar/src/constants/rpc.ts @@ -21,6 +21,26 @@ const rpc = { type: "SimulateResponse", }, }, + cosmwasm: { + query: { + description: "Query Cosmwasm state", + params: [ + { + name: "contract", + type: "String", + }, + { + name: "gas", + type: "u64", + }, + { + name: "query_request", + type: "Vec", + }, + ], + type: "Vec", + }, + } }; export default rpc; diff --git a/sidecar/src/services/abci.ts b/sidecar/src/services/abci.ts index 527cf945..66e1cdca 100644 --- a/sidecar/src/services/abci.ts +++ b/sidecar/src/services/abci.ts @@ -11,6 +11,7 @@ import { ApiPromise } from "@pinot/api"; import { ABCIQueryResponse } from "cosmjs-types/cosmos/base/tendermint/v1beta1/query.js"; import { SimulateRequest, SimulateResponse } from "cosmjs-types/cosmos/tx/v1beta1/service.js"; import { TxService } from "./tx.js"; +import { QuerySmartContractStateRequest } from 'cosmjs-types/cosmwasm/wasm/v1/query.js' export class AbciService implements ApiService { chainApi: ApiPromise; @@ -24,6 +25,8 @@ export class AbciService implements ApiService { } async query(path: string, data: string): Promise { + console.debug(`query(${path}, ${data})`); + if (path === "/cosmos.auth.v1beta1.Query/Account") { const address = QueryAccountRequest.decode( Buffer.from(data, "hex") @@ -65,6 +68,7 @@ export class AbciService implements ApiService { // TODO: Check simulate tx fields const request = SimulateRequest.decode(Buffer.from(data, 'hex')); const response = SimulateResponse.encode(await this.txService.simulate(Buffer.from(request.txBytes).toString('base64'))).finish(); + // TODO: Get actual height const height = (await this.chainApi.query.system.number()).toString(); return { @@ -78,6 +82,25 @@ export class AbciService implements ApiService { height: Long.fromString(height), codespace: "", }; + } else if (path === '/cosmwasm.wasm.v1.Query/SmartContractState') { + // TODO: Get actual height + const height = (await this.chainApi.query.system.number()).toString(); + const { address, queryData } = QuerySmartContractStateRequest.decode(Uint8Array.from(Buffer.from(data, 'hex'))); + + const gas = 10000000000; + const response = await this.chainApi.rpc['cosmwasm']['query'](address, gas, `0x${Buffer.from(queryData).toString('hex')}`); + + return { + code: 0, + log: "", + info: "", + index: Long.ZERO, + key: undefined, + value: new Uint8Array(), + proofOps: undefined, + height: Long.fromString(height), + codespace: "", + }; } else { throw new Error("unexpected path"); } From 55be29d2d337aa6a4f672a0e6b0b58e4fcd342c1 Mon Sep 17 00:00:00 2001 From: code0xff Date: Sun, 8 Sep 2024 23:16:49 +0900 Subject: [PATCH 51/55] fix: Modify query rpc parameter type from Vec to Bytes --- frame/cosmwasm/rpc/Cargo.toml | 1 + frame/cosmwasm/rpc/src/lib.rs | 12 +++++++----- sidecar/src/constants/rpc.ts | 4 ++-- sidecar/src/services/abci.ts | 9 ++++++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/frame/cosmwasm/rpc/Cargo.toml b/frame/cosmwasm/rpc/Cargo.toml index cfc8f2b8..8a30ec57 100644 --- a/frame/cosmwasm/rpc/Cargo.toml +++ b/frame/cosmwasm/rpc/Cargo.toml @@ -15,6 +15,7 @@ hex = { workspace = true } # substrate primitives sp-api = { workspace = true } sp-blockchain = { workspace = true } +sp-core = { workspace = true } sp-runtime = { workspace = true } # local diff --git a/frame/cosmwasm/rpc/src/lib.rs b/frame/cosmwasm/rpc/src/lib.rs index 30aead98..e119eade 100644 --- a/frame/cosmwasm/rpc/src/lib.rs +++ b/frame/cosmwasm/rpc/src/lib.rs @@ -12,6 +12,7 @@ use jsonrpsee::{ }; use sp_api::ProvideRuntimeApi; use sp_blockchain::HeaderBackend; +use sp_core::Bytes; use sp_runtime::traits::Block as BlockT; #[allow(clippy::too_many_arguments)] @@ -24,9 +25,9 @@ mod cosmwasm_api { &self, contract: String, gas: u64, - query_request: Vec, + query_request: Bytes, at: Option, - ) -> RpcResult>; + ) -> RpcResult; } } @@ -63,15 +64,16 @@ where &self, contract: String, gas: u64, - query_request: Vec, + query_request: Bytes, at: Option<::Hash>, - ) -> RpcResult> { + ) -> RpcResult { let api = self.client.runtime_api(); let at = at.unwrap_or_else(|| self.client.info().best_hash); let runtime_api_result = api - .query(at, contract, gas, query_request) + .query(at, contract, gas, query_request.to_vec()) .map_err(runtime_error_into_rpc_error)?; runtime_api_result + .map(Bytes::from) .map_err(|e| runtime_error_into_rpc_error(String::from_utf8_lossy(e.as_ref()))) } } diff --git a/sidecar/src/constants/rpc.ts b/sidecar/src/constants/rpc.ts index 91e77522..16e1460e 100644 --- a/sidecar/src/constants/rpc.ts +++ b/sidecar/src/constants/rpc.ts @@ -35,10 +35,10 @@ const rpc = { }, { name: "query_request", - type: "Vec", + type: "Bytes", }, ], - type: "Vec", + type: "Bytes", }, } }; diff --git a/sidecar/src/services/abci.ts b/sidecar/src/services/abci.ts index 66e1cdca..2b62f5e7 100644 --- a/sidecar/src/services/abci.ts +++ b/sidecar/src/services/abci.ts @@ -88,7 +88,14 @@ export class AbciService implements ApiService { const { address, queryData } = QuerySmartContractStateRequest.decode(Uint8Array.from(Buffer.from(data, 'hex'))); const gas = 10000000000; - const response = await this.chainApi.rpc['cosmwasm']['query'](address, gas, `0x${Buffer.from(queryData).toString('hex')}`); + const msg = { + wasm: { + smart: { + contract_addr: address, msg: `0x${Buffer.from(queryData).toString('hex')}` + } + } + }; + const response = await this.chainApi.rpc['cosmwasm']['query'](address, gas, `0x${Buffer.from(JSON.stringify(msg), 'utf8').toString('hex')}`); return { code: 0, From ee0bc15f9fab87d6a926493d8270ee9b296c9bae Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 9 Sep 2024 11:14:17 +0900 Subject: [PATCH 52/55] fix: Modify height in cosmwasm query to use the actual value --- sidecar/src/constants/rpc.ts | 4 ++++ sidecar/src/services/abci.ts | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/sidecar/src/constants/rpc.ts b/sidecar/src/constants/rpc.ts index 16e1460e..6ce3ed3e 100644 --- a/sidecar/src/constants/rpc.ts +++ b/sidecar/src/constants/rpc.ts @@ -37,6 +37,10 @@ const rpc = { name: "query_request", type: "Bytes", }, + { + name: "at", + type: "Option", + }, ], type: "Bytes", }, diff --git a/sidecar/src/services/abci.ts b/sidecar/src/services/abci.ts index 2b62f5e7..f04dd1fa 100644 --- a/sidecar/src/services/abci.ts +++ b/sidecar/src/services/abci.ts @@ -11,7 +11,7 @@ import { ApiPromise } from "@pinot/api"; import { ABCIQueryResponse } from "cosmjs-types/cosmos/base/tendermint/v1beta1/query.js"; import { SimulateRequest, SimulateResponse } from "cosmjs-types/cosmos/tx/v1beta1/service.js"; import { TxService } from "./tx.js"; -import { QuerySmartContractStateRequest } from 'cosmjs-types/cosmwasm/wasm/v1/query.js' +import { QuerySmartContractStateRequest, QuerySmartContractStateResponse } from 'cosmjs-types/cosmwasm/wasm/v1/query.js' export class AbciService implements ApiService { chainApi: ApiPromise; @@ -83,19 +83,21 @@ export class AbciService implements ApiService { codespace: "", }; } else if (path === '/cosmwasm.wasm.v1.Query/SmartContractState') { - // TODO: Get actual height - const height = (await this.chainApi.query.system.number()).toString(); const { address, queryData } = QuerySmartContractStateRequest.decode(Uint8Array.from(Buffer.from(data, 'hex'))); - const gas = 10000000000; const msg = { wasm: { smart: { - contract_addr: address, msg: `0x${Buffer.from(queryData).toString('hex')}` + contract_addr: address, msg: Buffer.from(queryData).toString('base64') } } }; - const response = await this.chainApi.rpc['cosmwasm']['query'](address, gas, `0x${Buffer.from(JSON.stringify(msg), 'utf8').toString('hex')}`); + + const height = await this.chainApi.query.system.number(); + const blockHash = await this.chainApi.rpc.chain.getBlockHash(height.toString()); + + const response = await this.chainApi.rpc['cosmwasm']['query'](address, gas, `0x${Buffer.from(JSON.stringify(msg), 'utf8').toString('hex')}`, blockHash.toString()); + const stateResponse = QuerySmartContractStateResponse.fromPartial({ data: Uint8Array.from(Buffer.from(response, 'hex')) }); return { code: 0, @@ -103,9 +105,9 @@ export class AbciService implements ApiService { info: "", index: Long.ZERO, key: undefined, - value: new Uint8Array(), + value: QuerySmartContractStateResponse.encode(stateResponse).finish(), proofOps: undefined, - height: Long.fromString(height), + height: Long.fromString(height.toString()), codespace: "", }; } else { From 674b3b0492472e17fa5bde1d8eedd68b6cac77d5 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 9 Sep 2024 11:39:33 +0900 Subject: [PATCH 53/55] feat: Add alloc feature to cosmwasm-std base64 dependency --- cosmwasm/std/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cosmwasm/std/Cargo.toml b/cosmwasm/std/Cargo.toml index 6d7cbb80..7031e4a5 100644 --- a/cosmwasm/std/Cargo.toml +++ b/cosmwasm/std/Cargo.toml @@ -50,7 +50,7 @@ cosmwasm_2_0 = ["cosmwasm_1_4"] cosmwasm_2_1 = ["cosmwasm_2_0"] [dependencies] -base64 = { version = "0.22.0", default-features = false } +base64 = { version = "0.22.0", default-features = false, features = ["alloc"] } bnum = { version = "0.11.0", default-features = false } cosmwasm-core = { version = "2.1.3", default-features = false } cosmwasm-derive = { version = "2.1.3", default-features = false } From c3d5fd9aaf716487f85fade399217462be5a6fcd Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 9 Sep 2024 12:00:36 +0900 Subject: [PATCH 54/55] fix: Remove composable-traits --- Cargo.toml | 2 -- composable/composable-traits/Cargo.toml | 16 ---------------- composable/composable-traits/src/cosmwasm.rs | 19 ------------------- composable/composable-traits/src/lib.rs | 3 --- frame/cosmwasm/Cargo.toml | 2 -- frame/cosmwasm/src/runtimes/vm.rs | 15 --------------- 6 files changed, 57 deletions(-) delete mode 100644 composable/composable-traits/Cargo.toml delete mode 100644 composable/composable-traits/src/cosmwasm.rs delete mode 100644 composable/composable-traits/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 1a7b815a..aa73bebc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,6 @@ members = [ "composable/vm", "composable/vm-wasmi", "composable/composable-support", - "composable/composable-traits", ] [workspace.dependencies] @@ -147,7 +146,6 @@ pallet-cosmwasm = { path = "frame/cosmwasm", default-features = false } cosmwasm-vm = { path = "composable/vm", default-features = false } cosmwasm-vm-wasmi = { path = "composable/vm-wasmi", default-features = false } composable-support = { path = "composable/composable-support", default-features = false } -composable-traits = { path = "composable/composable-traits", default-features = false } cosmwasm-rpc = { path = "frame/cosmwasm/rpc", default-features = false } cosmwasm-runtime-api = { path = "frame/cosmwasm/runtime-api", default-features = false } diff --git a/composable/composable-traits/Cargo.toml b/composable/composable-traits/Cargo.toml deleted file mode 100644 index 399c9608..00000000 --- a/composable/composable-traits/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -authors = ["Composable Developers"] -edition = "2021" -homepage = "https://composable.finance" -name = "composable-traits" -version = "1.0.0" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -thiserror = { version = "1.0.50", package = "thiserror-core", default-features = false } - -[features] -default = ["std"] -std = ["thiserror/std"] diff --git a/composable/composable-traits/src/cosmwasm.rs b/composable/composable-traits/src/cosmwasm.rs deleted file mode 100644 index 7b79c790..00000000 --- a/composable/composable-traits/src/cosmwasm.rs +++ /dev/null @@ -1,19 +0,0 @@ -/// Errors from integration of CosmwWasm <-> Substrate (types, conversions, encoding, host -/// functions, etc) -#[derive(thiserror::Error, Debug)] -pub enum CosmwasmSubstrateError { - #[error("")] - AssetConversion, - #[error("")] - AccountConvert, - #[error("")] - DispatchError, - #[error("")] - QuerySerialize, - #[error("")] - ExecuteSerialize, - #[error("")] - Ibc, - #[error("")] - Xcm, -} diff --git a/composable/composable-traits/src/lib.rs b/composable/composable-traits/src/lib.rs deleted file mode 100644 index b499c07d..00000000 --- a/composable/composable-traits/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -pub mod cosmwasm; diff --git a/frame/cosmwasm/Cargo.toml b/frame/cosmwasm/Cargo.toml index 0cf610bb..7091d18e 100644 --- a/frame/cosmwasm/Cargo.toml +++ b/frame/cosmwasm/Cargo.toml @@ -42,7 +42,6 @@ sp-io = { default-features = false, workspace = true } sp-runtime = { default-features = false, workspace = true } composable-support = { workspace = true, default-features = false } -composable-traits = { workspace = true, default-features = false } cosmwasm-std = { workspace = true, default-features = false, features = [ "iterator", "stargate", @@ -85,7 +84,6 @@ std = [ "sp-io/std", "sp-runtime/std", "composable-support/std", - "composable-traits/std", "cosmwasm-std/std", "cosmwasm-vm/std", "cosmwasm-vm-wasmi/std", diff --git a/frame/cosmwasm/src/runtimes/vm.rs b/frame/cosmwasm/src/runtimes/vm.rs index 1156c4b3..bb98038f 100644 --- a/frame/cosmwasm/src/runtimes/vm.rs +++ b/frame/cosmwasm/src/runtimes/vm.rs @@ -3,7 +3,6 @@ use crate::{ prelude::*, runtimes::abstraction::GasOutcome, types::*, weights::WeightInfo, Config, Pallet, }; use alloc::{borrow::ToOwned, collections::btree_map::BTreeMap, string::String, vec::Vec}; -use composable_traits::cosmwasm::CosmwasmSubstrateError; use core::marker::{Send, Sync}; use cosmwasm_std::{CodeInfoResponse, Coin, ContractInfoResponse, Empty, Env, MessageInfo}; use cosmwasm_vm::{ @@ -83,20 +82,6 @@ pub enum CosmwasmVMError { Precompile, } -impl From for CosmwasmVMError { - fn from(value: CosmwasmSubstrateError) -> Self { - match value { - CosmwasmSubstrateError::AssetConversion => Self::AssetConversion, - CosmwasmSubstrateError::AccountConvert => Self::AccountConvert, - CosmwasmSubstrateError::DispatchError => Self::Precompile, - CosmwasmSubstrateError::QuerySerialize => Self::QuerySerialize, - CosmwasmSubstrateError::ExecuteSerialize => Self::ExecuteSerialize, - CosmwasmSubstrateError::Ibc => Self::Ibc("CosmwasmSubstrate".to_string()), - CosmwasmSubstrateError::Xcm => Self::Ibc("CosmwasmSubstrate".to_string()), - } - } -} - impl HostError for CosmwasmVMError { From 2be63f1327122c81d26ef3f20102621d930cffa1 Mon Sep 17 00:00:00 2001 From: code0xff Date: Mon, 9 Sep 2024 12:11:46 +0900 Subject: [PATCH 55/55] fix: Remove ibc-primitives --- Cargo.toml | 2 - composable/primitives/Cargo.toml | 26 ------- composable/primitives/src/lib.rs | 129 ------------------------------- frame/cosmwasm/Cargo.toml | 2 - frame/cosmwasm/src/ibc.rs | 98 ----------------------- frame/cosmwasm/src/lib.rs | 1 - 6 files changed, 258 deletions(-) delete mode 100644 composable/primitives/Cargo.toml delete mode 100644 composable/primitives/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index aa73bebc..821fadaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,6 @@ members = [ "template/runtime", "template/node", "cosmwasm/std", - "composable/primitives", "composable/vm", "composable/vm-wasmi", "composable/composable-support", @@ -141,7 +140,6 @@ wasmi = { version = "0.30.0", default-features = false } wasmi-validation = { version = "0.5.0", default-features = false } # Composable -ibc-primitives = { path = "composable/primitives", default-features = false } pallet-cosmwasm = { path = "frame/cosmwasm", default-features = false } cosmwasm-vm = { path = "composable/vm", default-features = false } cosmwasm-vm-wasmi = { path = "composable/vm-wasmi", default-features = false } diff --git a/composable/primitives/Cargo.toml b/composable/primitives/Cargo.toml deleted file mode 100644 index f08d7165..00000000 --- a/composable/primitives/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -edition = "2021" -name = "ibc-primitives" -version = "0.1.0" -authors = ["David Salami "] - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -sp-runtime = { workspace = true, default-features = false } -scale-info = { workspace = true, default-features = false } - -ibc = { workspace = true, default-features = false } -codec = { version = "3.2.0", package = "parity-scale-codec", default-features = false } - -[features] -default = ['std'] -std = [ - "sp-runtime/std", - "scale-info/std", - "ibc/std", - "codec/std", -] -mocks = [] -runtime-benchmarks = [] diff --git a/composable/primitives/src/lib.rs b/composable/primitives/src/lib.rs deleted file mode 100644 index 9d396b5d..00000000 --- a/composable/primitives/src/lib.rs +++ /dev/null @@ -1,129 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -extern crate alloc; - -use alloc::{string::String, vec::Vec}; -use codec::{Decode, Encode}; -use ibc::{ - apps::transfer::types::PrefixedCoin, - core::{ - channel::types::{channel::ChannelEnd, packet::Packet}, - client::types::Height, - host::types::identifiers::{ChannelId, PortId}, - }, - primitives::{Signer, Timestamp}, -}; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; - -/// Packet timeout, could be an offset, or absolute value. -#[derive(RuntimeDebug, PartialEq, Eq, TypeInfo, Encode, Decode, Clone)] -pub enum Timeout { - Offset { - /// Timestamp at which this packet should timeout in counterparty in seconds - /// relative to the latest time stamp - timestamp: Option, - /// Block height at which this packet should timeout on counterparty - /// relative to the latest height - height: Option, - }, - /// Absolute value - Absolute { - /// Timestamp at which this packet should timeout on the counterparty in nanoseconds - timestamp: Option, - /// Block height at which this packet should timeout on the counterparty - height: Option, - }, -} - -pub enum HandlerMessage { - OpenChannel { - port_id: PortId, - channel_end: ChannelEnd, - }, - CloseChannel { - channel_id: ChannelId, - port_id: PortId, - }, - Transfer { - channel_id: ChannelId, - coin: PrefixedCoin, - timeout: Timeout, - from: AccountId, - to: Signer, - memo: String, - }, - SendPacket { - /// packet data - data: Vec, - /// Packet timeout - timeout: Timeout, - /// port id as utf8 string bytes - port_id: PortId, - /// channel id as utf8 string bytes - channel_id: ChannelId, - }, - WriteAck { - /// Raw acknowledgement bytes - ack: Vec, - /// Packet - packet: Packet, - }, -} - -#[derive(core::fmt::Debug, Clone, PartialEq, Eq)] -/// Error definition for module -pub enum Error { - /// Failed to register a new packet - SendPacketError { msg: Option }, - /// An error involving the connection id - ConnectionIdError { msg: Option }, - /// An error involving the client id - ClientIdError { msg: Option }, - /// An error involving channel or port - ChannelOrPortError { msg: Option }, - /// An error involving Client state - ClientStateError { msg: Option }, - /// An Error Involving the Timestamp and height - TimestampOrHeightNotFound { msg: Option }, - /// Failed to register a token transfer packet - SendTransferError { msg: Option }, - /// Ics20 receive packet processing error - ReceivePacketError { msg: Option }, - /// Write acknowledgement error - WriteAcknowledgementError { msg: Option }, - /// Ics20 packet acknowledgement processing error - AcknowledgementError { msg: Option }, - /// Ics20 packet timeout processing error - TimeoutError { msg: Option }, - /// Failed to bind port - BindPortError { msg: Option }, - /// Failed to initialize a new channel - ChannelInitError { msg: Option }, - /// Failed to close a channel - ChannelCloseError { msg: Option }, - /// Failed to decode a value - DecodingError { msg: Option }, - /// Failed to decode commitment prefix - ErrorDecodingPrefix, - /// Some other error - Other { msg: Option }, -} - -/// Captures the functions modules can use to interact with the ibc pallet -/// Currently allows modules to register packets and create channels -pub trait IbcHandler { - /// Get the latest height and latest timestamp for the client paired to the channel and port - /// combination - fn latest_height_and_timestamp( - port_id: &PortId, - channel_id: &ChannelId, - ) -> Result<(Height, Timestamp), Error>; - /// Handle a message - fn handle_message(msg: HandlerMessage) -> Result<(), Error>; - /// testing related methods - #[cfg(feature = "runtime-benchmarks")] - fn create_client() -> Result; - #[cfg(feature = "runtime-benchmarks")] - fn create_connection(client_id: ClientId, connection_id: ConnectionId) -> Result<(), Error>; -} diff --git a/frame/cosmwasm/Cargo.toml b/frame/cosmwasm/Cargo.toml index 7091d18e..bb28c82e 100644 --- a/frame/cosmwasm/Cargo.toml +++ b/frame/cosmwasm/Cargo.toml @@ -17,7 +17,6 @@ scale-info = { default-features = false, version = "2.1.1", features = [ hex = { version = "0.4", default-features = false, features = ["alloc"] } hex-literal = { workspace = true } ibc = { workspace = true, default-features = false } -ibc-primitives = { workspace = true, default-features = false, optional = false } libsecp256k1 = { version = "0.7.0", default-features = false } log = { workspace = true, default-features = false } parity-wasm = { version = "0.45.0", default-features = false } @@ -63,7 +62,6 @@ std = [ "scale-info/std", "hex/std", "ibc/std", - "ibc-primitives/std", "libsecp256k1/std", "log/std", "parity-wasm/std", diff --git a/frame/cosmwasm/src/ibc.rs b/frame/cosmwasm/src/ibc.rs index 7ebb6de2..7ab2e295 100644 --- a/frame/cosmwasm/src/ibc.rs +++ b/frame/cosmwasm/src/ibc.rs @@ -4,49 +4,6 @@ use crate::{ types::{AccountIdOf, DefaultCosmwasmVM}, Config, Pallet, }; -use cosmwasm_vm::{ - executor::{ - ibc::{ - IbcChannelCloseCall, IbcChannelConnectCall, IbcChannelOpenCall, IbcPacketAckCall, - IbcPacketReceiveCall, IbcPacketTimeoutCall, - }, - AllocateCall, AsFunctionName, CosmwasmCallInput, CosmwasmCallWithoutInfoInput, - DeallocateCall, HasInfo, Unit, - }, - input::Input, - memory::PointerOf, - vm::{VmErrorOf, VmInputOf, VmOutputOf}, -}; -use ibc::{ - core::{ - client::types::Height, - host::types::identifiers::{ChannelId, PortId}, - }, - primitives::Timestamp, -}; -use ibc_primitives::HandlerMessage; - -use crate::types::EntryPoint::{self, *}; - -pub struct ChannelOpenCall; -impl Input for ChannelOpenCall { - type Output = cosmwasm_vm::executor::ibc::IbcChannelOpenResult; -} -impl AsFunctionName for ChannelOpenCall { - const NAME: &'static str = "ibc_channel_open"; -} -impl HasInfo for ChannelOpenCall { - const HAS_INFO: bool = false; -} - -impl cosmwasm_vm::system::EventIsTyped for ChannelOpenCall { - const TYPE: cosmwasm_vm::system::SystemEventType = - cosmwasm_vm::system::SystemEventType::IbcChannelConnect; -} - -impl cosmwasm_vm::system::EventHasCodeId for ChannelOpenCall { - const HAS_CODE_ID: bool = false; -} impl Pallet { /// Check whether a contract export the mandatory IBC functions and is consequently IBC capable. @@ -84,58 +41,3 @@ impl Pallet { format!("wasm.{}", Pallet::::account_to_cosmwasm_addr(address)) } } - -use cosmwasm_vm::system::CosmwasmBaseVM; -pub trait CosmwasmCallVMSingle = CosmwasmBaseVM -where - I: Input + HasInfo, - for<'x> Unit: TryFrom, Error = VmErrorOf>, - for<'x> VmInputOf<'x, Self>: TryFrom>, Error = VmErrorOf> - + TryFrom>, Error = VmErrorOf> - + TryFrom, I>, Error = VmErrorOf> - + TryFrom, I>, Error = VmErrorOf>; - -pub trait AsEntryName { - const ENTRY: EntryPoint; -} - -impl AsEntryName for IbcChannelOpenCall { - const ENTRY: EntryPoint = IbcChannelOpen; -} - -impl AsEntryName for IbcPacketReceiveCall { - const ENTRY: EntryPoint = IbcPacketReceive; -} - -impl AsEntryName for IbcChannelConnectCall { - const ENTRY: EntryPoint = IbcChannelConnect; -} - -impl AsEntryName for IbcChannelCloseCall { - const ENTRY: EntryPoint = IbcChannelClose; -} - -impl AsEntryName for IbcPacketTimeoutCall { - const ENTRY: EntryPoint = IbcPacketTimeout; -} - -impl AsEntryName for IbcPacketAckCall { - const ENTRY: EntryPoint = IbcPacketAck; -} - -pub struct NoRelayer { - _marker: core::marker::PhantomData, -} - -impl ibc_primitives::IbcHandler> for NoRelayer { - fn latest_height_and_timestamp( - _port_id: &PortId, - _channel_id: &ChannelId, - ) -> Result<(Height, Timestamp), ibc_primitives::Error> { - Err(ibc_primitives::Error::Other { msg: Some("not supported".to_string()) }) - } - - fn handle_message(_msg: HandlerMessage>) -> Result<(), ibc_primitives::Error> { - Err(ibc_primitives::Error::Other { msg: Some("not supported".to_string()) }) - } -} diff --git a/frame/cosmwasm/src/lib.rs b/frame/cosmwasm/src/lib.rs index a62f5a2f..de78a403 100644 --- a/frame/cosmwasm/src/lib.rs +++ b/frame/cosmwasm/src/lib.rs @@ -51,7 +51,6 @@ pub mod runtimes; pub mod types; pub mod utils; pub mod weights; -pub use crate::ibc::NoRelayer; pub mod entrypoint; const SUBSTRATE_ECDSA_SIGNATURE_LEN: usize = 65;