From f3d135c83b4c8dba3bad401fd13f7c6aca8b6031 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 13 Mar 2019 14:08:31 +0100 Subject: [PATCH] Overhaul crypto (Schnorr/Ristretto, HDKD, BIP39) (#1795) * Rijig to Ristretto * Rebuild wasm * adds compatibility test with the wasm module * Add Ed25519-BIP39 support * Bump subkey version * Update CLI output * New keys. * Standard phrase/password/path keys. * Subkey uses S-URI for secrets * Move everything to use new HDKD crypto. * Test fixes * Ignore old test vector. * fix the ^^ old test vector. * Fix tests * Test fixes * Cleanups * Fix broken key conversion logic in grandpa CC @rphmeier * Remove legacy Keyring usage * Traitify `Pair` * Replace Ed25519AuthorityId with ed25519::Public * Expunge Ed25519AuthorityId type! * Replace Sr25519AuthorityId with sr25519::Public * Remove dodgy crypto type-punning conversions * Fix some tests * Avoid trait * Deduplicate DeriveJunction string decode * Remove cruft code * Fix test * Minor removals * Build fix * Subkey supports sign and verify * Inspect works for public key URIs * Remove more crypto type-punning * Fix typo * Fix tests --- Cargo.lock | 9 +- build.rs | 2 +- core/basic-authorship/src/basic_authorship.rs | 7 +- core/cli/src/lib.rs | 5 +- core/client/db/src/light.rs | 87 +-- core/client/src/client.rs | 75 +- core/client/src/genesis.rs | 42 +- core/client/src/light/backend.rs | 2 +- core/client/src/light/fetcher.rs | 11 +- core/consensus/aura/src/lib.rs | 46 +- core/consensus/common/src/error.rs | 5 +- core/consensus/common/src/offline_tracker.rs | 20 +- core/consensus/rhd/src/lib.rs | 60 +- core/consensus/rhd/src/misbehaviour_check.rs | 27 +- core/executor/src/wasm_executor.rs | 12 +- core/finality-grandpa/primitives/src/lib.rs | 8 +- core/finality-grandpa/src/authorities.rs | 28 +- core/finality-grandpa/src/aux_schema.rs | 12 +- core/finality-grandpa/src/communication.rs | 27 +- core/finality-grandpa/src/environment.rs | 8 +- core/finality-grandpa/src/finality_proof.rs | 25 +- core/finality-grandpa/src/import.rs | 12 +- core/finality-grandpa/src/justification.rs | 8 +- core/finality-grandpa/src/lib.rs | 28 +- core/finality-grandpa/src/tests.rs | 72 +- core/finality-grandpa/src/until_imported.rs | 4 +- core/keyring/src/ed25519.rs | 52 +- core/keyring/src/lib.rs | 16 +- core/keyring/src/sr25519.rs | 52 +- core/keystore/src/lib.rs | 179 +---- core/network/src/test/mod.rs | 13 +- core/primitives/Cargo.toml | 4 + core/primitives/src/authority_id.rs | 96 --- core/primitives/src/crypto.rs | 486 +++++++++++++ core/primitives/src/ed25519.rs | 601 +++++++++++----- core/primitives/src/lib.rs | 14 +- core/primitives/src/sr25519.rs | 652 ++++++++++-------- core/rpc/Cargo.toml | 2 + core/rpc/src/author/tests.rs | 38 +- core/rpc/src/state/tests.rs | 31 +- core/service/src/components.rs | 11 +- core/service/src/lib.rs | 3 +- core/sr-io/with_std.rs | 8 +- core/sr-primitives/src/generic/digest.rs | 30 +- core/sr-primitives/src/generic/tests.rs | 10 +- core/sr-primitives/src/lib.rs | 79 ++- core/sr-primitives/src/testing.rs | 18 +- core/sr-primitives/src/traits.rs | 33 +- core/state-machine/src/ext.rs | 2 +- core/test-client/src/block_builder_ext.rs | 7 +- core/test-client/src/lib.rs | 17 +- core/test-client/src/trait_tests.rs | 39 +- core/test-runtime/Cargo.toml | 1 + core/test-runtime/src/genesismap.rs | 19 +- core/test-runtime/src/lib.rs | 22 +- core/test-runtime/src/system.rs | 149 ++-- core/test-runtime/wasm/Cargo.lock | 72 +- .../substrate_test_runtime.compact.wasm | Bin 55903 -> 56845 bytes core/transaction-pool/graph/src/pool.rs | 90 +-- core/transaction-pool/src/tests.rs | 7 +- node-template/build.rs | 2 +- node-template/runtime/src/lib.rs | 31 +- node-template/runtime/wasm/Cargo.lock | 95 ++- node-template/src/chain_spec.rs | 45 +- node-template/src/service.rs | 2 +- node/cli/src/chain_spec.rs | 98 +-- node/cli/src/service.rs | 2 +- node/executor/src/lib.rs | 65 +- node/primitives/src/lib.rs | 14 +- node/runtime/src/lib.rs | 26 +- node/runtime/wasm/Cargo.lock | 73 +- .../release/node_runtime.compact.wasm | Bin 888467 -> 879134 bytes srml/consensus/src/lib.rs | 4 +- srml/contract/src/lib.rs | 5 +- srml/contract/src/wasm/mod.rs | 4 +- srml/grandpa/Cargo.toml | 2 + srml/grandpa/src/lib.rs | 31 +- srml/grandpa/src/tests.rs | 1 + srml/session/src/lib.rs | 9 +- subkey/Cargo.toml | 3 +- subkey/src/cli.yml | 51 +- subkey/src/main.rs | 156 +++-- subkey/src/vanity.rs | 5 +- 83 files changed, 2584 insertions(+), 1635 deletions(-) delete mode 100644 core/primitives/src/authority_id.rs create mode 100644 core/primitives/src/crypto.rs diff --git a/Cargo.lock b/Cargo.lock index 58af885709038..0da61066df86a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3269,6 +3269,7 @@ dependencies = [ "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", + "srml-consensus 0.1.0", "srml-finality-tracker 0.1.0", "srml-session 0.1.0", "srml-support 0.1.0", @@ -3576,9 +3577,10 @@ dependencies = [ [[package]] name = "subkey" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", @@ -3981,12 +3983,14 @@ dependencies = [ "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", @@ -4020,6 +4024,7 @@ dependencies = [ "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-version 0.1.0", "substrate-client 0.1.0", @@ -4029,6 +4034,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-client 0.1.0", + "substrate-test-runtime 0.1.0", "substrate-transaction-pool 0.1.0", "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4187,6 +4193,7 @@ dependencies = [ "substrate-inherents 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-test-client 0.1.0", ] [[package]] diff --git a/build.rs b/build.rs index 9981ae31d7b73..273700c525c88 100644 --- a/build.rs +++ b/build.rs @@ -16,7 +16,7 @@ use vergen::{ConstantsFlags, generate_cargo_keys}; -const ERROR_MSG: &'static str = "Failed to generate metadata files"; +const ERROR_MSG: &str = "Failed to generate metadata files"; fn main() { generate_cargo_keys(ConstantsFlags::all()).expect(ERROR_MSG); diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index f074b739ff02e..71114ad2da689 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -273,17 +273,16 @@ mod tests { use codec::Encode; use std::cell::RefCell; use consensus_common::{Environment, Proposer}; - use test_client::keyring::Keyring; - use test_client::{self, runtime::{Extrinsic, Transfer}}; + use test_client::{self, runtime::{Extrinsic, Transfer}, AccountKeyring}; fn extrinsic(nonce: u64) -> Extrinsic { let tx = Transfer { amount: Default::default(), nonce, - from: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Alice.into(), to: Default::default(), }; - let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); + let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); Extrinsic::Transfer(tx, signature) } diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 88d9b5728dc4e..864fda3805f2f 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -63,6 +63,9 @@ use substrate_telemetry::TelemetryEndpoints; const MAX_NODE_NAME_LENGTH: usize = 32; +/// The root phrase for our development network keys. +pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; + /// Executable version. Used to pass version information from the root crate. pub struct VersionInfo { /// Implemtation name. @@ -387,7 +390,7 @@ where } if cli.shared_params.dev { - config.keys.push("Alice".into()); + config.keys.push(format!("{}//Alice", DEV_PHRASE)); } let rpc_interface: &str = if cli.rpc_external { "0.0.0.0" } else { "127.0.0.1" }; diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index 7162971b36678..d99ef503b2f81 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -541,6 +541,7 @@ pub(crate) mod tests { use super::*; type Block = RawBlock>; + type AuthorityId = AuthorityIdFor; pub fn default_header(parent: &Hash, number: u64) -> Header { Header { @@ -831,10 +832,10 @@ pub(crate) mod tests { let checks = vec![ (0, None), (1, None), - (2, Some(vec![[1u8; 32].into()])), - (3, Some(vec![[1u8; 32].into()])), - (4, Some(vec![[1u8; 32].into(), [2u8; 32].into()])), - (5, Some(vec![[1u8; 32].into(), [2u8; 32].into()])), + (2, Some(vec![AuthorityId::from_raw([1u8; 32])])), + (3, Some(vec![AuthorityId::from_raw([1u8; 32])])), + (4, Some(vec![AuthorityId::from_raw([1u8; 32]), AuthorityId::from_raw([2u8; 32])])), + (5, Some(vec![AuthorityId::from_raw([1u8; 32]), AuthorityId::from_raw([2u8; 32])])), (6, None), (7, None), // block will work for 'future' block too ]; @@ -843,13 +844,13 @@ pub(crate) mod tests { run_checks(&db, 0, &checks); let hash1 = insert_final_block(&db, None, || default_header(&hash0, 1)); run_checks(&db, 1, &checks); - let hash2 = insert_final_block(&db, Some(vec![[1u8; 32].into()]), || default_header(&hash1, 2)); + let hash2 = insert_final_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32])]), || default_header(&hash1, 2)); run_checks(&db, 2, &checks); - let hash3 = insert_final_block(&db, Some(vec![[1u8; 32].into()]), || default_header(&hash2, 3)); + let hash3 = insert_final_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32])]), || default_header(&hash2, 3)); run_checks(&db, 3, &checks); - let hash4 = insert_final_block(&db, Some(vec![[1u8; 32].into(), [2u8; 32].into()]), || default_header(&hash3, 4)); + let hash4 = insert_final_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32]), AuthorityId::from_raw([2u8; 32])]), || default_header(&hash3, 4)); run_checks(&db, 4, &checks); - let hash5 = insert_final_block(&db, Some(vec![[1u8; 32].into(), [2u8; 32].into()]), || default_header(&hash4, 5)); + let hash5 = insert_final_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32]), AuthorityId::from_raw([2u8; 32])]), || default_header(&hash4, 5)); run_checks(&db, 5, &checks); let hash6 = insert_final_block(&db, None, || default_header(&hash5, 6)); run_checks(&db, 7, &checks); @@ -861,9 +862,9 @@ pub(crate) mod tests { // some older non-best blocks are inserted // ... -> B2(1) -> B2_1(1) -> B2_2(2) // => the cache ignores all writes before best finalized block - let hash2_1 = insert_non_best_block(&db, Some(vec![[1u8; 32].into()]), || default_header(&hash2, 3)); + let hash2_1 = insert_non_best_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32])]), || default_header(&hash2, 3)); assert_eq!(None, db.cache().authorities_at(BlockId::Hash(hash2_1))); - let hash2_2 = insert_non_best_block(&db, Some(vec![[1u8; 32].into(), [2u8; 32].into()]), || default_header(&hash2_1, 4)); + let hash2_2 = insert_non_best_block(&db, Some(vec![AuthorityId::from_raw([1u8; 32]), AuthorityId::from_raw([2u8; 32])]), || default_header(&hash2_1, 4)); assert_eq!(None, db.cache().authorities_at(BlockId::Hash(hash2_2))); } @@ -874,39 +875,39 @@ pub(crate) mod tests { // \> B6_1_1(5) // \> B6_1_2(6) -> B6_1_3(7) - let hash7 = insert_block(&db, Some(vec![[3u8; 32].into()]), || default_header(&hash6, 7)); + let hash7 = insert_block(&db, Some(vec![AuthorityId::from_raw([3u8; 32])]), || default_header(&hash6, 7)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - let hash8 = insert_block(&db, Some(vec![[3u8; 32].into()]), || default_header(&hash7, 8)); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + let hash8 = insert_block(&db, Some(vec![AuthorityId::from_raw([3u8; 32])]), || default_header(&hash7, 8)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![[3u8; 32].into()])); - let hash6_1 = insert_block(&db, Some(vec![[4u8; 32].into()]), || default_header(&hash6, 7)); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + let hash6_1 = insert_block(&db, Some(vec![AuthorityId::from_raw([4u8; 32])]), || default_header(&hash6, 7)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); - let hash6_1_1 = insert_non_best_block(&db, Some(vec![[5u8; 32].into()]), || default_header(&hash6_1, 8)); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); + let hash6_1_1 = insert_non_best_block(&db, Some(vec![AuthorityId::from_raw([5u8; 32])]), || default_header(&hash6_1, 8)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![[5u8; 32].into()])); - let hash6_1_2 = insert_non_best_block(&db, Some(vec![[6u8; 32].into()]), || default_header(&hash6_1, 8)); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![AuthorityId::from_raw([5u8; 32])])); + let hash6_1_2 = insert_non_best_block(&db, Some(vec![AuthorityId::from_raw([6u8; 32])]), || default_header(&hash6_1, 8)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![[5u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![[6u8; 32].into()])); - let hash6_2 = insert_block(&db, Some(vec![[4u8; 32].into()]), || default_header(&hash6_1, 8)); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![AuthorityId::from_raw([5u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![AuthorityId::from_raw([6u8; 32])])); + let hash6_2 = insert_block(&db, Some(vec![AuthorityId::from_raw([4u8; 32])]), || default_header(&hash6_1, 8)); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![[3u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![[5u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![[6u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![[4u8; 32].into()])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), Some(vec![AuthorityId::from_raw([3u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![AuthorityId::from_raw([5u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![AuthorityId::from_raw([6u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![AuthorityId::from_raw([4u8; 32])])); (hash7, hash8, hash6_1, hash6_2, hash6_1_1, hash6_1_2) }; @@ -917,19 +918,19 @@ pub(crate) mod tests { assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), None); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![[5u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![[6u8; 32].into()])); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![[4u8; 32].into()])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), Some(vec![AuthorityId::from_raw([5u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), Some(vec![AuthorityId::from_raw([6u8; 32])])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![AuthorityId::from_raw([4u8; 32])])); // finalize block hash6_2 db.finalize_header(BlockId::Hash(hash6_2)).unwrap(); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6)), None); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash7)), None); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash8)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![[4u8; 32].into()])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1)), Some(vec![AuthorityId::from_raw([4u8; 32])])); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_1)), None); assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_1_2)), None); - assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![[4u8; 32].into()])); + assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![AuthorityId::from_raw([4u8; 32])])); } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 23a6061e36e96..34723deb8cca1 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -1520,11 +1520,10 @@ impl backend::AuxStore for Client pub(crate) mod tests { use std::collections::HashMap; use super::*; - use keyring::Keyring; use primitives::twox_128; use runtime_primitives::traits::DigestItem as DigestItemT; use runtime_primitives::generic::DigestItem; - use test_client::{self, TestClient}; + use test_client::{self, TestClient, AccountKeyring, AuthorityKeyring}; use consensus::BlockOrigin; use test_client::client::backend::Backend as TestBackend; use test_client::BlockBuilderExt; @@ -1541,10 +1540,10 @@ pub(crate) mod tests { ) { // prepare block structure let blocks_transfers = vec![ - vec![(Keyring::Alice, Keyring::Dave), (Keyring::Bob, Keyring::Dave)], - vec![(Keyring::Charlie, Keyring::Eve)], + vec![(AccountKeyring::Alice, AccountKeyring::Dave), (AccountKeyring::Bob, AccountKeyring::Dave)], + vec![(AccountKeyring::Charlie, AccountKeyring::Eve)], vec![], - vec![(Keyring::Alice, Keyring::Dave)], + vec![(AccountKeyring::Alice, AccountKeyring::Dave)], ]; // prepare client ang import blocks @@ -1555,8 +1554,8 @@ pub(crate) mod tests { let mut builder = remote_client.new_block().unwrap(); for (from, to) in block_transfers { builder.push_transfer(Transfer { - from: from.to_raw_public().into(), - to: to.to_raw_public().into(), + from: from.into(), + to: to.into(), amount: 1, nonce: *nonces.entry(from).and_modify(|n| { *n = *n + 1 }).or_default(), }).unwrap(); @@ -1571,12 +1570,12 @@ pub(crate) mod tests { } // prepare test cases - let alice = twox_128(&runtime::system::balance_of_key(Keyring::Alice.to_raw_public().into())).to_vec(); - let bob = twox_128(&runtime::system::balance_of_key(Keyring::Bob.to_raw_public().into())).to_vec(); - let charlie = twox_128(&runtime::system::balance_of_key(Keyring::Charlie.to_raw_public().into())).to_vec(); - let dave = twox_128(&runtime::system::balance_of_key(Keyring::Dave.to_raw_public().into())).to_vec(); - let eve = twox_128(&runtime::system::balance_of_key(Keyring::Eve.to_raw_public().into())).to_vec(); - let ferdie = twox_128(&runtime::system::balance_of_key(Keyring::Ferdie.to_raw_public().into())).to_vec(); + let alice = twox_128(&runtime::system::balance_of_key(AccountKeyring::Alice.into())).to_vec(); + let bob = twox_128(&runtime::system::balance_of_key(AccountKeyring::Bob.into())).to_vec(); + let charlie = twox_128(&runtime::system::balance_of_key(AccountKeyring::Charlie.into())).to_vec(); + let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); + let eve = twox_128(&runtime::system::balance_of_key(AccountKeyring::Eve.into())).to_vec(); + let ferdie = twox_128(&runtime::system::balance_of_key(AccountKeyring::Ferdie.into())).to_vec(); let test_cases = vec![ (1, 4, alice.clone(), vec![(4, 0), (1, 0)]), (1, 3, alice.clone(), vec![(1, 0)]), @@ -1610,14 +1609,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( &BlockId::Number(client.info().unwrap().chain.best_number), - Keyring::Alice.to_raw_public().into() + AccountKeyring::Alice.into() ).unwrap(), 1000 ); assert_eq!( client.runtime_api().balance_of( &BlockId::Number(client.info().unwrap().chain.best_number), - Keyring::Ferdie.to_raw_public().into() + AccountKeyring::Ferdie.into() ).unwrap(), 0 ); @@ -1629,9 +1628,9 @@ pub(crate) mod tests { assert_eq!(client.info().unwrap().chain.best_number, 0); assert_eq!(client.authorities_at(&BlockId::Number(0)).unwrap(), vec![ - Keyring::Alice.to_raw_public().into(), - Keyring::Bob.to_raw_public().into(), - Keyring::Charlie.to_raw_public().into() + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Bob.into(), + AuthorityKeyring::Charlie.into() ]); } @@ -1653,8 +1652,8 @@ pub(crate) mod tests { let mut builder = client.new_block().unwrap(); builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 42, nonce: 0, }).unwrap(); @@ -1666,14 +1665,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( &BlockId::Number(client.info().unwrap().chain.best_number), - Keyring::Alice.to_raw_public().into() + AccountKeyring::Alice.into() ).unwrap(), 958 ); assert_eq!( client.runtime_api().balance_of( &BlockId::Number(client.info().unwrap().chain.best_number), - Keyring::Ferdie.to_raw_public().into() + AccountKeyring::Ferdie.into() ).unwrap(), 42 ); @@ -1695,15 +1694,15 @@ pub(crate) mod tests { let mut builder = client.new_block().unwrap(); builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 42, nonce: 0, }).unwrap(); assert!(builder.push_transfer(Transfer { - from: Keyring::Eve.to_raw_public().into(), - to: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Eve.into(), + to: AccountKeyring::Alice.into(), amount: 42, nonce: 0, }).is_err()); @@ -1789,8 +1788,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 41, nonce: 0, }).unwrap(); @@ -1809,8 +1808,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 1, }).unwrap(); @@ -1821,8 +1820,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 0, }).unwrap(); @@ -1910,8 +1909,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 41, nonce: 0, }).unwrap(); @@ -1930,8 +1929,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 1, }).unwrap(); @@ -1942,8 +1941,8 @@ pub(crate) mod tests { let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 0, }).unwrap(); diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 77861a606d017..9ee003368524e 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -41,14 +41,16 @@ pub fn construct_genesis_block< mod tests { use super::*; use parity_codec::{Encode, Decode, Joiner}; - use keyring::Keyring; use executor::{NativeExecutionDispatch, native_executor_instance}; use state_machine::{self, OverlayedChanges, ExecutionStrategy, InMemoryChangesTrieStorage}; use state_machine::backend::InMemory; - use test_client::runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; - use test_client::runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest, Extrinsic}; + use test_client::{ + runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}, + runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest, Extrinsic}, + AccountKeyring, AuthorityKeyring + }; use runtime_primitives::traits::BlakeTwo256; - use primitives::{Blake2Hasher, ed25519::{Public, Pair}}; + use primitives::Blake2Hasher; use hex::*; native_executor_instance!(Executor, test_client::runtime::api::dispatch, test_client::runtime::native_version, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); @@ -67,7 +69,7 @@ mod tests { use trie::ordered_trie_root; let transactions = txs.into_iter().map(|tx| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from.to_fixed_bytes())).unwrap()) + let signature = AccountKeyring::from_public(&tx.from).unwrap() .sign(&tx.encode()).into(); Extrinsic::Transfer(tx, signature) @@ -75,7 +77,6 @@ mod tests { let extrinsics_root = ordered_trie_root::(transactions.iter().map(Encode::encode)).into(); - println!("root before: {:?}", extrinsics_root); let mut header = Header { parent_hash, number, @@ -121,7 +122,6 @@ mod tests { ExecutionStrategy::NativeElseWasm, ).unwrap(); header = Header::decode(&mut &ret_data[..]).unwrap(); - println!("root after: {:?}", header.extrinsics_root); (vec![].and(&Block { header, extrinsics: transactions }), hash) } @@ -133,8 +133,8 @@ mod tests { genesis_hash, hex!("25e5b37074063ab75c889326246640729b40d0c86932edc527bc80db0e04fe5c").into(), vec![Transfer { - from: Keyring::One.to_raw_public().into(), - to: Keyring::Two.to_raw_public().into(), + from: AccountKeyring::One.into(), + to: AccountKeyring::Two.into(), amount: 69, nonce: 0, }] @@ -143,8 +143,10 @@ mod tests { #[test] fn construct_genesis_should_work_with_native() { - let mut storage = GenesisConfig::new_simple( - vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 1000 + let mut storage = GenesisConfig::new(false, + vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], + 1000 ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); @@ -169,8 +171,10 @@ mod tests { #[test] fn construct_genesis_should_work_with_wasm() { - let mut storage = GenesisConfig::new_simple( - vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 1000 + let mut storage = GenesisConfig::new(false, + vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], + 1000 ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); @@ -194,10 +198,11 @@ mod tests { } #[test] - #[should_panic] fn construct_genesis_with_bad_transaction_should_panic() { - let mut storage = GenesisConfig::new_simple( - vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 68 + let mut storage = GenesisConfig::new(false, + vec![AuthorityKeyring::One.into(), AuthorityKeyring::Two.into()], + vec![AccountKeyring::One.into(), AccountKeyring::Two.into()], + 68 ).genesis_map(); let state_root = BlakeTwo256::trie_root(storage.clone().into_iter()); let block = construct_genesis_block::(state_root); @@ -208,7 +213,7 @@ mod tests { let (b1data, _b1hash) = block1(genesis_hash, &backend); let mut overlay = OverlayedChanges::default(); - let _ = state_machine::new( + let r = state_machine::new( &backend, Some(&InMemoryChangesTrieStorage::new()), &mut overlay, @@ -217,6 +222,7 @@ mod tests { &b1data, ).execute( ExecutionStrategy::NativeElseWasm, - ).unwrap(); + ); + assert!(r.is_err()); } } diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 03d83c4e30fdc..a00d42e67394f 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -35,7 +35,7 @@ use hash_db::Hasher; use trie::MemoryDB; use heapsize::HeapSizeOf; -const IN_MEMORY_EXPECT_PROOF: &'static str = "InMemory state backend has Void error type and always suceeds; qed"; +const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always suceeds; qed"; /// Light client backend. pub struct Backend { diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index f9b28da0544d5..bb6624f91f1a9 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -390,12 +390,13 @@ impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number pub mod tests { use futures::future::{ok, err, FutureResult}; use parking_lot::Mutex; - use keyring::Keyring; use crate::client::tests::prepare_client_with_key_changes; use executor::{self, NativeExecutionDispatch}; use crate::error::Error as ClientError; - use test_client::{self, TestClient, blockchain::HeaderBackend}; - use test_client::runtime::{self, Hash, Block, Header}; + use test_client::{ + self, TestClient, blockchain::HeaderBackend, AccountKeyring, + runtime::{self, Hash, Block, Header} + }; use consensus::BlockOrigin; use crate::in_mem::{Blockchain as InMemoryBlockchain}; @@ -583,7 +584,7 @@ pub mod tests { // we're testing this test case here: // (1, 4, dave.clone(), vec![(4, 0), (1, 1), (1, 0)]), let (remote_client, remote_roots, _) = prepare_client_with_key_changes(); - let dave = twox_128(&runtime::system::balance_of_key(Keyring::Dave.to_raw_public().into())).to_vec(); + let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); let dave = StorageKey(dave); // 'fetch' changes proof from remote node: @@ -695,7 +696,7 @@ pub mod tests { let (remote_client, remote_roots, _) = prepare_client_with_key_changes(); let local_cht_root = cht::compute_root::( 4, 0, remote_roots.iter().cloned().map(|ct| Ok(Some(ct)))).unwrap(); - let dave = twox_128(&runtime::system::balance_of_key(Keyring::Dave.to_raw_public().into())).to_vec(); + let dave = twox_128(&runtime::system::balance_of_key(AccountKeyring::Dave.into())).to_vec(); let dave = StorageKey(dave); // 'fetch' changes proof from remote node: diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index a2e1c3f871c64..3990535401bca 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -41,7 +41,7 @@ use runtime_primitives::{generic, generic::BlockId, Justification}; use runtime_primitives::traits::{ Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi }; -use primitives::{Ed25519AuthorityId, ed25519}; +use primitives::{ed25519, Pair}; use inherents::{InherentDataProviders, InherentData, RuntimeString}; use futures::{Stream, Future, IntoFuture, future}; @@ -60,6 +60,9 @@ pub use aura_slots::SlotDuration; pub use aura_primitives::*; pub use consensus_common::SyncOracle; +type AuthorityId = ed25519::Public; +type Signature = ed25519::Signature; + /// A handle to the network. This is generally implemented by providing some /// handle to a gossip service or similar. /// @@ -73,16 +76,17 @@ pub trait Network: Clone { } /// Get slot author for given block along with authorities. -fn slot_author(slot_num: u64, authorities: &[Ed25519AuthorityId]) -> Option { +fn slot_author(slot_num: u64, authorities: &[AuthorityId]) -> Option { if authorities.is_empty() { return None } let idx = slot_num % (authorities.len() as u64); assert!(idx <= usize::max_value() as u64, "It is impossible to have a vector with length beyond the address space; qed"); - let current_author = *authorities.get(idx as usize) + let current_author = authorities.get(idx as usize) .expect("authorities not empty; index constrained to list length;\ - this is a valid index; qed"); + this is a valid index; qed") + .clone(); Some(current_author) } @@ -109,22 +113,22 @@ fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { pub trait CompatibleDigestItem: Sized { /// Construct a digest item which is a slot number and a signature on the /// hash. - fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self; + fn aura_seal(slot_number: u64, signature: Signature) -> Self; /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)>; + fn as_aura_seal(&self) -> Option<(u64, Signature)>; } -impl CompatibleDigestItem for generic::DigestItem { +impl CompatibleDigestItem for generic::DigestItem { /// Construct a digest item which is a slot number and a signature on the /// hash. - fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self { + fn aura_seal(slot_number: u64, signature: Signature) -> Self { generic::DigestItem::Seal(slot_number, signature) } /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)> { + fn as_aura_seal(&self) -> Option<(u64, Signature)> { match self { - generic::DigestItem::Seal(slot, ref sign) => Some((*slot, sign)), + generic::DigestItem::Seal(slot, ref sig) => Some((*slot, sig.clone().into())), _ => None } } @@ -162,7 +166,7 @@ pub fn start_aura_thread( Error: From + From + 'static, SO: SyncOracle + Send + Sync + Clone + 'static, OnExit: Future + Send + 'static, - DigestItemFor: CompatibleDigestItem + DigestItem + 'static, + DigestItemFor: CompatibleDigestItem + DigestItem + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + 'static, { let worker = AuraWorker { @@ -198,7 +202,7 @@ pub fn start_aura( I: BlockImport + Send + Sync + 'static, Error: From + From, SO: SyncOracle + Send + Sync + Clone, - DigestItemFor: CompatibleDigestItem + DigestItem, + DigestItemFor: CompatibleDigestItem + DigestItem, Error: ::std::error::Error + Send + 'static + From<::consensus_common::Error>, OnExit: Future, { @@ -232,7 +236,7 @@ impl SlotWorker for AuraWorker whe I: BlockImport + Send + Sync + 'static, Error: From + From, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem + DigestItem, + DigestItemFor: CompatibleDigestItem + DigestItem, Error: ::std::error::Error + Send + 'static + From<::consensus_common::Error>, { type OnSlot = Box + Send>; @@ -387,7 +391,7 @@ impl SlotWorker for AuraWorker whe /// if it's successful, returns the pre-header, the slot number, and the signat. // // FIXME #1018 needs misbehavior types -fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[Ed25519AuthorityId]) +fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId]) -> Result, String> where DigestItemFor: CompatibleDigestItem { @@ -395,7 +399,7 @@ fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, a Some(x) => x, None => return Err(format!("Header {:?} is unsealed", hash)), }; - let (slot_num, &sig) = match digest_item.as_aura_seal() { + let (slot_num, sig) = match digest_item.as_aura_seal() { Some(x) => x, None => return Err(format!("Header {:?} is unsealed", hash)), }; @@ -416,7 +420,7 @@ fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, a let to_sign = (slot_num, pre_hash).encode(); let public = ed25519::Public(expected_author.0); - if ed25519::verify_strong(&sig, &to_sign[..], public) { + if ed25519::Pair::verify(&sig, &to_sign[..], public) { Ok(CheckedHeader::Checked(header, slot_num, sig)) } else { Err(format!("Bad signature on {:?}", hash)) @@ -555,7 +559,7 @@ impl ExtraVerification for NothingExtra { impl Verifier for AuraVerifier where C: Authorities + ProvideRuntimeApi + Send + Sync, C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem + DigestItem, + DigestItemFor: CompatibleDigestItem + DigestItem, E: ExtraVerification, { fn verify( @@ -564,7 +568,7 @@ impl Verifier for AuraVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option>), String> { + ) -> Result<(ImportBlock, Option>), String> { let mut inherent_data = self.inherent_data_providers.create_inherent_data().map_err(String::from)?; let (timestamp_now, slot_now) = AuraSlotCompatible::extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; @@ -675,7 +679,7 @@ pub fn import_queue( B: Block, C: 'static + Authorities + ProvideRuntimeApi + Send + Sync, C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem + DigestItem, + DigestItemFor: CompatibleDigestItem + DigestItem, E: 'static + ExtraVerification, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; @@ -696,7 +700,7 @@ mod tests { use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; - use keyring::Keyring; + use keyring::ed25519::Keyring; use client::BlockchainEvents; use test_client; @@ -711,7 +715,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[Ed25519AuthorityId]) + fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index b4276a08b4f8b..58362b8e80e2e 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -18,6 +18,7 @@ use runtime_version::RuntimeVersion; use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind}; +use primitives::ed25519::{Public, Signature}; error_chain! { errors { @@ -52,13 +53,13 @@ error_chain! { } /// Error checking signature - InvalidSignature(s: ::primitives::ed25519::Signature, a: ::primitives::Ed25519AuthorityId) { + InvalidSignature(s: Signature, a: Public) { description("Message signature is invalid"), display("Message signature {:?} by {:?} is invalid.", s, a), } /// Account is not an authority. - InvalidAuthority(a: ::primitives::Ed25519AuthorityId) { + InvalidAuthority(a: Public) { description("Message sender is not a valid authority"), display("Message sender {:?} is not a valid authority.", a), } diff --git a/core/consensus/common/src/offline_tracker.rs b/core/consensus/common/src/offline_tracker.rs index d9afb68416def..3c6755d9411d7 100644 --- a/core/consensus/common/src/offline_tracker.rs +++ b/core/consensus/common/src/offline_tracker.rs @@ -112,25 +112,25 @@ impl OfflineTracker { #[cfg(test)] mod tests { use super::*; - use primitives::Ed25519AuthorityId; + use primitives::ed25519::Public as AuthorityId; #[test] fn validator_offline() { - let mut tracker = OfflineTracker::::new(); - let v = [0; 32].into(); - let v2 = [1; 32].into(); - let v3 = [2; 32].into(); - tracker.note_round_end(v, true); - tracker.note_round_end(v2, true); - tracker.note_round_end(v3, true); + let mut tracker = OfflineTracker::::new(); + let v = AuthorityId::from_raw([0; 32]); + let v2 = AuthorityId::from_raw([1; 32]); + let v3 = AuthorityId::from_raw([2; 32]); + tracker.note_round_end(v.clone(), true); + tracker.note_round_end(v2.clone(), true); + tracker.note_round_end(v3.clone(), true); let slash_time = REPORT_TIME + Duration::from_secs(5); tracker.observed.get_mut(&v).unwrap().offline_since -= slash_time; tracker.observed.get_mut(&v2).unwrap().offline_since -= slash_time; - assert_eq!(tracker.reports(&[v, v2, v3]), vec![0, 1]); + assert_eq!(tracker.reports(&[v.clone(), v2.clone(), v3.clone()]), vec![0, 1]); - tracker.note_new_block(&[v, v3]); + tracker.note_new_block(&[v.clone(), v3.clone()]); assert_eq!(tracker.reports(&[v, v2, v3]), vec![0]); } } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 65401c92a9b72..e42083a40b309 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -762,7 +762,7 @@ fn check_justification_signed_message( let auth_id = sig.signer.clone().into(); if !authorities.contains(&auth_id) { return None } - if ed25519::verify_strong(&sig.signature, message, &sig.signer) { + if ed25519::Pair::verify(&sig.signature, message, &sig.signer) { Some(sig.signer.0) } else { None @@ -838,7 +838,7 @@ pub fn check_vote( fn check_action(action: Action, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { let message = localized_encode(*parent_hash, action); - if ed25519::verify_strong(&sig.signature, &message, &sig.signer) { + if ed25519::Pair::verify(&sig.signature, &message, &sig.signer) { Ok(()) } else { Err(CommonErrorKind::InvalidSignature(sig.signature.into(), sig.signer.clone().into()).into()) @@ -1315,7 +1315,7 @@ mod tests { use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; use primitives::H256; - use self::keyring::Keyring; + use keyring::AuthorityKeyring; type TestBlock = GenericTestBlock<()>; @@ -1420,7 +1420,7 @@ mod tests { start_round: 0, })), round_timeout_multiplier: 10, - key: Arc::new(Keyring::One.into()), + key: Arc::new(AuthorityKeyring::One.into()), factory: DummyFactory } } @@ -1446,10 +1446,10 @@ mod tests { fn future_gets_preempted() { let client = FakeClient { authorities: vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::One.into(), + AuthorityKeyring::Two.into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1493,17 +1493,17 @@ mod tests { let hash = [0xff; 32].into(); let authorities = vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::One.into(), + AuthorityKeyring::Two.into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ]; let authorities_keys = vec![ - Keyring::One.into(), - Keyring::Two.into(), - Keyring::Alice.into(), - Keyring::Eve.into(), + AuthorityKeyring::One.into(), + AuthorityKeyring::Two.into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ]; let unchecked = UncheckedJustification(rhododendron::UncheckedJustification { @@ -1554,8 +1554,8 @@ mod tests { let parent_hash = Default::default(); let authorities = vec![ - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ]; let block = TestBlock { @@ -1563,7 +1563,7 @@ mod tests { extrinsics: Default::default() }; - let proposal = sign_message(rhododendron::Message::Propose(1, block.clone()), &Keyring::Alice.pair(), parent_hash);; + let proposal = sign_message(rhododendron::Message::Propose(1, block.clone()), &AuthorityKeyring::Alice.pair(), parent_hash);; if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_ok()); let mut invalid_round = proposal.clone(); @@ -1577,7 +1577,7 @@ mod tests { } // Not an authority - let proposal = sign_message::(rhododendron::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; + let proposal = sign_message::(rhododendron::Message::Propose(1, block), &AuthorityKeyring::Bob.pair(), parent_hash);; if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { @@ -1591,8 +1591,8 @@ mod tests { let hash: H256 = [0xff; 32].into(); let authorities = vec![ - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ]; let vote = sign_message::(rhododendron::Message::Vote(rhododendron::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; @@ -1618,10 +1618,10 @@ mod tests { fn drop_bft_future_does_not_deadlock() { let client = FakeClient { authorities: vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::One.into(), + AuthorityKeyring::Two.into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; @@ -1643,10 +1643,10 @@ mod tests { fn bft_can_build_though_skipped() { let client = FakeClient { authorities: vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - Keyring::Alice.to_raw_public().into(), - Keyring::Eve.to_raw_public().into(), + AuthorityKeyring::One.into(), + AuthorityKeyring::Two.into(), + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Eve.into(), ], imported_heights: Mutex::new(HashSet::new()), }; diff --git a/core/consensus/rhd/src/misbehaviour_check.rs b/core/consensus/rhd/src/misbehaviour_check.rs index a0c61bb4a6f39..58b36542f692b 100644 --- a/core/consensus/rhd/src/misbehaviour_check.rs +++ b/core/consensus/rhd/src/misbehaviour_check.rs @@ -74,8 +74,7 @@ pub fn evaluate_misbehavior( mod tests { use super::*; - use keyring::ed25519; - use keyring::Keyring; + use keyring::AuthorityKeyring; use rhododendron; use runtime_primitives::testing::{H256, Block as RawBlock}; @@ -110,7 +109,7 @@ mod tests { #[test] fn evaluates_double_prepare() { - let key: ed25519::Pair = Keyring::One.into(); + let key = AuthorityKeyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -127,7 +126,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_prepare(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior::( + assert!(!evaluate_misbehavior::( &key.public().into(), parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -135,23 +134,23 @@ mod tests { signed, signed, ) - ) == false); + )); // misbehavior has wrong target. - assert!(evaluate_misbehavior::( - &Keyring::Two.to_raw_public().into(), + assert!(!evaluate_misbehavior::( + &AuthorityKeyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoublePrepare( 1, sign_prepare(&key, 1, hash_1, parent_hash), sign_prepare(&key, 1, hash_2, parent_hash), ) - ) == false); + )); } #[test] fn evaluates_double_commit() { - let key: ed25519::Pair = Keyring::One.into(); + let key = AuthorityKeyring::One.pair(); let parent_hash = [0xff; 32].into(); let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); @@ -168,7 +167,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_commit(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior::( + assert!(!evaluate_misbehavior::( &key.public().into(), parent_hash, &MisbehaviorKind::BftDoubleCommit( @@ -176,17 +175,17 @@ mod tests { signed, signed, ) - ) == false); + )); // misbehavior has wrong target. - assert!(evaluate_misbehavior::( - &Keyring::Two.to_raw_public().into(), + assert!(!evaluate_misbehavior::( + &AuthorityKeyring::Two.into(), parent_hash, &MisbehaviorKind::BftDoubleCommit( 1, sign_commit(&key, 1, hash_1, parent_hash), sign_commit(&key, 1, hash_2, parent_hash), ) - ) == false); + )); } } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 044397ae3a803..7e459826989d4 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -28,7 +28,7 @@ use wasmi::memory_units::{Pages}; use state_machine::Externalities; use crate::error::{Error, ErrorKind, Result}; use crate::wasm_utils::UserError; -use primitives::{blake2_256, twox_128, twox_256, ed25519, sr25519}; +use primitives::{blake2_256, twox_128, twox_256, ed25519, sr25519, Pair}; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; @@ -474,7 +474,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_ed25519_verify"))?; let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_ed25519_verify"))?; - Ok(if ed25519::verify(&sig, &msg, &pubkey) { + Ok(if ed25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 } else { 5 @@ -487,7 +487,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_sr25519_verify"))?; let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_sr25519_verify"))?; - Ok(if sr25519::verify(&sig, &msg, &pubkey) { + Ok(if sr25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 } else { 5 @@ -759,7 +759,9 @@ impl WasmExecutor { #[cfg(test)] mod tests { use super::*; + use parity_codec::Encode; + use state_machine::TestExternalities; use hex_literal::{hex, hex_impl}; use primitives::map; @@ -875,7 +877,7 @@ mod tests { fn ed25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = ed25519::Pair::from_seed(&blake2_256(b"test")); + let key = ed25519::Pair::from_seed(blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); @@ -901,7 +903,7 @@ mod tests { fn sr25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = sr25519::Pair::from_seed(&blake2_256(b"test")); + let key = sr25519::Pair::from_seed(blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 9c20483305590..92bd0e4584c83 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -23,17 +23,19 @@ extern crate alloc; use parity_codec::{Encode, Decode}; -use substrate_primitives::Ed25519AuthorityId; +use substrate_primitives::ed25519; use sr_primitives::traits::{DigestFor, NumberFor}; use client::decl_runtime_apis; use rstd::vec::Vec; +use ed25519::Public as AuthorityId; + /// A scheduled change of authority set. #[cfg_attr(feature = "std", derive(Debug, PartialEq))] #[derive(Clone, Encode, Decode)] pub struct ScheduledChange { /// The new authorities after the change, along with their respective weights. - pub next_authorities: Vec<(Ed25519AuthorityId, u64)>, + pub next_authorities: Vec<(AuthorityId, u64)>, /// The number of blocks to delay. pub delay: N, } @@ -106,6 +108,6 @@ decl_runtime_apis! { /// When called at block B, it will return the set of authorities that should be /// used to finalize descendants of this block (B+1, B+2, ...). The block B itself /// is finalized by the authorities from block B-1. - fn grandpa_authorities() -> Vec<(Ed25519AuthorityId, u64)>; + fn grandpa_authorities() -> Vec<(AuthorityId, u64)>; } } diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index cc35cca822542..98b3973855b90 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -18,7 +18,7 @@ use fork_tree::ForkTree; use parking_lot::RwLock; -use substrate_primitives::Ed25519AuthorityId; +use substrate_primitives::ed25519; use grandpa::VoterSet; use parity_codec::{Encode, Decode}; use log::{debug, info}; @@ -28,6 +28,8 @@ use std::fmt::Debug; use std::ops::Add; use std::sync::Arc; +use ed25519::Public as AuthorityId; + /// A shared authority set. pub(crate) struct SharedAuthoritySet { inner: Arc>>, @@ -61,7 +63,7 @@ where N: Add + Ord + Clone + Debug, } /// Get the current authorities and their weights (for the current set ID). - pub(crate) fn current_authorities(&self) -> VoterSet { + pub(crate) fn current_authorities(&self) -> VoterSet { self.inner.read().current_authorities.iter().cloned().collect() } } @@ -85,7 +87,7 @@ pub(crate) struct Status { /// A set of authorities. #[derive(Debug, Clone, Encode, Decode, PartialEq)] pub(crate) struct AuthoritySet { - pub(crate) current_authorities: Vec<(Ed25519AuthorityId, u64)>, + pub(crate) current_authorities: Vec<(AuthorityId, u64)>, pub(crate) set_id: u64, // Tree of pending standard changes across forks. Standard changes are // enacted on finality and must be enacted (i.e. finalized) in-order across @@ -102,7 +104,7 @@ where H: PartialEq, N: Ord, { /// Get a genesis set with given authorities. - pub(crate) fn genesis(initial: Vec<(Ed25519AuthorityId, u64)>) -> Self { + pub(crate) fn genesis(initial: Vec<(AuthorityId, u64)>) -> Self { AuthoritySet { current_authorities: initial, set_id: 0, @@ -112,7 +114,7 @@ where H: PartialEq, } /// Get the current set id and a reference to the current authority set. - pub(crate) fn current(&self) -> (u64, &[(Ed25519AuthorityId, u64)]) { + pub(crate) fn current(&self) -> (u64, &[(AuthorityId, u64)]) { (self.set_id, &self.current_authorities[..]) } } @@ -379,7 +381,7 @@ pub(crate) enum DelayKind { #[derive(Debug, Clone, Encode, PartialEq)] pub(crate) struct PendingChange { /// The new authorities and weights to apply. - pub(crate) next_authorities: Vec<(Ed25519AuthorityId, u64)>, + pub(crate) next_authorities: Vec<(AuthorityId, u64)>, /// How deep in the chain the announcing block must be /// before the change is applied. pub(crate) delay: N, @@ -509,8 +511,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![([1; 32].into(), 5)]; - let set_b = vec![([2; 32].into(), 5)]; + let set_a = vec![(AuthorityId([1; 32]), 5)]; + let set_b = vec![(AuthorityId([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -574,8 +576,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![([1; 32].into(), 5)]; - let set_c = vec![([2; 32].into(), 5)]; + let set_a = vec![(AuthorityId([1; 32]), 5)]; + let set_c = vec![(AuthorityId([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -640,7 +642,7 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![([1; 32].into(), 5)]; + let set_a = vec![(AuthorityId([1; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), @@ -676,8 +678,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![([1; 32].into(), 5)]; - let set_b = vec![([2; 32].into(), 5)]; + let set_a = vec![(AuthorityId([1; 32]), 5)]; + let set_b = vec![(AuthorityId([2; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 930329344b8fb..eb187d877bf26 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -16,20 +16,20 @@ //! Schema for stuff in the aux-db. +use std::fmt::Debug; +use std::sync::Arc; use parity_codec::{Encode, Decode}; use client::backend::AuxStore; use client::error::{Result as ClientResult, Error as ClientError, ErrorKind as ClientErrorKind}; use fork_tree::ForkTree; use grandpa::round::State as RoundState; -use substrate_primitives::Ed25519AuthorityId; use log::{info, warn}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; use crate::NewAuthoritySet; -use std::fmt::Debug; -use std::sync::Arc; +use substrate_primitives::ed25519::Public as AuthorityId; const VERSION_KEY: &[u8] = b"grandpa_schema_version"; const SET_STATE_KEY: &[u8] = b"grandpa_completed_round"; @@ -61,7 +61,7 @@ type V0VoterSetState = (u64, RoundState); #[derive(Debug, Clone, Encode, Decode, PartialEq)] struct V0PendingChange { - next_authorities: Vec<(Ed25519AuthorityId, u64)>, + next_authorities: Vec<(AuthorityId, u64)>, delay: N, canon_height: N, canon_hash: H, @@ -69,7 +69,7 @@ struct V0PendingChange { #[derive(Debug, Clone, Encode, Decode, PartialEq)] struct V0AuthoritySet { - current_authorities: Vec<(Ed25519AuthorityId, u64)>, + current_authorities: Vec<(AuthorityId, u64)>, set_id: u64, pending_changes: Vec>, } @@ -141,7 +141,7 @@ pub(crate) fn load_persistent( B: AuxStore, H: Debug + Decode + Encode + Clone + PartialEq, N: Debug + Decode + Encode + Clone + Ord, - G: FnOnce() -> ClientResult> + G: FnOnce() -> ClientResult> { let version: Option = load_decode(backend, VERSION_KEY)?; let consensus_changes = load_decode(backend, CONSENSUS_CHANGES_KEY)? diff --git a/core/finality-grandpa/src/communication.rs b/core/finality-grandpa/src/communication.rs index f392d3278b3a2..54de53e7bb29e 100644 --- a/core/finality-grandpa/src/communication.rs +++ b/core/finality-grandpa/src/communication.rs @@ -25,11 +25,12 @@ use futures::prelude::*; use futures::sync::mpsc; use log::{debug, trace}; use parity_codec::{Encode, Decode}; -use substrate_primitives::{ed25519, Ed25519AuthorityId}; +use substrate_primitives::{ed25519, Pair}; use runtime_primitives::traits::Block as BlockT; use tokio::timer::Interval; use crate::{Error, Network, Message, SignedMessage, Commit, CompactCommit, GossipMessage, FullCommitMessage, VoteOrPrecommitMessage}; +use ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; fn localized_payload(round: u64, set_id: u64, message: &E) -> Vec { (message, round, set_id).encode() @@ -242,14 +243,14 @@ impl> Network for BroadcastHandle { // check a message. pub(crate) fn check_message_sig( message: &Message, - id: &Ed25519AuthorityId, - signature: &ed25519::Signature, + id: &AuthorityId, + signature: &AuthoritySignature, round: u64, set_id: u64, ) -> Result<(), ()> { - let as_public = ed25519::Public::from_raw(id.0); + let as_public = AuthorityId::from_raw(id.0); let encoded_raw = localized_payload(round, set_id, message); - if ed25519::verify_strong(signature, &encoded_raw, as_public) { + if ed25519::Pair::verify(signature, &encoded_raw, as_public) { Ok(()) } else { debug!(target: "afg", "Bad signature on message from {:?}", id); @@ -261,7 +262,7 @@ pub(crate) fn check_message_sig( /// the output stream checks signatures also. pub(crate) fn checked_message_stream( inner: S, - voters: Arc>, + voters: Arc>, ) -> impl Stream,Error=Error> where S: Stream,Error=()> @@ -297,7 +298,7 @@ pub(crate) fn checked_message_stream( pub(crate) struct OutgoingMessages> { round: u64, set_id: u64, - locals: Option<(Arc, Ed25519AuthorityId)>, + locals: Option<(Arc, AuthorityId)>, sender: mpsc::UnboundedSender>, network: N, } @@ -309,7 +310,7 @@ impl> Sink for OutgoingMessages fn start_send(&mut self, msg: Message) -> StartSend, Error> { // when locals exist, sign messages on import - if let Some((ref pair, local_id)) = self.locals { + if let Some((ref pair, ref local_id)) = self.locals { let encoded = localized_payload(self.round, self.set_id, &msg); let signature = pair.sign(&encoded[..]); @@ -317,7 +318,7 @@ impl> Sink for OutgoingMessages let signed = SignedMessage:: { message: msg, signature, - id: local_id, + id: local_id.clone(), }; let message = GossipMessage::VoteOrPrecommit(VoteOrPrecommitMessage:: { @@ -361,7 +362,7 @@ pub(crate) fn outgoing_messages>( round: u64, set_id: u64, local_key: Option>, - voters: Arc>, + voters: Arc>, network: N, ) -> ( impl Stream,Error=Error>, @@ -369,7 +370,7 @@ pub(crate) fn outgoing_messages>( ) { let locals = local_key.and_then(|pair| { let public = pair.public(); - let id = Ed25519AuthorityId(public.0); + let id = AuthorityId(public.0); if voters.contains_key(&id) { Some((pair, id)) } else { @@ -395,7 +396,7 @@ pub(crate) fn outgoing_messages>( fn check_compact_commit( msg: CompactCommit, - voters: &VoterSet, + voters: &VoterSet, ) -> Option> { if msg.precommits.len() != msg.auth_data.len() || msg.precommits.is_empty() { debug!(target: "afg", "Skipping malformed compact commit"); @@ -417,7 +418,7 @@ fn check_compact_commit( /// messages. pub(crate) fn checked_commit_stream( inner: S, - voters: Arc>, + voters: Arc>, ) -> impl Stream),Error=Error> where S: Stream,Error=()> diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index 857d6eafd7113..a9b5a43d01144 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -33,7 +33,7 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ As, Block as BlockT, Header as HeaderT, NumberFor, One, Zero, }; -use substrate_primitives::{Blake2Hasher, ed25519,Ed25519AuthorityId, H256}; +use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use crate::{ Commit, Config, Error, Network, Precommit, Prevote, @@ -45,6 +45,8 @@ use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; use crate::until_imported::UntilVoteTargetImported; +use ed25519::Public as AuthorityId; + /// Data about a completed round. pub(crate) type CompletedRound = (u64, RoundState); @@ -75,7 +77,7 @@ impl LastCompletedRound { /// The environment we run GRANDPA in. pub(crate) struct Environment, RA> { pub(crate) inner: Arc>, - pub(crate) voters: Arc>, + pub(crate) voters: Arc>, pub(crate) config: Config, pub(crate) authority_set: SharedAuthoritySet>, pub(crate) consensus_changes: SharedConsensusChanges>, @@ -205,7 +207,7 @@ impl, N, RA> voter::Environment: BlockNumberOps, { type Timer = Box + Send>; - type Id = Ed25519AuthorityId; + type Id = AuthorityId; type Signature = ed25519::Signature; // regular round message streams diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index eef705c4ff714..daebe3b72a585 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -42,7 +42,8 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{Ed25519AuthorityId, H256}; +use substrate_primitives::{ed25519, H256}; +use ed25519::Public as AuthorityId; use crate::justification::GrandpaJustification; @@ -189,7 +190,7 @@ fn do_check_finality_proof, C, J>( call_data: vec![], retry_count: None, })?; - let grandpa_authorities: Vec<(Ed25519AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) + let grandpa_authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) .ok_or_else(|| ClientErrorKind::BadJustification("failed to decode GRANDPA authorities set proof".into()))?; // and now check justification @@ -222,7 +223,7 @@ trait ProvableJustification: Encode + Decode { fn target_block(&self) -> (Header::Number, Header::Hash); /// Verify justification with respect to authorities set and authorities set id. - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()>; + fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()>; } impl> ProvableJustification for GrandpaJustification @@ -233,7 +234,7 @@ impl> ProvableJustification for GrandpaJ (self.commit.target_number, self.commit.target_hash) } - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { + fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { GrandpaJustification::verify(self, set_id, authorities) } } @@ -253,12 +254,12 @@ mod tests { impl ProvableJustification
for ValidFinalityProof { fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { + fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { assert_eq!(set_id, 1); assert_eq!(authorities, &vec![ - (Ed25519AuthorityId([1u8; 32]), 1), - (Ed25519AuthorityId([2u8; 32]), 2), - (Ed25519AuthorityId([3u8; 32]), 3), + (AuthorityId([1u8; 32]), 1), + (AuthorityId([2u8; 32]), 2), + (AuthorityId([3u8; 32]), 3), ].into_iter().collect()); Ok(()) } @@ -387,7 +388,7 @@ mod tests { impl ProvableJustification
for InvalidFinalityProof { fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } - fn verify(&self, _set_id: u64, _authorities: &VoterSet) -> ClientResult<()> { + fn verify(&self, _set_id: u64, _authorities: &VoterSet) -> ClientResult<()> { Err(ClientErrorKind::Backend("test error".into()).into()) } } @@ -415,9 +416,9 @@ mod tests { .unwrap().unwrap(); assert_eq!(do_check_finality_proof::( |_| Ok(vec![ - (Ed25519AuthorityId([1u8; 32]), 1u64), - (Ed25519AuthorityId([2u8; 32]), 2u64), - (Ed25519AuthorityId([3u8; 32]), 3u64), + (AuthorityId([1u8; 32]), 1u64), + (AuthorityId([2u8; 32]), 2u64), + (AuthorityId([3u8; 32]), 3u64), ].encode()), header(1), (2, header(2).hash()), diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 3f4dbb3650a86..7e1582645f7f7 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -36,7 +36,7 @@ use runtime_primitives::traits::{ Block as BlockT, DigestFor, DigestItemFor, DigestItem, Header as HeaderT, NumberFor, ProvideRuntimeApi, }; -use substrate_primitives::{H256, Ed25519AuthorityId, Blake2Hasher}; +use substrate_primitives::{H256, ed25519, Blake2Hasher}; use crate::{Error, CommandOrError, NewAuthoritySet, VoterCommand}; use crate::authorities::{AuthoritySet, SharedAuthoritySet, DelayKind, PendingChange}; @@ -44,6 +44,8 @@ use crate::consensus_changes::SharedConsensusChanges; use crate::environment::{finalize_block, is_descendent_of}; use crate::justification::GrandpaJustification; +use ed25519::Public as AuthorityId; + /// A block-import handler for GRANDPA. /// /// This scans each imported block for signals of changing authority set. @@ -67,7 +69,7 @@ impl, RA, PRA> JustificationImport B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, + DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -161,7 +163,7 @@ impl, RA, PRA> GrandpaBlockImport + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, + DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, @@ -379,14 +381,14 @@ impl, RA, PRA> BlockImport B: Backend + 'static, E: CallExecutor + 'static + Clone + Send + Sync, DigestFor: Encode, - DigestItemFor: DigestItem, + DigestItemFor: DigestItem, RA: Send + Sync, PRA: ProvideRuntimeApi, PRA::Api: GrandpaApi, { type Error = ConsensusError; - fn import_block(&self, mut block: ImportBlock, new_authorities: Option>) + fn import_block(&self, mut block: ImportBlock, new_authorities: Option>) -> Result { let hash = block.post_header().hash(); diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 52ce9006e19ab..d837e6a30862e 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -25,11 +25,13 @@ use grandpa::VoterSet; use grandpa::{Error as GrandpaError}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use substrate_primitives::{H256, Ed25519AuthorityId, Blake2Hasher}; +use substrate_primitives::{H256, ed25519, Blake2Hasher}; use crate::{Commit, Error}; use crate::communication; +use ed25519::Public as AuthorityId; + /// A GRANDPA justification for block finality, it includes a commit message and /// an ancestry proof including all headers routing all precommit target blocks /// to the commit target block. Due to the current voting strategy the precommit @@ -95,7 +97,7 @@ impl> GrandpaJustification { pub(crate) fn decode_and_verify( encoded: Vec, set_id: u64, - voters: &VoterSet, + voters: &VoterSet, ) -> Result, ClientError> where NumberFor: grandpa::BlockNumberOps, { @@ -106,7 +108,7 @@ impl> GrandpaJustification { } /// Validate the commit and the votes' ancestry proofs. - pub(crate) fn verify(&self, set_id: u64, voters: &VoterSet) -> Result<(), ClientError> + pub(crate) fn verify(&self, set_id: u64, voters: &VoterSet) -> Result<(), ClientError> where NumberFor: grandpa::BlockNumberOps, { diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index 07f35ebc63763..67953489e8905 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -68,7 +68,7 @@ use runtime_primitives::traits::{ use fg_primitives::GrandpaApi; use inherents::InherentDataProviders; use runtime_primitives::generic::BlockId; -use substrate_primitives::{ed25519, H256, Ed25519AuthorityId, Blake2Hasher}; +use substrate_primitives::{ed25519, H256, Blake2Hasher, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN}; use srml_finality_tracker; @@ -106,6 +106,8 @@ pub use finality_proof::{prove_finality, check_finality_proof}; use import::GrandpaBlockImport; use until_imported::UntilCommitBlocksImported; +use ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; + #[cfg(test)] mod tests; @@ -118,8 +120,8 @@ pub type Message = grandpa::Message<::Hash, NumberFor = grandpa::SignedMessage< ::Hash, NumberFor, - ed25519::Signature, - Ed25519AuthorityId, + AuthoritySignature, + AuthorityId, >; /// Grandpa gossip message type. @@ -148,15 +150,15 @@ pub type Precommit = grandpa::Precommit<::Hash, NumberFo pub type Commit = grandpa::Commit< ::Hash, NumberFor, - ed25519::Signature, - Ed25519AuthorityId + AuthoritySignature, + AuthorityId >; /// A compact commit message for this chain's block type. pub type CompactCommit = grandpa::CompactCommit< ::Hash, NumberFor, - ed25519::Signature, - Ed25519AuthorityId + AuthoritySignature, + AuthorityId >; /// Network level commit message with topic information. @@ -560,7 +562,7 @@ pub(crate) struct NewAuthoritySet { pub(crate) canon_number: N, pub(crate) canon_hash: H, pub(crate) set_id: u64, - pub(crate) authorities: Vec<(Ed25519AuthorityId, u64)>, + pub(crate) authorities: Vec<(AuthorityId, u64)>, } /// Commands issued to the voter. @@ -684,16 +686,16 @@ pub fn block_import, RA, PRA>( fn committer_communication, B, E, N, RA>( local_key: Option>, set_id: u64, - voters: &Arc>, + voters: &Arc>, client: &Arc>, network: &N, ) -> ( impl Stream< - Item = (u64, ::grandpa::CompactCommit, ed25519::Signature, Ed25519AuthorityId>), + Item = (u64, ::grandpa::CompactCommit, AuthoritySignature, AuthorityId>), Error = CommandOrError>, >, impl Sink< - SinkItem = (u64, ::grandpa::Commit, ed25519::Signature, Ed25519AuthorityId>), + SinkItem = (u64, ::grandpa::Commit, AuthoritySignature, AuthorityId>), SinkError = CommandOrError>, >, ) where @@ -702,7 +704,7 @@ fn committer_communication, B, E, N, RA>( N: Network, RA: Send + Sync, NumberFor: BlockNumberOps, - DigestItemFor: DigestItem, + DigestItemFor: DigestItem, { // verification stream let commit_in = crate::communication::checked_commit_stream::( @@ -773,7 +775,7 @@ pub fn run_grandpa, N, RA>( N::In: Send + 'static, NumberFor: BlockNumberOps, DigestFor: Encode, - DigestItemFor: DigestItem, + DigestItemFor: DigestItem, RA: Send + Sync + 'static, { use futures::future::{self, Loop as FutureLoop}; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 3eb7d556551ec..9aed819b25036 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -22,7 +22,7 @@ use network::test::{PassThroughVerifier}; use network::config::{ProtocolConfig, Roles}; use parking_lot::Mutex; use tokio::runtime::current_thread; -use keyring::Keyring; +use keyring::AuthorityKeyring; use client::{ BlockchainEvents, error::Result, blockchain::Backend as BlockchainBackend, @@ -238,13 +238,13 @@ impl Network for MessageRouting { #[derive(Default, Clone)] struct TestApi { - genesis_authorities: Vec<(Ed25519AuthorityId, u64)>, + genesis_authorities: Vec<(AuthorityId, u64)>, scheduled_changes: Arc>>>, forced_changes: Arc)>>>, } impl TestApi { - fn new(genesis_authorities: Vec<(Ed25519AuthorityId, u64)>) -> Self { + fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { TestApi { genesis_authorities, scheduled_changes: Arc::new(Mutex::new(HashMap::new())), @@ -282,7 +282,7 @@ impl Core for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { unimplemented!("Not required for testing!") } @@ -327,7 +327,7 @@ impl GrandpaApi for RuntimeApi { _: ExecutionContext, _: Option<()>, _: Vec, - ) -> Result>> { + ) -> Result>> { if at == &BlockId::Number(0) { Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } else { @@ -374,9 +374,9 @@ impl GrandpaApi for RuntimeApi { const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); -fn make_ids(keys: &[Keyring]) -> Vec<(Ed25519AuthorityId, u64)> { +fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(AuthorityId, u64)> { keys.iter() - .map(|key| Ed25519AuthorityId(key.to_raw_public())) + .map(|key| AuthorityId(key.to_raw_public())) .map(|id| (id, 1)) .collect() } @@ -386,7 +386,7 @@ fn make_ids(keys: &[Keyring]) -> Vec<(Ed25519AuthorityId, u64)> { fn run_to_completion_with( blocks: u64, net: Arc>, - peers: &[Keyring], + peers: &[AuthorityKeyring], before_waiting: F, ) -> u64 { use parking_lot::RwLock; @@ -462,14 +462,14 @@ fn run_to_completion_with( highest_finalized } -fn run_to_completion(blocks: u64, net: Arc>, peers: &[Keyring]) -> u64 { +fn run_to_completion(blocks: u64, net: Arc>, peers: &[AuthorityKeyring]) -> u64 { run_to_completion_with(blocks, net, peers, || {}) } #[test] fn finalize_3_voters_no_observers() { let _ = env_logger::try_init(); - let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -491,7 +491,7 @@ fn finalize_3_voters_no_observers() { #[test] fn finalize_3_voters_1_observer() { - let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 4); @@ -554,24 +554,24 @@ fn finalize_3_voters_1_observer() { fn transition_3_voters_twice_1_observer() { let _ = env_logger::try_init(); let peers_a = &[ - Keyring::Alice, - Keyring::Bob, - Keyring::Charlie, + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, ]; let peers_b = &[ - Keyring::Dave, - Keyring::Eve, - Keyring::Ferdie, + AuthorityKeyring::Dave, + AuthorityKeyring::Eve, + AuthorityKeyring::Ferdie, ]; let peers_c = &[ - Keyring::Alice, - Keyring::Eve, - Keyring::Two, + AuthorityKeyring::Alice, + AuthorityKeyring::Eve, + AuthorityKeyring::Two, ]; - let observer = &[Keyring::One]; + let observer = &[AuthorityKeyring::One]; let genesis_voters = make_ids(peers_a); @@ -719,11 +719,11 @@ fn transition_3_voters_twice_1_observer() { #[test] fn justification_is_emitted_when_consensus_data_changes() { - let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 3); // import block#1 WITH consensus data change - let new_authorities = vec![Ed25519AuthorityId::from([42; 32])]; + let new_authorities = vec![AuthorityId::from_raw([42; 32])]; net.peer(0).push_authorities_change_block(new_authorities); net.sync(); let net = Arc::new(Mutex::new(net)); @@ -736,7 +736,7 @@ fn justification_is_emitted_when_consensus_data_changes() { #[test] fn justification_is_generated_periodically() { - let peers = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let peers = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let voters = make_ids(peers); let mut net = GrandpaTestNet::new(TestApi::new(voters), 3); @@ -775,8 +775,8 @@ fn consensus_changes_works() { #[test] fn sync_justifications_on_change_blocks() { - let peers_a = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; - let peers_b = &[Keyring::Alice, Keyring::Bob]; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; let voters = make_ids(peers_b); // 4 peers, 3 of them are authorities and participate in grandpa @@ -825,13 +825,13 @@ fn sync_justifications_on_change_blocks() { fn finalizes_multiple_pending_changes_in_order() { let _ = env_logger::try_init(); - let peers_a = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; - let peers_b = &[Keyring::Dave, Keyring::Eve, Keyring::Ferdie]; - let peers_c = &[Keyring::Dave, Keyring::Alice, Keyring::Bob]; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_b = &[AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie]; + let peers_c = &[AuthorityKeyring::Dave, AuthorityKeyring::Alice, AuthorityKeyring::Bob]; let all_peers = &[ - Keyring::Alice, Keyring::Bob, Keyring::Charlie, - Keyring::Dave, Keyring::Eve, Keyring::Ferdie, + AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, + AuthorityKeyring::Dave, AuthorityKeyring::Eve, AuthorityKeyring::Ferdie, ]; let genesis_voters = make_ids(peers_a); @@ -883,7 +883,7 @@ fn finalizes_multiple_pending_changes_in_order() { #[test] fn doesnt_vote_on_the_tip_of_the_chain() { - let peers_a = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let mut net = GrandpaTestNet::new(api, 3); @@ -907,8 +907,8 @@ fn doesnt_vote_on_the_tip_of_the_chain() { #[test] fn force_change_to_new_set() { // two of these guys are offline. - let genesis_authorities = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie, Keyring::One, Keyring::Two]; - let peers_a = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; + let genesis_authorities = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie, AuthorityKeyring::One, AuthorityKeyring::Two]; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; let api = TestApi::new(make_ids(genesis_authorities)); let voters = make_ids(peers_a); @@ -960,8 +960,8 @@ fn force_change_to_new_set() { #[test] fn allows_reimporting_change_blocks() { - let peers_a = &[Keyring::Alice, Keyring::Bob, Keyring::Charlie]; - let peers_b = &[Keyring::Alice, Keyring::Bob]; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let peers_b = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob]; let voters = make_ids(peers_a); let api = TestApi::new(voters); let net = GrandpaTestNet::new(api.clone(), 3); diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index ceeb819ed0881..4b867c18c8e2b 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -28,7 +28,7 @@ use futures::prelude::*; use futures::stream::Fuse; use parking_lot::Mutex; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use substrate_primitives::Ed25519AuthorityId; +use substrate_primitives::ed25519::Public as AuthorityId; use tokio::timer::Interval; use std::collections::{HashMap, VecDeque}; @@ -199,7 +199,7 @@ impl Stream for UntilImported } } -fn warn_authority_wrong_target(hash: H, id: Ed25519AuthorityId) { +fn warn_authority_wrong_target(hash: H, id: AuthorityId) { warn!( target: "afg", "Authority {:?} signed GRANDPA message with \ diff --git a/core/keyring/src/ed25519.rs b/core/keyring/src/ed25519.rs index 49a073c086d4e..188bf5352c9a4 100644 --- a/core/keyring/src/ed25519.rs +++ b/core/keyring/src/ed25519.rs @@ -19,10 +19,14 @@ use std::collections::HashMap; use std::ops::Deref; use lazy_static::lazy_static; -use hex_literal::{hex, hex_impl}; -use substrate_primitives::ed25519::{Pair, Public, Signature}; +use substrate_primitives::{ed25519::{Pair, Public, Signature}, Pair as _Pair, H256}; pub use substrate_primitives::ed25519; +/// The root phrase for our test keys. +/// +/// This is the same phrase that's in node::cli, but shouldn't need to be. +pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; + /// Set of test accounts. #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub enum Keyring { @@ -37,7 +41,7 @@ pub enum Keyring { } impl Keyring { - pub fn from_public(who: Public) -> Option { + pub fn from_public(who: &Public) -> Option { [ Keyring::Alice, Keyring::Bob, @@ -49,17 +53,25 @@ impl Keyring { Keyring::Two, ].iter() .map(|i| *i) - .find(|&k| Public::from(k) == who) + .find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { - Self::from_public(Public::from_raw(who)) + Self::from_public(&Public::from_raw(who)) } pub fn to_raw_public(self) -> [u8; 32] { *Public::from(self).as_array_ref() } + pub fn from_h256_public(who: H256) -> Option { + Self::from_public(&Public::from_raw(who.into())) + } + + pub fn to_h256_public(self) -> H256 { + Public::from(self).as_array_ref().into() + } + pub fn to_raw_public_vec(self) -> Vec { Public::from(self).to_raw_vec() } @@ -69,16 +81,8 @@ impl Keyring { } pub fn pair(self) -> Pair { - match self { - Keyring::Alice => Pair::from_seed(b"Alice "), - Keyring::Bob => Pair::from_seed(b"Bob "), - Keyring::Charlie => Pair::from_seed(b"Charlie "), - Keyring::Dave => Pair::from_seed(b"Dave "), - Keyring::Eve => Pair::from_seed(b"Eve "), - Keyring::Ferdie => Pair::from_seed(b"Ferdie "), - Keyring::One => Pair::from_seed(b"12345678901234567890123456789012"), - Keyring::Two => Pair::from_seed(&hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")), - } + Pair::from_string(&format!("{}//{}", DEV_PHRASE, <&'static str>::from(self)), None) + .expect("static values are known good; qed") } } @@ -91,8 +95,8 @@ impl From for &'static str { Keyring::Dave => "Dave", Keyring::Eve => "Eve", Keyring::Ferdie => "Ferdie", - Keyring::One => "one", - Keyring::Two => "two", + Keyring::One => "One", + Keyring::Two => "Two", } } } @@ -134,6 +138,12 @@ impl From for [u8; 32] { } } +impl From for H256 { + fn from(k: Keyring) -> Self { + (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref().into() + } +} + impl From for &'static [u8; 32] { fn from(k: Keyring) -> Self { (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() @@ -162,12 +172,12 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use ed25519::Verifiable; + use substrate_primitives::{ed25519::Pair, Pair as _Pair}; #[test] fn should_work() { - assert!(Keyring::Alice.sign(b"I am Alice!").verify(b"I am Alice!", Keyring::Alice)); - assert!(!Keyring::Alice.sign(b"I am Alice!").verify(b"I am Bob!", Keyring::Alice)); - assert!(!Keyring::Alice.sign(b"I am Alice!").verify(b"I am Alice!", Keyring::Bob)); + assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); + assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); + assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); } } diff --git a/core/keyring/src/lib.rs b/core/keyring/src/lib.rs index faed637e03da6..5cf38401d0823 100644 --- a/core/keyring/src/lib.rs +++ b/core/keyring/src/lib.rs @@ -22,7 +22,15 @@ pub mod sr25519; /// Test account crypto for ed25519. pub mod ed25519; -/// The Ed25519 keyring. -/// -/// This is deprecated: use `ed25519::Keyring` instead. -pub use ed25519::Keyring; +/// Convenience export: Sr25519's Keyring is exposed as `AccountKeyring`, +/// since it tends to be used for accounts. +pub use sr25519::Keyring as AccountKeyring; + +/// Convenience export: Ed25519's Keyring is exposed as `AuthorityKeyring`, +/// since it tends to be used for authorities (session keys &c.). +pub use ed25519::Keyring as AuthorityKeyring; + +pub mod test { + /// The keyring for use with accounts when using the test runtime. + pub use super::ed25519::Keyring as AccountKeyring; +} diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index e63830559353f..de2146020c638 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -19,10 +19,14 @@ use std::collections::HashMap; use std::ops::Deref; use lazy_static::lazy_static; -use hex_literal::{hex, hex_impl}; -use substrate_primitives::sr25519::{Pair, Public, Signature}; +use substrate_primitives::{sr25519::{Pair, Public, Signature}, Pair as _Pair, H256}; pub use substrate_primitives::sr25519; +/// The root phrase for our test keys. +/// +/// This is the same phrase that's in node::cli, but shouldn't need to be. +pub const DEV_PHRASE: &str = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; + /// Set of test accounts. #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub enum Keyring { @@ -37,7 +41,7 @@ pub enum Keyring { } impl Keyring { - pub fn from_public(who: Public) -> Option { + pub fn from_public(who: &Public) -> Option { [ Keyring::Alice, Keyring::Bob, @@ -49,17 +53,25 @@ impl Keyring { Keyring::Two, ].iter() .map(|i| *i) - .find(|&k| Public::from(k) == who) + .find(|&k| &Public::from(k) == who) } pub fn from_raw_public(who: [u8; 32]) -> Option { - Self::from_public(Public::from_raw(who)) + Self::from_public(&Public::from_raw(who)) } pub fn to_raw_public(self) -> [u8; 32] { *Public::from(self).as_array_ref() } + pub fn from_h256_public(who: H256) -> Option { + Self::from_public(&Public::from_raw(who.into())) + } + + pub fn to_h256_public(self) -> H256 { + Public::from(self).as_array_ref().into() + } + pub fn to_raw_public_vec(self) -> Vec { Public::from(self).to_raw_vec() } @@ -69,16 +81,8 @@ impl Keyring { } pub fn pair(self) -> Pair { - match self { - Keyring::Alice => Pair::from_seed(b"Alice "), - Keyring::Bob => Pair::from_seed(b"Bob "), - Keyring::Charlie => Pair::from_seed(b"Charlie "), - Keyring::Dave => Pair::from_seed(b"Dave "), - Keyring::Eve => Pair::from_seed(b"Eve "), - Keyring::Ferdie => Pair::from_seed(b"Ferdie "), - Keyring::One => Pair::from_seed(b"12345678901234567890123456789012"), - Keyring::Two => Pair::from_seed(&hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")), - } + Pair::from_string(&format!("{}//{}", DEV_PHRASE, <&'static str>::from(self)), None) + .expect("static values are known good; qed") } } @@ -91,8 +95,8 @@ impl From for &'static str { Keyring::Dave => "Dave", Keyring::Eve => "Eve", Keyring::Ferdie => "Ferdie", - Keyring::One => "one", - Keyring::Two => "two", + Keyring::One => "One", + Keyring::Two => "Two", } } } @@ -134,6 +138,12 @@ impl From for [u8; 32] { } } +impl From for H256 { + fn from(k: Keyring) -> Self { + (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref().into() + } +} + impl From for &'static [u8; 32] { fn from(k: Keyring) -> Self { (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() @@ -162,12 +172,12 @@ impl Deref for Keyring { #[cfg(test)] mod tests { use super::*; - use sr25519::Verifiable; + use substrate_primitives::{sr25519::Pair, Pair as _Pair}; #[test] fn should_work() { - assert!(Keyring::Alice.sign(b"I am Alice!").verify(b"I am Alice!", Keyring::Alice)); - assert!(!Keyring::Alice.sign(b"I am Alice!").verify(b"I am Bob!", Keyring::Alice)); - assert!(!Keyring::Alice.sign(b"I am Alice!").verify(b"I am Alice!", Keyring::Bob)); + assert!(Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Alice)); + assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Bob!", Keyring::Alice)); + assert!(!Pair::verify(&Keyring::Alice.sign(b"I am Alice!"), b"I am Alice!", Keyring::Bob)); } } diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index 2b2380c7e27ae..f0ab573cd6dd6 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -24,13 +24,11 @@ use std::collections::HashMap; use std::path::PathBuf; use std::fs::{self, File}; use std::io::{self, Write}; -use std::num::NonZeroU32; -use serde_derive::{Serialize, Deserialize}; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, +use error_chain::{bail, error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind}; -use substrate_primitives::{hashing::blake2_256, ed25519::{Pair, Public, PKCS_LEN}}; +use substrate_primitives::{ed25519::{Pair, Public}, Pair as _Pair}; pub use crypto::KEY_ITERATIONS; @@ -45,99 +43,21 @@ error_chain! { description("Invalid password"), display("Invalid password"), } - InvalidPKCS8 { - description("Invalid PKCS#8 data"), - display("Invalid PKCS#8 data"), + InvalidPhrase { + description("Invalid recovery phrase (BIP39) data"), + display("Invalid recovery phrase (BIP39) data"), } - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct InvalidPassword; - -#[derive(Serialize, Deserialize)] -struct EncryptedKey { - mac: [u8; 32], - salt: [u8; 32], - ciphertext: Vec, // FIXME: switch to fixed-size when serde supports - iv: [u8; 16], - iterations: NonZeroU32, -} - -impl EncryptedKey { - fn encrypt(plain: &[u8; PKCS_LEN], password: &str, iterations: NonZeroU32) -> Self { - use rand::{Rng, rngs::OsRng}; - - let mut rng = OsRng::new().expect("OS Randomness available on all supported platforms; qed"); - - let salt: [u8; 32] = rng.gen(); - let iv: [u8; 16] = rng.gen(); - - // two parts of derived key - // DK = [ DK[0..15] DK[16..31] ] = [derived_left_bits, derived_right_bits] - let (derived_left_bits, derived_right_bits) = crypto::derive_key_iterations(password.as_bytes(), &salt, iterations); - - // preallocated (on-stack in case of `Secret`) buffer to hold cipher - // length = length(plain) as we are using CTR-approach - let mut ciphertext = vec![0; PKCS_LEN]; - - // aes-128-ctr with initial vector of iv - crypto::aes::encrypt_128_ctr(&derived_left_bits, &iv, plain, &mut *ciphertext) - .expect("input lengths of key and iv are both 16; qed"); - - // Blake2_256(DK[16..31] ++ ), where DK[16..31] - derived_right_bits - let mac = blake2_256(&crypto::derive_mac(&derived_right_bits, &*ciphertext)); - - EncryptedKey { - salt, - iv, - mac, - iterations, - ciphertext, - } - } - - fn decrypt(&self, password: &str) -> Result<[u8; PKCS_LEN]> { - let (derived_left_bits, derived_right_bits) = - crypto::derive_key_iterations(password.as_bytes(), &self.salt, self.iterations); - - let mac = blake2_256(&crypto::derive_mac(&derived_right_bits, &self.ciphertext)); - - if subtle::ConstantTimeEq::ct_eq(&mac[..], &self.mac[..]).unwrap_u8() != 1 { - return Err(ErrorKind::InvalidPassword.into()); + InvalidSeed { + description("Invalid seed"), + display("Invalid seed"), } - - let mut plain = [0; PKCS_LEN]; - crypto::aes::decrypt_128_ctr(&derived_left_bits, &self.iv, &self.ciphertext, &mut plain[..]) - .expect("input lengths of key and iv are both 16; qed"); - Ok(plain) } } -type Seed = [u8; 32]; - /// Key store. pub struct Store { path: PathBuf, - additional: HashMap, -} - -pub fn pad_seed(seed: &str) -> Seed { - let mut s: [u8; 32] = [' ' as u8; 32]; - - let was_hex = if seed.len() == 66 && &seed[0..2] == "0x" { - if let Ok(d) = hex::decode(&seed[2..]) { - s.copy_from_slice(&d); - true - } else { false } - } else { false }; - - if !was_hex { - let len = ::std::cmp::min(32, seed.len()); - &mut s[..len].copy_from_slice(&seed.as_bytes()[..len]); - } - - s + additional: HashMap, } impl Store { @@ -149,44 +69,36 @@ impl Store { /// Generate a new key, placing it into the store. pub fn generate(&self, password: &str) -> Result { - let (pair, pkcs_bytes) = Pair::generate_with_pkcs8(); - let key_file = EncryptedKey::encrypt( - &pkcs_bytes, - password, - NonZeroU32::new(KEY_ITERATIONS as u32).expect("KEY_ITERATIONS is not zero; QED") - ); - + let (pair, phrase) = Pair::generate_with_phrase(Some(password)); let mut file = File::create(self.key_file_path(&pair.public()))?; - ::serde_json::to_writer(&file, &key_file)?; - + ::serde_json::to_writer(&file, &phrase)?; file.flush()?; - Ok(pair) } /// Create a new key from seed. Do not place it into the store. - /// Only the first 32 bytes of the sead are used. This is meant to be used for testing only. - // FIXME: remove this - https://github.com/paritytech/substrate/issues/1063 pub fn generate_from_seed(&mut self, seed: &str) -> Result { - let padded_seed = pad_seed(seed); - let pair = Pair::from_seed(&padded_seed); - self.additional.insert(pair.public(), padded_seed); + let pair = Pair::from_string(seed, None) + .map_err(|_| Error::from(ErrorKind::InvalidSeed))?; + self.additional.insert(pair.public(), pair.clone()); Ok(pair) } /// Load a key file with given public key. pub fn load(&self, public: &Public, password: &str) -> Result { - if let Some(ref seed) = self.additional.get(public) { - let pair = Pair::from_seed(seed); - return Ok(pair); + if let Some(pair) = self.additional.get(public) { + return Ok(pair.clone()); } let path = self.key_file_path(public); let file = File::open(path)?; - let encrypted_key: EncryptedKey = ::serde_json::from_reader(&file)?; - let pkcs_bytes = encrypted_key.decrypt(password)?; - - Pair::from_pkcs8(&pkcs_bytes[..]).map_err(|_| ErrorKind::InvalidPKCS8.into()) + let phrase: String = ::serde_json::from_reader(&file)?; + let pair = Pair::from_phrase(&phrase, Some(password)) + .map_err(|_| Error::from(ErrorKind::InvalidPhrase))?; + if &pair.public() != public { + bail!(ErrorKind::InvalidPassword); + } + Ok(pair) } /// Get public keys of all stored keys. @@ -227,42 +139,6 @@ mod tests { use super::*; use tempdir::TempDir; - #[test] - fn encrypt_and_decrypt() { - let plain = [1; PKCS_LEN]; - let encrypted_key = EncryptedKey::encrypt(&plain, "thepassword", NonZeroU32::new(KEY_ITERATIONS as u32).expect("KEY_ITERATIONS is not zero; QED")); - - let decrypted_key = encrypted_key.decrypt("thepassword").unwrap(); - - assert_eq!(&plain[..], &decrypted_key[..]); - } - - #[test] - fn decrypt_wrong_password_fails() { - let plain = [1; PKCS_LEN]; - let encrypted_key = EncryptedKey::encrypt( - &plain, - "thepassword", - NonZeroU32::new(KEY_ITERATIONS as u32).expect("KEY_ITERATIONS is not zero; QED") - ); - - assert!(encrypted_key.decrypt("thepassword2").is_err()); - } - - #[test] - fn decrypt_wrong_iterations_fails() { - let plain = [1; PKCS_LEN]; - let mut encrypted_key = EncryptedKey::encrypt( - &plain, - "thepassword", - NonZeroU32::new(KEY_ITERATIONS as u32).expect("KEY_ITERATIONS is not zero; QED") - ); - - encrypted_key.iterations = NonZeroU32::new(encrypted_key.iterations.get() - 64).unwrap(); - - assert!(encrypted_key.decrypt("thepassword").is_err()); - } - #[test] fn basic_store() { let temp_dir = TempDir::new("keystore").unwrap(); @@ -285,16 +161,7 @@ mod tests { let temp_dir = TempDir::new("keystore").unwrap(); let mut store = Store::open(temp_dir.path().to_owned()).unwrap(); - let pair = store.generate_from_seed("0x1").unwrap(); - assert_eq!("5GqhgbUd2S9uc5Tm7hWhw29Tw2jBnuHshmTV1fDF4V1w3G2z", pair.public().to_ss58check()); - let pair = store.generate_from_seed("0x3d97c819d68f9bafa7d6e79cb991eebcd77d966c5334c0b94d9e1fa7ad0869dc").unwrap(); assert_eq!("5DKUrgFqCPV8iAXx9sjy1nyBygQCeiUYRFWurZGhnrn3HBL8", pair.public().to_ss58check()); - - let pair = store.generate_from_seed("12345678901234567890123456789022").unwrap(); - assert_eq!("5DscZvfjnM5im7oKRXXP9xtCG1SEwfMb8J5eGLmw5EHhoHR3", pair.public().to_ss58check()); - - let pair = store.generate_from_seed("1").unwrap(); - assert_eq!("5DYnksEZFc7kgtfyNM1xK2eBtW142gZ3Ho3NQubrF2S6B2fq", pair.public().to_ss58check()); } } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index e2cfe04e66814..24e05daec097e 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -39,19 +39,18 @@ use crate::consensus_gossip::ConsensusGossip; use crossbeam_channel::{self as channel, Sender, select}; use futures::Future; use futures::sync::{mpsc, oneshot}; -use keyring::Keyring; use crate::message::{Message, ConsensusEngineId}; use network_libp2p::{NodeIndex, ProtocolId, PeerId}; use parity_codec::Encode; use parking_lot::{Mutex, RwLock}; -use primitives::{H256, Ed25519AuthorityId}; +use primitives::{H256, ed25519::Public as AuthorityId}; use crate::protocol::{ConnectedPeer, Context, FromNetworkMsg, Protocol, ProtocolMsg}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; use runtime_primitives::Justification; use crate::service::{network_channel, NetworkChan, NetworkLink, NetworkMsg, NetworkPort, TransactionPool}; use crate::specialization::NetworkSpecialization; -use test_client; +use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use test_client::TestClient; @@ -458,12 +457,12 @@ impl + Clone> Peer { if with_tx { self.generate_blocks_at(at, count, BlockOrigin::File, |mut builder| { let transfer = Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Alice.into(), amount: 1, nonce, }; - let signature = Keyring::from_raw_public(transfer.from.to_fixed_bytes()).unwrap().sign(&transfer.encode()).into(); + let signature = AccountKeyring::from_public(&transfer.from).unwrap().sign(&transfer.encode()).into(); builder.push(Extrinsic::Transfer(transfer, signature)).unwrap(); nonce = nonce + 1; builder.bake().unwrap() @@ -473,7 +472,7 @@ impl + Clone> Peer { } } - pub fn push_authorities_change_block(&self, new_authorities: Vec) -> H256 { + pub fn push_authorities_change_block(&self, new_authorities: Vec) -> H256 { self.generate_blocks(1, BlockOrigin::File, |mut builder| { builder.push(Extrinsic::AuthoritiesChange(new_authorities.clone())).unwrap(); builder.bake().unwrap() diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 7aeeaf1029b29..04094ff01e48a 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -27,6 +27,8 @@ rand = { version = "0.6", optional = true } sha2 = { version = "0.8", optional = true } substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39", optional = true } tiny-bip39 = { version = "0.6.0", optional = true } +hex = { version = "0.3", optional = true } +regex = {version = "1.1", optional = true } [dev-dependencies] substrate-serializer = { path = "../serializer" } @@ -55,6 +57,7 @@ std = [ "ring", "untrusted", "hex-literal", + "hex", "base58", "substrate-bip39", "tiny-bip39", @@ -63,4 +66,5 @@ std = [ "rand", "sha2", "schnorrkel", + "regex", ] diff --git a/core/primitives/src/authority_id.rs b/core/primitives/src/authority_id.rs deleted file mode 100644 index e1b97fbc5bcd2..0000000000000 --- a/core/primitives/src/authority_id.rs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -#[cfg(feature = "std")] -use serde::{Serialize, Serializer, Deserialize, Deserializer}; -use parity_codec::{Encode, Decode}; -use crate::H256; - -/// An identifier for an authority in the consensus algorithm. The same size as ed25519::Public. -#[derive(Clone, Copy, PartialEq, Eq, Default, Encode, Decode)] -pub struct Ed25519AuthorityId(pub [u8; 32]); - -#[cfg(feature = "std")] -impl ::std::fmt::Display for Ed25519AuthorityId { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{}", crate::ed25519::Public(self.0).to_ss58check()) - } -} - -#[cfg(feature = "std")] -impl ::std::fmt::Debug for Ed25519AuthorityId { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - let h = format!("{}", crate::hexdisplay::HexDisplay::from(&self.0)); - write!(f, "{} ({}…{})", crate::ed25519::Public(self.0).to_ss58check(), &h[0..8], &h[60..]) - } -} - -#[cfg(feature = "std")] -impl ::std::hash::Hash for Ed25519AuthorityId { - fn hash(&self, state: &mut H) { - self.0.hash(state); - } -} - -impl AsRef<[u8; 32]> for Ed25519AuthorityId { - fn as_ref(&self) -> &[u8; 32] { - &self.0 - } -} - -impl AsRef<[u8]> for Ed25519AuthorityId { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl Into<[u8; 32]> for Ed25519AuthorityId { - fn into(self) -> [u8; 32] { - self.0 - } -} - -impl From<[u8; 32]> for Ed25519AuthorityId { - fn from(a: [u8; 32]) -> Self { - Ed25519AuthorityId(a) - } -} - -impl AsRef for Ed25519AuthorityId { - fn as_ref(&self) -> &Ed25519AuthorityId { - &self - } -} - -impl Into for Ed25519AuthorityId { - fn into(self) -> H256 { - self.0.into() - } -} - -#[cfg(feature = "std")] -impl Serialize for Ed25519AuthorityId { - fn serialize(&self, serializer: S) -> Result where S: Serializer { - crate::ed25519::serialize(&self, serializer) - } -} - -#[cfg(feature = "std")] -impl<'de> Deserialize<'de> for Ed25519AuthorityId { - fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { - crate::ed25519::deserialize(deserializer) - } -} diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs new file mode 100644 index 0000000000000..bf2ef3df46486 --- /dev/null +++ b/core/primitives/src/crypto.rs @@ -0,0 +1,486 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate 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. + +// Substrate 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 Substrate. If not, see . + +// tag::description[] +//! Cryptographic utilities. +// end::description[] + +#[cfg(feature = "std")] +use parity_codec::{Encode, Decode}; +#[cfg(feature = "std")] +use regex::Regex; +#[cfg(feature = "std")] +use base58::{FromBase58, ToBase58}; + +/// The infallible type. +#[derive(Debug)] +pub enum Infallible {} + +/// The length of the junction identifier. Note that this is also referred to as the +/// `CHAIN_CODE_LENGTH` in the context of Schnorrkel. +#[cfg(feature = "std")] +pub const JUNCTION_ID_LEN: usize = 32; + +/// Similar to `From`, except that the onus is on the part of the caller to ensure +/// that data passed in makes sense. Basically, you're not guaranteed to get anything +/// sensible out. +pub trait UncheckedFrom { + /// Convert from an instance of `T` to Self. This is not guaranteed to be + /// whatever counts as a valid instance of `T` and it's up to the caller to + /// ensure that it makes sense. + fn unchecked_from(t: T) -> Self; +} + +/// The counterpart to `UncheckedFrom`. +pub trait UncheckedInto { + /// The counterpart to `unchecked_from`. + fn unchecked_into(self) -> T; +} + +impl> UncheckedInto for S { + fn unchecked_into(self) -> T { + T::unchecked_from(self) + } +} + +/// An error with the interpretation of a secret. +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg(feature = "std")] +pub enum SecretStringError { + /// The overall format was invalid (e.g. the seed phrase contained symbols). + InvalidFormat, + /// The seed phrase provided is not a valid BIP39 phrase. + InvalidPhrase, + /// The supplied password was invalid. + InvalidPassword, + /// The seed is invalid (bad content). + InvalidSeed, + /// The seed has an invalid length. + InvalidSeedLength, + /// The derivation path was invalid (e.g. contains soft junctions when they are not supported). + InvalidPath, +} + +/// A since derivation junction description. It is the single parameter used when creating +/// a new secret key from an existing secret key and, in the case of `SoftRaw` and `SoftIndex` +/// a new public key from an existing public key. +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Encode, Decode)] +#[cfg(feature = "std")] +pub enum DeriveJunction { + /// Soft (vanilla) derivation. Public keys have a correspondent derivation. + Soft([u8; JUNCTION_ID_LEN]), + /// Hard ("hardened") derivation. Public keys do not have a correspondent derivation. + Hard([u8; JUNCTION_ID_LEN]), +} + +#[cfg(feature = "std")] +impl DeriveJunction { + /// Consume self to return a soft derive junction with the same chain code. + pub fn soften(self) -> Self { DeriveJunction::Soft(self.unwrap_inner()) } + + /// Consume self to return a hard derive junction with the same chain code. + pub fn harden(self) -> Self { DeriveJunction::Hard(self.unwrap_inner()) } + + /// Create a new soft (vanilla) DeriveJunction from a given, encodable, value. + /// + /// If you need a hard junction, use `hard()`. + pub fn soft(index: T) -> Self { + let mut cc: [u8; JUNCTION_ID_LEN] = Default::default(); + index.using_encoded(|data| if data.len() > JUNCTION_ID_LEN { + let hash_result = blake2_rfc::blake2b::blake2b(JUNCTION_ID_LEN, &[], data); + let hash = hash_result.as_bytes(); + cc.copy_from_slice(hash); + } else { + cc[0..data.len()].copy_from_slice(data); + }); + DeriveJunction::Soft(cc) + } + + /// Create a new hard (hardened) DeriveJunction from a given, encodable, value. + /// + /// If you need a soft junction, use `soft()`. + pub fn hard(index: T) -> Self { + Self::soft(index).harden() + } + + /// Consume self to return the chain code. + pub fn unwrap_inner(self) -> [u8; JUNCTION_ID_LEN] { + match self { + DeriveJunction::Hard(c) | DeriveJunction::Soft(c) => c, + } + } + + /// Get a reference to the inner junction id. + pub fn inner(&self) -> &[u8; JUNCTION_ID_LEN] { + match self { + DeriveJunction::Hard(ref c) | DeriveJunction::Soft(ref c) => c, + } + } + + /// Return `true` if the junction is soft. + pub fn is_soft(&self) -> bool { + match *self { + DeriveJunction::Soft(_) => true, + _ => false, + } + } + + /// Return `true` if the junction is hard. + pub fn is_hard(&self) -> bool { + match *self { + DeriveJunction::Hard(_) => true, + _ => false, + } + } +} + +#[cfg(feature = "std")] +impl> From for DeriveJunction { + fn from(j: T) -> DeriveJunction { + let j = j.as_ref(); + let (code, hard) = if j.starts_with("/") { + (&j[1..], true) + } else { + (j, false) + }; + + let res = if let Ok(n) = str::parse::(code) { + // number + DeriveJunction::soft(n) + } else { + // something else + DeriveJunction::soft(code) + }; + + if hard { + res.harden() + } else { + res + } + } +} + +/// An error type for SS58 decoding. +#[cfg(feature = "std")] +#[derive(Clone, Copy, Eq, PartialEq, Debug)] +pub enum PublicError { + /// Bad alphabet. + BadBase58, + /// Bad length. + BadLength, + /// Unknown version. + UnknownVersion, + /// Invalid checksum. + InvalidChecksum, + /// Invalid format. + InvalidFormat, + /// Invalid derivation path. + InvalidPath, +} + +/// Key that can be encoded to/from SS58. +#[cfg(feature = "std")] +pub trait Ss58Codec: Sized { + /// Some if the string is a properly encoded SS58Check address. + fn from_ss58check(s: &str) -> Result; + /// Some if the string is a properly encoded SS58Check address, optionally with + /// a derivation path following. + fn from_string(s: &str) -> Result { Self::from_ss58check(s) } + /// Return the ss58-check string for this key. + fn to_ss58check(&self) -> String; +} + +#[cfg(feature = "std")] +/// Derivable key trait. +pub trait Derive: Sized { + /// Derive a child key from a series of given junctions. + /// + /// Will be `None` for public keys if there are any hard junctions in there. + fn derive>(&self, _path: Iter) -> Option { None } +} + +#[cfg(feature = "std")] +impl + AsRef<[u8]> + Default + Derive> Ss58Codec for T { + fn from_ss58check(s: &str) -> Result { + let mut res = T::default(); + let len = res.as_mut().len(); + let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. + if d.len() != len + 3 { + // Invalid length. + return Err(PublicError::BadLength); + } + if d[0] != 42 { + // Invalid version. + return Err(PublicError::UnknownVersion); + } + if d[len+1..len+3] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..len+1]).as_bytes()[0..2] { + // Invalid checksum. + return Err(PublicError::InvalidChecksum); + } + res.as_mut().copy_from_slice(&d[1..len+1]); + Ok(res) + } + + fn to_ss58check(&self) -> String { + let mut v = vec![42u8]; + v.extend(self.as_ref()); + let r = blake2_rfc::blake2b::blake2b(64, &[], &v); + v.extend(&r.as_bytes()[0..2]); + v.to_base58() + } + + fn from_string(s: &str) -> Result { + let re = Regex::new(r"^(?P[\w\d]+)(?P(//?[^/]+)*)$") + .expect("constructed from known-good static value; qed"); + let cap = re.captures(s).ok_or(PublicError::InvalidFormat)?; + let re_junction = Regex::new(r"/(/?[^/]+)") + .expect("constructed from known-good static value; qed"); + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + Self::from_ss58check(&cap["ss58"])?.derive(path).ok_or(PublicError::InvalidPath) + } +} + +/// Trait suitable for typical cryptographic PKI key pair type. +/// +/// For now it just specifies how to create a key from a phrase and derivation path. +#[cfg(feature = "std")] +pub trait Pair: Sized { + /// TThe type which is used to encode a public key. + type Public; + + /// The type used to (minimally) encode the data required to securely create + /// a new key pair. + type Seed; + + /// The type used to represent a signature. Can be created from a key pair and a message + /// and verified with the message and a public key. + type Signature; + + /// Error returned from the `derive` function. + type DeriveError; + + /// Generate new secure (random) key pair. + /// + /// This is only for ephemeral keys really, since you won't have access to the secret key + /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. + fn generate() -> Self; + + /// Generate new secure (random) key pair and provide the recovery phrase. + /// + /// You can recover the same key later with `from_phrase`. + /// + /// This is generally slower than `generate()`, so prefer that unless you need to persist + /// the key from the current session. + fn generate_with_phrase(password: Option<&str>) -> (Self, String); + + /// Returns the KeyPair from the English BIP39 seed `phrase`, or `None` if it's invalid. + fn from_phrase(phrase: &str, password: Option<&str>) -> Result; + + /// Derive a child key from a series of given junctions. + fn derive>(&self, path: Iter) -> Result; + + /// Generate new key pair from the provided `seed`. + /// + /// @WARNING: THIS WILL ONLY BE SECURE IF THE `seed` IS SECURE. If it can be guessed + /// by an attacker then they can also derive your key. + fn from_seed(seed: Self::Seed) -> Self; + + /// Make a new key pair from secret seed material. The slice must be the correct size or + /// it will return `None`. + /// + /// @WARNING: THIS WILL ONLY BE SECURE IF THE `seed` IS SECURE. If it can be guessed + /// by an attacker then they can also derive your key. + fn from_seed_slice(seed: &[u8]) -> Result; + + /// Construct a key from a phrase, password and path. + fn from_standard_components< + I: Iterator + >(phrase: &str, password: Option<&str>, path: I) -> Result; + + /// Sign a message. + fn sign(&self, message: &[u8]) -> Self::Signature; + + /// Verify a signature on a message. Returns true if the signature is good. + fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool; + + /// Verify a signature on a message. Returns true if the signature is good. + fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool; + + /// Get the public key. + fn public(&self) -> Self::Public; + + /// Interprets the string `s` in order to generate a key Pair. + /// + /// This takes a helper function to do the key generation from a phrase, password and + /// junction iterator. + /// + /// - If `s` is a possibly `0x` prefixed 64-digit hex string, then it will be interpreted + /// directly as a `MiniSecretKey` (aka "seed" in `subkey`). + /// - If `s` is a valid BIP-39 key phrase of 12, 15, 18, 21 or 24 words, then the key will + /// be derived from it. In this case: + /// - the phrase may be followed by one or more items delimited by `/` characters. + /// - the path may be followed by `///`, in which case everything after the `///` is treated + /// as a password. + /// In this case they are interpreted as HDKD junctions; purely numeric items are interpreted as + /// integers, non-numeric items as strings. Junctions prefixed with `/` are interpreted as soft + /// junctions, and with `//` as hard junctions. + /// + /// There is no correspondence mapping between SURI strings and the keys they represent. + /// Two different non-identical strings can actually lead to the same secret being derived. + /// Notably, integer junction indices may be legally prefixed with arbitrary number of zeros. + /// Similarly an empty password (ending the SURI with `///`) is perfectly valid and will generally + /// be equivalent to no password at all. + /// + /// `None` is returned if no matches are found. + fn from_string(s: &str, password_override: Option<&str>) -> Result { + let hex_seed = if s.starts_with("0x") { + &s[2..] + } else { + s + }; + + if let Ok(d) = hex::decode(hex_seed) { + if let Ok(r) = Self::from_seed_slice(&d) { + return Ok(r) + } + } + + let re = Regex::new(r"^(?P\w+( \w+)*)(?P(//?[^/]+)*)(///(?P.*))?$") + .expect("constructed from known-good static value; qed"); + let cap = re.captures(s).ok_or(SecretStringError::InvalidFormat)?; + let re_junction = Regex::new(r"/(/?[^/]+)") + .expect("constructed from known-good static value; qed"); + let path = re_junction.captures_iter(&cap["path"]) + .map(|f| DeriveJunction::from(&f[1])); + Self::from_standard_components( + &cap["phrase"], + password_override.or_else(|| cap.name("password").map(|m| m.as_str())), + path, + ) + } +} + +#[cfg(test)] +mod tests { + use crate::DeriveJunction; + use hex_literal::{hex, hex_impl}; + use super::*; + + #[derive(Eq, PartialEq, Debug)] + enum TestPair { + Generated, + GeneratedWithPhrase, + GeneratedFromPhrase{phrase: String, password: Option}, + Standard{phrase: String, password: Option, path: Vec}, + Seed(Vec), + } + + impl Pair for TestPair { + type Public = (); + type Seed = (); + type Signature = (); + type DeriveError = (); + + fn generate() -> Self { TestPair::Generated } + fn generate_with_phrase(_password: Option<&str>) -> (Self, String) { (TestPair::GeneratedWithPhrase, "".into()) } + fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + Ok(TestPair::GeneratedFromPhrase{ phrase: phrase.to_owned(), password: password.map(Into::into) }) + } + fn derive>(&self, _path: Iter) -> Result { + Err(()) + } + fn from_seed(_seed: Self::Seed) -> Self { TestPair::Seed(vec![]) } + fn sign(&self, _message: &[u8]) -> Self::Signature { () } + fn verify, M: AsRef<[u8]>>(_sig: &Self::Signature, _message: M, _pubkey: P) -> bool { true } + fn verify_weak, M: AsRef<[u8]>>(_sig: &[u8], _message: M, _pubkey: P) -> bool { true } + fn public(&self) -> Self::Public { () } + fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { + Ok(TestPair::Standard { phrase: phrase.to_owned(), password: password.map(ToOwned::to_owned), path: path.collect() }) + } + fn from_seed_slice(seed: &[u8]) -> Result { + Ok(TestPair::Seed(seed.to_owned())) + } + } + + #[test] + fn interpret_std_seed_should_work() { + assert_eq!( + TestPair::from_string("0x0123456789abcdef", None), + Ok(TestPair::Seed(hex!["0123456789abcdef"][..].to_owned())) + ); + assert_eq!( + TestPair::from_string("0123456789abcdef", None), + Ok(TestPair::Seed(hex!["0123456789abcdef"][..].to_owned())) + ); + } + + #[test] + fn password_override_should_work() { + assert_eq!( + TestPair::from_string("hello world///password", None), + TestPair::from_string("hello world", Some("password")), + ); + assert_eq!( + TestPair::from_string("hello world///password", None), + TestPair::from_string("hello world///other password", Some("password")), + ); + } + + #[test] + fn interpret_std_secret_string_should_work() { + assert_eq!( + TestPair::from_string("hello world", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![]}) + ); + assert_eq!( + TestPair::from_string("hello world/1", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::soft(1)]}) + ); + assert_eq!( + TestPair::from_string("hello world/DOT", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::soft("DOT")]}) + ); + assert_eq!( + TestPair::from_string("hello world//1", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::hard(1)]}) + ); + assert_eq!( + TestPair::from_string("hello world//DOT", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::hard("DOT")]}) + ); + assert_eq!( + TestPair::from_string("hello world//1/DOT", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::hard(1), DeriveJunction::soft("DOT")]}) + ); + assert_eq!( + TestPair::from_string("hello world//DOT/1", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: None, path: vec![DeriveJunction::hard("DOT"), DeriveJunction::soft(1)]}) + ); + assert_eq!( + TestPair::from_string("hello world///password", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: Some("password".to_owned()), path: vec![]}) + ); + assert_eq!( + TestPair::from_string("hello world//1/DOT///password", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: Some("password".to_owned()), path: vec![DeriveJunction::hard(1), DeriveJunction::soft("DOT")]}) + ); + assert_eq!( + TestPair::from_string("hello world/1//DOT///password", None), + Ok(TestPair::Standard{phrase: "hello world".to_owned(), password: Some("password".to_owned()), path: vec![DeriveJunction::soft(1), DeriveJunction::hard("DOT")]}) + ); + } +} diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 9b856009628ff..1d1a1bff4af92 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -18,58 +18,251 @@ //! Simple Ed25519 API. // end::description[] + +use crate::{hash::H256, hash::H512}; +use parity_codec::{Encode, Decode}; + +#[cfg(feature = "std")] use untrusted; +#[cfg(feature = "std")] use blake2_rfc; -use ring::{rand, signature, signature::KeyPair}; -use crate::{hash::H512, Ed25519AuthorityId}; +#[cfg(feature = "std")] +use ring::{signature, signature::KeyPair, rand::{SecureRandom, SystemRandom}}; +#[cfg(feature = "std")] use base58::{ToBase58, FromBase58}; -use parity_codec::{Encode, Decode}; +#[cfg(feature = "std")] +use substrate_bip39::seed_from_entropy; +#[cfg(feature = "std")] +use bip39::{Mnemonic, Language, MnemonicType}; +#[cfg(feature = "std")] +use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive}; +#[cfg(feature = "std")] +use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; +use crate::crypto::UncheckedFrom; +/// A secret seed. It's not called a "secret key" because ring doesn't expose the secret keys +/// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we +/// will need it later (such as for HDKD). #[cfg(feature = "std")] -use serde::{de, Serializer, Deserializer, Deserialize}; +type Seed = [u8; 32]; -/// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = H512; +/// A public key. +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode, Default)] +pub struct Public(pub [u8; 32]); -/// Length of the PKCS#8 encoding of the key. -pub const PKCS_LEN: usize = 85; +/// A key pair. +#[cfg(feature = "std")] +pub struct Pair(signature::Ed25519KeyPair, Seed); -/// A localized signature also contains sender information. -#[derive(PartialEq, Eq, Clone, Debug, Encode, Decode)] -pub struct LocalizedSignature { - /// The signer of the signature. - pub signer: Public, - /// The signature itself. - pub signature: Signature, +#[cfg(feature = "std")] +impl Clone for Pair { + fn clone(&self) -> Self { + Pair::from_seed(self.1.clone()) + } } -/// Verify a message without type checking the parameters' types for the right size. -/// Returns true if the signature is good. -pub fn verify>(sig: &[u8], message: &[u8], public: P) -> bool { - let public_key = untrusted::Input::from(public.as_ref()); - let msg = untrusted::Input::from(message); - let sig = untrusted::Input::from(sig); +impl AsRef<[u8; 32]> for Public { + fn as_ref(&self) -> &[u8; 32] { + &self.0 + } +} - match signature::verify(&signature::ED25519, public_key, msg, sig) { - Ok(_) => true, - _ => false, +impl AsRef<[u8]> for Public { + fn as_ref(&self) -> &[u8] { + &self.0[..] } } -/// A public key. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct Public(pub [u8; 32]); +impl AsMut<[u8]> for Public { + fn as_mut(&mut self) -> &mut [u8] { + &mut self.0[..] + } +} -/// A key pair. -pub struct Pair(signature::Ed25519KeyPair); +impl From for [u8; 32] { + fn from(x: Public) -> Self { + x.0 + } +} + +#[cfg(feature = "std")] +impl From for Public { + fn from(x: Pair) -> Self { + x.public() + } +} + +impl AsRef for Public { + fn as_ref(&self) -> &Public { + &self + } +} + +impl From for H256 { + fn from(x: Public) -> Self { + x.0.into() + } +} + +impl UncheckedFrom<[u8; 32]> for Public { + fn unchecked_from(x: [u8; 32]) -> Self { + Public::from_raw(x) + } +} +impl UncheckedFrom for Public { + fn unchecked_from(x: H256) -> Self { + Public::from_h256(x) + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Display for Public { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "{}", self.to_ss58check()) + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Debug for Public { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + let s = self.to_ss58check(); + write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) + } +} + +#[cfg(feature = "std")] +impl Serialize for Public { + fn serialize(&self, serializer: S) -> Result where S: Serializer { + serializer.serialize_str(&self.to_ss58check()) + } +} + +#[cfg(feature = "std")] +impl<'de> Deserialize<'de> for Public { + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { + Public::from_ss58check(&String::deserialize(deserializer)?) + .map_err(|e| de::Error::custom(format!("{:?}", e))) + } +} + +#[cfg(feature = "std")] impl ::std::hash::Hash for Public { fn hash(&self, state: &mut H) { self.0.hash(state); } } +/// A signature (a 512-bit value). +#[derive(Encode, Decode)] +pub struct Signature(pub [u8; 64]); + +impl Clone for Signature { + fn clone(&self) -> Self { + let mut r = [0u8; 64]; + r.copy_from_slice(&self.0[..]); + Signature(r) + } +} + +impl Default for Signature { + fn default() -> Self { + Signature([0u8; 64]) + } +} + +impl PartialEq for Signature { + fn eq(&self, b: &Self) -> bool { + &self.0[..] == &b.0[..] + } +} + +impl Eq for Signature {} + +impl From for H512 { + fn from(v: Signature) -> H512 { + H512::from(v.0) + } +} + +impl From for [u8; 64] { + fn from(v: Signature) -> [u8; 64] { + v.0 + } +} + +impl AsRef<[u8; 64]> for Signature { + fn as_ref(&self) -> &[u8; 64] { + &self.0 + } +} + +impl AsRef<[u8]> for Signature { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + +impl AsMut<[u8]> for Signature { + fn as_mut(&mut self) -> &mut [u8] { + &mut self.0[..] + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Debug for Signature { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) + } +} + +#[cfg(feature = "std")] +impl ::std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + ::std::hash::Hash::hash(&self.0[..], state); + } +} + +impl Signature { + /// A new instance from the given 64-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_raw(data: [u8; 64]) -> Signature { + Signature(data) + } + + /// A new instance from the given slice that should be 64 bytes long. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_slice(data: &[u8]) -> Self { + let mut r = [0u8; 64]; + r.copy_from_slice(data); + Signature(r) + } + + /// A new instance from an H512. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_h512(v: H512) -> Signature { + Signature(v.into()) + } +} + +/// A localized signature also contains sender information. +#[cfg(feature = "std")] +#[derive(PartialEq, Eq, Clone, Debug, Encode, Decode)] +pub struct LocalizedSignature { + /// The signer of the signature. + pub signer: Public, + /// The signature itself. + pub signature: Signature, +} + /// An error type for SS58 decoding. +#[cfg(feature = "std")] #[derive(Clone, Copy, Eq, PartialEq, Debug)] pub enum PublicError { /// Bad alphabet. @@ -84,36 +277,33 @@ pub enum PublicError { impl Public { /// A new instance from the given 32-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! pub fn from_raw(data: [u8; 32]) -> Self { Public(data) } /// A new instance from the given slice that should be 32 bytes long. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! pub fn from_slice(data: &[u8]) -> Self { let mut r = [0u8; 32]; r.copy_from_slice(data); Public(r) } - /// Some if the string is a properly encoded SS58Check address. - pub fn from_ss58check(s: &str) -> Result { - let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. - if d.len() != 35 { - // Invalid length. - return Err(PublicError::BadLength); - } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } - if d[33..35] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..33]).as_bytes()[0..2] { - // Invalid checksum. - return Err(PublicError::InvalidChecksum); - } - Ok(Self::from_slice(&d[1..33])) + /// A new instance from an H256. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! + pub fn from_h256(x: H256) -> Self { + Public(x.into()) } /// Return a `Vec` filled with raw data. + #[cfg(feature = "std")] pub fn to_raw_vec(self) -> Vec { let r: &[u8; 32] = self.as_ref(); r.to_vec() @@ -129,6 +319,30 @@ impl Public { pub fn as_array_ref(&self) -> &[u8; 32] { self.as_ref() } +} + +#[cfg(feature = "std")] +impl Derive for Public {} + +#[cfg(feature = "std")] +impl Public { + /// Some if the string is a properly encoded SS58Check address. + pub fn from_ss58check(s: &str) -> Result { + let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. + if d.len() != 35 { + // Invalid length. + return Err(PublicError::BadLength); + } + if d[0] != 42 { + // Invalid version. + return Err(PublicError::UnknownVersion); + } + if d[33..35] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..33]).as_bytes()[0..2] { + // Invalid checksum. + return Err(PublicError::InvalidChecksum); + } + Ok(Self::from_slice(&d[1..33])) + } /// Return the ss58-check string for this key. pub fn to_ss58check(&self) -> String { @@ -140,178 +354,197 @@ impl Public { } } -impl AsRef<[u8; 32]> for Public { - fn as_ref(&self) -> &[u8; 32] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl Into<[u8; 32]> for Public { - fn into(self) -> [u8; 32] { - self.0 - } -} - -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } -} - +#[cfg(feature = "std")] impl AsRef for Pair { fn as_ref(&self) -> &Pair { &self } } -impl Into for Public { - fn into(self) -> Ed25519AuthorityId { - Ed25519AuthorityId(self.0) - } -} - -impl From for Public { - fn from(id: Ed25519AuthorityId) -> Self { - Public(id.0) - } -} - -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } +/// Derive a single hard junction. +#[cfg(feature = "std")] +fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { + ("Ed25519HDKD", secret_seed, cc).using_encoded(|data| { + let mut res = [0u8; 32]; + res.copy_from_slice(blake2_rfc::blake2b::blake2b(32, &[], data).as_bytes()); + res + }) } -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) - } +/// An error when deriving a key. +#[cfg(feature = "std")] +pub enum DeriveError { + /// A soft key was found in the path (and is unsupported). + SoftKeyInPath, } -impl Pair { - /// Generate new secure (random) key pair, yielding it and the corresponding pkcs#8 bytes. - pub fn generate_with_pkcs8() -> (Self, [u8; PKCS_LEN]) { - let rng = rand::SystemRandom::new(); - let pkcs8_bytes = signature::Ed25519KeyPair::generate_pkcs8(&rng).expect("system randomness is available; qed"); - let pair = Self::from_pkcs8(&pkcs8_bytes.as_ref()).expect("just-generated pkcs#8 data is valid; qed"); - - let mut out = [0; PKCS_LEN]; - out.copy_from_slice(pkcs8_bytes.as_ref()); - (pair, out) - } +#[cfg(feature = "std")] +impl TraitPair for Pair { + type Public = Public; + type Seed = Seed; + type Signature = Signature; + type DeriveError = DeriveError; /// Generate new secure (random) key pair. - pub fn generate() -> Pair { - let (pair, _) = Self::generate_with_pkcs8(); - pair - } - - /// Generate from pkcs#8 bytes. - pub fn from_pkcs8(pkcs8_bytes: &[u8]) -> Result { - signature::Ed25519KeyPair::from_pkcs8(untrusted::Input::from(&pkcs8_bytes)).map(Pair) - } - - /// Make a new key pair from a seed phrase. - /// NOTE: prefer pkcs#8 unless security doesn't matter -- this is used primarily for tests. - pub fn from_seed(seed: &[u8; 32]) -> Pair { + /// + /// This is only for ephemeral keys really, since you won't have access to the secret key + /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. + fn generate() -> Pair { + let mut seed: Seed = Default::default(); + SystemRandom::new().fill(seed.as_mut()).expect("system random source should always work! qed"); + Self::from_seed(seed) + } + + /// Generate new secure (random) key pair and provide the recovery phrase. + /// + /// You can recover the same key later with `from_phrase`. + fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); + let phrase = mnemonic.phrase(); + ( + Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + phrase.to_owned(), + ) + } + + /// Generate key pair from given recovery phrase and password. + fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + let big_seed = seed_from_entropy( + Mnemonic::from_phrase(phrase, Language::English) + .map_err(|_| SecretStringError::InvalidPhrase)?.entropy(), + password.unwrap_or(""), + ).map_err(|_| SecretStringError::InvalidSeed)?; + Self::from_seed_slice(&big_seed[0..32]) + } + + /// Make a new key pair from secret seed material. + /// + /// You should never need to use this; generate(), generate_with_phrasee + fn from_seed(seed: Seed) -> Pair { let key = signature::Ed25519KeyPair::from_seed_unchecked(untrusted::Input::from(&seed[..])) .expect("seed has valid length; qed"); + Pair(key, seed) + } + + /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it + /// will return `None`. + /// + /// You should never need to use this; generate(), generate_with_phrase + fn from_seed_slice(seed_slice: &[u8]) -> Result { + if seed_slice.len() != 32 { + Err(SecretStringError::InvalidSeedLength) + } else { + let mut seed = [0u8; 32]; + seed.copy_from_slice(&seed_slice); + Ok(Self::from_seed(seed)) + } + } - Pair(key) + /// Derive a child key from a series of given junctions. + fn derive>(&self, path: Iter) -> Result { + let mut acc = self.1.clone(); + for j in path { + match j { + DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), + DeriveJunction::Hard(cc) => acc = derive_hard_junction(&acc, &cc), + } + } + Ok(Self::from_seed(acc)) } - /// Sign a message. - pub fn sign(&self, message: &[u8]) -> Signature { - let mut r = [0u8; 64]; - r.copy_from_slice(self.0.sign(message).as_ref()); - Signature::from(r) + /// Generate a key from the phrase, password and derivation path. + fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { + Self::from_phrase(phrase, password)?.derive(path).map_err(|_| SecretStringError::InvalidPath) } /// Get the public key. - pub fn public(&self) -> Public { + fn public(&self) -> Public { let mut r = [0u8; 32]; let pk = self.0.public_key().as_ref(); r.copy_from_slice(pk); Public(r) } -} - -/// Verify a signature on a message. Returns true if the signature is good. -pub fn verify_strong>(sig: &Signature, message: &[u8], pubkey: P) -> bool { - let public_key = untrusted::Input::from(&pubkey.as_ref().0[..]); - let msg = untrusted::Input::from(message); - let sig = untrusted::Input::from(&sig.as_bytes()); - match signature::verify(&signature::ED25519, public_key, msg, sig) { - Ok(_) => true, - _ => false, + /// Sign a message. + fn sign(&self, message: &[u8]) -> Signature { + let mut r = [0u8; 64]; + r.copy_from_slice(self.0.sign(message).as_ref()); + Signature::from_raw(r) } -} -/// Something that acts as a signature allowing a message to be verified. -pub trait Verifiable { - /// Verify something that acts like a signature. - fn verify>(&self, message: &[u8], pubkey: P) -> bool; -} + /// Verify a signature on a message. Returns true if the signature is good. + fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { + let public_key = untrusted::Input::from(&pubkey.as_ref().0[..]); + let msg = untrusted::Input::from(message.as_ref()); + let sig = untrusted::Input::from(&sig.0[..]); -impl Verifiable for Signature { - /// Verify something that acts like a signature. - fn verify>(&self, message: &[u8], pubkey: P) -> bool { - verify_strong(&self, message, pubkey) + match signature::verify(&signature::ED25519, public_key, msg, sig) { + Ok(_) => true, + _ => false, + } } -} -impl Verifiable for LocalizedSignature { - fn verify>(&self, message: &[u8], pubkey: P) -> bool { - pubkey.as_ref() == &self.signer && self.signature.verify(message, pubkey) + /// Verify a signature on a message. Returns true if the signature is good. + /// + /// This doesn't use the type system to ensure that `sig` and `pubkey` are the correct + /// size. Use it only if you're coming from byte buffers and need the speed. + fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { + let public_key = untrusted::Input::from(pubkey.as_ref()); + let msg = untrusted::Input::from(message.as_ref()); + let sig = untrusted::Input::from(sig); + + match signature::verify(&signature::ED25519, public_key, msg, sig) { + Ok(_) => true, + _ => false, + } } } -/// Deserialize from `ss58` into something that can be constructed from `[u8; 32]`. #[cfg(feature = "std")] -pub fn deserialize<'de, D, T: From<[u8; 32]>>(deserializer: D) -> Result where - D: Deserializer<'de>, -{ - let ss58 = String::deserialize(deserializer)?; - Public::from_ss58check(&ss58) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - .map(|v| v.0.into()) -} +impl Pair { + /// Get the seed for this key. + pub fn seed(&self) -> &Seed { + &self.1 + } -/// Serializes something that implements `AsRef<[u8; 32]>` into `ss58`. -#[cfg(feature = "std")] -pub fn serialize>(data: &T, serializer: S) -> Result where - S: Serializer, -{ - serializer.serialize_str(&Public(*data.as_ref()).to_ss58check()) + /// Exactly as `from_string` except that if no matches are found then, the the first 32 + /// characters are taken (padded with spaces as necessary) and used as the MiniSecretKey. + pub fn from_legacy_string(s: &str, password_override: Option<&str>) -> Pair { + Self::from_string(s, password_override).unwrap_or_else(|_| { + let mut padded_seed: Seed = [' ' as u8; 32]; + let len = s.len().min(32); + padded_seed[..len].copy_from_slice(&s.as_bytes()[..len]); + Self::from_seed(padded_seed) + }) + } } #[cfg(test)] mod test { use super::*; use hex_literal::{hex, hex_impl}; + use crate::Pair as _Pair; - fn _test_primitives_signature_and_local_the_same() { - fn takes_two(_: T, _: T) { } - takes_two(Signature::default(), crate::Signature::default()) + #[test] + fn test_vector_should_work() { + let pair: Pair = Pair::from_seed(hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); + let public = pair.public(); + assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); + let message = b""; + let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); + assert!(&pair.sign(&message[..]) == &signature); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] - fn test_vector_should_work() { - let pair: Pair = Pair::from_seed(&hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); + fn test_vector_by_string_should_work() { + let pair: Pair = Pair::from_string("0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", None).unwrap(); let public = pair.public(); assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); let message = b""; - let signature: Signature = hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b").into(); + let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); assert!(&pair.sign(&message[..]) == &signature); - assert!(verify_strong(&signature, &message[..], &public)); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] @@ -320,33 +553,47 @@ mod test { let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); - assert!(verify_strong(&signature, &message[..], &public)); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn seeded_pair_should_work() { - use crate::hexdisplay::HexDisplay; - - let pair = Pair::from_seed(b"12345678901234567890123456789012"); + let pair = Pair::from_seed(*b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!(public, Public::from_raw(hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee"))); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); - println!("Correct signature: {}", HexDisplay::from(&signature.as_bytes())); - assert!(verify_strong(&signature, &message[..], &public)); + println!("Correct signature: {:?}", signature); + assert!(Pair::verify(&signature, &message[..], &public)); + } + + #[test] + fn generate_with_phrase_recovery_possible() { + let (pair1, phrase) = Pair::generate_with_phrase(None); + let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + + assert_eq!(pair1.public(), pair2.public()); } #[test] - fn generate_with_pkcs8_recovery_possible() { - let (pair1, pkcs8) = Pair::generate_with_pkcs8(); - let pair2 = Pair::from_pkcs8(&pkcs8).unwrap(); + fn generate_with_password_phrase_recovery_possible() { + let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); + let pair2 = Pair::from_phrase(&phrase, Some("password")).unwrap(); assert_eq!(pair1.public(), pair2.public()); } + #[test] + fn password_does_something() { + let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); + let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + + assert_ne!(pair1.public(), pair2.public()); + } + #[test] fn ss58check_roundtrip_works() { - let pair = Pair::from_seed(b"12345678901234567890123456789012"); + let pair = Pair::from_seed(*b"12345678901234567890123456789012"); let public = pair.public(); let s = public.to_ss58check(); println!("Correct: {}", s); diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index fc3867a7880c0..67b99f7ebc81b 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -49,19 +49,17 @@ pub mod hashing; pub use hashing::{blake2_256, twox_128, twox_256}; #[cfg(feature = "std")] pub mod hexdisplay; -#[cfg(feature = "std")] -pub mod ed25519; -#[cfg(feature = "std")] -pub mod sr25519; +pub mod crypto; pub mod u32_trait; +pub mod ed25519; +pub mod sr25519; pub mod hash; mod hasher; pub mod sandbox; pub mod storage; pub mod uint; -mod authority_id; mod changes_trie; #[cfg(test)] @@ -69,17 +67,15 @@ mod tests; pub use self::hash::{H160, H256, H512, convert_hash}; pub use self::uint::U256; -pub use authority_id::Ed25519AuthorityId; pub use changes_trie::ChangesTrieConfiguration; +#[cfg(feature = "std")] +pub use crypto::{DeriveJunction, Pair}; pub use hash_db::Hasher; // Switch back to Blake after PoC-3 is out // pub use self::hasher::blake::BlakeHasher; pub use self::hasher::blake2::Blake2Hasher; -/// A 512-bit value interpreted as a signature. -pub type Signature = hash::H512; - /// Hex-serialised shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index a6e7db8078cdf..4c2b97c5f68a2 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -16,33 +16,212 @@ // tag::description[] //! Simple sr25519 (Schnorr-Ristretto) API. +//! +//! Note: `CHAIN_CODE_LENGTH` must be equal to `crate::crypto::JUNCTION_ID_LEN` +//! for this to work. // end::description[] -use base58::{FromBase58, ToBase58}; +#[cfg(feature = "std")] use blake2_rfc; +#[cfg(feature = "std")] use rand::rngs::OsRng; +#[cfg(feature = "std")] use schnorrkel::{signing_context, Keypair, SecretKey, MiniSecretKey, PublicKey, derive::{Derivation, ChainCode, CHAIN_CODE_LENGTH} }; +#[cfg(feature = "std")] use substrate_bip39::mini_secret_from_entropy; -//use sha2::Sha512; +#[cfg(feature = "std")] +use bip39::{Mnemonic, Language, MnemonicType}; +#[cfg(feature = "std")] +use crate::crypto::{Pair as TraitPair, DeriveJunction, Infallible, SecretStringError, Derive, Ss58Codec}; +use crate::{hash::{H256, H512}, crypto::UncheckedFrom}; use parity_codec::{Encode, Decode}; -use crate::hash::H512; -use bip39::{Mnemonic, Language}; #[cfg(feature = "std")] -use serde::{de, Deserialize, Deserializer, Serializer}; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +#[cfg(feature = "std")] +use schnorrkel::keys::MINI_SECRET_KEY_LENGTH; // signing context -const SIGNING_CTX: &'static [u8] = b"substrate transaction"; +#[cfg(feature = "std")] +const SIGNING_CTX: &[u8] = b"substrate"; + +/// An Schnorrkel/Ristretto x25519 ("sr25519") public key. +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode, Default)] +pub struct Public(pub [u8; 32]); + +/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair. +#[cfg(feature = "std")] +pub struct Pair(Keypair); + +impl AsRef for Public { + fn as_ref(&self) -> &Public { + &self + } +} + +impl AsRef<[u8; 32]> for Public { + fn as_ref(&self) -> &[u8; 32] { + &self.0 + } +} + +impl AsRef<[u8]> for Public { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + +impl AsMut<[u8]> for Public { + fn as_mut(&mut self) -> &mut [u8] { + &mut self.0[..] + } +} + +impl From for [u8; 32] { + fn from(x: Public) -> [u8; 32] { + x.0 + } +} + +impl From for H256 { + fn from(x: Public) -> H256 { + x.0.into() + } +} + +impl UncheckedFrom<[u8; 32]> for Public { + fn unchecked_from(x: [u8; 32]) -> Self { + Public::from_raw(x) + } +} + +impl UncheckedFrom for Public { + fn unchecked_from(x: H256) -> Self { + Public::from_h256(x) + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Display for Public { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "{}", self.to_ss58check()) + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Debug for Public { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + let s = self.to_ss58check(); + write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) + } +} + +#[cfg(feature = "std")] +impl Serialize for Public { + fn serialize(&self, serializer: S) -> Result where S: Serializer { + serializer.serialize_str(&self.to_ss58check()) + } +} + +#[cfg(feature = "std")] +impl<'de> Deserialize<'de> for Public { + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { + Public::from_ss58check(&String::deserialize(deserializer)?) + .map_err(|e| de::Error::custom(format!("{:?}", e))) + } +} + +#[cfg(feature = "std")] +impl ::std::hash::Hash for Public { + fn hash(&self, state: &mut H) { + self.0.hash(state); + } +} /// An Schnorrkel/Ristretto x25519 ("sr25519") signature. /// /// Instead of importing it for the local module, alias it to be available as a public type -pub type Signature = H512; +#[derive(Encode, Decode)] +pub struct Signature(pub [u8; 64]); + +impl Clone for Signature { + fn clone(&self) -> Self { + let mut r = [0u8; 64]; + r.copy_from_slice(&self.0[..]); + Signature(r) + } +} + +impl Default for Signature { + fn default() -> Self { + Signature([0u8; 64]) + } +} + +impl PartialEq for Signature { + fn eq(&self, b: &Self) -> bool { + &self.0[..] == &b.0[..] + } +} + +impl Eq for Signature {} + +impl From for [u8; 64] { + fn from(v: Signature) -> [u8; 64] { + v.0 + } +} + +impl From for H512 { + fn from(v: Signature) -> H512 { + H512::from(v.0) + } +} + +impl AsRef<[u8; 64]> for Signature { + fn as_ref(&self) -> &[u8; 64] { + &self.0 + } +} + +impl AsRef<[u8]> for Signature { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + +impl AsMut<[u8]> for Signature { + fn as_mut(&mut self) -> &mut [u8] { + &mut self.0[..] + } +} + +#[cfg(feature = "std")] +impl From for Signature { + fn from(s: schnorrkel::Signature) -> Signature { + Signature(s.to_bytes()) + } +} + +#[cfg(feature = "std")] +impl ::std::fmt::Debug for Signature { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) + } +} + +#[cfg(feature = "std")] +impl ::std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + ::std::hash::Hash::hash(&self.0[..], state); + } +} /// A localized signature also contains sender information. /// NOTE: Encode and Decode traits are supported in ed25519 but not possible for now here. +#[cfg(feature = "std")] #[derive(PartialEq, Eq, Clone, Debug)] pub struct LocalizedSignature { /// The signer of the signature. @@ -51,64 +230,80 @@ pub struct LocalizedSignature { pub signature: Signature, } -/// An Schnorrkel/Ristretto x25519 ("sr25519") public key. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -pub struct Public(pub [u8; 32]); +impl Signature { + /// A new instance from the given 64-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_raw(data: [u8; 64]) -> Signature { + Signature(data) + } -/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair. -pub struct Pair(Keypair); + /// A new instance from the given slice that should be 64 bytes long. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_slice(data: &[u8]) -> Self { + let mut r = [0u8; 64]; + r.copy_from_slice(data); + Signature(r) + } -impl ::std::hash::Hash for Public { - fn hash(&self, state: &mut H) { - self.0.hash(state); + /// A new instance from an H512. + /// + /// NOTE: No checking goes on to ensure this is a real signature. Only use it if + /// you are certain that the array actually is a signature. GIGO! + pub fn from_h512(v: H512) -> Signature { + Signature(v.into()) } } -/// An error type for SS58 decoding. -#[derive(Clone, Copy, Eq, PartialEq, Debug)] -pub enum PublicError { - /// Bad alphabet. - BadBase58, - /// Bad length. - BadLength, - /// Unknown version. - UnknownVersion, - /// Invalid checksum. - InvalidChecksum, +#[cfg(feature = "std")] +impl Derive for Public { + /// Derive a child key from a series of given junctions. + /// + /// `None` if there are any hard junctions in there. + fn derive>(&self, path: Iter) -> Option { + let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; + for j in path { + match j { + DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0, + DeriveJunction::Hard(_cc) => return None, + } + } + Some(Self(acc.to_bytes())) + } } impl Public { /// A new instance from the given 32-byte `data`. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! pub fn from_raw(data: [u8; 32]) -> Self { Public(data) } /// A new instance from the given slice that should be 32 bytes long. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! pub fn from_slice(data: &[u8]) -> Self { let mut r = [0u8; 32]; r.copy_from_slice(data); Public(r) } - /// Some if the string is a properly encoded SS58Check address. - pub fn from_ss58check(s: &str) -> Result { - let d = s.from_base58().map_err(|_| PublicError::BadBase58)?; // failure here would be invalid encoding. - if d.len() != 35 { - // Invalid length. - return Err(PublicError::BadLength); - } - if d[0] != 42 { - // Invalid version. - return Err(PublicError::UnknownVersion); - } - if d[33..35] != blake2_rfc::blake2b::blake2b(64, &[], &d[0..33]).as_bytes()[0..2] { - // Invalid checksum. - return Err(PublicError::InvalidChecksum); - } - Ok(Self::from_slice(&d[1..33])) + /// A new instance from an H256. + /// + /// NOTE: No checking goes on to ensure this is a real public key. Only use it if + /// you are certain that the array actually is a pubkey. GIGO! + pub fn from_h256(x: H256) -> Self { + Public(x.into()) } /// Return a `Vec` filled with raw data. + #[cfg(feature = "std")] pub fn to_raw_vec(self) -> Vec { let r: &[u8; 32] = self.as_ref(); r.to_vec() @@ -124,179 +319,52 @@ impl Public { pub fn as_array_ref(&self) -> &[u8; 32] { self.as_ref() } - - /// Return the ss58-check string for this key. - pub fn to_ss58check(&self) -> String { - let mut v = vec![42u8]; - v.extend(self.as_slice()); - let r = blake2_rfc::blake2b::blake2b(64, &[], &v); - v.extend(&r.as_bytes()[0..2]); - v.to_base58() - } - - /// Derive a child key from a series of given junctions. - /// - /// `None` if there are any hard junctions in there. - pub fn derive>(&self, mut path: Iter) -> Option { - let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; - for j in path { - match j { - DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0, - DeriveJunction::Hard(cc) => return None, - } - } - Some(Self(acc.to_bytes())) - } -} - -impl AsRef<[u8; 32]> for Public { - fn as_ref(&self) -> &[u8; 32] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl Into<[u8; 32]> for Public { - fn into(self) -> [u8; 32] { - self.0 - } -} - -impl AsRef for Public { - fn as_ref(&self) -> &Public { - &self - } } +#[cfg(feature = "std")] impl AsRef for Pair { fn as_ref(&self) -> &Pair { &self } } +#[cfg(feature = "std")] impl From for Pair { fn from(sec: MiniSecretKey) -> Pair { Pair(sec.expand_to_keypair()) } } +#[cfg(feature = "std")] impl From for Pair { fn from(sec: SecretKey) -> Pair { Pair(Keypair::from(sec)) } } +#[cfg(feature = "std")] impl From for Pair { fn from(p: schnorrkel::Keypair) -> Pair { Pair(p) } } +#[cfg(feature = "std")] impl From for schnorrkel::Keypair { fn from(p: Pair) -> schnorrkel::Keypair { p.0 } } +#[cfg(feature = "std")] impl AsRef for Pair { fn as_ref(&self) -> &schnorrkel::Keypair { &self.0 } } -impl ::std::fmt::Display for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } -} - -impl ::std::fmt::Debug for Public { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) - } -} - -/// A since derivation junction description. It is the single parameter used when creating -/// a new secret key from an existing secret key and, in the case of `SoftRaw` and `SoftIndex` -/// a new public key from an existing public key. -#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Encode, Decode)] -pub enum DeriveJunction { - /// Soft (vanilla) derivation. Public keys have a correspondent derivation. - Soft([u8; CHAIN_CODE_LENGTH]), - /// Hard ("hardened") derivation. Public keys do not have a correspondent derivation. - Hard([u8; CHAIN_CODE_LENGTH]), -} - -impl DeriveJunction { - /// Consume self to return a soft derive junction with the same chain code. - pub fn soften(self) -> Self { DeriveJunction::Soft(self.unwrap_inner()) } - - /// Consume self to return a hard derive junction with the same chain code. - pub fn harden(self) -> Self { DeriveJunction::Hard(self.unwrap_inner()) } - - /// Create a new soft (vanilla) DeriveJunction from a given, encodable, value. - /// - /// If you need a hard junction, use `hard()`. - pub fn soft(index: T) -> Self { - let mut cc: [u8; CHAIN_CODE_LENGTH] = Default::default(); - index.using_encoded(|data| if data.len() > CHAIN_CODE_LENGTH { - let hash_result = blake2_rfc::blake2b::blake2b(CHAIN_CODE_LENGTH, &[], data); - let hash = hash_result.as_bytes(); - cc.copy_from_slice(hash); - } else { - cc[0..data.len()].copy_from_slice(data); - }); - DeriveJunction::Soft(cc) - } - - /// Create a new hard (hardened) DeriveJunction from a given, encodable, value. - /// - /// If you need a soft junction, use `soft()`. - pub fn hard(index: T) -> Self { - Self::soft(index).harden() - } - - /// Consume self to return the chain code. - pub fn unwrap_inner(self) -> [u8; CHAIN_CODE_LENGTH] { - match self { - DeriveJunction::Hard(c) | DeriveJunction::Soft(c) => c, - } - } - - /// Consume self to return the chain code. - pub fn unwrap_chain_code(self) -> ChainCode { - ChainCode(self.unwrap_inner()) - } - - /// Return a reference to the chain code. - pub fn chain_code(&self) -> ChainCode { - self.clone().unwrap_chain_code() - } - - /// Return `true` if the junction is soft. - pub fn is_soft(&self) -> bool { - match *self { - DeriveJunction::Soft(_) => true, - _ => false, - } - } - - /// Return `true` if the junction is hard. - pub fn is_hard(&self) -> bool { - match *self { - DeriveJunction::Hard(_) => true, - _ => false, - } - } -} - /// Derive a single hard junction. +#[cfg(feature = "std")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> SecretKey { ("SchnorrRistrettoHDKD", &secret.to_bytes()[..], cc).using_encoded(|data| MiniSecretKey::from_bytes(blake2_rfc::blake2b::blake2b(32, &[], data).as_bytes()) @@ -305,173 +373,181 @@ fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> Sec ) } -impl Pair { +#[cfg(feature = "std")] +type Seed = [u8; MINI_SECRET_KEY_LENGTH]; + +#[cfg(feature = "std")] +impl TraitPair for Pair { + type Public = Public; + type Seed = Seed; + type Signature = Signature; + type DeriveError = Infallible; + /// Generate new secure (random) key pair. - pub fn generate() -> Pair { + fn generate() -> Pair { let mut csprng: OsRng = OsRng::new().expect("os random generator works; qed"); let key_pair: Keypair = Keypair::generate(&mut csprng); Pair(key_pair) } - /// Make a new key pair from a seed phrase. + /// Make a new key pair from raw secret seed material. + /// /// This is generated using schnorrkel's Mini-Secret-Keys. + /// /// A MiniSecretKey is literally what Ed25519 calls a SecretKey, which is just 32 random bytes. - pub fn from_seed(seed: &[u8; 32]) -> Pair { - let mini_key: MiniSecretKey = MiniSecretKey::from_bytes(seed) + fn from_seed(seed: Seed) -> Pair { + let mini_key: MiniSecretKey = MiniSecretKey::from_bytes(&seed[..]) .expect("32 bytes can always build a key; qed"); let kp = mini_key.expand_to_keypair(); Pair(kp) } - /// Make a new key pair from a seed phrase. - /// This is generated using schnorrkel's Mini-Secret-Keys. - /// A MiniSecretKey is literally what Ed25519 calls a SecretKey, which is just 32 random bytes. - pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> Pair { - let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) - .expect("32 bytes can always build a key; qed"); - let kp = mini_key.expand_to_keypair(); - Pair(kp) + /// Get the public key. + fn public(&self) -> Public { + let mut pk = [0u8; 32]; + pk.copy_from_slice(&self.0.public.to_bytes()); + Public(pk) + } + + /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it + /// will return `None`. + /// + /// You should never need to use this; generate(), generate_with_phrase(), from_phrase() + fn from_seed_slice(seed: &[u8]) -> Result { + if seed.len() != MINI_SECRET_KEY_LENGTH { + Err(SecretStringError::InvalidSeedLength) + } else { + Ok(Pair( + MiniSecretKey::from_bytes(seed) + .map_err(|_| SecretStringError::InvalidSeed)? + .expand_to_keypair() + )) + } + } + + /// Generate a key from the phrase, password and derivation path. + fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { + Self::from_phrase(phrase, password)? + .derive(path) + .map_err(|_| SecretStringError::InvalidPath) + } + + fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); + let phrase = mnemonic.phrase(); + ( + Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + phrase.to_owned(), + ) } - /// Returns the KeyPair from the English BIP39 seed `phrase`, or `None` if it's invalid. - pub fn from_phrase(phrase: &str, password: Option<&str>) -> Option { + fn from_phrase(phrase: &str, password: Option<&str>) -> Result { Mnemonic::from_phrase(phrase, Language::English) - .ok() + .map_err(|_| SecretStringError::InvalidPhrase) .map(|m| Self::from_entropy(m.entropy(), password)) } - /// Derive a child key from a series of given junctions. - pub fn derive>(&self, mut path: Iter) -> Pair { + fn derive>(&self, path: Iter) -> Result { let init = self.0.secret.clone(); let result = path.fold(init, |acc, j| match j { DeriveJunction::Soft(cc) => acc.derived_key_simple(ChainCode(cc), &[]).0, DeriveJunction::Hard(cc) => derive_hard_junction(&acc, &cc), }); - Self(result.into()) + Ok(Self(result.into())) } - /// Sign a message. - pub fn sign(&self, message: &[u8]) -> Signature { + fn sign(&self, message: &[u8]) -> Signature { let context = signing_context(SIGNING_CTX); - Signature::from(self.0.sign(context.bytes(message)).to_bytes()) - } - - /// Get the public key. - pub fn public(&self) -> Public { - let mut pk = [0u8; 32]; - pk.copy_from_slice(&self.0.public.to_bytes()); - Public(pk) - } -} - -/// Verify a signature on a message. Returns true if the signature is good. -pub fn verify_strong>(sig: &Signature, message: &[u8], pubkey: P) -> bool { - let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig[..]) { - Ok(some_signature) => some_signature, - Err(_) => return false - }; - match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { - Ok(pk) => pk.verify(signing_context(SIGNING_CTX).bytes(message), &signature), - Err(_) => false, - } -} - -/// Verify a message without type checking the parameters' types for the right size. -/// Returns true if both the pubkey and the signature is good. -pub fn verify>(sig: &[u8], message: &[u8], pubkey: P) -> bool { - let signature = match schnorrkel::Signature::from_bytes(&sig[..]) { - Ok(sig) => sig, - Err(_) => return false, - }; - match PublicKey::from_bytes(pubkey.as_ref()) { - Ok(pk) => pk.verify_simple(SIGNING_CTX, message, &signature), - Err(_) => false, - } -} - -/// Something that acts as a signature allowing a message to be verified. -pub trait Verifiable { - /// Verify something that acts like a signature. - fn verify>(&self, message: &[u8], pubkey: P) -> bool; -} - -impl Verifiable for Signature { - /// Verify something that acts like a signature. - fn verify>(&self, message: &[u8], pubkey: P) -> bool { - verify_strong(&self, message, pubkey) + self.0.sign(context.bytes(message)).into() + } + + /// Verify a signature on a message. Returns true if the signature is good. + fn verify, M: AsRef<[u8]>>(sig: &Self::Signature, message: M, pubkey: P) -> bool { + let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(&sig.as_ref()) { + Ok(some_signature) => some_signature, + Err(_) => return false + }; + match PublicKey::from_bytes(pubkey.as_ref().as_slice()) { + Ok(pk) => pk.verify( + signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature + ), + Err(_) => false, + } } -} -impl Verifiable for LocalizedSignature { - fn verify>(&self, message: &[u8], pubkey: P) -> bool { - pubkey.as_ref() == &self.signer && self.signature.verify(message, pubkey) + /// Verify a signature on a message. Returns true if the signature is good. + fn verify_weak, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool { + let signature: schnorrkel::Signature = match schnorrkel::Signature::from_bytes(sig) { + Ok(some_signature) => some_signature, + Err(_) => return false + }; + match PublicKey::from_bytes(pubkey.as_ref()) { + Ok(pk) => pk.verify( + signing_context(SIGNING_CTX).bytes(message.as_ref()), &signature + ), + Err(_) => false, + } } } -/// Deserialize from `ss58` into something that can be constructed from `[u8; 32]`. #[cfg(feature = "std")] -pub fn deserialize<'de, D, T: From<[u8; 32]>>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - let ss58 = String::deserialize(deserializer)?; - Public::from_ss58check(&ss58) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - .map(|v| v.0.into()) -} - -/// Serializes something that implements `AsRef<[u8; 32]>` into `ss58`. -#[cfg(feature = "std")] -pub fn serialize>(data: &T, serializer: S) -> Result -where - S: Serializer, -{ - serializer.serialize_str(&Public(*data.as_ref()).to_ss58check()) +impl Pair { + /// Make a new key pair from binary data derived from a valid seed phrase. + /// + /// This uses a key derivation function to convert the entropy into a seed, then returns + /// the pair generated from it. + pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> Pair { + let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) + .expect("32 bytes can always build a key; qed"); + let kp = mini_key.expand_to_keypair(); + Pair(kp) + } } #[cfg(test)] mod test { use super::*; + use crate::Pair as _Pair; use hex_literal::{hex, hex_impl}; - + #[test] fn derive_soft_should_work() { - let pair: Pair = Pair::from_seed(&hex!( + let pair: Pair = Pair::from_seed(hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); - let derive_1 = pair.derive(Some(DeriveJunction::soft(1)).into_iter()); - let derive_1b = pair.derive(Some(DeriveJunction::soft(1)).into_iter()); - let derive_2 = pair.derive(Some(DeriveJunction::soft(2)).into_iter()); + let derive_1 = pair.derive(Some(DeriveJunction::soft(1)).into_iter()).unwrap(); + let derive_1b = pair.derive(Some(DeriveJunction::soft(1)).into_iter()).unwrap(); + let derive_2 = pair.derive(Some(DeriveJunction::soft(2)).into_iter()).unwrap(); assert_eq!(derive_1.public(), derive_1b.public()); assert_ne!(derive_1.public(), derive_2.public()); } #[test] fn derive_hard_should_work() { - let pair: Pair = Pair::from_seed(&hex!( + let pair: Pair = Pair::from_seed(hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); - let derive_1 = pair.derive(Some(DeriveJunction::hard(1)).into_iter()); - let derive_1b = pair.derive(Some(DeriveJunction::hard(1)).into_iter()); - let derive_2 = pair.derive(Some(DeriveJunction::hard(2)).into_iter()); + let derive_1 = pair.derive(Some(DeriveJunction::hard(1)).into_iter()).unwrap(); + let derive_1b = pair.derive(Some(DeriveJunction::hard(1)).into_iter()).unwrap(); + let derive_2 = pair.derive(Some(DeriveJunction::hard(2)).into_iter()).unwrap(); assert_eq!(derive_1.public(), derive_1b.public()); assert_ne!(derive_1.public(), derive_2.public()); } #[test] fn derive_soft_public_should_work() { - let pair: Pair = Pair::from_seed(&hex!( + let pair: Pair = Pair::from_seed(hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::soft(1)); - let pair_1 = pair.derive(path.clone().into_iter()); + let pair_1 = pair.derive(path.clone().into_iter()).unwrap(); let public_1 = pair.public().derive(path.into_iter()).unwrap(); assert_eq!(pair_1.public(), public_1); } #[test] fn derive_hard_public_should_fail() { - let pair: Pair = Pair::from_seed(&hex!( + let pair: Pair = Pair::from_seed(hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::hard(1)); @@ -480,7 +556,7 @@ mod test { #[test] fn sr_test_vector_should_work() { - let pair: Pair = Pair::from_seed(&hex!( + let pair: Pair = Pair::from_seed(hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let public = pair.public(); @@ -492,8 +568,7 @@ mod test { ); let message = b""; let signature = pair.sign(message); - assert!(verify(&signature[..], message, &public.0)); - assert!(verify_strong(&signature, &message[..], &public)); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] @@ -502,13 +577,13 @@ mod test { let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); - assert!(verify_strong(&signature, &message[..], &public)); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(b"12345678901234567890123456789012"); + let pair = Pair::from_seed(*b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!( public, @@ -518,7 +593,7 @@ mod test { ); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); - assert!(verify_strong(&signature, &message[..], &public)); + assert!(Pair::verify(&signature, &message[..], &public)); } #[test] @@ -537,4 +612,15 @@ mod test { let enc = hex!["090fa15cb5b1666222fff584b4cc2b1761fe1e238346b340491b37e25ea183ff"]; assert_eq!(Public::from_ss58check(k).unwrap(), Public::from_raw(enc)); } + + #[test] + fn verify_from_wasm_works() { + // The values in this test case are compared to the output of `node-test.js` in schnorrkel-js. + // + // This is to make sure that the wasm library is compatible. + let pk = Pair::from_seed(hex!("0000000000000000000000000000000000000000000000000000000000000000")); + let public = pk.public(); + let js_signature = Signature::from_raw(hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00")); + assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); + } } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index 47edca65dc439..762453f2b77cc 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -28,7 +28,9 @@ tokio = "0.1.7" [dev-dependencies] assert_matches = "1.1" futures = "0.1.17" +sr-io = { path = "../sr-io" } test_client = { package = "substrate-test-client", path = "../test-client" } +test_runtime = { package = "substrate-test-runtime", path = "../test-runtime" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } rustc-hex = "2.0" hex-literal = "0.1" diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index dfdae48311106..53166e76f82ea 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -17,27 +17,24 @@ use super::*; use std::sync::Arc; -use hex_literal::{hex, hex_impl}; use assert_matches::assert_matches; use parity_codec::Encode; use transaction_pool::{ txpool::Pool, ChainApi, }; -use primitives::H256; -use test_client::keyring::Keyring; -use test_client::runtime::{Extrinsic, Transfer}; -use test_client; +use primitives::{H256, blake2_256, hexdisplay::HexDisplay}; +use test_client::{self, AccountKeyring, runtime::{Extrinsic, Transfer}}; use tokio::runtime; -fn uxt(sender: Keyring, nonce: u64) -> Extrinsic { +fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { let tx = Transfer { amount: Default::default(), nonce, - from: sender.to_raw_public().into(), + from: sender.into(), to: Default::default(), }; - let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); + let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); Extrinsic::Transfer(tx, signature) } @@ -50,14 +47,15 @@ fn submit_transaction_should_not_cause_error() { pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client))), subscriptions: Subscriptions::new(runtime.executor()), }; - let h: H256 = hex!("81897a4890fb7554e7f77c533a865846a11583a56a8ad5e307543188d55e64f1").into(); + let xt = uxt(AccountKeyring::Alice, 1).encode(); + let h: H256 = blake2_256(&xt).into(); assert_matches!( - AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 1).encode().into()), + AuthorApi::submit_extrinsic(&p, xt.clone().into()), Ok(h2) if h == h2 ); assert!( - AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 1).encode().into()).is_err() + AuthorApi::submit_extrinsic(&p, xt.into()).is_err() ); } @@ -70,14 +68,15 @@ fn submit_rich_transaction_should_not_cause_error() { pool: Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))), subscriptions: Subscriptions::new(runtime.executor()), }; - let h: H256 = hex!("9ec8469b5dcfe29cc274ac1d07ad73d80be57566ace0fcdbe51ebcf4b51e925b").into(); + let xt = uxt(AccountKeyring::Alice, 0).encode(); + let h: H256 = blake2_256(&xt).into(); assert_matches!( - AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 0).encode().into()), + AuthorApi::submit_extrinsic(&p, xt.clone().into()), Ok(h2) if h == h2 ); assert!( - AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 0).encode().into()).is_err() + AuthorApi::submit_extrinsic(&p, xt.into()).is_err() ); } @@ -95,7 +94,7 @@ fn should_watch_extrinsic() { let (subscriber, id_rx, data) = ::jsonrpc_pubsub::typed::Subscriber::new_test("test"); // when - p.watch_extrinsic(Default::default(), subscriber, uxt(Keyring::Alice, 0).encode().into()); + p.watch_extrinsic(Default::default(), subscriber, uxt(AccountKeyring::Alice, 0).encode().into()); // then assert_eq!(runtime.block_on(id_rx), Ok(Ok(1.into()))); @@ -104,10 +103,10 @@ fn should_watch_extrinsic() { let tx = Transfer { amount: 5, nonce: 0, - from: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Alice.into(), to: Default::default(), }; - let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); + let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); Extrinsic::Transfer(tx, signature) }; AuthorApi::submit_extrinsic(&p, replacement.encode().into()).unwrap(); @@ -116,9 +115,10 @@ fn should_watch_extrinsic() { res, Some(r#"{"jsonrpc":"2.0","method":"test","params":{"result":"ready","subscription":1}}"#.into()) ); + let h = blake2_256(&replacement.encode()); assert_eq!( runtime.block_on(data.into_future()).unwrap().0, - Some(r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"usurped":"0x53daed816610aa6b22dedbcee43aba44a7ca7155cc71f2919c5e79ebbc7de58c"},"subscription":1}}"#.into()) + Some(format!(r#"{{"jsonrpc":"2.0","method":"test","params":{{"result":{{"usurped":"0x{}"}},"subscription":1}}}}"#, HexDisplay::from(&h))) ); } @@ -132,7 +132,7 @@ fn should_return_pending_extrinsics() { pool: pool.clone(), subscriptions: Subscriptions::new(runtime.executor()), }; - let ex = uxt(Keyring::Alice, 0); + let ex = uxt(AccountKeyring::Alice, 0); AuthorApi::submit_extrinsic(&p, ex.encode().into()).unwrap(); assert_matches!( p.pending_extrinsics(), diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 510f4235a7866..436d413b1a7be 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -17,10 +17,10 @@ use super::*; use self::error::{Error, ErrorKind}; +use sr_io::twox_128; use assert_matches::assert_matches; use consensus::BlockOrigin; -use rustc_hex::FromHex; -use test_client::{self, runtime, keyring::Keyring, TestClient, BlockBuilderExt}; +use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt}; #[test] fn should_return_storage() { @@ -64,8 +64,8 @@ fn should_notify_about_storage_changes() { let mut builder = api.client.new_block().unwrap(); builder.push_transfer(runtime::Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 42, nonce: 0, }).unwrap(); @@ -88,8 +88,10 @@ fn should_send_initial_storage_changes_and_notifications() { { let api = State::new(Arc::new(test_client::new()), Subscriptions::new(remote)); + let alice_balance_key = twox_128(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + api.subscribe_storage(Default::default(), subscriber, Some(vec![ - StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap()), + StorageKey(alice_balance_key.to_vec()), ]).into()); // assert id assigned @@ -97,8 +99,8 @@ fn should_send_initial_storage_changes_and_notifications() { let mut builder = api.client.new_block().unwrap(); builder.push_transfer(runtime::Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 42, nonce: 0, }).unwrap(); @@ -131,8 +133,8 @@ fn should_query_storage() { let add_block = |nonce| { let mut builder = client.new_block().unwrap(); builder.push_transfer(runtime::Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 42, nonce, }).unwrap(); @@ -145,13 +147,14 @@ fn should_query_storage() { let block2_hash = add_block(1); let genesis_hash = client.genesis_hash(); + let alice_balance_key = twox_128(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); let mut expected = vec![ StorageChangeSet { block: genesis_hash, changes: vec![ ( - StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap()), + StorageKey(alice_balance_key.to_vec()), Some(StorageData(vec![232, 3, 0, 0, 0, 0, 0, 0])) ), ], @@ -160,7 +163,7 @@ fn should_query_storage() { block: block1_hash, changes: vec![ ( - StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap()), + StorageKey(alice_balance_key.to_vec()), Some(StorageData(vec![190, 3, 0, 0, 0, 0, 0, 0])) ), ], @@ -169,7 +172,7 @@ fn should_query_storage() { // Query changes only up to block1 let result = api.query_storage( - vec![StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap())], + vec![StorageKey(alice_balance_key.to_vec())], genesis_hash, Some(block1_hash).into(), ); @@ -178,7 +181,7 @@ fn should_query_storage() { // Query all changes let result = api.query_storage( - vec![StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap())], + vec![StorageKey(alice_balance_key.to_vec())], genesis_hash, None.into(), ); @@ -187,7 +190,7 @@ fn should_query_storage() { block: block2_hash, changes: vec![ ( - StorageKey("a52da2b7c269da1366b3ed1cdb7299ce".from_hex().unwrap()), + StorageKey(alice_balance_key.to_vec()), Some(StorageData(vec![148, 3, 0, 0, 0, 0, 0, 0])) ), ], diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 8786306fa2545..94f5e69c8f395 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -536,12 +536,7 @@ mod tests { use super::*; use parity_codec::Encode; use consensus_common::BlockOrigin; - use substrate_test_client::{ - self, - TestClient, - keyring::Keyring, - runtime::{Extrinsic, Transfer}, - }; + use substrate_test_client::{self, TestClient, AccountKeyring, runtime::{Extrinsic, Transfer}}; #[test] fn should_remove_transactions_from_the_pool() { @@ -551,10 +546,10 @@ mod tests { let transfer = Transfer { amount: 5, nonce: 0, - from: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Alice.into(), to: Default::default(), }; - let signature = Keyring::from_raw_public(transfer.from.to_fixed_bytes()).unwrap().sign(&transfer.encode()).into(); + let signature = AccountKeyring::from_public(&transfer.from).unwrap().sign(&transfer.encode()).into(); Extrinsic::Transfer(transfer, signature) }; // store the transaction in the pool diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index 45127cd43677b..6ec7195d5d8cd 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -34,6 +34,7 @@ use log::{info, warn, debug}; use futures::prelude::*; use keystore::Store as Keystore; use client::BlockchainEvents; +use primitives::Pair; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Header, As}; use exit_future::Signal; @@ -62,7 +63,7 @@ use components::{StartRPC, MaintainTransactionPool}; #[doc(hidden)] pub use network::OnDemand; -const DEFAULT_PROTOCOL_ID: &'static str = "sup"; +const DEFAULT_PROTOCOL_ID: &str = "sup"; /// Substrate service. pub struct Service { diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 3667866398870..d67d4ec53c50f 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -18,7 +18,8 @@ pub use parity_codec as codec; // re-export hashing functions. pub use primitives::{ - blake2_256, twox_128, twox_256, ed25519, Blake2Hasher, sr25519 + blake2_256, twox_128, twox_256, ed25519, Blake2Hasher, sr25519, + Pair }; pub use tiny_keccak::keccak256 as keccak_256; // Switch to this after PoC-3 @@ -163,6 +164,7 @@ pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option

(input: &[&[u8]]) -> H::Out where H: Hasher, @@ -196,12 +198,12 @@ where /// Verify a ed25519 signature. pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - ed25519::verify(sig, msg, pubkey) + ed25519::Pair::verify_weak(sig, msg, pubkey) } /// Verify an sr25519 signature. pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { - sr25519::verify(sig, msg, pubkey) + sr25519::Pair::verify_weak(sig, msg, pubkey) } /// Verify and recover a SECP256k1 ECDSA signature. diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 95d243b97df74..710bcc77457ce 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -24,8 +24,6 @@ use rstd::prelude::*; use crate::codec::{Decode, Encode, Codec, Input}; use crate::traits::{self, Member, DigestItem as DigestItemT, MaybeHash}; -use substrate_primitives::hash::H512 as Signature; - /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] @@ -63,7 +61,7 @@ impl traits::Digest for Digest where /// provide opaque access to other items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum DigestItem { +pub enum DigestItem { /// System digest item announcing that authorities set has been changed /// in the block. Contains the new set of authorities. AuthoritiesChange(Vec), @@ -72,13 +70,13 @@ pub enum DigestItem { /// trie creation. ChangesTrieRoot(Hash), /// Put a Seal on it - Seal(u64, Signature), + Seal(u64, SealSignature), /// Any 'non-system' digest item, opaque to the native code. Other(Vec), } #[cfg(feature = "std")] -impl ::serde::Serialize for DigestItem { +impl ::serde::Serialize for DigestItem { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| { ::substrate_primitives::bytes::serialize(bytes, seq) @@ -91,13 +89,13 @@ impl ::serde::Serialize for DigestItem { +pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// Reference to `DigestItem::AuthoritiesChange`. AuthoritiesChange(&'a [AuthorityId]), /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), /// A sealed signature for testing - Seal(&'a u64, &'a Signature), + Seal(&'a u64, &'a SealSignature), /// Any 'non-system' digest item, opaque to the native code. /// Reference to `DigestItem::Other`. Other(&'a Vec), @@ -116,7 +114,7 @@ enum DigestItemType { Seal, } -impl DigestItem { +impl DigestItem { /// Returns Some if `self` is a `DigestItem::Other`. pub fn as_other(&self) -> Option<&Vec> { match *self { @@ -126,7 +124,7 @@ impl DigestItem { } /// Returns a 'referencing view' for this digest item. - fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash, AuthorityId> { + fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { match *self { DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), @@ -139,7 +137,8 @@ impl DigestItem { impl< Hash: Codec + Member, AuthorityId: Codec + Member + MaybeHash, -> traits::DigestItem for DigestItem { + SealSignature: Codec + Member, +> traits::DigestItem for DigestItem { type Hash = Hash; type AuthorityId = AuthorityId; @@ -152,13 +151,13 @@ impl< } } -impl Encode for DigestItem { +impl Encode for DigestItem { fn encode(&self) -> Vec { self.dref().encode() } } -impl Decode for DigestItem { +impl Decode for DigestItem { fn decode(input: &mut I) -> Option { let item_type: DigestItemType = Decode::decode(input)?; match item_type { @@ -169,7 +168,7 @@ impl Decode for DigestItem Decode::decode(input)?, )), DigestItemType::Seal => { - let vals: (u64, Signature) = Decode::decode(input)?; + let vals: (u64, SealSignature) = Decode::decode(input)?; Some(DigestItem::Seal(vals.0, vals.1)) }, DigestItemType::Other => Some(DigestItem::Other( @@ -179,7 +178,7 @@ impl Decode for DigestItem } } -impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member> DigestItemRef<'a, Hash, AuthorityId> { +impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec + Member> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { /// Cast this digest item into `AuthoritiesChange`. pub fn as_authorities_change(&self) -> Option<&'a [AuthorityId]> { match *self { @@ -197,7 +196,7 @@ impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member> DigestItemRef<'a, Ha } } -impl<'a, Hash: Encode, AuthorityId: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId> { +impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId, SealSignature> { fn encode(&self) -> Vec { let mut v = Vec::new(); @@ -227,6 +226,7 @@ impl<'a, Hash: Encode, AuthorityId: Encode> Encode for DigestItemRef<'a, Hash, A #[cfg(test)] mod tests { use super::*; + use substrate_primitives::hash::H512 as Signature; #[test] fn should_serialize_digest() { diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index 5d58bd6c33bb9..91fc8f3faf904 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -17,12 +17,12 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use crate::codec::{Decode, Encode}; -use substrate_primitives::H256; +use substrate_primitives::{H256, H512}; use super::DigestItem; #[test] fn system_digest_item_encoding() { - let item = DigestItem::AuthoritiesChange::(vec![10, 20, 30]); + let item = DigestItem::AuthoritiesChange::(vec![10, 20, 30]); let encoded = item.encode(); assert_eq!(encoded, vec![ // type = DigestItemType::AuthoritiesChange @@ -35,13 +35,13 @@ fn system_digest_item_encoding() { 30, 0, 0, 0, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } #[test] fn non_system_digest_item_encoding() { - let item = DigestItem::Other::(vec![10, 20, 30]); + let item = DigestItem::Other::(vec![10, 20, 30]); let encoded = item.encode(); assert_eq!(encoded, vec![ // type = DigestItemType::Other @@ -52,6 +52,6 @@ fn non_system_digest_item_encoding() { 10, 20, 30, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index a06f3fc1b0017..953568e57bc7a 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -30,7 +30,7 @@ pub use serde_derive; pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; use rstd::prelude::*; -use substrate_primitives::hash::{H256, H512}; +use substrate_primitives::{ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; #[cfg(feature = "std")] @@ -251,39 +251,64 @@ impl From> for Perbill { } } -/// Ed25519 signature verify. -#[derive(Eq, PartialEq, Clone, Default, Encode, Decode)] +/// Signature verify that can work with any known signature types.. +#[derive(Eq, PartialEq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum MultiSignature { + /// An Ed25519 signature. + Ed25519(ed25519::Signature), + /// An Sr25519 signature. + Sr25519(sr25519::Signature), +} + +impl Default for MultiSignature { + fn default() -> Self { + MultiSignature::Ed25519(Default::default()) + } +} + +/// Public key for any known crypto algorithm. +#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Ed25519Signature(pub H512); +pub enum MultiSigner { + /// An Ed25519 identity. + Ed25519(ed25519::Public), + /// An Sr25519 identity. + Sr25519(sr25519::Public), +} -impl Verify for Ed25519Signature { - type Signer = H256; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify((self.0).as_fixed_bytes(), msg.get(), &signer.as_bytes()) +impl Default for MultiSigner { + fn default() -> Self { + MultiSigner::Ed25519(Default::default()) } } -impl From for Ed25519Signature { - fn from(h: H512) -> Ed25519Signature { - Ed25519Signature(h) +impl Verify for MultiSignature { + type Signer = MultiSigner; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { + match (self, signer) { + (MultiSignature::Ed25519(ref sig), &MultiSigner::Ed25519(ref who)) => sig.verify(msg, who), + (MultiSignature::Sr25519(ref sig), &MultiSigner::Sr25519(ref who)) => sig.verify(msg, who), + _ => false, + } } } -/// Sr25519 signature verify. +/// Signature verify that can work with any known signature types.. #[derive(Eq, PartialEq, Clone, Default, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Sr25519Signature(pub H512); +pub struct AnySignature(H512); -impl Verify for Sr25519Signature { - type Signer = H256; - fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { - runtime_io::sr25519_verify((self.0).as_fixed_bytes(), msg.get(), &signer.as_bytes()) - } -} +/// Public key for any known crypto algorithm. +#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Default, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct AnySigner(H256); -impl From for Sr25519Signature { - fn from(h: H512) -> Sr25519Signature { - Sr25519Signature(h) +impl Verify for AnySignature { + type Signer = AnySigner; + fn verify>(&self, mut msg: L, signer: &AnySigner) -> bool { + runtime_io::sr25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0.as_bytes()) || + runtime_io::ed25519_verify(self.0.as_fixed_bytes(), msg.get(), &signer.0.as_bytes()) } } @@ -581,7 +606,7 @@ impl traits::Extrinsic for OpaqueExtrinsic { #[cfg(test)] mod tests { - use substrate_primitives::hash::H256; + use substrate_primitives::hash::{H256, H512}; use crate::codec::{Encode, Decode}; use crate::traits::DigestItem; @@ -616,7 +641,7 @@ mod tests { } impl_outer_log! { - pub enum Log(InternalLog: DigestItem) for Runtime { + pub enum Log(InternalLog: DigestItem) for Runtime { a(AuthoritiesChange), b() } } @@ -636,16 +661,16 @@ mod tests { assert_eq!(auth_change, decoded_auth_change); // interpret regular item using `generic::DigestItem` - let generic_b1: super::generic::DigestItem = Decode::decode(&mut &encoded_b1[..]).unwrap(); + let generic_b1: super::generic::DigestItem = Decode::decode(&mut &encoded_b1[..]).unwrap(); match generic_b1 { super::generic::DigestItem::Other(_) => (), _ => panic!("unexpected generic_b1: {:?}", generic_b1), } // interpret system item using `generic::DigestItem` - let generic_auth_change: super::generic::DigestItem = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); + let generic_auth_change: super::generic::DigestItem = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); match generic_auth_change { - super::generic::DigestItem::AuthoritiesChange::(authorities) => assert_eq!(authorities, vec![100, 200, 300]), + super::generic::DigestItem::AuthoritiesChange::(authorities) => assert_eq!(authorities, vec![100, 200, 300]), _ => panic!("unexpected generic_auth_change: {:?}", generic_auth_change), } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index 96a10363aacd0..2711c0e623d62 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -24,30 +24,30 @@ use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; use crate::generic::DigestItem as GenDigestItem; - -pub use substrate_primitives::{H256, Ed25519AuthorityId}; +pub use substrate_primitives::H256; use substrate_primitives::U256; +use substrate_primitives::ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct UintAuthorityId(pub u64); -impl Into for UintAuthorityId { - fn into(self) -> Ed25519AuthorityId { +impl Into for UintAuthorityId { + fn into(self) -> AuthorityId { let bytes: [u8; 32] = U256::from(self.0).into(); - Ed25519AuthorityId(bytes) + AuthorityId(bytes) } } /// Converter between u64 and the AuthorityId wrapper type. pub struct ConvertUintAuthorityId; -impl Convert for ConvertUintAuthorityId { - fn convert(a: u64) -> UintAuthorityId { - UintAuthorityId(a) +impl Convert> for ConvertUintAuthorityId { + fn convert(a: u64) -> Option { + Some(UintAuthorityId(a)) } } /// Digest item -pub type DigestItem = GenDigestItem; +pub type DigestItem = GenDigestItem; /// Header Digest #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index b05f1a38da264..e5a58850e747c 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -55,6 +55,20 @@ pub trait Verify { fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } +impl Verify for substrate_primitives::ed25519::Signature { + type Signer = substrate_primitives::ed25519::Public; + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + runtime_io::ed25519_verify(self.as_ref(), msg.get(), signer) + } +} + +impl Verify for substrate_primitives::sr25519::Signature { + type Signer = substrate_primitives::sr25519::Public; + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + runtime_io::sr25519_verify(self.as_ref(), msg.get(), signer) + } +} + /// Some sort of check on the origin is performed by this object. pub trait EnsureOrigin { /// A return type. @@ -134,6 +148,16 @@ pub trait Convert { fn convert(a: A) -> B; } +impl Convert for () { + fn convert(_: A) -> B { Default::default() } +} + +/// A structure that performs identity conversion. +pub struct Identity; +impl Convert for Identity { + fn convert(a: T) -> T { a } +} + /// Simple trait similar to `Into`, except that it can be used to convert numerics between each /// other. pub trait As { @@ -161,15 +185,6 @@ macro_rules! impl_numerics { impl_numerics!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize); -/// A structure that performs identity conversion. -pub struct Identity; -impl Convert for Identity { - fn convert(a: T) -> T { a } -} -impl Convert for () { - fn convert(_: T) -> () { () } -} - /// A meta trait for arithmetic. pub trait SimpleArithmetic: Zero + One + IntegerSquareRoot + As + diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 2eb63f9f35cdd..abfde7ee7b9e0 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -26,7 +26,7 @@ use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root, is_child_trie_key_valid}; use heapsize::HeapSizeOf; -const EXT_NOT_ALLOWED_TO_FAIL: &'static str = "Externalities not allowed to fail within runtime"; +const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; /// Errors that can occur when interacting with the externalities. #[derive(Debug, Copy, Clone)] diff --git a/core/test-client/src/block_builder_ext.rs b/core/test-client/src/block_builder_ext.rs index 17a96cfa271a8..e427b5789291e 100644 --- a/core/test-client/src/block_builder_ext.rs +++ b/core/test-client/src/block_builder_ext.rs @@ -17,7 +17,7 @@ //! Block Builder extensions for tests. use client; -use keyring; +use super::AccountKeyring; use runtime; use runtime_primitives::traits::ProvideRuntimeApi; use client::block_builder::api::BlockBuilder; @@ -38,9 +38,8 @@ impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime: } fn sign_tx(transfer: runtime::Transfer) -> runtime::Extrinsic { - let signature = keyring::Keyring::from_raw_public(transfer.from.to_fixed_bytes()) + let signature = AccountKeyring::from_public(&transfer.from) .unwrap() - .sign(&parity_codec::Encode::encode(&transfer)) - .into(); + .sign(&parity_codec::Encode::encode(&transfer)); runtime::Extrinsic::Transfer(transfer, signature) } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 34a17d3301911..6eb6db4d4bcea 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -29,9 +29,9 @@ pub use client::ExecutionStrategies; pub use client::blockchain; pub use client::backend; pub use executor::NativeExecutor; -pub use keyring; pub use runtime; pub use consensus; +pub use keyring::{AuthorityKeyring, AccountKeyring}; use std::sync::Arc; use futures::future::FutureResult; @@ -39,7 +39,6 @@ use primitives::Blake2Hasher; use runtime_primitives::StorageOverlay; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor}; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use keyring::Keyring; use state_machine::ExecutionStrategy; use client::LocalCallExecutor; @@ -165,10 +164,16 @@ pub fn new_with_backend( fn genesis_config(support_changes_trie: bool) -> GenesisConfig { GenesisConfig::new(support_changes_trie, vec![ - Keyring::Alice.to_raw_public().into(), - Keyring::Bob.to_raw_public().into(), - Keyring::Charlie.to_raw_public().into(), - ], 1000) + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Bob.into(), + AuthorityKeyring::Charlie.into(), + ], vec![ + AccountKeyring::Alice.into(), + AccountKeyring::Bob.into(), + AccountKeyring::Charlie.into(), + ], + 1000 + ) } fn genesis_storage(support_changes_trie: bool) -> StorageOverlay { diff --git a/core/test-client/src/trait_tests.rs b/core/test-client/src/trait_tests.rs index b678d83fdb5d8..aa51f7d8bf9e3 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-client/src/trait_tests.rs @@ -20,10 +20,9 @@ #![allow(missing_docs)] use std::sync::Arc; -use keyring::Keyring; use consensus::BlockOrigin; use primitives::Blake2Hasher; -use crate::TestClient; +use crate::{TestClient, AccountKeyring}; use runtime_primitives::traits::Block as BlockT; use crate::backend; use crate::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; @@ -88,8 +87,8 @@ pub fn test_leaves_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 41, nonce: 0, }).unwrap(); @@ -117,8 +116,8 @@ pub fn test_leaves_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 1, }).unwrap(); @@ -132,8 +131,8 @@ pub fn test_leaves_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 0, }).unwrap(); @@ -180,8 +179,8 @@ pub fn test_children_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 41, nonce: 0, }).unwrap(); @@ -200,8 +199,8 @@ pub fn test_children_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 1, }).unwrap(); @@ -212,8 +211,8 @@ pub fn test_children_for_backend(backend: Arc) where let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Ferdie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Ferdie.into(), amount: 1, nonce: 0, }).unwrap(); @@ -269,8 +268,8 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc(backend: Arc(backend: Arc, - pub authorities: Vec, - pub balances: Vec<(Ed25519AuthorityId, u64)>, + pub authorities: Vec, + pub balances: Vec<(AccountId, u64)>, } impl GenesisConfig { - pub fn new_simple(authorities: Vec, balance: u64) -> Self { - Self::new(false, authorities, balance) - } - - pub fn new(support_changes_trie: bool, authorities: Vec, balance: u64) -> Self { + pub fn new(support_changes_trie: bool, authorities: Vec, endowed_accounts: Vec, balance: u64) -> Self { GenesisConfig { changes_trie_config: match support_changes_trie { true => Some(super::changes_trie_config()), false => None, }, authorities: authorities.clone(), - balances: authorities.into_iter().map(|a| (a, balance)).collect(), + balances: endowed_accounts.into_iter().map(|a| (a, balance)).collect(), } } pub fn genesis_map(&self) -> HashMap, Vec> { let wasm_runtime = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm").to_vec(); let mut map: HashMap, Vec> = self.balances.iter() - .map(|&(account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) + .map(|&(ref account, balance)| (account.to_keyed_vec(b"balance:"), vec![].and(&balance))) .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ (well_known_keys::CODE.into(), wasm_runtime), diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 59b56e3e0f084..b345c06e6cb4e 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -29,7 +29,7 @@ use substrate_client::{ impl_runtime_apis, }; use runtime_primitives::{ - ApplyResult, Ed25519Signature, transaction_validity::TransactionValidity, + ApplyResult, transaction_validity::TransactionValidity, create_runtime_str, traits::{ BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT, @@ -38,7 +38,7 @@ use runtime_primitives::{ }; use runtime_version::RuntimeVersion; pub use primitives::hash::H256; -use primitives::{Ed25519AuthorityId, OpaqueMetadata}; +use primitives::{ed25519, sr25519, OpaqueMetadata}; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; use inherents::{CheckInherentsResult, InherentData}; @@ -81,8 +81,8 @@ pub struct Transfer { #[derive(Clone, PartialEq, Eq, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum Extrinsic { - AuthoritiesChange(Vec), - Transfer(Transfer, Ed25519Signature), + AuthoritiesChange(Vec), + Transfer(Transfer, AccountSignature), } #[cfg(feature = "std")] @@ -125,8 +125,14 @@ impl Extrinsic { } } +// The identity type used by authorities. +pub type AuthorityId = ed25519::Public; +// The signature type used by authorities. +pub type AuthoritySignature = ed25519::Signature; /// An identifier for an account on this system. -pub type AccountId = H256; +pub type AccountId = sr25519::Public; +// The signature type used by accounts/transactions. +pub type AccountSignature = sr25519::Signature; /// A simple hash type for all our hashing. pub type Hash = H256; /// The block number type used in this runtime. @@ -134,7 +140,7 @@ pub type BlockNumber = u64; /// Index of a transaction. pub type Index = u64; /// The item of a block digest. -pub type DigestItem = runtime_primitives::generic::DigestItem; +pub type DigestItem = runtime_primitives::generic::DigestItem; /// The digest of a block. pub type Digest = runtime_primitives::generic::Digest; /// A test block. @@ -256,7 +262,7 @@ cfg_if! { version() } - fn authorities() -> Vec { + fn authorities() -> Vec { system::authorities() } @@ -347,7 +353,7 @@ cfg_if! { version() } - fn authorities() -> Vec { + fn authorities() -> Vec { system::authorities() } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index bfa5de70d0de7..f1e04473ece18 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -26,8 +26,8 @@ use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; -use primitives::{Ed25519AuthorityId, Blake2Hasher}; -use primitives::storage::well_known_keys; +use primitives::{Blake2Hasher, storage::well_known_keys}; +use primitives::ed25519::Public as AuthorityId; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -37,7 +37,7 @@ storage_items! { // The current block number being processed. Set by `execute_block`. Number: b"sys:num" => required BlockNumber; ParentHash: b"sys:pha" => required Hash; - NewAuthorities: b"sys:new_auth" => Vec; + NewAuthorities: b"sys:new_auth" => Vec; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -53,7 +53,7 @@ pub fn nonce_of(who: AccountId) -> u64 { } /// Get authorities ar given block. -pub fn authorities() -> Vec { +pub fn authorities() -> Vec { let len: u32 = storage::unhashed::get(well_known_keys::AUTHORITY_COUNT) .expect("There are always authorities in test-runtime"); (0..len) @@ -71,6 +71,36 @@ pub fn initialise_block(header: &Header) { } /// Actually execute all transitioning for `block`. +pub fn polish_block(block: &mut Block) { + let header = &mut block.header; + + // check transaction trie root represents the transactions. + let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let txs_root = enumerated_trie_root::(&txs).into(); + info_expect_equal_hash(&txs_root, &header.extrinsics_root); + header.extrinsics_root = txs_root; + + // execute transactions + block.extrinsics.iter().enumerate().for_each(|(i, e)| { + storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); + execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); + storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); + }); + + header.state_root = storage_root().into(); + + // check digest + let mut digest = Digest::default(); + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); + } + if let Some(new_authorities) = ::take() { + digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + } + header.digest = digest; +} + pub fn execute_block(block: Block) { let ref header = block.header; @@ -83,9 +113,9 @@ pub fn execute_block(block: Block) { // execute transactions block.extrinsics.iter().enumerate().for_each(|(i, e)| { - storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - execute_transaction_backend(e).map_err(|_| ()).expect("Extrinsic error"); - storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); + storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); + execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); + storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); }); // check storage root. @@ -122,7 +152,7 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { } let hash = |from: &AccountId, nonce: u64| { - twox_128(&nonce.to_keyed_vec(from.as_bytes())).to_vec() + twox_128(&nonce.to_keyed_vec(&from.encode())).to_vec() }; let requires = if tx.nonce != expected_nonce && tx.nonce > 0 { let mut deps = Vec::new(); @@ -144,7 +174,6 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { } } - /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn execute_transaction(utx: Extrinsic) -> ApplyResult { @@ -225,8 +254,8 @@ fn execute_transfer_backend(tx: &Transfer) -> ApplyResult { Ok(ApplyOutcome::Success) } -fn execute_new_authorities_backend(new_authorities: &[Ed25519AuthorityId]) -> ApplyResult { - let new_authorities: Vec = new_authorities.iter().cloned().collect(); +fn execute_new_authorities_backend(new_authorities: &[AuthorityId]) -> ApplyResult { + let new_authorities: Vec = new_authorities.iter().cloned().collect(); ::put(new_authorities); Ok(ApplyOutcome::Success) } @@ -258,12 +287,11 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use parity_codec::{Joiner, KeyedVec}; - use keyring::Keyring; - use crate::{Header, Digest, Extrinsic, Transfer}; + use substrate_test_client::{AuthorityKeyring, AccountKeyring}; + use crate::{Header, Extrinsic, Transfer}; use primitives::{Blake2Hasher, map}; use primitives::storage::well_known_keys; use substrate_executor::WasmExecutor; - use hex_literal::{hex, hex_impl}; const WASM_CODE: &'static [u8] = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"); @@ -272,36 +300,34 @@ mod tests { TestExternalities::new(map![ twox_128(b"latest").to_vec() => vec![69u8; 32], twox_128(well_known_keys::AUTHORITY_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => Keyring::Alice.to_raw_public().to_vec(), - twox_128(&1u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => Keyring::Bob.to_raw_public().to_vec(), - twox_128(&2u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => Keyring::Charlie.to_raw_public().to_vec(), - twox_128(&Keyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&0u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Alice.to_raw_public().to_vec(), + twox_128(&1u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Bob.to_raw_public().to_vec(), + twox_128(&2u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Charlie.to_raw_public().to_vec(), + twox_128(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ]) } fn construct_signed_tx(tx: Transfer) -> Extrinsic { - let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); + let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); Extrinsic::Transfer(tx, signature) } fn block_import_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { - let mut t = new_test_ext(); - let h = Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("e51369d0b37e4aa1383f1e7a34c2eec75f18ee6b4b199a440f4f2456906e0eb7").into(), - extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), - digest: Digest { logs: vec![], }, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), }; - - let b = Block { + let mut b = Block { header: h, extrinsics: vec![], }; - block_executor(b, &mut t); + with_externalities(&mut new_test_ext(), || polish_block(&mut b)); + block_executor(b, &mut new_test_ext()); } #[test] @@ -321,69 +347,74 @@ mod tests { } fn block_import_with_transaction_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 111); - assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 0); - }); - - let b = Block { + let mut b1 = Block { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("f61a14ce70846cd6a1714bbe1b63b2ca1172df1c8c01adfd798bb08bd30dc486").into(), - extrinsics_root: hex!("198205cb7729fec8ccdc2e58571a4858586a4f305898078e0e8bee1dddea7e4b").into(), - digest: Digest { logs: vec![], }, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), }, extrinsics: vec![ construct_signed_tx(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Bob.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Bob.into(), amount: 69, nonce: 0, }) ], }; - with_externalities(&mut t, || { - execute_block(b.clone()); + let mut dummy_ext = new_test_ext(); + with_externalities(&mut dummy_ext, || polish_block(&mut b1)); - assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 42); - assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 69); - }); - - let b = Block { + let mut b2 = Block { header: Header { - parent_hash: b.header.hash(), + parent_hash: b1.header.hash(), number: 2, - state_root: hex!("a47383d9a5d6c8c7531386abccdf512c76729a1a19c59b6c2e4f95dde419923a").into(), - extrinsics_root: hex!("041fa8971dda28745967179a9f39e3ca1a595c510682105df1cff74ae6f05e0d").into(), - digest: Digest { logs: vec![], }, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), }, extrinsics: vec![ construct_signed_tx(Transfer { - from: Keyring::Bob.to_raw_public().into(), - to: Keyring::Alice.to_raw_public().into(), + from: AccountKeyring::Bob.into(), + to: AccountKeyring::Alice.into(), amount: 27, nonce: 0, }), construct_signed_tx(Transfer { - from: Keyring::Alice.to_raw_public().into(), - to: Keyring::Charlie.to_raw_public().into(), + from: AccountKeyring::Alice.into(), + to: AccountKeyring::Charlie.into(), amount: 69, nonce: 1, }), ], }; - block_executor(b, &mut t); + with_externalities(&mut dummy_ext, || polish_block(&mut b2)); + drop(dummy_ext); + + let mut t = new_test_ext(); with_externalities(&mut t, || { + assert_eq!(balance_of(AccountKeyring::Alice.into()), 111); + assert_eq!(balance_of(AccountKeyring::Bob.into()), 0); + }); + + block_executor(b1, &mut t); - assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 0); - assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 42); - assert_eq!(balance_of(Keyring::Charlie.to_raw_public().into()), 69); + with_externalities(&mut t, || { + assert_eq!(balance_of(AccountKeyring::Alice.into()), 42); + assert_eq!(balance_of(AccountKeyring::Bob.into()), 69); + }); + + block_executor(b2, &mut t); + + with_externalities(&mut t, || { + assert_eq!(balance_of(AccountKeyring::Alice.into()), 0); + assert_eq!(balance_of(AccountKeyring::Bob.into()), 42); + assert_eq!(balance_of(AccountKeyring::Charlie.into()), 69); }); } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index fdba699543195..a5b87b4436956 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1,5 +1,13 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "arrayref" version = "0.3.5" @@ -481,6 +489,11 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hex-literal" version = "0.1.3" @@ -651,6 +664,11 @@ name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "memchr" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memoffset" version = "0.2.1" @@ -1120,6 +1138,26 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "regex" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ring" version = "0.14.6" @@ -1159,7 +1197,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "schnorrkel" version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1168,6 +1206,7 @@ dependencies = [ "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1441,11 +1480,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "substrate-bip39" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1561,19 +1600,21 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", - "substrate-bip39 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1947,6 +1988,11 @@ name = "typenum" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "uint" version = "0.6.1" @@ -1994,6 +2040,11 @@ dependencies = [ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "vcpkg" version = "0.2.6" @@ -2066,6 +2117,7 @@ dependencies = [ ] [metadata] +"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" @@ -2127,6 +2179,7 @@ dependencies = [ "checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" @@ -2149,6 +2202,7 @@ dependencies = [ "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" @@ -2201,12 +2255,14 @@ dependencies = [ "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" +"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" -"checksum schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe554f318830b48e5da8ab1ccb1ffd02b79228364dac7766b7cd1ec461ca5116" +"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" @@ -2226,7 +2282,7 @@ dependencies = [ "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum substrate-bip39 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec6183ce9e04bec5f113ff19c8ef5355dad20a4196134b5402732bf5d3c1a351" +"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" "checksum syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)" = "525bd55255f03c816e5d7f615587bd13030c7103354fadb104993dcee6a788ec" @@ -2254,12 +2310,14 @@ dependencies = [ "checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" diff --git a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 416fd30a5c971c184c502c7a6bdf316dfd633f8c..ff8a7a70c368b615d3f6f7a602c91497024ce30b 100644 GIT binary patch delta 13250 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 delta 12126 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 -> Result>, Self::Error> { Ok(match at { - BlockId::Number(num) => Some(H256::from_low_u64_be(*num)), + BlockId::Number(num) => Some(H256::from_low_u64_be(*num)).into(), BlockId::Hash(_) => None, }) } @@ -502,7 +502,7 @@ mod tests { fn hash_and_length(&self, uxt: &ExtrinsicFor) -> (Self::Hash, usize) { let len = uxt.encode().len(); ( - (uxt.transfer().from.to_low_u64_be() << 5) + uxt.transfer().nonce, + (H256::from(uxt.transfer().from.clone()).to_low_u64_be() << 5) + uxt.transfer().nonce, len ) } @@ -524,8 +524,8 @@ mod tests { // when let hash = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); @@ -539,8 +539,8 @@ mod tests { // given let pool = pool(); let uxt = uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, }); @@ -564,21 +564,21 @@ mod tests { // when let _hash = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); let _hash = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 1, })).unwrap(); // future doesn't count let _hash = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 3, })).unwrap(); @@ -600,20 +600,20 @@ mod tests { // given let pool = pool(); let hash1 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); let hash2 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 1, })).unwrap(); let hash3 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 3, })).unwrap(); @@ -636,8 +636,8 @@ mod tests { // given let pool = pool(); let hash1 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); @@ -662,8 +662,8 @@ mod tests { }, TestApi::default()); let hash1 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 1, })).unwrap(); @@ -671,8 +671,8 @@ mod tests { // when let hash2 = pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(2), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(2)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 10, })).unwrap(); @@ -697,8 +697,8 @@ mod tests { // when pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 1, })).unwrap_err(); @@ -717,8 +717,8 @@ mod tests { // given let pool = pool(); let watcher = pool.submit_and_watch(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); @@ -733,7 +733,7 @@ mod tests { // then let mut stream = watcher.into_stream().wait(); assert_eq!(stream.next(), Some(Ok(watcher::Status::Ready))); - assert_eq!(stream.next(), Some(Ok(watcher::Status::Finalised(H256::from_low_u64_be(2))))); + assert_eq!(stream.next(), Some(Ok(watcher::Status::Finalised(H256::from_low_u64_be(2).into())))); assert_eq!(stream.next(), None); } @@ -742,8 +742,8 @@ mod tests { // given let pool = pool(); let watcher = pool.submit_and_watch(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); @@ -758,7 +758,7 @@ mod tests { // then let mut stream = watcher.into_stream().wait(); assert_eq!(stream.next(), Some(Ok(watcher::Status::Ready))); - assert_eq!(stream.next(), Some(Ok(watcher::Status::Finalised(H256::from_low_u64_be(2))))); + assert_eq!(stream.next(), Some(Ok(watcher::Status::Finalised(H256::from_low_u64_be(2).into())))); assert_eq!(stream.next(), None); } @@ -767,8 +767,8 @@ mod tests { // given let pool = pool(); let watcher = pool.submit_and_watch(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 1, })).unwrap(); @@ -777,8 +777,8 @@ mod tests { // when pool.submit_one(&BlockId::Number(0), uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, })).unwrap(); @@ -795,8 +795,8 @@ mod tests { // given let pool = pool(); let uxt = uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, }); @@ -819,8 +819,8 @@ mod tests { // given let pool = pool(); let uxt = uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, }); @@ -853,8 +853,8 @@ mod tests { }, TestApi::default()); let xt = uxt(Transfer { - from: H256::from_low_u64_be(1), - to: H256::from_low_u64_be(2), + from: AccountId::from_h256(H256::from_low_u64_be(1)), + to: AccountId::from_h256(H256::from_low_u64_be(2)), amount: 5, nonce: 0, }); @@ -863,8 +863,8 @@ mod tests { // when let xt = uxt(Transfer { - from: H256::from_low_u64_be(2), - to: H256::from_low_u64_be(1), + from: AccountId::from_h256(H256::from_low_u64_be(2)), + to: AccountId::from_h256(H256::from_low_u64_be(1)), amount: 4, nonce: 1, }); diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index e7a0f03339bbc..cab44f49cc79c 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -17,10 +17,9 @@ use super::*; -use keyring::Keyring::{self, *}; use parity_codec::Encode; use txpool::{self, Pool}; -use test_client::runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}; +use test_client::{runtime::{AccountId, Block, Hash, Index, Extrinsic, Transfer}, AccountKeyring::{self, *}}; use sr_primitives::{ generic::{self, BlockId}, traits::{Hash as HashT, BlakeTwo256}, @@ -86,9 +85,9 @@ fn number_of(at: &BlockId) -> u64 { } } -fn uxt(who: Keyring, nonce: Index) -> Extrinsic { +fn uxt(who: AccountKeyring, nonce: Index) -> Extrinsic { let transfer = Transfer { - from: who.to_raw_public().into(), + from: who.into(), to: AccountId::default(), nonce, amount: 1, diff --git a/node-template/build.rs b/node-template/build.rs index d30f13c0c9d79..afc39d3b63c5e 100644 --- a/node-template/build.rs +++ b/node-template/build.rs @@ -1,6 +1,6 @@ use vergen::{ConstantsFlags, generate_cargo_keys}; -const ERROR_MSG: &'static str = "Failed to generate metadata files"; +const ERROR_MSG: &str = "Failed to generate metadata files"; fn main() { generate_cargo_keys(ConstantsFlags::all()).expect(ERROR_MSG); diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index fd696e9500a85..f46f8df249b6d 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -11,10 +11,10 @@ use parity_codec::{Encode, Decode}; use rstd::prelude::*; #[cfg(feature = "std")] use primitives::bytes; -use primitives::{Ed25519AuthorityId, OpaqueMetadata}; +use primitives::{ed25519, OpaqueMetadata}; use runtime_primitives::{ - ApplyResult, transaction_validity::TransactionValidity, Ed25519Signature, generic, - traits::{self, BlakeTwo256, Block as BlockT, StaticLookup}, create_runtime_str + ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, + traits::{self, BlakeTwo256, Block as BlockT, StaticLookup, Verify} }; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, @@ -34,8 +34,17 @@ pub use runtime_primitives::{Permill, Perbill}; pub use timestamp::BlockPeriod; pub use support::{StorageValue, construct_runtime}; -/// Alias to Ed25519 pubkey that identifies an account on the chain. -pub type AccountId = primitives::H256; +/// The type that is used for identifying authorities. +pub type AuthorityId = ::Signer; + +/// The type used by authorities to prove their ID. +pub type AuthoritySignature = ed25519::Signature; + +/// Alias to pubkey that identifies an account on the chain. +pub type AccountId = ::Signer; + +/// The type used by authorities to prove their ID. +pub type AccountSignature = ed25519::Signature; /// A hash of some data used by the chain. pub type Hash = primitives::H256; @@ -66,13 +75,13 @@ pub mod opaque { } } /// Opaque block header type. - pub type Header = generic::Header>; + pub type Header = generic::Header>; /// Opaque block type. pub type Block = generic::Block; /// Opaque block identifier type. pub type BlockId = generic::BlockId; /// Opaque session key type. - pub type SessionKey = Ed25519AuthorityId; + pub type SessionKey = AuthorityId; } /// This runtime version. @@ -125,7 +134,7 @@ impl aura::Trait for Runtime { impl consensus::Trait for Runtime { /// The identifier we use to refer to authorities. - type SessionKey = Ed25519AuthorityId; + type SessionKey = AuthorityId; // The aura module handles offline-reports internally // rather than using an explicit report system. type InherentOfflineReport = (); @@ -179,7 +188,7 @@ impl template::Trait for Runtime { } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime with Log(InternalLog: DigestItem) where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic @@ -208,7 +217,7 @@ pub type Block = generic::Block; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; /// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; +pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. @@ -221,7 +230,7 @@ impl_runtime_apis! { VERSION } - fn authorities() -> Vec { + fn authorities() -> Vec { Consensus::authorities() } diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index bfcafe4e79233..98c611de64ec2 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1,5 +1,13 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "arrayref" version = "0.3.5" @@ -36,7 +44,7 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -53,7 +61,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitmask" version = "0.5.0" -source = "git+https://github.com/paritytech/bitmask#c2d8d196e30b018d1385be8357fdca61b978facf" +source = "git+https://github.com/paritytech/bitmask#a84e147be602631617badd18b6b9af83391db4a9" [[package]] name = "blake2-rfc" @@ -118,7 +126,7 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -141,7 +149,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -370,7 +378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -481,6 +489,11 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hex-literal" version = "0.1.3" @@ -651,6 +664,11 @@ name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "memchr" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memoffset" version = "0.2.1" @@ -832,7 +850,7 @@ name = "openssl-sys" version = "0.9.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -870,7 +888,7 @@ dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -919,7 +937,7 @@ dependencies = [ "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -976,7 +994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1154,12 +1172,32 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "regex" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1245,7 +1283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1357,7 +1395,7 @@ dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1594,7 +1632,7 @@ dependencies = [ "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 0.1.0", "srml-support-procedural-tools 0.1.0", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1605,7 +1643,7 @@ dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 0.1.0", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1614,7 +1652,7 @@ version = "0.1.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1780,11 +1818,13 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", @@ -1864,7 +1904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.27" +version = "0.15.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1879,7 +1919,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2137,6 +2177,11 @@ name = "typenum" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "uint" version = "0.6.1" @@ -2184,6 +2229,11 @@ dependencies = [ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "vcpkg" version = "0.2.6" @@ -2256,6 +2306,7 @@ dependencies = [ ] [metadata] +"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" @@ -2272,7 +2323,7 @@ dependencies = [ "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" +"checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" @@ -2317,6 +2368,7 @@ dependencies = [ "checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" @@ -2339,6 +2391,7 @@ dependencies = [ "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" @@ -2391,6 +2444,8 @@ dependencies = [ "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" +"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" @@ -2420,7 +2475,7 @@ dependencies = [ "checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)" = "525bd55255f03c816e5d7f615587bd13030c7103354fadb104993dcee6a788ec" +"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" @@ -2445,12 +2500,14 @@ dependencies = [ "checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" diff --git a/node-template/src/chain_spec.rs b/node-template/src/chain_spec.rs index b9f61e45f546b..fa5b44c65a02b 100644 --- a/node-template/src/chain_spec.rs +++ b/node-template/src/chain_spec.rs @@ -1,10 +1,13 @@ -use primitives::{Ed25519AuthorityId, ed25519}; +use primitives::{ed25519, Pair}; use node_template_runtime::{ AccountId, GenesisConfig, ConsensusConfig, TimestampConfig, BalancesConfig, SudoConfig, IndicesConfig, FeesConfig, }; +use substrate_cli::DEV_PHRASE; use substrate_service; +use ed25519::Public as AuthorityId; + // Note this is the URL for the telemetry server //const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -22,6 +25,18 @@ pub enum Alternative { LocalTestnet, } +fn authority_key(s: &str) -> AuthorityId { + ed25519::Pair::from_string(&format!("{}//{}", DEV_PHRASE, s), None) + .expect("static values are valid; qed") + .public() +} + +fn account_key(s: &str) -> AccountId { + ed25519::Pair::from_string(&format!("{}//{}", DEV_PHRASE, s), None) + .expect("static values are valid; qed") + .public() +} + impl Alternative { /// Get an actual chain config from one of the alternatives. pub(crate) fn load(self) -> Result { @@ -30,11 +45,11 @@ impl Alternative { "Development", "dev", || testnet_genesis(vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), + authority_key("Alice") ], vec![ - ed25519::Pair::from_seed(b"Alice ").public().0.into(), + account_key("Alice") ], - ed25519::Pair::from_seed(b"Alice ").public().0.into() + account_key("Alice") ), vec![], None, @@ -46,17 +61,17 @@ impl Alternative { "Local Testnet", "local_testnet", || testnet_genesis(vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), - ed25519::Pair::from_seed(b"Bob ").public().into(), + authority_key("Alice"), + authority_key("Bob"), ], vec![ - ed25519::Pair::from_seed(b"Alice ").public().0.into(), - ed25519::Pair::from_seed(b"Bob ").public().0.into(), - ed25519::Pair::from_seed(b"Charlie ").public().0.into(), - ed25519::Pair::from_seed(b"Dave ").public().0.into(), - ed25519::Pair::from_seed(b"Eve ").public().0.into(), - ed25519::Pair::from_seed(b"Ferdie ").public().0.into(), + account_key("Alice"), + account_key("Bob"), + account_key("Charlie"), + account_key("Dave"), + account_key("Eve"), + account_key("Ferdie"), ], - ed25519::Pair::from_seed(b"Alice ").public().0.into() + account_key("Alice"), ), vec![], None, @@ -76,7 +91,7 @@ impl Alternative { } } -fn testnet_genesis(initial_authorities: Vec, endowed_accounts: Vec, root_key: AccountId) -> GenesisConfig { +fn testnet_genesis(initial_authorities: Vec, endowed_accounts: Vec, root_key: AccountId) -> GenesisConfig { GenesisConfig { consensus: Some(ConsensusConfig { code: include_bytes!("../runtime/wasm/target/wasm32-unknown-unknown/release/node_template_runtime_wasm.compact.wasm").to_vec(), @@ -93,7 +108,7 @@ fn testnet_genesis(initial_authorities: Vec, endowed_account existential_deposit: 500, transfer_fee: 0, creation_fee: 0, - balances: endowed_accounts.iter().map(|&k|(k, (1 << 60))).collect(), + balances: endowed_accounts.iter().cloned().map(|k|(k, 1 << 60)).collect(), vesting: vec![], }), sudo: Some(SudoConfig { diff --git a/node-template/src/service.rs b/node-template/src/service.rs index cc51fba51c3f4..1bb97256aea70 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -15,7 +15,7 @@ use basic_authorship::ProposerFactory; use node_executor; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; use substrate_client as client; -use primitives::ed25519::Pair; +use primitives::{ed25519::Pair, Pair as _Pair}; use inherents::InherentDataProviders; use network::construct_simple_protocol; use substrate_executor::native_executor_instance; diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 27441a9ecc210..784dcf5a75d59 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,7 +16,7 @@ //! Substrate chain configurations. -use primitives::{Ed25519AuthorityId as AuthorityId, ed25519}; +use primitives::{ed25519::Public as AuthorityId, ed25519, sr25519, Pair, crypto::UncheckedInto}; use node_primitives::AccountId; use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, SessionConfig, StakingConfig, TimestampConfig, BalancesConfig, TreasuryConfig, @@ -24,9 +24,8 @@ use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, Dem pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::{hex, hex_impl}; - -use substrate_keystore::pad_seed; use substrate_telemetry::TelemetryEndpoints; +use cli::DEV_PHRASE; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -40,25 +39,30 @@ pub fn dried_danta_config() -> Result { fn staging_testnet_config_genesis() -> GenesisConfig { // stash, controller, session-key + // generated with secret: + // for i in 1 2 3 4 ; do for j in stash controller; do subkey -p danta-$i-$j restore $secret; done; done + // and + // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 -p danta-$i-$j restore $secret; done; done let initial_authorities: Vec<(AccountId, AccountId, AuthorityId)> = vec![( - hex!["fbecf7767fc63a6f9fa8094bbc5751d7269cd8e619cfdd9edfbe1fbc716b173e"].into(), // 5Hm2GcbuUct7sWX8d56zRktxr9D9Lw5hTFjSUhUoVHwFNmYW TODO: change once we switch to sr25519 - hex!["6ed35e632190b9c795f019030e6c5cff1508655db28c83577e0a4366c9bd5773"].into(), // 5Ea1uyGz6H5WHZhWvPDxxLXWyiUkzWDwx54Hcn8LJ5dbFawH TODO: change once we switch to sr25519 - hex!["82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5"].into(), + hex!["d807f8bd6b4b02b3db716dd5372960b094ed0e62b5704a07bc990130a642992b"].unchecked_into(), // 5GwxZv7LxSUQn89TLUaLi3oEWhFcabqW3nHcEg2J88gZNhrb + hex!["1a934af462454e512e22b5d9455c0c3c2df479b1c61406b3d990f6bc2eb25e09"].unchecked_into(), // 5CfYrg5cW8UebBdfJpJbKFhZLyk7yHWXUgdxZnSGb2dWKgpt + hex!["831fcce3a9565baf093b52568a8cb9875cb54974d80da8fc4f0cc767128a23e9"].unchecked_into(), // 5F2daQPHK7yv4Yuwyz3cggvvn1R5u1ofGMQ5LK5XvnfebMcX ),( - hex!["30b76ef977b84a575992ef52f561db315221123c68074269d3d51ce211c4a3dc"].into(), // 5DAaeTwVuyUmTyLBR5vKEDWeDJ75nhLutDuCJH58it7EHDM2 TODO: change once we switch to sr25519 - hex!["a270edf24cb2a472b0e913fc43bfd4da0ef337cc715eaf94073d5198f7659f0c"].into(), // 5FjhAKgzpuzt1dYWE7H7Jb1sEHSuG5hcyZdPtfX829gmFVXh TODO: change once we switch to sr25519 - hex!["4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7"].into(), + hex!["12652f26e427c56268095bb0ec5824471e37722b073a9fa5de61c61c1de94656"].unchecked_into(), // 5CUpn2JmpsWkHQjZgWjN3rqPEUnjjUQZYcMk14nbUgR2Gpab + hex!["5279e73e22971d729276ebad4eb6804d1b9c0c35bd32e8aba4513c674760a461"].unchecked_into(), // 5Dvqzke7Mdp3fP6Ysut7UXPSepPr3Qguys6LNkZGPSwXwAkR + hex!["dbe61640d854bb7bf83cbfaf638a8a4c76c49a919ec3bbdd86799061fc1903e4"].unchecked_into(), // 5H32hCtKf6nXSckviVhUvWb7N14wDCRunRkCM29mxEXwjcUZ ),( - hex!["7b9e79c1bfc71ad0c4389565c01e79269dc512cb9bd856489671662481355417"].into(), // 5ErnpkRUbmM3WdbQwnVwfZeYs3iKmggEQceyB9db9ft18dSn TODO: change once we switch to sr25519 - hex!["9ffec660c4d328306cf5e38faf4b132fb5c9f38287af95d9b25629fc29de3945"].into(), // 5FgV9vxNpdCXMUmHCLQcsN4mUUUG6ZpFuvAMrm5X4BUnFhie TODO: change once we switch to sr25519 - hex!["063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5"].into(), + hex!["a81d738fdeeaed440cfce5635e0820d0d23e89207cf66a62b8c0d2a968e37d32"].unchecked_into(), // 5Fs8ehAjDEnenDwULCPnEr3HVXgepAVfyk9ABW84NfxCYtWD + hex!["443a2c779a5f5dada8ee6921efec9673f67e5ce1bd6012899ff6c1adc437696c"].unchecked_into(), // 5DcAPqR269myKXhZmwbU1x2xLbuTojr85jHNRuDhrFdZ3vwi + hex!["5bc01f56225e8602372fb343dba65a73e20c55bdbb3b8343a8f34df298a616fb"].unchecked_into(), // 5E91HbY2xo2qDJzi3KY8nRXjDNAQE9WtmMaji6YRwT8DAuK1 ),( - hex!["7e58b096b95c4b3b271f27fedd9f2c51edd48b9d37046240e601180c9dcc8c27"].into(), // 5EvNEhYYd4b9giczuCo2o8bfLZoKW9jnTeUukfL1NWsAAeEx TODO: change once we switch to sr25519 - hex!["36dfc933bb0848d8addf16a961369b2e122633a5819a19e43c8142381a1280e3"].into(), // 5DJevPKpz4EEvmSpK7W6KemS3i5JYPq5FEuEewgRY2cZCxNg TODO: change once we switch to sr25519 - hex!["8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c"].into(), + hex!["e269e835e0bc07c497d55bc17c7bb29c85c5615f9e61582ffdeca7e5f5c66578"].unchecked_into(), // 5HBa95U5HDFCV1N5Xyrjti65F71tHRQcPbZBmkxRJ39SpqzM + hex!["3e9829e6fd4fc7501b504fc16f12177c6c7f38aeb3b8344efb9b15ee85118b2c"].unchecked_into(), // 5DUn2afs2QevZ6PrGu8snrt76157oacH6JXUD8JNM18VKMwK + hex!["0fd673ee5e95ed124bcd71463ff924c810573dad91527ab9d2b5af36f66ff84b"].unchecked_into(), // 5CRUHGLA1JYe2v4p479VCHybqjB9uBXjGkJ2npdduVdrTuUM )]; + // generated with secret: subkey -p danta-root restore $secret let endowed_accounts: Vec = vec![ - hex!["f295940fa750df68a686fcf4abd4111c8a9c5a5a5a83c4c8639c451a94a7adfd"].into(), // 5HYmsxGRAmZMjyZYmf7uGPL2YDQGHEt6NjGrfUuxNEgeGBRN TODO: change once we switch to sr25519 + hex!["343df6f04ffae0840f214f6cb0da00b612c7e9347f980e7afafc520582f79136"].unchecked_into(), // 5DFCkiP9vky31C1ZP3LpuQYinLAFwQqq6vda7NXa8ALCpq5D ]; const MILLICENTS: u128 = 1_000_000_000; const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. @@ -79,8 +83,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), system: None, balances: Some(BalancesConfig { - balances: endowed_accounts.iter() - .map(|&k| (k, ENDOWMENT)) + balances: endowed_accounts.iter().cloned() + .map(|k| (k, ENDOWMENT)) .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), existential_deposit: 1 * DOLLARS, @@ -94,7 +98,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { .collect::>(), }), session: Some(SessionConfig { - validators: initial_authorities.iter().map(|x| x.1.into()).collect(), + validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), session_length: 5 * MINUTES, keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), }), @@ -109,8 +113,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { bonding_duration: 60 * MINUTES, offline_slash_grace: 4, minimum_validator_count: 4, - stakers: initial_authorities.iter().map(|x| (x.0.into(), x.1.into(), STASH)).collect(), - invulnerables: initial_authorities.iter().map(|x| x.1.into()).collect(), + stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH)).collect(), + invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), democracy: Some(DemocracyConfig { launch_period: 10 * MINUTES, // 1 day per public referendum @@ -182,23 +186,26 @@ pub fn staging_testnet_config() -> ChainSpec { ) } -/// Helper function to generate AuthorityID from seed +/// Helper function to generate AccountId from seed pub fn get_account_id_from_seed(seed: &str) -> AccountId { - let padded_seed = pad_seed(seed); - // NOTE from ed25519 impl: - // prefer pkcs#8 unless security doesn't matter -- this is used primarily for tests. - ed25519::Pair::from_seed(&padded_seed).public().0.into() + sr25519::Pair::from_string(&format!("{}//{}", DEV_PHRASE, seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate AuthorityId from seed +pub fn get_session_key_from_seed(seed: &str) -> AuthorityId { + ed25519::Pair::from_string(&format!("{}//{}", DEV_PHRASE, seed), None) + .expect("static values are valid; qed") + .public() } /// Helper function to generate stash, controller and session key from seed pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuthorityId) { - let padded_seed = pad_seed(seed); - // NOTE from ed25519 impl: - // prefer pkcs#8 unless security doesn't matter -- this is used primarily for tests. ( - get_account_id_from_seed(&format!("{}-stash", seed)), + get_account_id_from_seed(&format!("{}//stash", seed)), get_account_id_from_seed(seed), - ed25519::Pair::from_seed(&padded_seed).public().0.into() + get_session_key_from_seed(seed) ) } @@ -216,6 +223,12 @@ pub fn testnet_genesis( get_account_id_from_seed("Dave"), get_account_id_from_seed("Eve"), get_account_id_from_seed("Ferdie"), + get_account_id_from_seed("Alice//stash"), + get_account_id_from_seed("Bob//stash"), + get_account_id_from_seed("Charlie//stash"), + get_account_id_from_seed("Dave//stash"), + get_account_id_from_seed("Eve//stash"), + get_account_id_from_seed("Ferdie//stash"), ] }); @@ -235,11 +248,11 @@ pub fn testnet_genesis( existential_deposit: 500, transfer_fee: 0, creation_fee: 0, - balances: endowed_accounts.iter().map(|&k| (k.into(), ENDOWMENT)).collect(), + balances: endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect(), vesting: vec![], }), session: Some(SessionConfig { - validators: initial_authorities.iter().map(|x| x.1.into()).collect(), + validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), session_length: 10, keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), }), @@ -254,8 +267,8 @@ pub fn testnet_genesis( current_offline_slash: 0, current_session_reward: 0, offline_slash_grace: 0, - stakers: initial_authorities.iter().map(|x| (x.0.into(), x.1.into(), STASH)).collect(), - invulnerables: initial_authorities.iter().map(|x| x.1.into()).collect(), + stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH)).collect(), + invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), democracy: Some(DemocracyConfig { launch_period: 9, @@ -267,7 +280,7 @@ pub fn testnet_genesis( council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) - .map(|a| (a.clone().into(), 1000000)).collect(), + .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, present_slash_per_voter: 1, @@ -275,7 +288,7 @@ pub fn testnet_genesis( presentation_duration: 10, approval_voting_period: 20, term_duration: 1000000, - desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32, + desired_seats: (endowed_accounts.len() / 2 - initial_authorities.len()) as u32, inactive_grace_period: 1, }), council_voting: Some(CouncilVotingConfig { @@ -319,8 +332,8 @@ fn development_config_genesis() -> GenesisConfig { vec![ get_authority_keys_from_seed("Alice"), ], - get_account_id_from_seed("Alice").into(), - Some(vec![get_authority_keys_from_seed("Alice").0]), + get_account_id_from_seed("Alice"), + None, ) } @@ -335,11 +348,8 @@ fn local_testnet_genesis() -> GenesisConfig { get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob"), ], - get_account_id_from_seed("Alice").into(), - Some(vec![ - get_authority_keys_from_seed("Alice").0, - get_authority_keys_from_seed("Bob").0, - ]), + get_account_id_from_seed("Alice"), + None, ) } diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 1c865956f90a6..dd03b25bb9349 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -25,7 +25,7 @@ use client; use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; use grandpa; use node_executor; -use primitives::ed25519::Pair; +use primitives::{Pair as _Pair, ed25519::Pair}; use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index 7db47236a8d82..8e1a2162da982 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -31,15 +31,13 @@ mod tests { use super::Executor; use substrate_executor::{WasmExecutor, NativeExecutionDispatch}; use parity_codec::{Encode, Decode, Joiner}; - use keyring::ed25519::Keyring; + use keyring::{AccountKeyring, AuthorityKeyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; use state_machine::{CodeExecutor, Externalities, TestExternalities}; - use primitives::{ - twox_128, Blake2Hasher, ChangesTrieConfiguration, ed25519::{Public, Pair}, NeverNativeValue, - NativeOrEncoded - }; + use primitives::{twox_128, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, + NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; - use runtime_primitives::traits::{Header as HeaderT, Digest as DigestT, Hash as HashT}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; use runtime_primitives::{generic, generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; use {balances, indices, session, system, consensus, timestamp, treasury, contract}; use contract::ContractAddressFor; @@ -55,27 +53,27 @@ mod tests { const GENESIS_HASH: [u8; 32] = [69u8; 32]; fn alice() -> AccountId { - AccountId::from(Keyring::Alice.to_raw_public()) + AccountKeyring::Alice.into() } fn bob() -> AccountId { - AccountId::from(Keyring::Bob.to_raw_public()) + AccountKeyring::Bob.into() } fn charlie() -> AccountId { - AccountId::from(Keyring::Charlie.to_raw_public()) + AccountKeyring::Charlie.into() } fn dave() -> AccountId { - AccountId::from(Keyring::Dave.to_raw_public()) + AccountKeyring::Dave.into() } fn eve() -> AccountId { - AccountId::from(Keyring::Eve.to_raw_public()) + AccountKeyring::Eve.into() } fn ferdie() -> AccountId { - AccountId::from(Keyring::Ferdie.to_raw_public()) + AccountKeyring::Ferdie.into() } fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { @@ -83,12 +81,12 @@ mod tests { Some((signed, index)) => { let era = Era::mortal(256, 0); let payload = (index.into(), xt.function, era, GENESIS_HASH); - let pair = Pair::from(Keyring::from_public(Public::from_raw(signed.clone().into())).unwrap()); + let key = AccountKeyring::from_public(&signed).unwrap(); let signature = payload.using_encoded(|b| { if b.len() > 256 { - pair.sign(&runtime_io::blake2_256(b)) + key.sign(&runtime_io::blake2_256(b)) } else { - pair.sign(b) + key.sign(b) } }).into(); UncheckedExtrinsic { @@ -259,7 +257,7 @@ mod tests { } fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { - let three = [3u8; 32].into(); + let three = AccountId::from_raw([3u8; 32]); TestExternalities::new_with_code(code, GenesisConfig { consensus: Some(Default::default()), system: Some(SystemConfig { @@ -288,11 +286,11 @@ mod tests { }), session: Some(SessionConfig { session_length: 2, - validators: vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into(), three], + validators: vec![AccountKeyring::One.into(), AccountKeyring::Two.into(), three], keys: vec![ - (alice(), keyring::ed25519::Keyring::Alice.to_raw_public().into()), - (bob(), keyring::ed25519::Keyring::Bob.to_raw_public().into()), - (charlie(), keyring::ed25519::Keyring::Charlie.to_raw_public().into()) + (alice(), AuthorityKeyring::Alice.into()), + (bob(), AuthorityKeyring::Bob.into()), + (charlie(), AuthorityKeyring::Charlie.into()) ] }), staking: Some(StakingConfig { @@ -317,11 +315,7 @@ mod tests { contract: Some(Default::default()), sudo: Some(Default::default()), grandpa: Some(GrandpaConfig { - authorities: vec![ // set these so no GRANDPA events fire when session changes - (keyring::ed25519::Keyring::Charlie.to_raw_public().into(), 1), - (keyring::ed25519::Keyring::Bob.to_raw_public().into(), 1), - (keyring::ed25519::Keyring::Alice.to_raw_public().into(), 1), - ], + authorities: vec![], }), fees: Some(FeesConfig { transaction_base_fee: 1, @@ -447,12 +441,7 @@ mod tests { ] ); - let mut digest = generic::Digest::::default(); - digest.push(Log::from(::grandpa::RawLog::AuthoritiesChangeSignal(0, vec![ - (Keyring::Alice.to_raw_public().into(), 1), - (Keyring::Bob.to_raw_public().into(), 1), - (Keyring::Charlie.to_raw_public().into(), 1), - ]))); + let digest = generic::Digest::::default(); assert_eq!(Header::decode(&mut &block2.0[..]).unwrap().digest, digest); (block1, block2) @@ -585,18 +574,6 @@ mod tests { phase: Phase::Finalization, event: Event::session(session::RawEvent::NewSession(1)) }, - // EventRecord { - // phase: Phase::Finalization, - // event: Event::staking(staking::RawEvent::Reward(0)) - // }, - EventRecord { - phase: Phase::Finalization, - event: Event::grandpa(::grandpa::RawEvent::NewAuthorities(vec![ - (Keyring::Alice.to_raw_public().into(), 1), - (Keyring::Bob.to_raw_public().into(), 1), - (Keyring::Charlie.to_raw_public().into(), 1), - ])), - }, EventRecord { phase: Phase::Finalization, event: Event::treasury(treasury::RawEvent::Spending(0)) @@ -767,7 +744,7 @@ mod tests { CheckedExtrinsic { signed: Some((charlie(), 2)), function: Call::Contract( - contract::Call::call::(indices::address::Address::Id(addr), 10, 10_000, vec![0x00, 0x01, 0x02, 0x03]) + contract::Call::call::(indices::address::Address::Id(addr.clone()), 10, 10_000, vec![0x00, 0x01, 0x02, 0x03]) ), }, ] diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index a73209a9ab161..8c23e5d32bf25 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -22,14 +22,14 @@ #![cfg_attr(not(feature = "std"), feature(alloc))] use runtime_primitives::{ - generic, traits::{Verify, BlakeTwo256}, Ed25519Signature, OpaqueExtrinsic + generic, traits::{Verify, BlakeTwo256}, OpaqueExtrinsic }; /// An index to a block. pub type BlockNumber = u64; -/// Alias to 512-bit hash when used in the context of a signature on the chain. -pub type Signature = Ed25519Signature; +/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. +pub type Signature = primitives::sr25519::Signature; /// Some way of identifying an account on the chain. We intentionally make it equivalent /// to the public key of our transaction signing scheme. @@ -44,7 +44,10 @@ pub type Balance = u128; /// The Ed25519 pub key of an session that belongs to an authority of the chain. This is /// exactly equivalent to what the substrate calls an "authority". -pub type SessionKey = primitives::Ed25519AuthorityId; +pub type AuthorityId = ::Signer; + +/// Alias to 512-bit hash when used in the context of a session signature on the chain. +pub type AuthoritySignature = primitives::ed25519::Signature; /// Index of a transaction in the chain. pub type Index = u64; @@ -56,7 +59,8 @@ pub type Hash = primitives::H256; pub type Timestamp = u64; /// Header type. -pub type Header = generic::Header>; +/// +pub type Header = generic::Header>; /// Block type. pub type Block = generic::Block; /// Block ID. diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 45b252b04cb67..eab07326a0649 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -27,7 +27,7 @@ use support::{Serialize, Deserialize}; use support::construct_runtime; use substrate_primitives::u32_trait::{_2, _4}; use node_primitives::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature }; use grandpa::fg_primitives::{self, ScheduledChange}; use client::{ @@ -37,7 +37,7 @@ use client::{ use runtime_primitives::{ApplyResult, generic, create_runtime_str}; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::traits::{ - Convert, BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, }; use version::RuntimeVersion; use council::{motions as council_motions, voting as council_voting}; @@ -60,7 +60,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 34, + spec_version: 35, impl_version: 35, apis: RUNTIME_API_VERSIONS, }; @@ -113,7 +113,7 @@ impl fees::Trait for Runtime { impl consensus::Trait for Runtime { type Log = Log; - type SessionKey = SessionKey; + type SessionKey = AuthorityId; // The Aura module handles offline-reports internally // rather than using an explicit report system. @@ -125,16 +125,8 @@ impl timestamp::Trait for Runtime { type OnTimestampSet = Aura; } -/// Session key conversion. -pub struct SessionKeyConversion; -impl Convert for SessionKeyConversion { - fn convert(a: AccountId) -> SessionKey { - a.to_fixed_bytes().into() - } -} - impl session::Trait for Runtime { - type ConvertAccountIdToSessionKey = SessionKeyConversion; + type ConvertAccountIdToSessionKey = (); type OnSessionChange = (Staking, grandpa::SyncedAuthorities); type Event = Event; } @@ -186,7 +178,7 @@ impl sudo::Trait for Runtime { } impl grandpa::Trait for Runtime { - type SessionKey = SessionKey; + type SessionKey = AuthorityId; type Log = Log; type Event = Event; } @@ -196,7 +188,7 @@ impl finality_tracker::Trait for Runtime { } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime with Log(InternalLog: DigestItem) where Block = Block, NodeBlock = node_primitives::Block, UncheckedExtrinsic = UncheckedExtrinsic @@ -246,7 +238,7 @@ impl_runtime_apis! { VERSION } - fn authorities() -> Vec { + fn authorities() -> Vec { Consensus::authorities() } @@ -322,7 +314,7 @@ impl_runtime_apis! { None } - fn grandpa_authorities() -> Vec<(SessionKey, u64)> { + fn grandpa_authorities() -> Vec<(AuthorityId, u64)> { Grandpa::grandpa_authorities() } } diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index f6cfef7c80957..543020eed7a47 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1,5 +1,13 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "arrayref" version = "0.3.5" @@ -481,6 +489,11 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hex-literal" version = "0.1.3" @@ -651,6 +664,11 @@ name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "memchr" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memoffset" version = "0.2.1" @@ -1189,6 +1207,26 @@ name = "redox_syscall" version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "regex" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ring" version = "0.14.6" @@ -1236,7 +1274,7 @@ dependencies = [ [[package]] name = "schnorrkel" version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1245,6 +1283,7 @@ dependencies = [ "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1610,6 +1649,7 @@ dependencies = [ "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "sr-std 0.1.0", + "srml-consensus 0.1.0", "srml-finality-tracker 0.1.0", "srml-session 0.1.0", "srml-support 0.1.0", @@ -1818,11 +1858,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "substrate-bip39" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1949,19 +1989,21 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", - "substrate-bip39 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", "tiny-bip39 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2306,6 +2348,11 @@ name = "typenum" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "uint" version = "0.6.1" @@ -2353,6 +2400,11 @@ dependencies = [ "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "vcpkg" version = "0.2.6" @@ -2425,6 +2477,7 @@ dependencies = [ ] [metadata] +"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" @@ -2486,6 +2539,7 @@ dependencies = [ "checksum hash256-std-hasher 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c13dbac3cc50684760f54af18545c9e80fb75e93a3e586d71ebdc13138f6a4" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" +"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" @@ -2508,6 +2562,7 @@ dependencies = [ "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94da53143d45f6bad3753f532e56ad57a6a26c0ca6881794583310c7cb4c885f" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" @@ -2561,13 +2616,15 @@ dependencies = [ "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" +"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe554f318830b48e5da8ab1ccb1ffd02b79228364dac7766b7cd1ec461ca5116" +"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" @@ -2587,7 +2644,7 @@ dependencies = [ "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum substrate-bip39 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec6183ce9e04bec5f113ff19c8ef5355dad20a4196134b5402732bf5d3c1a351" +"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" "checksum syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)" = "525bd55255f03c816e5d7f615587bd13030c7103354fadb104993dcee6a788ec" @@ -2615,12 +2672,14 @@ dependencies = [ "checksum trie-root 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c6fef2705af3258ec46a7e22286090394a44216201a1cf7d04b78db825e543" "checksum twox-hash 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "555cd4909480122bbbf21e34faac4cb08a171f324775670447ed116726c474af" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 2192c80bc519e67ecc8f06313cc54c1734ceb15d..29139d149965fbe608d20e0278d20b79e625a03f 100644 GIT binary patch literal 879134 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

Q=%Kjb6V@?ITucG>{kd`At(-VA#AWL1GAA% zNv?pg8-%A61$?w(H=s{qH)a^lm>*~k>(QcRGxGjWhMNx%Ld0pZayi>7g=;yRHM3`5zQX;D8c0_#bm;98D!M0!v@qF5{`1pU%+Kf*b7z?k~3iXo`kos z(I70Vd>62P-mx0|_AD2TH%L2F@L8uE?5U8g0G8W!VpHS?Q(zoF0b&hj6CNjBu!iq7 z8c1|eqZOkcQ>W_U^g`P|oMkMv#&q4W;T^|j>AorGAVjKdER>Q%$e|<8h9j`TV-{;5 zXJrvA+EOWP7mh$VPPigWi&VKbAniZ|%9KrV7FQ}Ei!YUr<6+K(#yHs1(v!!dvY?Y8YM=Bh%4(e%ro+XQJYd2C4D;i6h{LrNWGO?Mmq;V6eMa&dCutKM>1{j^LV+ zZUZpYOM`%Ol(o#am1EBG7t}L=MTScJAm~6BF*y9tU^YfG#dyuqvw?Pwo|6;Q{W0YJ`+0vxTKh^dkkiLWNZ$T?#Qz-rtB$C77Ab zj5K&szcb-aB$)j~h;lq+49){(u&)5A3UpFBh>PjU%o00iX_Jh#ByRz7C2!XDf02MB z^o_KF#$$qqwTh}=Nd%Lb3@jOp6D@G6t^mpwH3hIh=bKGI&eWeUe&ui%Btggymm;)Ev8+_T97o zj}(hf9eU}dmnOe6G+VhW+d>jt$uk(&{ysU7-I~X^4$dRY_TW%Dki;ftd$9U(LraNM z|M%V(;+>Uf79`5Lt4T;9HsrQE_We%Fqmf%GS>-j$+N|<1mNkM|5Y|u~o({#49Z0W) z{A08GYVyzQ1~X#MB@ib0SEXPUNSu`U9ZvR;2$mayscRTBTm}g!HFfn|$e8vh;siSz z(j$$9%~vrNGLqT5HR-AzL(wms$YGY+fZ z@qA+&stCp1GJzl>UNgIqz>KYl;4>r^liUd!{YplhC+bz3LRbn3MXZjxaZznPuthfL zaNrRjtpr#!;F1Q`EHU4-wB|GOAe$Sk(Y>fw>A*Zr9g@Fcz_`-uZ$cX0*!8tmU|cX{sm3@|9f?3SgppSOOmAna(>M6EYR`T^kaM zSXPUNvNYE!uLuDin*bMqS4sN=*nTp-YCC9DmLVeiW-3CA-qu`7kIF3}ztVf4(Fp6H zaHaE1G*75xC5212e#pCw&H?aB@8C~$hZRv(j_yR=)qVc+V(67}XYVW92;}-pXH~vz z1eaEIuUB}!(sn9i9!5Deg{C5xwa|#irO?27q}Q=e5Q2zWC)}ItHTOuGDgrW@!dLCH z!WR+63CER*WG39q808o$!om(~T=&EKbTx%!O9z>cU=Btz0z0_sk-5R$j+PKMq*hwO zK^RyN)MFw{WJ1oCJMV|H*AxXRMmaLo1io3_4-Q4SHtGVWr8@}ekm$GEYxm-n_ zl3TwPjY^8f4b^?i=ut!36K(+0o|<*-sg?!hB1W%Fe7kRjQC)n%vo7*NsX^o08T_Gq z8c)BBFvrj=SmUd%+<_4n4JmiE#qx!zt!P@k z8aCJ}kEnlx7(Dw^Ki_C_hJ_!x>xV|=w|(*dD>AWv&bVlnoul1s+<@5$+Rdig6Z!P) zBqe_uoPrWrG@q8zuUaTe=->ExU{Oc9ck6njh7hfXyZc?AOErY9?7V$!cUCmLRt@ZFC7};Wt}_L?CvdNyQB3myMYHMysL9~&F;QpY0_$8={ks{*pDvJ_Vgb+^0o`Zc>- zWhr(Kb+@N;-J0FKdF*6qJ>16dtFs|OviAxy4O+?s;rkHyQ;dwYm@C8Zr}xj)yvpt zJlJr_a04SAykpyN!{TrQdqxKzL17pI4QP=KLL5CvY-0Sks_KSt!a)EMaCQ_yn32V z(M*qwDRPshEw6{lqnWX<_vq{tDopYc{XhqtZL8>Bt!^5&oQ0cWoiwYC(L^Sbif7rI zMKfGA>BfAyan*)r!~sHbf8oH`@Qg@J9hs4goE2x}^~5wI4~5Mzr{z#k?IOk1!g|Ng zjbf)Bht%wp2^o0)8%3Apfs*j3}MRb3iu18cKT2%;KU;@)Z`NV||gde3@ zBpn%hv9H&T?Tc2OMLpQpbZ2MPS4}IcclVmH-OIu zj7TsQyB}bmEP(SGdZb8~c#WOaTw^#y2L>39df>6da2ko>$n|Cwx$19Sk7$wSzarYT z0i?4`Mgc_Y<^#yeh}J+Pz&MC>T2$h+fJi4rrSE`9=a$9q93Nrad32Hi2L|Qm6=Ugw z)-=DwP=*k|@qGihsy8JW&&2Ft9CI$8>tcp1NU!s<`m)-&xl{`Zc;6elthA~A*egHD{o1*|aT0|Fa0r>+#3g

kO??e5UoU5t!A%8&HWfus-!&uSrF^F1D6FtjT)h@B~Q3fXcfUnI@mL|16oz$b+CiB3W=L$ z*zRybK)Avho-q4T7eW2=1_Wkos2iMSo(*YCOdyI(rsW1_1&yS;Fh!=Mg5njm@Z^zh zUy7!bJ0jQ>cc3*<3*C;jjiubR>jlN@Lmj8w*-%|~(NGP6pw)BYiOYrnW+MA+(@d$x z6lPk9^DxuE7lvl~a_|K$N==}L%*w036bF6K20fkwk3yP-6;6%gz_ccux8v1VRwNx2-WnwxTGKTDs*n!Z;bUj|GAyVuiA^D$SANjvKsssA1Lr%?nsDj@kcEWE zB$h)5l~`^ivE0&;4DyM#bg)(y-GJ7BSdI;Kmx8%Vhs1Ic%8V~~fyXMqYd>oV24kOH zk1Inl@k$+7`zk6;2xp3i@+cFbhPCWP7Rt+4NjD19m8Tshm)wQd=z7HUNb6yO13@PW zuE)*_{ynm+Q+Ef(c1P=B(u@YXo2>iyq9?Q7*VSYDqE!i4gMCeza}NPNG}C5nXjhHx zj@EIm$4>GAvSrk?zm_uI!d2C#fQez+h`VpZAvh9S*?^P9%<#(1qJ*6ql0-VLS(KH| zc%kL{3LXPHseI##V}<`;RFediYA(It_1trzEvyyPpB3H07gkh_0tg(quqJ3Ic;XK0 z)d{9DJ&a&6`H&vgseR za)MZ(EaIl_e}mQ%-;j%(@5xUt7dhXPpB&lkesUvF!nc#!KI{}>>1k^tu_Bo&~@4!X#k@NMO{BZ z#T_#=TE`6y=^vB_03NO?B}2-BsSzVu!$`vg)EX`z6I?-S;MliwbT{3QJn)u2yD752RT+G^p*AJi^l?p*3Add=2Ak% zg1;0d`AS6GOx?TC>surFrpMfxG4Y)g{}?-b{v2Y5X(j`#>t(@I#9wV5jm?Q2YQsQ< zv>UyO&Ja&d-)I`vDjtFjr(s<=Rym;c+|sc2kL`}ub4$Zo9@`zQ<9s1&r(x|I+a0a{ z-%i82WUSPnb@QbL3-Co?Z*MdW>!Ps$qIL5Dw1QaOG`G~)G%P#iZN#}sYntE7mWH)Q zrj~sC=j@1~J{_zVv)Eci2`JgzD&(YFlSEQC^_4&SXOM_&pEsPzrdCn|p zqYm$_V=0c-FLsLC2=2b}lRQV<9i8M@A-Z*}a!G4i#7z^T#x|=k8+?z=#X*jq8xOqD zi&G=Du=o93*uw=J^=7h%LG`mjufeNx^F#N?Vj->LoW0sh5`4$w{LsCzebIVue&}Ls zceIWh+82u-npGgGV}-)BA#KAs(qHO+j*W`4onu8At%(b6ns&W{@_6pPc+aBTkb-gn zr@NUPXrq4R?PFJ!)-QooJ+BB$n)ra5@@1Jg>$~}G%JIhWSpCInT#PsYXiaPUa_KLY zCS>By7;Pm6qjahTJZvkkBI&*bWho-&!1~ad2EA$QhV}8iz4RFN_MWqWpnAI1G&gz` zHG^~W9$!Q4Lxv@}2mEW3u0hqRJGz!(c`loHSJ8#eWfSiz>d;@c zO}t>33&SrZM+$>JS6*+ywF~WBsd4*(;9A8F#_+#a&LIS;*W5v`&r6pnxo_VeTwIc z_}w`50mP^EWtsZsBfgG?9_5Z>wOL9;j7fT27HmsR4eZKXlt*Xlu(D#}@5*7;o-@bJdE zdfv7gJ5`TV+nG?cokp7yNLI!)y56R3NZ2}TRtoiJhD!KZ{h6(nmRXhXTk7l^>d5Ej z9fis>LmgS=na)s0-Olb+Iy&eCHPjKUwcLqNRB*1-Tcx9G$96>P;qKhfh~{-H)BudM z{WVq)3R{APMr2!p7Kb|8qH07db`&-P4RvIjfwl~Fv{j{uR_rM31RCndb^?vAnu-uv z)^vxOY2k_!j=~jXWWyC82v^k;1Lc6cc-xMuc$+tD9d5we8_T<`a0gD;!8_QfHrPN` zZ)~V%U#~%31HyW;Mhk*u&A6|ke={P2nTEW_SZ9vG_JdOe%4y@9qdwj>N(hwqz)dO}qw_%qC|57mqT9ZhnK*89Q zVHHehsR}_=FrnJII=t(9P@EtErei#AtdD37dI|f1Ho6kYSvjy0o9?V!btS4b8N7-h z8QN7bz)I`;DT422XtV8L94l204g($KHE|QdS3?~Q zhOg3y)(l_yMqqYLWMNaw3Ju_2yra%=hj;f5;-5KGZD&ZW^yM0lth^g|jRy@`&jriF zF({7ZHSNomV60R?`X8YdbJzqhP;Fz=UA{wDzOwPQ1}z6;eWSD7GIo}Prod*+ zG8DDn=q$C3%{FultR<~qoU=3&rUJpvNqy=yfq-(XFV*Q1tT% z+IUzT6@E?X*QO6!Mj5*`2MoFae<%#lHiw2Ck!Dwq?ugXR!)l9Yr?wT+W=Zu~(>3c` zL~SeNocQbgup2E-+6qZ)S{!;tLC9)bAv2wSHmT41!KE_Od)`UdvZDIn|#w&hk~$ku4~bP(6;oMe^X zk%A3@R0b+~At#Pdz0633sqil`1X|N90fw)0ZYRNr5;9$B`yB*ih$4htxD4k7RnwQnxSn1kvlr{ZnC}gCq>!X_}X-z}j6wSiey1-Hk8igEU_u5w_y8Df;|TO8-7e}rjMfh z`5)!2+w8{$sFJnN8Z>YK>qtue?Qa%35!rsxM~7D~K=|cBtAkv=^xdDz%GWGhoB2#R zms~S_;uk(`GyPv1jkac5ob2bjH5$%%Z~6d4n|%(GvZF6~X+Iu$Z%z4aWdY})5QA#O zbNG=Len0fYDgM{GUN7-F>=SfJNd^CX!VoHbVJ14ARVCwdfTp_5C7=`=`kPA=&4(Kw zY4g|QcpHZJT;pWF!5ACm(}0!n#xWBSR# znT_kV;xh3nPH_Zb8|AZ&6X690%5((pz+2<(Md)AmNd9K&RJ z*2v5s*EnMe;EJQXCB9iJ=kk^QjU2cuCej;+3J_!s@)t7b{|2{9#Ur`x%>ojOcj&Cy zr`{!Ru7p(+kk_*QA8CNwys--n@O(pjs+<95iZigR6K5pqpT-%9`loS5eXNO+*5{0k zkADPB%~Hjh+Z8_)VZPp4MUKl8oWcDVXK;@!U&9&8p9Rjat|Vr#e$;NpIK$2z5-|h( zBvGBXD;<|)$dCgXjS2M=wL_mtIPJYHnNW?)3bcVx0+SUm_DV_!ORu`Ial2Ea+7=D; zRZaCxl!qb!9#k@+VisYa2jjA#Z&E4_BGVD2O|Aa?JX}I)|XpR3hwjjGYD-9+pwurbS{8$9A3_F0L${94_$1!}fI8P%0vW zlIf@uI+tE)z7DoY(It%A87%5Yj?Rp{P^?&47&XhNb}9F#cAGjjK>B#q(2^&`7CK?t zl&OZ7sn483n3w15=wUC=S&`+Vqk_o78GtM~vN~VN9<;-ti*mQ#{K0&6DKq1AQD;_v zX7RNgk{DjUBAcpz;{HKL79$|;-?zg?gmWuACEUO;A zSr3_qAA9(kJkMpopUaL9n^?!#ka8w~mVijF4i&`TLvg53K=-+;<(0OpJ2|8!WxQYV z#&ZxE#f^pb@cHClyq7PTBIH_An1}63+11N-wanEL&vvYq4}9#sS^wAaZ2sSFDz;;% zkK72{ou<%YKAYeGfNXrjQSbYknwj<*#M#~Z7*Y1)oe+e~iPDn|l02Xi<|9sUEx zpm%Q24ReTwfqm$*WAr!7?PYJUo}@t*dgW*Gy9PZpkiQV1E5ne|Kc08jV1bGXOwfT| zz3MJbskSfp{PFx)FV~^K886Ln#_XEsFH-DkAuN_N_uO4I5$3!B^>3JQ-1VHd6c+5Y z1*-X&)l6tknQek5*N7RV94R$P4S+cdQN<%PXO1x@6$$dpmu>VJ`IJcr;Ra z+|!rTM4ME$`JVFh>5pZ1-5q*&GqTgC-8q?*5Y?P2=N#YevHp4IXr-@g}Zarc%p z+`VOo-~8T3xLNS)Pk-h!*Y(osN`FD>8pO&a*XY1`{g6Wi%>;d$}>Ou9zI!U990NT zC%~Q3UVsaH0;Meobs(E=L!^A)oo7oos?xyvgDqj}U~|}Nbv(b<(6A>94H7^WIxau- z7J!riphe>mu3}&9kk#Qc7Q7fT1b9g(EMjP?WJ_sh2z z{b%vfmeB7%li%$QttEH@zUh(PX@`Q6`8 z7WbC3-*(oFi4SD=4=yhoI_j?n2V>Tu1<(>cO@a|7<$*JRDlwkGh&pB)Lw6*qiT-OC z{2&Ms+?`eAZu!fQml4yv-oeb$JN)=N^R;(^cEGgnc-}c4+T6OX>*Wm;Lj9kBMMa30 zK?g#GE**kQQ_O_RWdn+Zl+Q;9l7r~=&O$4jX|{A|-sNUS{lJ~C_0g7}q84mHgVc-> zWmupDqp*6@;Bzj)M*+w2M)vwlF8aBA zH{5Q1^J?(3TL zDP5mt_DskIA?(o#)Vs&S-0DC!?HrqVYlBt8Nhjh$%9$QP7?>)%K>=2Z!aiNJ{|>v7 zMX*&@GAtA-?7yGDY5o0)Mznt_)RQ~)bDYheP3kz1qs_o#5Wf{!a#eN88i?b!U zuY%_-K*>F}uRUL3D-`UgV7}I@yPp||pC)c$4mxmndhOn9bzBJ&9 z*`F5=@iJ$34m3c|62#GA7Hf1fKDw?H-%RM-ho?L9($Ecbom;w&d(eF;*WDNI zgfL(r`B~WfH#UIJQyEemj(++`4qQf>SFMWP13`K~2|aMf4q)FQ$lifBf7bf2HmG0o zRZEN{b8HX$?|)jH&5hqS4c(N)Pfs=Q9iyEBS4vQT*L3@rz4YP+Nj&OJ<$;aZsg?Lt_V50T!5=O8Yi?ODw14U zgN^BQe~EoHniq!Xt60!!9xhW~H8Ds(&5A0*%zXsC5Vy!t$%Pq7CMI28%5`p%NvSwf zDD0Alm4?KxGoet`W&+V`EE?TdL9fa5Tuk(nr$u7N)c-3(Td~7O?be$I@`F zlF3&)o`#*OWT#_lI3G*IgTuPa5`l0!wV}w#urj}l%rH|;3o5oAWuT??)Oo2fkKmjhB?0fhpl| z3=HGk{n@|%siQ~eU%^-Fz9UNi)$UG5n4q#bcj~> z&v1Cg`@DRJ{45}9`3qSv)9)daV0jR8jAwwAd5*%YT9Oyc=A&p&}SfupAgwRXotVWqeSpiU+uBn%dGAqe(BJ_yH`UB|&2kV31W*m^ubq zY;PeP3R~4EtpHFb{p)W4hcu(l%lo0Hbx+!29Q^G=NEM7KmY|t2W z2XB1N6i%%>(l<3`&T7oe7>t?utP{ZFp2jz-JDHd{m*9#`<1wp1karZ)ovgI(sLTn0 zvWiTjZIQS-o5s}@zSORBH5G{ECpj8oRaU`UF_ry|Lj|HD@w9|R#nUbEv}R;QpvHej z_oF#gCtUwHc3c#!KAekOD2j|PT)tZVO4k3G#xr<>1o?;5zG|>3JzlGxmha{pTMm(z z@6qSNY%YlWs#WF`C~#WgZ&ig3Pb>UCtuPXSl^i@&ybmhTB#rSfO?$`spF;Fvy5z`) zf;j5}lu##4)f{T-l%w`gqx|zfdN*W1 zmnH-@{_~{3<|RWdbQ6?!M&~o4(GqSx0Ix-2WLzbzZDb>2Zd5r?kg$vLbAm9Zs+)}y zCPcVF!mO*BrB|;=K zL`dv}`HQ=I3!GesNO4>4VEi3r7M5=oz5JIp>gjO}AILRiG} zZVrvRW!C5h!fR-T_dOj&f#ki8A5-CVeWoJDk(||hp`w%t%1P{p0!ZspL zUzhJF%=&o5s6%i34R7qr$lo$aE6W6dC4HQi{|S9TOv4NU6&jr*7sm=sxIk=G;b}Ko z@)Ge^Sx+jo&uO?kI9_gT{qg8!MxOmFX2P8|DkQ7ba#{oXO*>80ri(WMQ#CeeKMAIf z2wZwt*-ylb^D=1ML$R5IAPGG^!03@R}3VOe=LzF;O7`cSv^OQyt0#K&SNKC6e~qL32v+Gqz_NpN$Pkd%L+G4d@$-0xe>+` ztRhKf+nAjcyOZps$l2(oJz3=JwRRG)tr<#CYfYz`t>h^4=98`D=#6DYQ9L==f3vaF zyK*5(*oHRvD|-7tv^~o2hyQGGcV7N0vErV_Q8y%h*ccOKty;}y_%SOXNvA6LDJu~? zypzeacn9suv@r6n8tuPP=!5mYPL3hJcS?x5v4N?JvC)&UQNwREHoAe=)v-**p>gS` zO)GQ7SI3oL&RF$c&4_e991@E&VWJ-rw}1K5(b(Xzi9oun&nq)utv}*|z!`6it&#d4 z!8>7VOl!l%M#VSAS84-!Y;sc~A=(;Lelvj*uR9>E#}FGOWo)@Z?4JqO#;QOlFF$Um ze*hoQ=$4XCS;>R7lGhnJ|IMgGmMPwDiJ~@?qNq25QdixaU~a0rr+ChU;?*h(;uGM% zuC43Zc;bV}3dR)vNL{Bkqq;WcL}j<`R&%r|C)IpDt@0oaa#^qw8hS<)TA~tnfvx?AIQ;O z0SEZD%8?1&tU$=v;sf#)YzE~@|9$67eb(>;o?>NPi=jn@isT|*WM~ne1LDv$K@2U9 zO&eM&AX3k#5n7~s(Py~G?pJ);&>1U*t;~8qN?%Ci63@X!%`zAhrKtp)Ry&FcQTO%F z-&ku&SY5aJ#9?~LYmKuulQV}dqXss0c=YL+I=m$|sL+GU3Ljw#(QjywPi=tJbV5@h z1h|&WGrXUpmo$5*)H!AkHLE)faT^|191=gvvRN9g{+K3wd0>X=?^VcpXqP)M9 zCfggDY*%I?Q;uTJ{?Fx!{2)LDrQv1M5BJ|r+(k@5;^Mr5g^mn;~( z99hbru4N~y=CIFzYM&;!Qj>VXU#WTc8K0@1Npn|+jn-J6N?z=s?U*6Udq4tnlVDi} zqVp5jlvqzEm}zg{arQ+27O!xm^}O$itR}jjOvR_A`?d%UxTonX?>@w+?zdw1nRZjB zk$QJvRTK3)5wf!I(AGE`&}?G3Tr#_9J= z68lEKqht}M-88NAIg|Y+*vAB8h@yWip<+z(W6Srw`_5cz3DqR*(j_L0#FPq87EwEz zn7%_8R`vpaUc3{1TmICe=isz*+aQ-A;DV~OWNPJH@Y;Q$#Uy9Df3x({QqlI*9Im?d zNt%&ls@f#PMb2kb+*h`dEm|J4 zjR-m>6&oXhg$xLkO}Xrk5afkRmug~x5RBZL#LKX?o(}A0x zA2w2#9jVK9=m@w#BLNq$LV)QiO%m9kFXy@Br>jdV^Vl|hFnWkfZ>zpe=_4Y@vAZT4 zC609r_ibr&@_Ng*^69KMO?9BB23N8`E?xiUGz}`7ihIPZ-$T({$LD;&N)~ z#UJc8TBN7doIjvst5=E@Y=W#nom}icg*VbE@!-)Wgk@`zHH?3+)hRjsGVc-ul_n77 zB@Qtn^(7G{VyGfmTu43)Em%sk^s1MzqgB!#+EN>3#p2W+4h8i>>{dbJc(5dOm`s(j z;lVZ}g6-`fJGI)OgHrJ#pJGlxx@O7FYbQ&IH8n;J>MtMD-&|8aQ~Jw3c(K29iC%`8 z)zWsi(v*i}POWSC@sg7o6y~t;k}@nOl&;|)@Goa?|6EH0C{?UDb}jd=&2)W#%S!>E z??zVZN#l6Q1{lg5(|RZYNjV&Afkdg+FOCCgwo6X(1dtr5_yPhFqeBXhVKXAyv)oC- zTJ@|A!*Z8TA|erw+vyZr7D>cV&zul}%ritZDry8{tTwYfJY*USaa@k^r451M@UPmm zh*AY8;t;fH(G1ZLW!|f5)H+_6lApmb%N7YXSt>qF`X&n20jiV!mcSRhglKXlX_hV; zBq}Xw@wiDXIntt0@Ixn5G{{4{yp!NHt59|zDy>7!Zoj%hI>a)zEfo{3t9t-#=6~v8@N+CzfF4y^WUekzeWP-bqKdozg8nZ?WT%W>-wGI@@udj88?IjDDd<29hRB99j51q?igt)a3r#`B7G*N6v_mPW0T7`I+%elz5;E6!h z-X;b^&>ul#TkxE>o8E5fCH!g-N--jyLII7Doh04PeMJGnyFoNkj8aCp$Fg)gE5|_M zetC3%Sob)0@j3pTU5RFmd)CJr0x;nXa?Lg8Zkf+A3BacXiX*c1UO}(Zs!!sbaxLHb zL0|Q0JGHdE?7#i{bEt^8Iy9Eu|DoD@aYvUw{qME1Isf*1f3^0l(Lz@K&>#4FubF9R z+mYE*lN!e)zm}O4<>a=}^;bht+d?`=ph*6(YsL$DeV5~K#UPhyq4;9~;w93-Ji?*? zHgKb@gk|UnHg*+lb_p=87#*wGj)p-Xt4{DhoeeWQok7Q5wOyR!tB7`c6~P)=mlZTs zvmzUKW&}|9c_Z{=3)Rv%8|;vSB$B8pcf6A2rg}5X408O0 zNQyon3^~c5IbqmWscKLirb=4s8eUgN;#hb?hnHIo+j9a1Upn#!F-9kJ&+&1Wk6C$? z50LRJIiQS>h0v|c&k6d*yYUKr#1br(iNF1-nXa@*OOIGDD-q6;GHEMj4T~`AE5y(b zPVxMRny3y|iF74YFV6R`1rAA4vvO5%`53FH;DI^g16$Vn5HssIbyhtr{KI*j0l0XQ15+Zj&2~a3iS)#kEHo>$-ff=MnXDXa64qYqk?ZYHV^arS(yBI= z3>sit&MQ2}!x?n=uNM{vjmRlu#Gr1pBl5eB>&?P%!s&IxSp|2QJ_r5~E;}!3wHA&{ z3jk?zLNUWLYzfzp<<@qbVP$Z%sS3;0AEoDeqZ@p|v;-T5E-F|8hYmkrm6UZIvp}057Um`y&eVS_&o9 zH)>F4hT!2LpuDx$t$HA00rg^gti5?h1Cp}Ks!921BDfyi1H;1I>qGN?sl`YS9rY3! z1JLKfqR|5g!d98n#t;v%RR(GU3NLm;6`wrwZggUx>bbIuSOaopgHz*#c0ymPgH60- z!9!LT7v*oWc6JNDg!WnH+%*Zf2wn-gh5jwr+Xf zj=O2iYi%aCy9cub_{t|_*nkLDviCO0WWTdPxMgY`{}LYtatFR< zUxgxU)6NO@GJlyz_*l-mZ`O?G+9MOR3RN%*`(+F}YMK7(Q)pUq-ChQrs-BEK8;#GY z;{^PGk}W?+s<3?gVWW&06=w!ymS4v!KD2Mt8lboszTi_h171?SYJ+VKn20FKhcs=A zO(4oyco?aI)aYxyV67v3+!irqqASsn@TI~UL#p03bWTvBZ+dI2#RO)EG7>M<7&au2 zgF<^|LW)XN44M$rf?w4`Gp7-Cl4s!8FHG^pSLXkCQ%f3eh7jhw=Aa*s`i?cFeZ0B` zbwf&4{hnegETCnlc;@`Hp))N#MM3e?9H?ENyHJ{t`7qvFcElnEMu;(FqT{@rm;Ycv z2}Dp^GQG|FKml9uI8@$$JF*b#$ePGGFrs34A z#fX+opai|hD30)Yp?UJ{{BX34M8M;YN>|3tw!YBYSr)0U%EU*!tZib9WffPjJL@%z z6O46ywAr5G48fb*>Em-(ug|2iv+|2p4{${~$-eA)(0O)4b{N4n%ad~?L)d5*)XDGE zKmh=j(JZYpSRTH^vLhHJrP@JZMgxJXB~ucS7>#)cpn}^)9PoAMuJm7jKeF}yXpA+= z8ErISbVE!C@Xu;!>IeYMBS0etI5EU9VBK&m%*v7iz2lI#IwJBTF#;fMZ&TRL70l_W zt@3t#+t47}-Zpfiog6~D!g_3Tk=KOvM)~L|`Co6t{SZJ>C;1>^y-~h{H`Zxf-i7*_ zkYAb(K*J`m4L8O9GGlO)(S`9)BS0bZU!?WjVSZ)#f#+tI*;RPp3v-r!i&!^@e)TEe zz>W|X0ZHGFN3_o4p@|--zB$+eMxZ)+GQ=iT#aOzk%UK3NTdz+161Es{WE+WXSTT=9 zR{oG&7q=#yL@@${_lN_L=o`(QY9L_EZG`|UVqK)LPONj~8IlXdp10$l%o#P#3Ci1m z8l(uSSV?d6co|KI9_Nf6F{zCnw^NGZp!9U1P|SCcx`#FqsqSD04I@>k3sMCn3rJHG zVitCo871LD=#7Vj2izXOKhds6Wc3M9al402VX+PyBW|RBz3eChFoVls2HhB)%cvY? zNEa$w5Xm8Rob$!xJ!b(UZJ;)A2Ij+Myaeox&+H~*j&Xyb#5P&QXKa|Rp>F3h4RgWxY{B@9 zLxF^Rc3!QRY{8f;4I8=XyiEtT8E7@^9X{YKtK}7pGXN%Yr{LU{}K5IV%sCAgUI>^a%yM>@|zH67fS>f+y7=blD?55C=PQCbZgjo1impuB;INW8U{}X97<23zoQ@R5U)10TZd7*=+0gjwd+PgUOk4;XA_|l?>0i` z@uY4QxkOrbg*q-;@xdbQB_<-9PEviO`9uPd<`MmqB;ec{W?ux*72LJGOk|6S0oI`h zV}K|pkSt<==De^sVdhjNfY-GA{QH|0;cCjxIgOnYH^NZzw|u7ZXWoA<8x-XM%iahh zS53G!i)N@z`}=j>YAZSH`EkehH2|ef^ zhQ*ln**c_h0wBZI@xV4v@CQ8`;>v3mLt;KUK2S#)X!Zx2N_!U4T|5QMOw5!Hexkas z-B?t_943*X?{<9b10R%k(0lXv>sSHip99}$&uZIt_`tV&BWgqd-_od%{R$=&X1?Ot z8obQUw)_kE90E8a(Y}J{Zy|+=2>cY~p&!Y+C@Uf@jK+dV+VMp%owlsak2D&xoD1Tm z0oN-7HHhmc@_}dtLeAw{^GxAR>Omq5@&+i>>n0D}2qs90{B6n$LJxy8DUyNki?XGM zmKKJfvJXuksIib;pPSFzAT9#3EjKST&KkYUs42RQuhM#W(6BEpV5$6lsLP`FgC>=x z{={~O*Qjw~)%DtWFV$=jd#^PpmYQm9daX!Pt-y{9ESeE?B~JiHeS|(Vizv~eHaTM6 z?zrGngQ1kDV5rep3a#uIJXY9&aR~^dg;5saoKOb!^ma?!_A684Yv%~?a~P#Qq?5l zNmo>-4e@I_T}OQCG^Dqt)9h+ErPE`Gr=1HTeypQpotd#UdpvBBK#&;*Y0_IpC=f%7 z{F{YL@i1;xX${0WQ&ZEpskbu%vCePgCF`xl-QoQT#NJyPQ3-^&s*M9Bi~-zc3NRDgJ)BLGbRVjLrgdpyAUUcGp@4c!3Y$|uFL}Z0 zPPl>iztl#I`%CD?V7mW;FWvuYQD{yKdx2EQoM`|}AEIH01qJ{L!!m$E`TZX}M+&b! z?B~W_vXcA_W}MAAj4ZY`tBMcg4>I{71?Dw!r?yn8_LN}5+=jNGXLEznrsfrZwH?V6 zsHYBEkzjJ|t*McE4Jhuh8ZcMN=CNVHR!4>pmcU3B1S|)&sHW4xx!~&y=+2&ExAIhB z89TE<+7NpjOHzQqjkS&d8#>@JsJre?)m`PR#*d6zpUqgERN3x zhBX~4rx?g$-i?h%OakpQ9@+Jy@!WvfDKQ37A~!^ZZ1<<1^8$>mg~w{w%l#?PQcr4` zj5G!9%rfCJYVN%4V0@3YqXn1k$#wvQB2Y7`v~Bf+`-b%CT-leeEr?0&)0F}IMkjo7 ztI;?r7*=#C)7YWsSR?ntpoLZHL^&U`a4_0)$f`Jy^;d+>#y#aHv%C5~FO=ADL;HRl z2T8*)bH5MTvEI;PO3ifXz$t?QqMnz06$Xw}2E)n4(N%#6AT{DQ=km6kw};rujY(Oo z5JUY<+37sevhx#5zDEoNzV#3Q#=Zj%?0I9TWDmkdr*m1_u(DQEGNw|MFr^&VMEJdy zz=|Z)BRz+bNl~fU+QYR>MFO=psJoLo5J#$mkZO8rMbv@R9V=3wM=hz2I~73|*d_Ev4RQ}o zM)h%zGh0=rFOS~X2&E-2Xi7fSQ8mZsR;|fbhops9tfusq>Ipmq!wPXjm;&v%RBPyEv>=7+HL8@6$@rW6YBQi;@PgV}% zV&hEDV2~`QkQ4-47;bN{W0e8fZrBXPkYG1MNLCzSH*6zgaI~9)kr(XdrU*A~3Pe=0 zhvG@J(+lQ5+RkSr(mv*k2lx_VzkN)aDWsp92-}!>AX2{_8T1!9`#r;n+C81Y#(sRv zZIt5Z=pO?4{*#hg+O6D+Lt~+tHFMI;AmEyoJ(ANmqsT=6lECUAv7DNM!WyC00?JQH zRvn=ze_?Nio=I@;&u_Or%CZ{o+<2RZiuKx@uG&X!uC3Vnx??p7arL}91S-zx)dc$O z2%we^c#2Hd$H?&7uwi!Iu4K9-dhQ2C73FnM(Z1{@B1f}JOzQnUQ6JI?O`%{Rm~i~V z@iLR4YU--heHp~T=LWkY`Cj9i>?>rV6ieBc4*)N*GIaiD4WO8UY%8mfzBLBlFBP}z z_BKqy$yOyG-Y?RSJSyzmg=z@V=#SR#h;>yCmrLp!JQ7Q*+;o|h@2Kh#DE1!7U*H0S zDBf~GbV!O^S!gt^=&nO8qIV?BtN@UYq@TbneV0B_?Jpn>=(R61$pk?tEo;qKH&US5 zx<@2=LOioKWwd!JsOD{<7$)4LBNx&b%?wI2c!Gz$Q;~%WLo35`O9YO-5%m??!4}Ku zx0C$PY39(IdPTGlMA=e`^o@TfX)PZxR*S&>x9P50^=@sc=VIaETlOX={SP zgAC)L;Q|?BTIPYGME;M_w~m*63la;}%6}rdkSXRsz7PM{8GL9#VoGIS&hUvM#0oeN zztI9X7F#3K6cWb!S8!Ncd@IujD}cmh<)^ig*R?k1j(fWL9EysUFg&X^mCJU%HVJ6x zD_CpPCh>^a=A5i+u+bPL5o2xZKBS~!P0Vm#B_aF5B{6;mI3aDUFFOo$WRNYVygeWg z^Y%z$64qlTB&KT2+sov{ilpIEbF(@8O@5#P#6AA&!k3oYLT+OW=HTskE{c2*7a^V^ z$?N)zOv3>QYf!6sdMsoS)Ru`$!lJ;_w}!Vb`<7vWtnY=M8FxJZ#($_dg+7@=Rp)wI zot1lAm?ev%eE395fw5dN4LFI#*q@5u! zw`lyS1Ya(VE17QMfq0GRh#1nytfhSWw7E|U>I$1<4_YGq)IsrhMVcMNI9}^K2qc%G z2iC|%l;fz0Z>I{nVqxn@w2?vrxm!MSW8p}XvZUD6XvpZAd^^$0Z#Rp!2m7853At34 zkV9EP&azv_LdJ-;D3>x|fvc8P@mGSz{8OT(O%sgbuj11*O@KJmhl*H8{MKg+WS_?z z6HOXGehPCV9tD7QfMPA6RTE35Xe{#Ok||~hp`7DAl03;QWE-U2Nt{iWW^HkmBC!w_ zKh;3yKm)Vy69XY+UyT9*tFH#aXqxOmz)tPH$pD+?=tz1hez=7E)HH+0AxTLSkH9*@ zWn4`Y2p+_`O2P@tfak}0GdfB&rT&0UV`LFwXqDp^`(jX(I(DjvQni9L zdm+7q(X42Uz2wFZZ;CLHyPmkO$r-7=%%nbHET-v_HmWbnzRZ11)VhztmJuQ4m9TyT{ zRsccalECWB=Mva7J&s-j$L@rpcwM)HA=6;EXOcVzImoOy%4~Mrx;R_8pJVUNQLEz5 zHtQ@9YSx0&mFu6hN1r^Pqw@0lCo3&DgilBa*>Ed5lW$Ec=kHiC_Q@CcShV!r7y6*y zu*U?(4D_x%sBUuNS{fOR#RaqLemQrcFMoc{F*o9|;;89w&BJ4d-j>{2C*-w%ad+pk zR?*03W}9vEd42hkt?glFB%7%=mNjEb%T;Z^mQBbX-Ncn$#OXz2Hm_)jV@4=0Mvb_o z)x@5Vh?9`Z4H|%__hlA)tdeJ$p*QjFm6(~Q`V$k-kgr*q_GGl!#kfC3WxP52fKw){ zRg;4IGJ4HvICRbi?im+$IJmJS7G}NavHrS$Ed6HMpQwrt6=I*(c2Sy0B05LBA-Om% zcFL`uiYVSPKY18(fk$ba31j!>8P6y`&#J#_>j1wp1QccLN^ zEVRbZ;KQ57|Cx*+qml}l1{NlAQX3H>xC}nD2ocn7x;Ka{RquyZ4I*?UK_uccLBvT^ zo+uDOGYcXyL`G(B?48?Q(b1gOSa!*ku7*$3W5YMUvo?H2R~vrjdo1j=J{h>8M2pn; zk3kW68ov)5QqZWytY!`w7)ES6B8;bo_=Mf^jeq|hTZdO)bM}!(^Iiv^yvu(&=beR@ z{MS%I(aAfchaP9g`^N5Ut+e`VmsFyYG^yJzBs!nI&V=SvAshp6Vju$DEZPR&GBv76%uk^mg6t*gG|D@Ib%t3Lm7wLQn<}adpiENU~|o6FLBd!I{#_eSp`&2 zF6@!~jNkSA^D{`Dn|qrPgGE;>!(DWc&>w{cc`}LTmB>!$mwG6gO)S)~EskM5v)!Ck zy{xCQD@Ogv_h+pm`9o&(Ny6ye2XfwVNvAnO=kQIYKx}!_IuIdkR}k4cg2*-oxE3O$ zx?c)Jwvt?95W$)^W^obywNvr@n{;v9?- z=UhdcQF%w=6ihWo9n}w4X7$J+TaPF{`y7j*2~lhs!vt_MU>qvWgNDETZO|ab0ZSK$ zhGs;=*J~o)VNGy*iYOR@6Cxl{Zzp&U$xYmVIH*xp&Ib;39YhiBA(ssz5te&M7R`Vk z8B&o}R>Ssa`*;CT=<-S=HufWbq6j3EtCK7MRgpGB)_x(660vTUGxzr21Su~Sk2VyU zTPn`s{BYp#uy|qb8NBrbfqUw-1P=VTf#5j*}`VIy{@u`m1S zc!G`dVAxi{LIuF$vN|lz01N8{us8$f!KF}@7VE@AG^kpPNdHqC)hLZIRqicS?Wmk~ zyxf(HkP`s?6XYR_xfMkhqdzKBM!U(D*AmM7v7bE0m^7NV8e)ecQg40KXv0DsTX^E_ zkDBEPww{-}{pK=dKTRIV-zu#`vyTenK)v@hy!sQMdW&i>>N&%mp`Y&8f%H~@^dKJ- zfXe>0ew&A~AJng^YuuQwi*M3$pB}qlE>M$`C%JBkSw^FfOtZ{|s5?iaNWgo* zF6!NwLbsa}o&=9GAgMp1+cO2hS}2H}ko%EtMct85E zp3*f4i7qAQMVG&A1*eHU}FM9+qZ+#NM zXoE@FGeR)^IuC-8J%-?yQN^zzZHxm<_I$u(&ol%}xCp`e6@v8(jT(Y=?Nh?P(6C4> zT(=v}9*e}vyH#K|Mq&$H$4G2ZdL)+5t|9sm<(X_|La~jKPDKhVN@B52*FL-~6aIOT z07#wQZ7|Mt!x)&2<{$4K;#Hp2jgAzawJ}L0)QJs;N1LGkm%lv+y@k9du*JHIantf= zeg~UIA>@hbr_eHNJyRUz)hET3Yhu8#eYBqJIqyl&RFUB33wu{fzCFq+7193m?)-?l zvw5T4k%E}k8HBoy1Nk9g+1@x*NJ6PY{DnAm9EkNr3o7o`$01R-z68o7hpqieIv9|RUN^?3D^xBvt;yj_ zX48(#Vc~B>G&5BWL%Who(};!Xo{bU6rio_gSCd_Q>PMjd#bj+G%As# zNGfV%NKU1a1hkrs?kbuj4QFr&W;8%OyBJgQ%c(@BWG6~XY%!w~)pH4^q)T*6$z(!u z;oeqMMZ%Np!z$Cr$3Or`qGUssV>_|0KywDHw8kt)lOR}*t!OzagFjl1@|K=X%MlMs zmZR4F(R;TX%kELeXfB^I?|Ho0f9uOtHX`{MgK-YO<~u}h_9b<)k4Af?^B*%|lDOwQU2uLos+fn0m6FN!?x=<>h=nt$gFL)l>Ol+?3mP~rGNhu zM^&L|=?|rA-yEOMu8dlm`KPTMqAdlyHwiS{OZQ|7h3tKdNm=tAVf{qv6`A_z)+%b& znoMfa4Jc~G5k)Am)(I8;n?jV_A|BT*fGH}Pm!6!WoV)9ZIAgY&K5S^VE{K@k)i8m1 zuAxZLkae{$)SjZDV-!3`I}pMxy-i9fGMWhNJ#=$#Q~3*Ka+H??;ha;`USvDHA$?he zx8C?B>}Vf?IeAk?I5I$FQfK84eEgh<zjnz8ky)1fCvw%Rza?>?t`;cbNtyL^L@NB0(y1?g4L7={)rEeKD_;JSLg{7WaG%S1q- zWkzF(6Blt>J~p~U4c9P@q$9n^$TO;@TYAF~FH4bU@9HkQXZ^VMU?p9dFaTL4m}BoV zd8lQi9V&}+5#o6 zy2fR@yVtBg(u+_XrHMebF%>Jq@&;Wh`d3Xq5Y^F?9a;jFl1p}&wqWYmk?E>eG-Ty# zV?984A}ADD$>&QDTgZ?C7^2Zx5vZ{K#WvyZCt%lX!%<5}E0L?UhMZ7Z5A7Z69n|$b z%qc2id7j)hHo|PZei$rA@?Z!L4|ga>@?dckz@l0)Pk@Do5W@~KxwI_FrXncbp==UD z)FGWQ@zywBTu*eWZ6iOC^HhK9JO^0RD%jXtqYvo#oLjIl^-R{5B_LD*`k0`A_2lNA zj5D`JletGi97~|ifmdzq`Y!z6y+>0x<*+pSp-@A*6#Z9?r7VsPYX3PS9 z-QSEX;7=tBcuRRbLu60drnY19xce4J?Ac<$krvufUaf-1s=(Eba%W=Fq=I-3UW7Vj z!)csK6|u+)Hl%k}Tfsoy#SWY|UlYYzR#NRFP_j>;w*V1;dk>s~eCV%jE(9+x1 z_A)IMgadt!>B+)SxxPM-mKHHcOQ+!`$?qCaYg{3`rnIyKC?=aUU@$_=2LmRsR_0s- z9*)!&c#5(Us1Jkl@_XD1BxVY0-`u;3b9^rEURA@u#PBA}{R#=$3 z7oU+!?6nK3_@sYPss6<%Iun5+@*<@2{9XqRg@?I5)?WhI_q21qo|@aD&3)V(am-rYtBxP^^%x+?w(jyiRKW({ zkxGEiGHqO=Y~!|etBH(X*YP903>~>Rh}q9z-tS||Z~3t&-otV$YI`+Vt*KwIm`&=^ z6{Q@wQ)o965j-nHji*Jjw!#E~YQBO5fP4j0 zaXo{i5V%KE_i7|g){9ZRy~%z1jjy*;l!l-K{3O$S%^Kj0Ce{)XZoM#g9>)U2$E?iRZPX_0P zt-E;E7fM4i0_ZX&CvI=OScC`T(eAZscS(q%-RewleX&H@vV2@S&sz~a zbhA>)rJJkMdefBUZ@hC9u=$mAy`wyglj15p>1OsI(`ux8z^3pHKq+-|g*7-vJ(ama zZwC}T77a>g0>i>%FjaZjpVigDdFCr8j1(ZV0d#5;B*-G4pbp4d?gzayD<(zs+&3#< z^Nw?}1Bd7bgZR$zw=V1w)%4}`%M@fi?7mV&(Ngx_caFu>;*slxu;+)!B3-oHECvou zvPaXBI&5x7a-OC4DfwlCh9#KVGs4ukoTla}6FgIdwDU04OftBTfaKZ$zAR=Vi3T@I zCdQZzi|q|xdla)_s|7P=cr4D_69U`^|GhNq4Au}2jt$nD~JddL0t40>&kfKou_y!(5j-Y)5ai$JI%g5ZRCH3s%;z8 z(^w`b?xo`Xe7NoGaM#K%JJxX5N|Q6|(A+xN5QU^!h@HcUv7JvTnzdt824Gnae zy8rm!+1)oEtLr~CgzB| z>eMC9-;j~Hg*amWEaM(tZ*zE8gzFz3?o}M|3cafCZ^gLWi-z8cQ$tL8uRvluO7lP~ z6Lx8zlV&(5-q`}=d&``3O@Gn=~1ritMn)f(}M z*%ci~ZjmPNtgm?F;?e2lRRhjUFhj1g5>j+OS_u~2k4McnWB7@>G~*i;(pG9P8)0O5 zHa+P~3aZjYO;0+jD=lCfrSfpo;d+lx+Mbk zVC1Lk-8cZS)x3Z;d3|`!9fGp`dGSuzsC>djhZ488*)%S-JvNovzxQ__98$U`Md3Px zbAd5V6Ne*e|GOyBhnsHZ!1AOaA^72zn|q|m8_h44Z~BLGl6zOvdF@pc7VZd}oK%Jf zIa!{e_B2X1ofsTgcU*t*>x^q-6LE0Y4b(G@gX!=EI9MxNq@{)j{8;bE!K^8;(cB;j z{qv5E1BQ);i=#vH;XpW4Y73*~aDd@vgS`T-{vno^b@umL@Pd_7XHJJ4JRKxrH|9qV z_m|o8R|k8;exDj!S{?4MzZ-9+zRT`S8-Mwe<1aUr_KUQo;i7$(NS5e?|D z>#A@EYJy+~FcT~zx}YON*K*iws6YY?ZsfnijiV_#u5_qNhyimJCX+wP&xqM+nx?Aq zH%LyC(5voAOq0}$_Z83X9TWD`{gu5Vi?Tk$d_LuLK?{t$ShK*c6Llh&Ks$<-Fz|I@ zSz$+LJ0E+1`LKLUc_Mqkk)x+c#0*Ftl!&#?C=6uwNjRX$+&*XR72a1{;ebL*xHkyo zeGG|mt`7?Fh9a|Z^r8sh`f&IJ;^4*;!yCgvT%W;V9ZN&Zs7bY01^cij_G=fj8RACo zbg^=XAygzptx9yo&Y?E!Cwjh_ONu%97UMz1JK3#1gv*EvD%#~_F&{QzerShAWYj3U z1BnBln~6xI2v!tnTR2=*B5RoeYB35 z%{Da>%JZOU;5qmY?z=H8ye=FLz1Q8plD!0mb^%nGdKN=9-8w)~*`2wIQmB}L4fOh^ z(39D=DJ+=FV}U^CM6Vy+5oR)z&PWD=kevrs!gI9m>LxfQ7SJ(&agzcxUV&bMZnl(L zZ{zH~eDDQa0{>l{>~s^C9D;JBTpm0(VT@4E;0w!Q@I|PP=at(BN6RgPvfMdXDK`(k z7^U+i<)!;>( z>o&N({KmnH%STQPUQ*sU`1111slgrPR}TJ3`OvAsOUv5_UqQbL%~2q6Fp1o;e@@ud z|G)B*nThhJG2b9sXmP7{yJ(ajo_uSOx6Z}4dYknUqr7+cm9}kQFmt-4X?b%f*qw3E zGF6RZ0Rv%0zl_Z^!pjCPmqpngyo~=|K2OJHf$r_AgRkP}@oaVQ)%lb-Z}4?Mbq9m|dH~ig!=MY0*l23dDNhdmMS0KQ z8_KU6e4`-oO@hK|IX5^CxL*mlzZr0U3*i1%!2K!)D-ho$(B2JbzYWmd18Bb;(B3Q1 zeg~j^wLtrwfcCq}&fs6tu@iLgKK?rywhT_up@PXBYO2isihZX~>W972#~OvNv~SGx zm$5a+6M`o1N0rnoc#OP&l7GqzsFlNAzICQ#4qRzo+oaH;Tw*7a*dadw6G;kfUgvxJ z_KWrCN0aEs9C&5?3fAEHr2Kaz=}lP_#Nw)?P?D-JPCU=TRHX-ti>J=4$4v>QL_aQW zDe9y3wZ>^Fsv_OL$Vf&@QP0`9rYuFZ>3^1@z8#6CrKta#e(Cg+tTq05U2iuq{ImpK zw1JB;eOgY~iY)y}07`>@vVhi}k?gbdONG;nMgT6O(GtDw4Q3zck$|ng1hp%paXT4x z(e!u*Y!r=tS;UuP8nPR&>DcyQJIzyq3}9a?%B86&BH7RDm0aA;tPJdLyGD*AE22|r zq-j8gaipzOz*rg7p}=`6iy*K$iOPUCOA^I3gDR6ZZu)_4T!A#XGCV`km+j2KW`nDg zUgOk=Cef&*^y@vdprX!4vM2TanWr`!#wYb&@&xDX>iDGASLqq$ObW>I>S%L!wKJ<1 z5i#b>sWdu!3*|f$hGRukKMYr=BG+FxlG#ALLNxVW9d@V3Rz$t^ri>iMn^F<=)|yhi zWJ^GxT0ScI#`ONXn&y_62e zOD|s??xXbbs&p##A~{*6l80yV>TWni-o@qEH%6!G#Wl61J8&s&53j4h?QhZk{!m%k z;$>PLE}NxlJZCghqeazwAY4+*rS77-OSka+VzZkj=QSHTNrn^Wpw|1-9JCw--;!hNll+Y z$I;6h+{SH&V|wjadaV)mrCri)Vm}=;8}{^>0{#?G_J%JNJQ(_&fuT3UZTe0#MAdLH z-u8trjLcVr7a;P(3sdby_%hwUXmo$O?q58*e~IqDd~|<@?*GZ?{-wJA3P**36hhdm z^Ogl!Kvyuf!G3<8D;MRu@C9^k7}wFDb8h?3xf3B#A$+6FeKQt< z(x4<%E5i%W7nYTzTY$cBz^_(#!}b!g@-JBpHwZU&bMtDr)gA8n@P+h$@P*+BbhmXr zoEn_Yk%gy#@OS6obRO=6Ckf_{%Q>iSf7qceQ6)FLx8s$=eUfUc0?v^56*;wbxeL5} zlU)(V+U0SqEd0~3kC7q}_lH-=QM3bqv*E!za0#?7G=BSH?1LU*K0I!gK?;WZ=@Ae; z2yl0?HJ(B;bC5OZK=bOxzgQ)b?3LRv++es)TB21o@^Y)S*2rEp@^VlU8)=4D$e~V+ z%)u&qX~bG+9`_#TogpwfPTGc|0@+}{J;(W;QBStq)@v6>b+!Mv-h0Kper)?!*~k+F zNA^rWV=6+#k65-cXF^xfrKz7vG@80#6LfJYKZaNkVU|VctPT%R&d+PAsdxK;V+>xa z*c!k0S5Km(!s-z`hOg5D;L6I})#2;yMpR5A-(xr08kL?rU^lE*(%VEWD5c-ut5S7* z*}3@!C*#*}T(?T^&qdFYK<34MZ(hm52l7goe-Gi1Sj+44a425BE)TCwmBR*Z{HUfK z!c)ZBoQQSK7|HR1f3SaWiW%XPxAYd3tO_L?QG=US_-d!&!5eaL_kFpZpEjzu_vd8K z#joXtaCc4gVvcaa5oI2KHVoSL1KPwYOC@oyFig_KooAo=aih{zH z-!WCAyN2IENxH+uNlK~7M&6>I<>kC+LVhw#?zEEU2$Pyfd zL*Tf@S?83o4qr;jxX6iG@07`(k=BEDMU1BPxR${(UF#u9B2hKND=V${&6U>smP+e= zYhCM!HD6U}J!8_$NuPsvlR^;JA-p@I`>yWUN!a<~uDaHvmzCCIH(VC(q}LjOvuDmo z+i`%=8m$Lyf9<&1yIUXDlnI`41Bv+t(~=5)g>RFdx+m3Ngm2gVy`%f@(EY1N_ur}e z?;72IlkUHMbibzLwuWu^GOxl(-JGN$-mRaboY4|gTScZwaffRWS+e@~%Qfb73K*6SFnZZg_5 z`aA*kB5EN_sMx3+Z`GOOfZgv4-(b5MKw4}cJ7i~~48}Ma4wP(B*n~L_gs&5C@U5O} z`fl$k^BiDFFE#YizVMBz12V8j2nW6b&$-o!kejGQ%a^FgBF_h;_JH02;0?pwuS`PS zc;nXY@Q_+YjPjeQFDE39HJH~Z)PiErLDI}u--h-&6uxG4fb`vj&^0z&4tlEzy`tth z{p6$&`${FNrhgQ?mg5umg&R0SG2EbIcwPqk>$PFi4oAm66Aj!DUU91i7Rk(omxGj-hrO^O$eL%kSkF^N z3P@hSfZ5qX455#fZL|e-Hf?yOg74tgjUE{_epQWe9}5xV7^P_GK{ZCHWA3XlN>_7V zjZuo6`)Z8R^4wQrWHB8)8uslpJ!;%~QUxa|0u|S3z{tMa7-f@Df+>aF7{a{9B0tEU zABU=0ar~;|1_5XXQoF&9COiaTNEcuQ@P8VI?(Y0H<~*Rj{@WYRfVo^hyyCVVO7>LG zR?Hlrj7voeT@NWJ_?2u35?;ov1S#GMHL9uu7HhP-!f!;hh3RF;*%Wa>r_sRr!M8VM zZ`u}B#BcQc^^`lbuB+NKhM%WUwZ5LyLA>4oZKTJev{=1=?}zRfSJ-KR^#?pp*$jWeP;$+J~!R->!&# zyE67|8}|z9{Kc=UZxi9Uzt6)Js^dxvW;Hc-`Y|66NOt;w)>O;De7wOC6Z4;Fa)5P1 z2Uv49!q{fwl2+^}pk!ve5hTk1siLqA85Fn&UI}xGD$xzc_*jy<<_iY|+4f{@0`&ZF z>I@Had+5u_Mw5uSPT^vYYCn^UEkDeaM6VZEpGsX~;kRa89EP&RQ@bO-~;%->a z%v8FOvNAXz4fStOihK{|;*nZB?b9xZvL)-H1%);*dIuv}Y2NoZO*__irfJ9e&NS_m zzB5-TL1}3t>bsIkM}5!M?>q0sLn>@7A#REB@x;30$!Uo97k=su$EFv%GuJ(aK|4gF zF^)ljPg%Bc6?;S1aTR-`^i}M9CMzqC7;FfGwq0`ETtFBcJNE_*+Wy-9ykHE%U|gY8 z2pEBpT@NIJFldxN@>?)G1K?7>g|dn4XZS@ibdaI-kAfyaQDL_KeUvN}VMtb86OM$= zcl${v608!(nWnYd9D~9^EjT8As7*X7eG;UjnVXLnd8d9dO_*}Fn(?ss#Vi{;xP%C{ zfek-^TqGr8qu9l&9JMrq)R^TzvYiHVvOIN0&0>&=;U_&Cm%*_V^s_;SxVkO_`>L<% zRPv6g3|6S4#WnTb(Z=SBgLwefw#ivm-FNsmi|@k3z^%O*JyHMozz%+D;-#>@buRV} zPeTfGUUNdT%-bMbI`pm+?4&OR4GeaS4?z3jIhG9}BM=K~T>RO24lJ}7y&b=%6D*6S z6OzEGCQ}t85XjHbOdEt@*Z)VukDK;mWdx#i4@@)>3Gzh*hn?I#XHY`ZB&&%KiCMT= zry^+&H%>~NZ9rr31H|d^GRPupLQ$M_i_yrrT3YLj9U-t)zznm(EDsHoGc0Rn_Dx@n zjsRmG2GewIplLbHz946#JhR2fwR6AXdgMy}*;-^VWqhBF8%zoe*!7{rxNa%HV*7vC zF*DeLqmv4SChQyo#P>Tu#CQmC(V7q00f6ekQWZVw8MNvW%6QX`BJ@gfexM6vstGWv ztQ}Yg$=DtWK%>H`ORG9g|F)esP8s#9C8h9t3Th)ke)@07_GOu``@uZWq2SPkEOIDP z>yAK+B(wYHLcr732fF82EfWw*G|qkOfXjg=OD~O`D;>MU)-M%@j&;?}Nm@I= zP<51cu$QxvxtOFjFgMsDZgdZ&=~(FWJfMlReqYe?Q;;u6J))YyI#hEWq@&x;Pc={! z9cn$swsdRPVY3Tk^i%nYLtPI38-L2A`qY==pxlb`iTr9IEWb| z_UV&T&7wX!KdG%xGzqrr6O8PpwFE=yG=h=wZG4U!6bS~JrpqSYudwlrx_V)vF`G6k zZ%RZVGXo+yIJ!5Yxwg9JA#;F6Ve|j@Og<;geI6Ae&api_EXTZ9xu5gV&T;mV%nQ^? zUp%6D0uJWYF|Wkqh;I7+QK48#r@oP1tk)!v>?3JFLBVWCdTgBN99vgX#Zl1?cpOtx zL#cY&nxdh`xEbSNiiScXqwZZpN!7^`pu=;nq$CDh6R-kS(ng2)YO4|nNmRCmjVIGb z`AfndPVA-Dhs zNDvOF0jK4_u@>ymuBQqiz`|f!BS3Wos1Ct|`l*_@h-S3J9vY`LfvPc_xYVK39#iF# z^G0(FRnjAEaX+rgfy+ph+jd9=lv16liQQ?ki7iO<3lsQn-00+Ib5y)IDg6VxCb0Q6 zMi`EEn?i&iGq>DCiWGRIgOI|)hz`RJsCzIX*HMB*MMN6b6Dd%Jm`jcN>5z&4%;sm% zd8IJ1pLN>({D+&3g5zcvBpxOXPX6IM4Ws@mpx4h%#vk3uYyjY8=edhLJDIiYA)cKK zEe;mYvu656_=2frEv>@}w=42hwU(7Ke1|!c*yPgrASEDtRn%$wF+j^ zE!*ctDZ|Ck5&yKx06%h+@vv{fDE9aX{o|&3!eZ!~-foqgZCr5TF+PR@6c89`Ey$E) z52}Q0nZ*%VMIt1Qm)?=h$l>jMq#dD1r5flU+?MUzw_tk*H7!XId*tCE3tIeaW?qZ`&dSXGo$)+o}sC)1*@2JHsPWG5@z4d}OXjkzJVrN!%A3BfMx z)}t552TdunmcRozqqB;Qv#ay2p)Tp=;%Hc~p1BJ{vV6rPo1G~hndh+g=E+=?buO!U z;B{&mzqTV0(xJ4l3Km8@v{XJfCJ;=4T?FDQ<4ATB_m%M^yNdgfaYfi1Zd&Xv$g(hh zopXt@%yd~Pn-R{FS!F`{YR1pb(7{^*Vnz9^q*2jOuEB3%W8DVP?`Y)NKD*B5b~x-g z2L;LuYaPPnJv#|W(JZNzXv67TRypmMyMZ5kcg41{=MQI$3Y%fZBkWudGxJYd%9YVc z?DFcUdS4beQzsTb!2PX;f*AD=?my@=;xaV z{Kft(*eRMz+0`-?_GJ6T@q4lx#qI~P=fUgTJq!092<*$UA#3FM5V%rN@Ebc!ayWA& z?`lv-@(?=WCIn39VGa^i;I`MX9Z}8;9wAKN86O0of$aqvaes=lJV@6SX8{=$6J;?u z<(-P7q_a+9KE^Jh$vZVmr&F)?NQ6%iKi>Atsb?GC;DN-;z$JaiqLOy)Cr*> z3c!XE5M+u(0X7hD&{H}4LVZZY$wX`#;+x_Skv4j&AwnB1 z>-9Q~c-PekeU5}X>a#T@Xn8|pb>QqnuIgwarzx0FN8|TUMTLu6M-wgpFH`1)QSy0_ zA`Cc9>dIcN;Vtiqm;kI03H>u2BI#@gguMinCXIH}OL+kAQUSdA4-V%X^ zBU#S-4I)h5g1a)Pp%fY8k`TQ|OMFtoyGFc$;73su|<~l4sF?Nzn25U^(=wSYb*hl;Z9lt&ZyBQ z*@URn-gu(_#j54SXo+kJi_sE+{z;6HB|>5!76lS>)^$FS^>)}C8=3R-(I|sfELgQ% z932@Ro0wtLhQSyfAZ=?jJhlpHlZJ;}f@pZi5vUm+#)p_R1Z!n@Bx|T8hDi1`1A=2> zr_d%iOZuQPK}clmvOuUue`JD~p?^LT14de7p%^|Y3&nzNG%E}JL(N7GId^O3tt6)Z zlbH=p4FZiwwheMx1OW(`v9jrsyaq+8`N8g-utnL_4pQ~VHNAQcFFo>UO_zaFd@Oy^ ze|sKVLsw)&LfHD59}DJV3$94xj@zx#(5-nf%hduiyl_lG?2)OT4C7`)rU#aZUQ4dg z`@m8Q(pjYXK9v+aqasuSC2xK@bAYG#}ix(#obT9 z_t2MX1@_X8^Oa&4y^}dCixM+q<=dZX+yO5@BtT-1iU42S5EDnZ#bk6fc#O zZ+q>#M`d_rD*N5~d$gjmzy3_^+n$&G(*3n>i9G1NM_%(@tM8y6Y~O}BaSG`~6?@?= zcmIkNwg|~M(LQ>m@4KSeuOHOcMiG4W zfy|_7Rs!Do>x2uMbPe;_0&~yr?O{zBaK)@*PBoeL{U0eXB1mie^VWAZA-1Y~&R`!e!-)I*v{0H(#;K=m>z{Bj+g|D~_VKC*|Q01P{le(LO6Yq zaI&W$in!3quDE>Xc0w}=l`O!np!;S)x7ocy`5KPkVG~%Q^BNF=nTjn#mcWTl1IBw8 zzp{eLnN>UaRRjc_a)gVe59l5mvu-Xa0np8TaBf~Ev#j#?fK|c7(UOk^?9XsDXZeD; zcCML#0s%;ky}h~-C_qeWV6bcZ<=bGVbR@W1GdyFxYh~jiw%a7_GS5iuTzuz##up4m(WTsIcp@i1LV5 z(ZCIQuR1Xu?`MC;A)k(Y*dk&78fzcldHN(&&c4a5F9;M4V9-a7>kk0ot0Y`*Y4|7M!pGjCgC>BS|%Deo}|@W|kXG#o*sl8#b7I`O@djSXXs6DAnraqTV`r50sR8(?-D?-k`g zWV%Qn3%6ir9H9|<37Sy{S!o*JjuGZys}o1^-R>4)K?s4S7Y%79kxWdsWL_7ghCIgn z%Nou_4%wx_d4~)xai;*BM9x3bupi5e|2hl^EQuAT>WnCib|1-lkW!>5z6~AcKw+4Z z&_!nm_Q;liY1YdSRFP@HTvPziV`S;AMwxA=$3+eOnF-r$*Q9$xxsaNOH{!c0+N-xl zyjimmqI@Z}`MA;-ocpk;+V?_fEzCOdJR6ER8lJHOQrjES@~s*rPgU_Q*R`JwEx^}OFNW({KE6KU%sKc&^pzor5uI}sNYEJ{^V5xv~=~9U+0*uS9 zLu?wmNqLP6edElfibrKQpg$1gpULmKdjxtnYYZH9z3F|Uj>;(LKZLJVzUvL|&H77R zJoc&g*oAEmarzyx^sj&0OUr+FB$hlL-zz`)##nOhSK~Vmet#_aFf?K_t7|U)?tdmP z)`$fodW{!LxUf>_?x9wBWFsw`z8-n8eD?n@FE)W-trrU@Oj}p_#)4DJl8;`r>edu!5*r7pyF`p|3ziYkJSUMxiy!r6rXW;WtR{kMNCFZKyDWNL0K;~jHjZRiwD zb7Su`{SGnibYl|%t#M;74Z$KGMh#1^abv0Qb4z{b1P^9NG2@}hpp6bC zN~UFrpXK9bM)PFSmo@69JmOYj9$#>ZFY6>=cvsvvFE7%Uz4MZMSu)(EjNst9FZ+=! z*=f<4wNZ$Z?QL^rN6vWC{t-|_&=mFg95}OgZqS+SyVx>kR*0MQW~q-4s4bN_q!M9yS*^PxO}xh6H7L~#!vxEkzYD2e$lY}T zI_B=C3F--VcRGm92hg?PS0D+GS9uY{0HCcq>7eP*4SKwnFz6``@8qDP!~2gt@Qd?# zyPrj$H&UwkybB|FWc!8ljKx@%)l9iL^l_tFPKn9f1_@1l=;)$USL=WNK=MUl#aW- zSa?;`bA7)z!QAZL{~y=b0#4;tD3Q zq&bq5P~R8p`$nK5l4E>oUEg;c!lo&Va1BbIYv1?tGq|6h!4+>1K{UNx^L;5=9=Wi~ z@vWs%5wvd~R^oRQNyFqH^L;HqSrwVVMo~@h$XHu5>;6B3?`v#dbA5r+nCojJH)$3n zDie60pTV8Xs#xRte$I(6dUT(k!No=X{0wfQ*S5KpV?HlMX2p(XiQsn3WX;PfUh?@F zTtPy1P7;MRkM^8dg`c0nJ(7QZ2KVzbxNbSP;Z$>FKR<(u4pQ)`%Eg)P$|7HC7G<(d z`=j{B=Vx#+v;V(1gZrVva+j3`YzzIAwOEv`+r~44*_Lu9W51}pm6ABgb0+&9wzH+Q zq{u>Otg4AiT}`cfK-Z$-0$!cMw8W2%0qm1lg->~toL~>s7hY1vFtv`oqO=wAs4bP0 zUXUh|o=^5-qSbnx>$R`tx7M+VZ`brf>)YtXx%aO(NB-aD8%-8Dw6w^zIWs5e-cY=|dY_kDo?)#mgEhSPrkHsts}cjP2N8>G4#?ET zt|JC`+KU-wIQuA}I2E|8ZqyQ#sE-ULD~F}1u0#;*uBLlE6U7S z=t9I`kONR#OAOuD>4HS8+0g3QcD~9fhI!^gn_VWDm~Hc)WobS7C(hWm@;z>JOLC6y zG|<+T7|rs|&^gX3*m+v&3>qwIV_yIPh@s2R;dO#J=^juwP_b|`8TDI=h@-hpyE;v~L)2NcD%wo%ih?vkD*|Sydex(gd`E*xm zh5qayZyc38(dOee<4Q8K%W)R&0}L%B)!`RaYMMRGG7&C)Ab$#g*(OiwZwk&xexwl_ zaoGrc#JUgjww#!EeAJB$ShKjjfuEi+T~ZXo0c!K*CF2-G^4nbYa>33sgZQbmTeR!HRn57 z`9RE|`lVOTZaFn`@>*p5<^0#QMQz2zj*27ced$-Go+XM{Vo_=@&r7dr?U$j&B8?Ub z-WDjBPG=snU^#@?Tsg2UyJFolikU=tepq7%^3G_}3bq5`6;nTgVM7ipOF={>+mg(% z!rtnTDbMm5iSD(az3>T=Gmt-bJ%4{mo3XL+8hf3vp{N?QChuldz2{X}NR+he@^LL| z!)RGCnby$H<9Ydq{||d_9xTUk-+6Xb_q)4+#zlg7AdywL9xejl0e~PSq8h{{km6ww zyd~f$*p%q;rHP5yg=EJrZE0-Sqp%rk z#SC`MKR6Ti7l-rd-E0d!SXRpu{$cmDF1nV(_-?ka!W zm0$_Zk_})-+lui#>si#SJ=C6)0=wI69~M`dF7z!6^uBni+|t1AsjS@c!0NNj5V*Q1 z(%2C~NaJw25^0Nhc>&T`y|)l)tSY@Mq_O=2BI>)5^pU15bc($Cmg^9=dl-ut7o{wPigqPn34_VNJ)P+ zRfVk3BtcX76HlDxGcv==7OMJ<{V7(pZnvxzitW@YZ>`?e=UJC>TC7c5ucoXgKsVav zwVPR!_KW}hSt#e4QnDrv@|LRxqY$tMhKpXDFmUNG#Z23-AO(rKcbe0?*Hyhc55YRx z`SWKWvaJg>Iev+|X2HSebzs-sn#>6=BfA=(*6-M^#wR15kf_FIbiK$x`w1>J1>XH- zJoT|+H69NaIYeB^#uYP-uYbC*b1nc)JA3}_rwbWROC{&_-*=rcnr-CyDHOu8dyXW*{L$Y<$I`Bic!wRU+)x=*Xv*cL($@fx^! zHb=3Fu$%-P7MaC2ys>QeRpj~bG_{O`F&4bD!KPWO6~HRTp#PfczKY7$JWEwD&k_Ja zek1!`TvPt-X*A_@t=m_kDfg+@QM@KAZgjQ}Qzha|4&eNDor}H*%g+}t_OkqeiI-EksLfOL+o<^G=}%wPi{;rrOFX_%-vg)Vgn(03f0WE6`RzkxNntQw)jfLHM7Y+R$gtr&`%l_(6tKA^QK9c8#zB> z1`ZaZp2n;mE~ecCU5om>+Dy>v-`Q6;L4W+6eRUJ``{gYr=&R-RbaAVjpzGWO&FpSW zQ{Rn((mE_&LzHc6tJvA9Xl;DU`)6<6TKrwZD_o-r3$o$z5o6C=spH?%C+*}B`86%R zZUyw(eU-HMT`Qo%=)9CJ@dD%a=h8XwPu(G2VBNl$C<*XVYC$_A;V<;{f><&s6$87* zuhq!%d?KZ4#?f>-r=o2w5ybEJ!Vw~;PEMRDJ&JYU>3jDm)>q`LJc_fP31wt5m!fi` ztjN5I$|6v7d5%TY$U{(HB6Xe?M6+pI@!vG5lRDm&zA8=u@%)cQ>;4M#m`Tqkib!oR zhELx}@@wKZj9q#E8o3~hKd#Z~$uA9bG?hg_H9E_L)LYaKOjOOBN(mVaygoYBsg9OSww z-I{Sa@yc-ZbJ^9zELNG5HLkNGGxonW_X^L-kEAElmP+Q5*@J8(6EDrd^4<4m5W4a? z+hqA=e6H9DTIkX*=(zb>4QX+P5QF@-zK`Yya1?*yhz})>ceQtGT_7G_uzlm?23Z&I z4(($VO``oX(|r&C zM_l~MvX~ukm!yep=cKK=?-DC*&G3V8V-@t7N&SphQ*PBrTe^-NX-X}lTRecc_f53g z99rUavKrmIKr9TQf&pVp9e_PhL_O@vRu-9?p#d0B+b);B2WXg#FR)u*M)ARNlQtOtUAmq#Alfjkf+a2phjxcXWaj?m0W9b!>}PGi*G( zM(4=W9bVG}4H!^&wCg!majbnEY9{OGXAG6FqO+b0kLVZwmopjTKu~y~b8T2b*9emx z>}+Xo71h81jMrnU2OGAlNPVE+!jHxj3;V6Z!1ZKdzbE69!G23!;a9Oq*&&P@!B2VP z6Gw2TxIU?9Du3D^F16j!jL&$u>ScB=qu0D9B61c4#v@G8YdEyohUv78`&fr@TI${9 z;dDOU;mkj*x~=Se>(g-_vwyNkZI7*sT&|ADyDk1s$KPAy@82;{wAxq3-#ziS*2tN^ ziVe@NtoBa-5)rd)yIj(kwXwbmO;_85Rw>}br!j+-QL(v-QftWyRHj2QA;+}l9ALT0 zVmSd8jPWKeQ_g}UV7i%hCe0vkDNbcui;!*ODC+BrZnhnLw4-QdJBtUi8;Xx-Hx^H2 zHx)me-CR7L?Lz2xD`d!yEM{<-TX{CW#YpE2+i-?uZjoiF8K))EzNu)@Yp=YLz1gjb zQjBMN`G<4%Acwq;>rCu-1J>>G5@s`OVsZM^Y*rwXJ?6Id1LGaEdjPNPU@vg~dNVsj zhYlA%o*e=9+kky3urDv3&)!p<%#Icx&h9K;J(b;6Ol0q+6L-^zd+5ZybmG2ZGW#Ja zJx1mC^Y3_=%pRb!6#vnt#)#F4#1Mv!yv#o}UlYmlIF`nfrgR&!l_pkCN`e3DGCsnYf}{sar1B6g@5hr zh{zhq{EtfDgeudEwng-q?3mT|gB}IX*Tw3y4Vi$MOB)PxxpZ#>g&qgR0RDX#6q}oE z2>w0|irrcN#~u_z#?pV0PEWdkW#_CBn78?qMNHur7gd4t)ElPO;N zZj#xnzQL(kzDoPN{1XF{7XRH(42&jzuDoS5@l$r~7zBr$kZqF}tL5UZ7GltMtHbJf zlNYO91y$pT)mno!FnLiMv!Q-%P9>rCRbl!$Q=rxMlLTC3Fckq~aEYDVm6nqi#yi!4 zRAzSMEy0f2;zAr`o+mTx`N#>)S!xVO3|IrhPFSIlH9ca>{8@G#r#l*Uy30AKeQ;0a zOW^9Uumo?#Jj_X>r76WOpUK5!uU^G$<%@OgkdLv9Nfb6GS4C+IW|=TZ?^pLog3a}N zu*<~2l0*D{kxr{vWZ>Y-rRq)^7Av1(vGOUJ8o}9|z8Ngxrwe|R@t{Y_n8Kg)PI{N8 za0scQlBmHk62u!aV^q2tl`xe^CyGx0>@W*Qh3v!X?loc#F$G?yto^n9=H^Mwl?`#O zt61;i;(N(xOF7ixSV@$N&~hD)hl0|Et9&tDQQomlZ*dN|L(EtTNtx{w8<{9ec{tXT z5`n4Ech`y+W1zy6j>=Jb7Uqn4$W1UsmG{gD0G(IqDUTSy+R^(q`4pE(i$%Y?;*_ck zrCD-|X*=UH1~vW(|7*q#FB%qwxAQUPdD&2}k*(oT6gzGA29ZLz?f@BH*D`TVhJpt) zkpb0Yy(|HZkxrYnwQdePV0aWG`Bgv5_;+4Tx%B&N`W-t?8yafSoNYH9`|P7HASie9 z^|xqZQMJ{t7cune^k=`NiR2p?m&$NZZ`aSIFucWqPQ57=QE$DeXmM&ysa_w;6*CBV zP_kxFq3lZ|1hGOn1s_CzI|{>|NXR3ef(%{k5pp7y!vhXunxPs2)maAHt$?TWWHw(d z_c(_>Y+WrvuuU|6WVW^lSr^ZDF`jRyhe5(Kz6!doHRF9hJ8_f3O@JmgAea zb#Kik6flA;M!HYx@N)jhq-{2ml-E&}guX<2n|pmiQj%*426OnLa^DN-7eJ7C{2Y zj#RW)TJ9EMd;y;EX zeG)*{@RwoW*1Qs?pU+o?t4R4=q2YKI)*bGw;M?_5>VfxHJPG@)$^)tr#>!k8@EnEC zEQ_xQXO4pgN6R1rWl)q|xncMSW?K|21D@>CUI~YRn5_?afIedy_fLiiM06`hymQ1j z;BbEe+q#J@-5JuRVKed~hS50MZq#7Dil`fehXJn_eMZ7ISS~hh#oI-g5j`zYXT>{a z^F0*vw2wzBl)9w26z7qE1y1=d*0_P2?d6TO!??b@5q7r48^lt_K$V z1N8Wz@L;$D5@37>RSWdm7;b-3xZ(0aE_0F=@6x?fuiykCoBY@q4(K47jntEE#6c7l z@~e+!Qa10BYjiaeIwMH4<_{hW?@>qXW1al;fOH}niY{tz`ZOHS7rbwkJe+CRLM0P*R7VOqw{AlVomv|os!ywV4bbcpIwp-x;6S&R+JFiy%a+5zmk z8}mD?r6NJ(7V25c@0xxG+4U^3Q`o02*E)*Lv5+k+WQ*-N0sjy=RH_}pxF7yQ#P2^s zniJP2&0;Dntbk}Z_$f5-HE7_gq=835?{McTtL}cW*D=00bQ0HlRelT|%vevSW*oEA zqf#PUf|YRSv2dK%)XGEJy*CXHC=vL$8vZb`uMdaAM>;9+d`Q_urKB^eJ)VB{vewpP*9Q*p#c-q*jRQ9G=;YVpuo(`yCSXTO$r~19Sa|nDwbLRP4A-aSXUbE zRzqbCT;8Mms`@nCtNW_$G~B2A3a~M(-$T;3ZRr^SbGvuA)VFOZF|(Ob-;Nm$V>quV zeak+brR`D6HGR9hrf(n6qKgkob$t+RyOCc05a*{#*+JG))4~fM2EP#V!_E?n4V{zr z*nK-3)o@YHn2szMxyz!)$HSf?y$e70SlAPeh>>6?J(sSWn&p%jOqO11>ZNwLQ*~h0 z?2(ROrE+Yw)rn%ASBrX2MZBOFQP#MTQg*QC`|cuK%(b^|&E}7&;r9oA8iM3lc%MQ3 zsK9>A4>Cg;kA_FW{@LsUsNly8p)-LuTKU5=DF- z)R+h=d8qE8sRW_Ahpdu->K38#u+0N0cNlvK+b;ixagU~YfvgzePw zf$;wDumb83{4xDJ${+2%FWm8CVb3hQ(fu-q$GM_AaI}M+c%UhJFJL)+={fZgMj2F%Z`0%7FX{|l~km#h=;kPFuVUo0~a3+b1`pnPUZO4Wr!eB zs2mr^@>-k$k6aUTHaNy79@WajFEv+{!chJeG0gxQPW8%WzM?b(i3u$+T<+%?cn<_% zL$%U)IiRn~7(thi$Fiov6mNn6P1f27&c0(9=Xo7(kd~!T&YNg>{hm)UVT$!LKP3E9}od z<%WC;n?*ST#S$lw8dY>^=WP(^@pi;#9j3)L0BSc=xzjES6$RCiwQqf+~vXQ807tH@wGMEmN zLE8t(&F%SR7O{1 zaco-El+j8m*dggYTg!Get6>!L-V#yO%Cw;OjA~xYBw?8Y1ZK)yK;Z+WG-y6#&QQ9g zb9V_u44|{PSYGLZioPfw{4QrY%Dhs|M8Sg0ba6S5`V}p$5QVM`sfwm0GbuT$qOE4L^5s6y;o3wqzxh&1DutsNvHUhlDxGAQ zl+2V9`QnK0J-fZnAW^-RYXvN?y`RUimf%X1h_vYEvXes#qnHCbHlR&!t2C!n>C);> zdbC=VQ7X{|qBWpIBTK!rY%O9|AYWvWlxxWEnjoNkjh232Odl>#obwfIe~K72e1}xA zN4my5833nw-s(!0_iN%&M@HF7V%Art?2R?`nPyYxyV^bxJ5J=uI^_bTh?QK9U`|=f z<-zPpD8)e!$>W#d2`!-?Bf{;bX5h-W79+J_x;{~ABS+L};kdSTMVw{Jy0AY7=>_q) zD&a_Bo%e$iX^Yl0v7+U`SxXf&^k?$}unCj^Kmcdr&g{! z>Y)#mKOG;miZi}EJATPHC!NypgN8Nlqp3i_G~V220B~C5d;oO3G9a{w-P;7-m_Bbp zd%l*1N>F+0paq+F^lABX%~Zr-%MM5p4`ej+L!Yp_h+M&{#h3sfVV0j4696Q}x{V0{ z_~B&&03W&wNG&*kIyT)V{+n_EYraKOmZ#=gXk|S2Xb0B?Y2=6KSimH^n}N!23wi=G zXl7F^V9bCL=raR-$4D$-2i_4M@W_tV_6pMi6fsln%@sPGGy#lL2d8s@5kN<#ccm-2 z;M7}hB~yYtyd*=Ur3iKcHx6$as0wb{owm8s8M7M8HEb6HvEVq%C6$*gQVbAczWjZ* znT%^?eLSMilITL-jK*9$^wsn;?wqyj6t) zm>L-o?>B;NSeU^#zN`eej0W|H{@vY;wSdG9FUV+wjPgd<-58;OS%b9L*ypc4 zur%3#WSliv>qK#iZ$S0iPjNlBn| zpNGw`F&rnCqfJ_hBeBtjCPG`HNmE%QoKeo-C?VcarMOZm5#k%95v98-=RQ?9S6|B3 z@PzY%C>UjM$dn})?gE1k?~EO6gmQy>RK5DijvKSZfB6qT{i~zC6pS<5h5=rJJSt`y zJy9$Y$fE^m0s^rFS!+ksg_!s<2(t2C@Zk+)eOZFs63EJgVMCv4;u(-J72x0ZqZsou z*Z>=ULtwYUC|%$XOsSe*{-UKJfu>E3U$AR%Oxn+h0=CplIhdup3N9LE$I+#uLFZZ< zW^tYLC;X~nM=p@sdB(z}0k!~_+9<?jm#F4V6ji&F=6YXV2l|UW8W7rjHGnA z4$E4D#XDER1W5$b0Mo$&qM)UhBkDo`Frmc7bVM@}XF5KGg4`PgjoU^2%BGQ3d z4ZNV49j}O?G7K4LGD(gm_+z#ZXs{t%*=M#eE(RVge(j52C1u7KP9A0jKa6&w7Bq;$SFegALJ&7D<~1t^vL;16O2ufpu%CZu#twqs|I14i^frjg z%?ogE(&7z%o83Q*dQi3Lg}il-)u$F)y;IM1e@XA^E-{yuNgrhl(lYCpP$! z7!8v!ig}WMnnPpvtS57EI%LE9gf|jXt|Zr!AgNmjF1M6VAO|~dom47g+^z|Z1R--( z=Zm@4Y%+*jb|5u`5fk^Ta7KG2NNxF#;m)MBGk_x!YC-$DwlA zj0xCB1Sa1_kUy3afj^nk%fsZl=^*Y&z}Jgo0fdp`gFCLz;X~LpYv6e`Og8`D?P6Yf#4LKF`!AtwU~{wvoUVbm>kR=%KgP18DLls!mfn&B z=U#p6F_X9rI;u}?$)Gavxkj`_y*M0c6o2&DuW>#tv*k^SmR1j!Qc&HH`6Lt@+<5nY7^R^1Jv6F=X}81gkhd zBHn7Nd-&91?r%G^GwB5ex{^tMQNW)s1q>ozP#t_7Ul2krP}jRv#d&N3StMTH8zZ^Z zs5f}unWW3?j@V!F=vuv@fr8zb8&W-FF{~*D{Bdi8?idaYX)c_@kml%|k2K^ZB2A1D zzcU>1fKMt+)jD0h<(~{kt>OX|$j0Dw-X=!GjNNaVpuUuLe_0SvQTNZd;1V7}RfGMU zo!sW=;7oc(=ho|)+Vf|q!WTvZ=poljue>#yd5*QD28oPb1AMHZa?aQ~+19{qB?*k{ z2G@X;?$e)yQKRb7g2b@|m`!FePf>ag#pw??(^i-%-GFBn-@4D9`I6%XDxODPwA^~2 zvuW+h>+q9gRIy*R8H2H0Nx8u!TgtKR+>NkJgtlu}rpRTMw9Jd2Mf?y^(o=rgmN^*4 zY4P4T4=Q~pyp5L)9MbsAXK#F~D>dy`G~EPEYPxE!>FwCP$)UqEt|?;8vo^z|hL8k3 zW~m1yV9CP9n}ax!x?g|*6%IiFBkOqxzzr)AKsLl>B7h*r>3{WAu#GZvhEBTYV5k|a z2BdT?fXk@COLwV@;S1))_-bmCfkyq4i@Yf|3gVx96r!S3FUdqw@y1Sv@M#q5fP9EP zT^wK{J)6fwDsmi-QAcDV6*>+R3jK=M6B}%1qfk;-1r{f5kGKFY7=83P+@mAi`Dyb5 z_vk4$6)V8ldYrh?`X>5w>5AV+(X>sx0cg}r3`Xu4|7yJ8K{oTSQNBF^AhcE&`K zvN{uC`{A&8NKuGm0R~h!1Otr)7@&y~0~-5ZCI-ajXle~qrE8gp8PM!+ybv3k+62+IS0#jCiN7?}E9x2cpcrv49fn1n5!bLAO#i+$MQuopH zng8f%y?r3f$vPl)i&8FshR0PzYTJUX4-ZcSlMSo2r&P=0`9FQ}AE$B~k$qnu8O3%2t#<$s(z7$Qju3z+Pc$IQ}s%BpoYOFhRzY|f-8R8l` z*)R%aqwD`;bV3_SC;V&j&#wu-&5f4Px7Tn!lkO)$V)42=tF$(gelwNJIFp{!4kHNG zYpHonFPfkBEu4)vh9nL^n{TsUW$ba>4ArT$Fs>WhDkxAF77qZ)V!|fiY+vrhzpI= zf^M3-H>G!Yx5K{){;_&5TZ|^QHvsP!g$VDZKB;^*zcE)Dz>6>9FvH~TMvuE2t(C_% z-TAtW8rARWb9vJCRs04VvBp9Qge5inX$;$$ z8^)x}U#ORaYek7Y{ivP3&a4w{& zW>?g(f@@Wn$_+7!I=Y5kP4snLQBU+0^+aD$55DM%+WepqSA4M}CVESq>Av1frWB?i zZq!@{Ab?`a_0l3enQI&H5%`<sX0sijCyFG~h+SeraLItq>vir zSreEe&s4D{t!=~8hEEZl!zz`0PV#BTc+z%F1uQ1G6>I8L+}Y7`he;m51LHot1zy=r zd?LI-o2853Ng{b$b7py*z--EED6?Yp(YSjIP5+q;^8B0KWiW)|S8@g#xSHZp^BwF4 zH$g7HJ@H(ThFGH>D=^v^HJi9SnprYpvMf~udLl_9Et%j0_|@VihF63TR$_roK;)dz zter$8<3QMmcIC;IMK~`h&I@51ixhAM^_ga-S1robn0hTunrdb)aqVnD5de);QoJGu zA50_#dqm{62v3WRUMUik*EbTYZ7u=+Ko8R9nbLjpK;$T z2qF45)@%tOmTEogJBbSvC{cVO(X<%eXYr>$PwWGWrMh@l(9VhOznj7CQZ z?xDAjvfV{fNH>A}@*ta#(6{22w&J?^59d9a^Y4HgI8i|k)D1*Z%(~Ih!pIGO-!jk68k4I!ybL zQ$3GlRam_mu$zDN2Y>t-O{;koqQ!E5xhazg^7M66ad57+rh~d{O-D<*iBjn%zEX89 z)RWDRE4h|_&Qz!z+4EC4O z0*zpq4$b21FOisnxB}nrm6!I`m(xC4E_TI7uf>nbJ)^%-Rze0yc^T{D?Qg2c2I+J4q{K=aU<0Hbj4eo3rP@4sV@%{`PacCCJ z$m5F`XU_mIK8iIh5k4w_G*789yg*}0Ku5tcZPPWfYRU%sMa#j0HxyLnI*)Xe5(TIjMgBBr$vF*&Rayge98fh+LUi4D!)%v!M^M0Bpw=fbWO4^V zr5$Gi=Bx~_wkEs|w4#m|!KVR<&oTr^N)rBMMP36&Kyc?>$3$Q7Vssd zHDZ^1ss0I%b-uhp0JX79vv_e5;4~S@Y@ED=>NhR|FBgNqGq2KzA#6Zt4g8WHLN|6K(vC*p6atR6(Qtsukz&V@I5|5IdAA1+$Kw&ZN$%GT)-Z(#q0; z$A%DzcqM_617aFIN~#rrUS9Iitbp>9$YPJRE=rfyV_AG)oCQbe$s&CQ--Iqjw+1^` zuf)Pc^C}U>qIpv_h0Z-H*{Z|`$hM3#$28Wu!nFMSg_x#Pl4BT&Bt>xOZ0xp7t-5V9 z{&fIJ->Z;+kzQK=Or8MSR9lJN^8PX^OwCd1qb+&nRzq9;(_zROK$T$}Y)$=7~Ei&YK`UipO96{{#~wO4pEQ80%#gvg3T zEDer^t{U19rSls?Fts74w}S)?!44X#!j3lHT!GL@My|&k*pS_ zRh6VKYY}atWU8J)$?Rj>QbLLe=$hDXBr|qXE^-aP7)bWO zzJQnhQEUBfBAJr$5?v*3%lpfy&Bd~hG!si7Gnh196jcL=GK5Pmqk#2MRms+gfYFl3 zAYLW`D7YaKK97BfjdR5#PQ54UHXsu zamcncA}k~tOFt33Q!I|jz-78t-j{|nRo)k+HeF2<#KJuFt0gH|@cq)E-&0yS9_9C= z`rZtQMjPc7q8pRQ%y8P81d;=UWA7lon1QPjTKB<`Du|z%sl1HOH2lLi6Ve#FT@-gE zjhu7~x_c$)YJZRD;`>XWi*!3OorINlMi-s37!JSYjXOsXNH)vWDAu|2BsSA@G{{jV zhK;takT^ETzDR4aVvW9NW@~KwrmAg?7bm06zSwU{sG;`p4t+esehH&!VLA88FetMi zy_Xa(SM18t3mV03`odC18ziq=PZf?(LdNfTd?o3A4*h|N`3560VimSchn}Au{@kL? zu2-Yr#^}g65>M;x-1LNrJF(4wTyejIxS~`+$2*AolA+>G>Hjyy{Yua^Ox&*oUH`wh zFBJcO6miEVxRkhCE=qqs=i6ywi{^asiHvc$eAB=6axA~R26WlKkpEyB+tMM~kGikE zl-^|OmG`3d+S*rMdRnUZfu~ohx_$uQg8YkvYp7R-{nY=`{D;T7&2{*4E)ZzRPVN;5 zz|xL>uBq&BmAHi!{$<|&UqPrJa1Sq&w*Om`v*4MtJkQ243uoHK>)H4?L3qXe}(graKXCM855*9AU?k3QR7fm&fr0=uf=Qpd}&RlDh#Iuk2cmRULY>i z&v4Qt*;i~@j#((p%6(h#__W*wF1hK_?>Sw7f&RoC_1Z|fNTYWaTQz5|YL#@~>UrRi zDnCD>dE?|2%MS@GhbgQ2i>0>e!qOSe`rNc-BHN@WgPW$$#i#n2tB!z4^|-5weJ0%Z zXo&dM4j;_q`{LjfJ-qPGKOD0D)SHQq`O(xYb34@$gEXm=PBJjw@ZAVW|Qbbpm!u)x64 zp={mdA(L?(w~>VLS9BghfzybB0ZZ_T?^?cE~Ayi zGmU@w1v`tbTuJ;(U)bjxiZnJgK385ZXD?k6hcy2~!o;qIn9H!nW@!Vo!==|mFVAX( zD>slcK{3LKSl**yOYSBp&y~eCALP!J(y4UCJ1Dy^z zB~!d-dmKXrl98!mMs>2)DVZgD(y^t*{D$UHQc`S~&$VVhZQDV@#r^N#dT&m;FFx6I!RnK1q60u9sW&e#fb9>NO>0~y-RX&m8HBu_dF^X5A?FB3{(cA|S z8#DG~{n+4^`Dm(vbHpxU8)XCONO|S!bilK%u4($}8h$=T0uHNdNR>IPcT+V;hiTKzU*#SEvTC0w$Y`=8E?yhs%Q*3ZRFJph z>{xAnVZvhCUtC&ke^F|Zl6eO*f2B|&aS-*%8g&u%|MZ37qCQ!#!bP1r&Ztp-fh}}p zSg=!CXCcXE<4>vMCY5R{DHxYlduMFsgoE>VDzd{Te77lG?XqaI2jU(Gyi4+RVG1dK6S#^15V+$5KboLT1j#i7t(~1;zIDG=6o!N zl5YVAin2|FwKd6Vo?5-N215t)}l zU5sW+c={dCwt;HE!A203#72j{T>;f}u>Z1FV03l#wi7A=^Nj_U^!Tpmp7@k7w9KC)=|P{hcw3l1WeM=sD`$Y|EcUgoXk z2|3C|9@4qI^T)r&k|J>__%Dc^q)8Y5HLzF zuMba6>jTJt5Fm2!9FT~EA>bII?eTX3h!nlt&5`1Kl410F+THv(C4BFVLHKAj*>4PKZ9T`d zC(}vCrgt}Air>IlXH*RvJo1sTUippe8f9nEdcKlp%y#-GXS`N&*4{Z+D|yXIUays$ zvy$_*5>LE;vnqjQL(U1b!oj+HGLxH?G@lo>{VybO3uZY*8D87=WYpX%=y=NWqfwk1 zKox)X^|Ot@91mL+DYLu<9X~#sX{jAvQ(I3|!J^{Sdz5`W1^F3%ba;Xq;%bVmvhl#Q zMlU_df{3Us1dv`F_s_>`?Kk@Q*#fqN;~T#*0EecUE&)ed%`z7&D~5x|4Q?UovjzhR zGr+*ue7pdcz}J2fH6iVRt{A6>QW%@~p**pBm{E3=M!A$z7bLhIgXynVjF_VEt7+`w%1()$=wC)r{} zJjT!h#aT_}qX^huL@+K18I{1D!xn0R^;`NS0C9m|HbP0?)V)jI>nb`=;)%&Q z7>z<>&ylh@T>Rp+#VqPlHmb#JeAAb*(c&d5=}XyYamGseQZ`zA(MtMKHd?%DC4DIy zExuwUm6R1}rmSK_&BRRq&2;}3TuX=S2_O!A524(BSqv(kL=Z}H?I3$hpWNihW_v^= z!xQ49H9EFN0p1rz+UU7KLR*+;F3HA41O1_~k`ti=wR78OC((I4@TxXEAt_JUXCkb! z&lp~5n--GEXcBwLr(_&39rnYzpE+`PeW-ZbK|ipbe7#*gmq_8DpS|ugi%lB&({~1`dU5K6*Gq^*N=0@?=dhsTT4M#jtI1?_x%_7YG zSGQc#K9xQ{%0jy-{%KPhv#(&r*ID#eZGl_uSA$3SBi_E-KXeY_+Ap4fftz z9N5c5oceK%Mg-1n$pNO6{&Cn+nl0*~Op6s9z$7;=TLO`m+O{s)GCPR$6sIGf;y9*eb~P$!B_@?q zOaBl)=a9a3HVuPhtBbMhTBL~s$X?WGO`R;n);qIV*8BFK{MOI^&tH1!D?75h_*Rmw z<=G3cA8S`wjO}*Q)%@!klD%;XqpKT4}**2iNUM!R{ zRbF%7)bH2KeWTxU-?TN52XTqBaSbZ82e~1*a^1KEkV{o_va05(el>F<6x>mZ1&gr} z=#)J%>V8ieh4}xOzj$TMMxx`cygP8$K%C|tT-ElPsqmxWAt`|347>6r#dX>K;^&dm ztcND6cPw1LXq4)jtr5KMZGH$=SacsN0k&z4Po8w{3fpXBpT+lej_UHIB->fFo!?L! zR6G@yutL(nVq`NBZiwa>QktW@QVsJQX<8nZg{7?0zmOqLe(_^$?!EgpA zl^U`eAs3^D8#zHR+!$_rF25<<6mC2=o!@v5d+C_8Wj9M~@5puu2M5Ak;V36UFvLs3 z(IeBkIB=wMkOz0N1rLQuXkhIQz7pR1sr<%pHxcH8;l`JF?ViJ(g8+L#I^z)U-+MA7 z7{Egu6r*$%Mlpvv9p#$&!`bj2$v5@RW(UI21D%YIkA(dwetAp#xxVk@Z1|zs>^)ra z(h&f=Yc@L?0OlY^$h1vq@)4i30Bt`SBiHAwH!UzZvKRU;S?~h&Gnu$QH2N**=3bgR zW{PY-;&((}AMC6Ncj5wAZ8U&V*l)E$H`! zCA?1vdp`)f!x8rQ;m#d^e_RNAkoP~}2z#)z#IkNd*n{8>=fNM&hDU@j>g7BPzI&AK z_<1<=BFcJPfAGoK@S)l45iWV{VL*FqHhYu<3plW65oyyx3?K1{P}UR5^m!d+e3vYE z!BN%=jeZNd`2Z;Uu%WC6${q$a_aEfo^7~7a(EupxsT>S}vg<&Z4h1@({Mqg8d@6iI zF#KqELhjLz0!qF&{IFa7hpJIZc#^iB&`^m3AC^+vKM{-%g^$fr6;Jf-E#XIOsPs_y zk=bnTRQRaS`cd6{6v^HjW&!oYZ1$021kFmsaXa$;AHQ)H`Iar*zbpMPKfPV)<00++ z^*28E7hm|&=e~m7(e#BZyKP8s(uRd$k>1}VlA7^+zl{i_CCj(Cs7tYFm+AWW90$T< zmhrcE{SSP_eeoZ^ezsBMa3)o^-MdPF*3POJ^3(KZtzkdX)P=iV`%GcCZ}*>f`_H@l z=QjW0SZ{QCd$0f8;y-)*XSWY?_tkaa9jOT$C^)O5Y;a?iM}K*L%YXqx3C0w{G`T*rg*dcj;yqr_byTE1~o?vz&h} z9B}CGp1{(|Tf(%DL-E)bjzgtLp&`69&$$cN-bLj*!;N#MPxD*vWAFO ze9%a23c>5Vn33S=m79oVZX&kR@RgXPA#EWG?_iE%Teo9<-W@hS_n;lh7WO$o_lX_$ z)Yze92J2Oy9~NH*KkU(1x{&M_;)o*bgZ|DDkSyCL1=wCS71o7Z+Xpz=msdLohzX`S zrb(Li2A-aiKgDZd-!2OeEY*;aeG|NJG5UchEHm|D;qWds3l}eei?o!J&(@oZCRbbj z*>>!tX&4)BsCPbEU7g=zb830xgkl9rpqg0}VdF?=znK3d*xAe99xU(Pu=KD>Su!9l zS_x3^zeOFXbHnLSjTOcm+6 z)?!Ji%JG~S2&u|9sa&J) zZ2uHq1kNe$_|B|XeCJm&Wt5o>lPSZZ0bTEZ{m;Muncx2BfBrk)#$Bw22moW_v%Vq2 zbCS#WjxgduxREM8f$c1|xsiIKv}7=u%}MO_-&!QPei`2?CgNMM#xJSHonB+z61GZ9 zSPv#d&&K4=yc^PQv4da(t7yh-mz%Gfr=s6zubS`J;JLkuakW=(_E&E*0f6sthxOlK z*fb@EBC#ITlvpn`v;EC|lO){h_A`rk>9T z?eEVB?eEVB4ZetfO2x#Im^HGHpoX^ENkOrl9>EPlI)WtZC$O`hQg1{XoAl(|^07^) zD@Fv8r}OQv$-962@%(yye7zzr2h6K?#9+ZuXql1^k==t3?GXPCbA2E*unH~L8S{O5 z{7=3r89??yF2N;SdxctMU2c(|Z_%DNJzlY&rW*QOX$?u~s8+r`)mqmGu;Zla24#7` zMm+hAz3cGaTj9oD`YANI(oI_8D*u!2rDBkMNJ%G$q*EB*;Kqn6t)Ep9A`KBRd#3Ew z6-GY58G(L}2hR?~k>{`h%y);4_YA`ZBb|4|284W`u@|l0$xOyw#8cke3)$V^@*X7U zUWD$xVm$ky;>{#G#!CmnK?wzcLiZS%;I*=2w?DIHO(LTT#U1Z zyobSH&|@(IYtZgA^$}UCHW?}N|Y4`LsO&ptpT?t>6J`;Zvz!@R|rfMT?9Y5g|aPm-l)`VKZ} z>VQ@xU;0kJd5^Ip3kj8Zg8DNu9W{#&$K(SFyY7tc=k(fdX%32W*UWSWYmU75H$r7}NCB0n}v9j}8^L^>lZJ z27hjncJM-T3r!H3@#`h`| z_YB3nIaa=DE3Zu;=!)CO60^MuvwYCf2Vhp3oOp&2qE?S+kz|P^67drZ*`1+h+U+3? z6cw6M%;xg{6wM;I;H!*@pJ?44&B`40ju3a|x*lCJLQyI!e^{~yk=VFK>*V*BYl^Am zM8Sk)3X`*jxDlAe3SQ9@(3>zyNpVW0X8IMiRZ$P4%^+3v8AgFbHFC1Uh{Pt=c-_z% zuY(jgCcrhFgSV~-->=@_RQ056SzkwLeO*1Yud9tI2dV_~Rh0)i2C(hyAKO&jgspjp z>9qZjNO}Pz7*bD!{da>dEEQnX-ib1(*XUrvYaG(63HIu>xWKopsb>hmY0~>oh*npL z!%ybdhbQ>E9uz+zp}NZ8H~;D|-#%gVvT5@t97Q1L2?wPIxUAB(7FZwZKv)t~>>2V` zbt>u^0St}(T_T8zV(Z6ctNMLn-hKHTzX~}OgR~ubdcvO=q$lW^MGY0~y$HLo;;;kI zL(&DDIxS=$$4k|A8>%%Us469JXU(>^!T}rhqJwxnM_Z^}Q$;vQ@>oj7j0>SFH6#NF zUG*7C#uN`NT4QkVq@J0M>h$%DxXJWO)GL*qDfLbopGW-z>P)T9sxM{DVk39UImVgb ztzRG1^&!7Tm&nV82Ivtb2*MEhM{;o@3?|_YwmnmP92Y#*%`EUco=~-x1g6h%mY9_7A7qLyq^}$xiZ&^F`Ro!K4)&{dxf4&@ZO;b-moLvu4xO4V96Y7qE>~f4=uy9 znUs{Bl{}dW+p`_KOWNKxCGgs$rq3CCM2+2%eH5qf32g5VW2}D!yQfT)?1Uw^WKS~1 z^-qc<`U(#dRJC(l|U&1T|+|cBkg}xGH!n! zKG1(PgwlvvqYj?k8+e`qZTAM7hpf4`h!@Cb>l&%~xz-C)f3ti(Gy0eU zvmsA<$#XJT1;V}|gUfPC>Rj2cI(2STo1+R&gPY13{F+#DNR=hUFwtI?@D^pe(sM1Y z436TQ9a#bIzB!ULQyb>KVIyUV&d1F+{Y}2CD$-|OMfdhP%o2ig;9tXkF2C7Az47}x zb1TIvWj2zW#5Q9vdaL-m#D<-}N$Bh#!^5P|Rk4Ce4MZAi%fzmy&#+Z6eK>8sQe*x^ zWi-Ohxy@d3FIq$jM*ks9J)WB_T zE`9DepOCilaEHA~Y@NUazly8L>uopp8F!-WmFZG?b+$KV?a(;i9upyoUY`Q>v<_Ff z7YN5PuaB~$o=NH%*-cmW1=6vFIYx}h{cGN_bq&NczmW}(0iR;YJYd_1CH@3<7IHWX+pn^?_~GceLi zp36B3$S`z_DJu3~FP<%)1Z^P799vW>YryW%jAKKHF5ddmS%`=t$2Ry~vC7UIv{U}H zza`EL>qdC4$s6#UJv-HrH@5 z_JUt<^ClS_%A`7v8H9h5Ox6U4zcX%I#T0)(kT1aMm*SkI9gy0gw1dBd&tu-fn_O}; zj-0)vQprt~c>vwr+MX?43rJ$-w;g{Myf6>El%a=>8u?+{tJJ`xyUGWqTW=^6v7dqH9B9*I$T=KHLguIGwa9uOt<1Ev)Qn|F+L8)9wz+sif{cXG& zxECEg!8Sd8Ys)hbnAmEJ{zJ+$dCtjou(!>yo3X~irD~J<2ODh2es{(kI1dw$y zN1pjhfX6%rN;M9l8&;QG2XT+h=|VYxl@7UFl-TOML6qQ*R4CE0oC{Gxsm4wY0+@A_ zjLU7dGML`?|2dCx)og^9+D?PcUD^c1Il@*NH9G(uqrkBMFS0BECj%qF@=ME2_@)>&7+0k)pCnE zxHD>_Nri=2V$s%;0i$dNi-x#NK+`@Kt-;8UqnE@Ejpz!a6i7wW3=k_ML<>UD{8g?n zr3!sHEyjbCs}@V(QDofpmrGrQ@Esc_Yn|FU6HuthPcClxY;p>*hM}tARrz zW0=sJ+F@0;kF}O%@yX);CnC5$S9u&vQ3*i2VSmO15kCwekk zgKSB026;z?*+q{drGL8#Kqx{o&pJ(k{vtanPGvo`=GFFmw@mG2?&&x|= zeLA-iN%%)gI57(ee~npr!Zv?4s`|oI)}UiT6F!%DP&OPvUz$rv85#3>w3s%69LZ2- z)R^PBNCy#^%h~ZOoJ}3;8ybNLc|9^Z$Q6hv%hWzIaHDZ|c${0Y9d?;1QMo}~xfQqX zD7z*OTSEVnK07%x*?ElWtdtTVCN)xDA7>{wP#U!hK-kd@()h*$cCd~ZJ2SnnvmDU- zgg;WHDhPDcem5*-H8A;xb_SmGJ)~qF_(~jk2;(k&BucsL3Y?9GiFhoiR=;4c*kCMn zWGSR+grz9=dPj8ns}7)0FW?nlGoxrk1RrN%DEQ{uV=hJYMuQAW37)65+h!cmq0%5E zhy9M=H5odQGXCV?C1PDl6?zfY07SZ)`=;=DQNqiWuyJu0wjJrTZQLfT`}SsFeYB%o zM|W{duP=@6PWhX%8A~k_cPmWux_Q>Hl00i@6&>p?y%%@cxyvwE&8vgu^i*rv}YMs*AA3whZA@qMq}*tv;EOc4stPzf{H1*gz+H2DdRCtqbQ?B zKqr~;SUS&mjE5yBeDVGg84r}9bgqpT5Ow}^fb=qHJ4!3#F&>sl+qv=3hikKCnGX5wdSGQVESb%h%rhQKP&Xj9iUKW>?lCj(CIdyi(0Jf><4oB^q^T)} zxjG}py08r0z9cN83#``Qj2I&V-H;xm=hlZr3VVrzYzAXV4df*eWLW~rqy96iK^Ae% zY8W0ls3r*l8mj>wbqJ1)yAr6Tfl0I)01&N)MhvTR7@{fr#V@K6-m>A6v~Xk$8*7h{ z`|g9|Zq^md8U=J^qU+XTS+o{Q;_nb^asIou7C=`YPcO6@f>$J7LZX{lR&Zes%;i`I z(FJw|XFnk8;OA_2u@Jv9l1?&Iz%Ep$hb;0#nqU3SS@Ram68;a|5Q_dhbX4ru|6KoD zTxBI=fVW=yTBG2Pbrb~pdEIjgvG!cnx7$I6Z5X35l4Mm}*^>Qa%-{VPS?-#5>F>fB zx){$HlPaP%Z@YUcVu&jqZJMkTXmR^(S{sMMR6?~kN(7$~U(^6Z6tyodJLBVtiF1i< z@~7=P@Z)ui2?pH2#sg$e1fBe4`+Ms{Z8RiDW>Wr_?M*>!Nu6O+3b8T~kZzdLo*L{p zBS~Vh6`Nd3189mN%C(O7=DyMZI!ucDDh|x5?)YYtHs#`DL#mF9ME6lk09gXgksGli z%yIBHHLoLV-B9%c&14G)TQ%?%3K<5zZAuJoSeq;+XRs$lpp#(ufB}&9;#Sw`mMCm^ z2Ql`HiMbJN~l&QH=vv$ ztxqiVPKg%J5t(A7%nE%Fm_kY)y<_a==8_kt{&b=>YTjBZnLHCupGs{V?n+Qy&b!SK zD&{n*aUSFAnU}y1HP4gv)&FofC*%Vc+hW6&^RNSDhUz`EU(ll z3d$l1F)jn@?9fO;0a`w-xQutjU)+Ir7+ceJ%#~0!M7D~EwuQMqd)&WbG*c0vp+Ht8 zOAYZyMZAXMIuZ&3YdU@}G)iv%ZVRTCse7Duq4nHn|7#t$+VC<=ipqZDXTI7m!`)Ze zYyaHe`?NMf8p=lz&@YpKC?in+@417w3(0Hs?ASMNg<(5_`rUdvHhbol?lbB%w5Kb zhF}Wg-Haz17D*U(prO4)bs2a@H+%R#AS{vraI1A4- zyo@%7oo)C%GzpRB{8+>C;%8GMLb|X2rDN07Qg0`_Or!P`ecq{hV=Zk zzxPjy(UV@`?N2|$fkc~W%vGq}^k$n@a<4woC zVa8{-HX6nM$fgx|UTj{$z>8tZh{jWzHDE-nVD_k`FKC2?qpRpVFDRxqx>*zIqEys>0l%P4a`>9k6Z2o6Ho+y@{L~<@Po_;2zV)41T-y?~{4vk|z)~izw1ZP`y3&&WIb;3gI zAyv&8j5>#pE!7LpW%@(5EH`Uvei!w+~Rc)XQQ*(0zp&#zUmJ79T91{{0J6+yrf(BlBu*s(%J%Kv-wX=;Fkg54uzn5MH=Rgi$NG-+Ui`zx zF|<(Yo@s<@BYZA5G8=6o!*Upi9_W=`qxj65_!*6By8l|pDSGG-Lqcms9xcQzPJ^4 zC@iCUSMr zgys`>${;vL#H!J<11un&7GKb!E@F!a6BB6``HZ29_`+p7n^2rT@0Yj3MoPiZh>Mfn%LMIm{vHa+3Oi*vL9q7`yP_;PO%5rTTCxwu-OY} zioJkdJ;hEyE7=LCn=KykUl&_ zA0DO;j|l2Vf%-9^ejiZ3AE+M})E^Mk9|Y6TEliYodl{} z8?Jjg3!+aiyeCXBIh~pO9O14ro4-f#@Ju2$6SA;;He1UNasNEa!b~`PEUe{OJ`)Zd z};E&ACI4u(U!8J9J*%>J;h_J$4mxh-tc&%48ne(nfM zXG6gkezR;g?5l2At$%xU!&v;R4fGOri6IX#JHn)W13=ZCMxX;Hu(hxUc9=-lM7ob| zkJypt3<%gUuSr+6-!``X**ptlPi8q^kDScbg8y~Ao{)};J!em{vfg|>d&dDmz9FpN z)C~E?V_`i>@+z6(YSOMY2`ih()ZIKCHir#iW7s^c55i)5%r`t%nLb%G_{o-OYbp~J zw(6a2>Q1i4sAogiGOZT9oek77LrFe!j3+ZRcs<%Vto1Lh1kmlX2Ih8wsR~A($#+!k zs*?hkr$hR<)0q@+?2h4Q?cwJuubI)wHj_pNqg^qXebMtgqKOOc=!!S3pLBb87Z2NTBIUR1A zMpU+mi)O=Ce&7Hodi^x|f$Af38Z{%PMcmC5Cpleb;F@`y1o+}3U=o2GVdZC{jeuSF z)w!?GPqO$yy;` z-E_9uOKo_Vgpp_S+(z_>4n0FZAP7CQ|Z1CxDDBXXZrH|$0;e`>a34RHfsbj39h`q=&OKRGc935 zd&Lej4Lc9f^wObW)MIuEgD-f@bT{82ZSErXL2?_NHf_XeGqKz{gDDynVZ&M%i*8saZB}`0&!pvXT<2%M@Na# zNWUG_x&SSb2|&H6?2+)Xi!y$8S7r2j4`uuujb%Fon#KY+nH1m2(;8MN4tj9RS!T2`qlLD@9;0Ii9=Eo!ewppL8HPf1*EY`9ZaGOTexpVsUzyPOj z;@-@P6m1^u$p+ofED&N^`A+lF>sd$GY0A290p9ielPj{8f7?~K6RNqvxF_38XY#Q5 z1eR^$W7)OpbN`Q?Tyr$vO6RW)t7hd6&>Mt(?U8)lGx^Qvt8lZX40rM(Qm&sZy4b?P zu&`G7CAbb5e@Oh!6WJCorEDi(0nN2y3I+<>>D}fm1C+JlTIJ5Evzg1G<2ahKh-3FO zz+gtxSnJvRTF-6)zSyc)yq0BaR%V)Ki^wP(8X2u|Vgc7>>uGqsH@rSlR#>el8&N!) zt*6YC)s}v%7LuSfYFeLNC#|zSTqks*>`&y^@?yrCKG0+`o6ds!?c3<06rU@PT0tJJ z(=)VI^_U884kH8%z?U$@D7bb++?pcH=|R);MotWcn@r!Wt&lxtz$ zQV0l-k*;~Yo5371w>EYq$Bdbd%?&6T2har@I@_N8!DE?>Bg_cU3oduXk2Ac&~wXTqJ`O_dVe9V__SPtfnlz zPiPbC(+(60Fyk!54y~h$eKdi1YB-UvmCVYv!lXy1;cC_dJ!_<*yQTv4M3}Sq+&b=* zwD3nMbV|dutl~g~ujQ-UOEZO{)`!h^!%5Oy@Bbg=v_>yj z^T!Yqo;;=}qFpPzPmWKq7Brn*PZ*0T{KmpPrOdW3{z z?2c%a#%fkURrX@UL8E@&XJDqjnC^R2(y%FDa~Nq@O~*>yARVw8rRwKe5EO8lHJ8V9p&0da$ z2N)M)M?NC*+e+n%?l73Ml)|6psvKZ6C_$;K17_S@ZdR!;_L|F;4IJa37kve{Yxhw; zkKiOknVykN7s^`); zBVjh`Op4^$;ycX3j6I#R_E;0R2(6+~9d---G3MQuJR3&zJ91LLWJB=m)a*x}&H2Kn zp&7Tbi0lL*CB94$b*Yte4UnSKc&un`3Ki@0vp;ovP3jGs-q0 zYHAEDNsR@tGF3&L?HghuP2{*QVkP99A-D6mCt58;%f$ z;`}WqXBiY?YQQvZD~!=7>@|*njuXu>879A$QOS7m6}x32fDUn>ET2542&lQ9!jh&> z#+Z>HGOMWon+BqU36qR8QG#{GT(uGgYkCUpwHbPjYcFDwuUCe0!<2zj^1~`)2Lmy0 z>%1gK<#_NoUc8knG*)O@3j~iT_Sf-R7NKgDEFAL14~Ioe%vc}jjbBYX945nr>01S# z^Da;N$pu8A^Cgs2X$(qY$d{J5koHMIvNj!YF_vFjY*s~!|g%$>+MCr(bM6LXHioGQ)B$~YYZ zT2UWyB?^O_=@i@;FmRyRcImsB@Q?Jq5F zwEiU+&XsYY11HF_ppxJ>$k*Pghm#OGeE@+oR;vp>!z}4)%?p zJ=HBm#V(^tc046&pHQvNErf5!V_?0hB-N%LS;(vesw{cN$PbT4Mabev=|k2ZaAAq| z7{*Dc#0_VVapNQ-=ge4q5o=`q3aMQb7T-HP&5{P%v}ziVmfB?Z{9{QCH_Y5q(*!rj zO;yuGSrd9vHNlW9sw96D!-X2)%~7+&oVR0zt60c60nV^a9ig$UwDT1VS&m=vCMC4mp^7<+j8H| zZb=SkKI-gc&qu9fKB|jCVI@p)nE9xEOhU4`YbuvYOv(GnR?bjR3NO3R) z1iPwO!+g}#;CxiVd{n}G6rmQED4UML8NQ@Ml|E+q8`ccYLjlOGxHGa&w^9AOBx>(w zy6JY{CSfZpfV&6W`vvzMz;^(M4+6v?-agDf0ppd2Ys9G3g>^dGWV%}@M^%~Qq z>|RWKFW)QGiSL%q5~mBBqki&&ss1p*3rL*bRKB6{#5pE_n8{%)ZUu5#Y=Y_A!3|R~ zezTPuLTi50VrZeOdnknEvusUlSgs?+l#M*XRpghHlUaoh2Gc+x%P@$yNOP>wBvZ!s z8Y46)U9(`4iKNbfNhbE9E+?7RXp$-LHIqykXv@=mRAKJEgFvKmE#hm{Gajw_YSIhiBC~l>*c!GOPfFHdPK5<4rLK*XGW`^BW2MwJLn#wgCC1i)DZ4pm zR02(2tB{p#VmP%9Efn7taLdXY!Gvu0>zVMIdzf2L4FSaI@ytw%hkL_Sy*0HMoYb*Dy>eUekba zG%~GKme(s=&rPk9C9iIvxFVifuV^;IO^sAy>Wh*}!8ZZG)SjdIilNZg5KV!o%|b5o zcsI=N&t)M;fNUjFHlJcl9bR>KNTrvDB!RbsIXDgc2a$YPK+Ojx+iD04^DDbNV7?y| z+W`P;>cX|AE?jHs!iB!53s(@Gb_Pv-K&P7sQqS+jWuZiL3Mf6o)bp{!bdE^1px(>F zj;h_sTxq@lyO#ymc7liN)IRzZb*{%0bI>s|K$TK%8l8F}x~quWe`#9lQ;nSFtww}XkmLE$ODjG1VD#N;bM5mCZ6Y2G634eAoAunEM%aK zq6>yemEvBOhGGZ6R@!wdH#LPAOu5|y)gLM`Si2fFU7;$Qav?Vhq zz2%x}u_=00G`v?g*H1%f8MRKuvN-qsgPhWo`TkWNc zKscEo0UA6lbtK8KaRQ3~{EZ+Tl#9sWFC^ zQO*C&-n&4_b)EH|=TZHtu2PrYl4V<`%CgmRBuhzb*|D8irxV8(##n#}VZp3ewmPva zS+ZMgCuTX0h>bCDLktNaYapOS5)>x!y`CX}VZuTQW(bpHCPR`-fN)2=E@4&xUtW{D z2+92Z-?#UvQ`Ob7WGnYFYvEp2owLt5`|<5>fA9TmBTxY)>^-V6IyHnQ8I>DF5ZF)T zyku`Xz8o{swMA|;p$pD&xiJA#7`%^f3(ia{GeUKta9ns`x`)94`{b;J=Mc~HuW|h9 ztHhw;@r!O>!kkxwM?aqyfEdsv-C5DfONv<`*Op@IA@n00{5b0sOcB7?E4J=n!bPr~ zNYx68Vph+fwbf%PM6c^R>v^T<0{7Z`R6vntHq|HfOzJ5cDx4zO>jR za~y44c29SfdimKp&D_=d<>=rQ%<`qZ$PX{}zzcO3Z*X6-43KkfU zVraZ2;}4`I-&4T{-qVjekf>&~oR^G}7(th_z1|J2(BQ0RS*abWrOHc;#4>CrAp;yy zqM1Wl+}xR?5t_gp)rKttY7>&w z-)|s64TpN0MN%YEGAO*~a2a{eFDa-7Zef7piG~7`6=|Xa_{l$)QF{g*No3>b@m1la zU3t$@{BG-RLP~w!j^Ms! zWdpk0Zc@)3fZIzhElm3uX(Mi$lSDpCV#BrjI7o$Fj2~;9Vzwy9V)o-C`{J>!_;0mY zIzCe^lavJOjXY>nfU{iQF_+;peeaG-dEt1Y0PTG6R=P4K%QqeS(v*cb+%+Xgb(=*lKUeS_Ro!#p zFyqW*{OtHj)7NS@cKIX+y|nn1of#i#mw~v$Jm2FK9q8LA2$-W{bC@?7n*$ezXmi9w zP`Gp&D6CI{b+$Jh1}sM91NSG+l%gX5S`{wkvnI z7cghhPwEA@N29N_8B#s$D+Yiu0E2;{(~U56tBW=TOkZmv*5*!*oyHesD6AA+L|2Rl zdOhA5taAAC{B z#WQ%*y+$tvP1aHT^iVOlvYz4(^^1v=NKW9?*@wqG&LU~40{dN65Mp8-jWc_nqeXq9 z46`OH=e=zVGXx^*q+zfotv`qCz!kZq*ETvBWNq0f@Sp;m;teX8MNB#Sj*jE49_zB1 zNO&NE3@GdU*3M>AV|Y>9px0Pu?Y)RV=A>tOjGmU-ak$h!56zJj_ z%i`FQ>Dk6?;8nTyC+7rr(t5)d5Ia2qNM33?I`VzrkLz(+RPJLsou`%qQUO@`mPFm6 z@l5`GfVyBC?wM}!WRuXx^`rfcLRtt1Te+<7mc1(Ar$2;^YbGr6g_a%J%m{o|O|%*WP3Mw%&W@b4%a* z>JKk{?}^XU%0k+c$DXQ{h5Rnh{AsN|_JymBr@vM!3#m}v{Xf^f4gLFve_s0D=YOR3 zUikL8U#q5uw*Kh?~&O?*ru>}d~4jMCG&{TA9>-qTjlhjn z&y99w7mak3o(-H|Oa9s;<#WoL*jo^QtCI_~RTAVTU)#8Z)0Ntg&0?f}Ej|*@ zkz;n8GuVrK?)dRk8`8(jkQZv#!j1JGD#;UqG^F*6Fuk`eR%lrn2eRQ)sO4 zbXJ2Eb;nv9?yJU*A8$NQb7VHrv=TRD&51)UZI066<~SKb$1iJx{#a`b{Gw<)ROAoM zok|{ND|hl8n@*BX;BtIYNt%u+^uGHB?j0%q9I{k`k<$o3&br=ePyqvlvVTgDZ z!4VKM$Vtw)Ld+N^KhRj4gN^yhlG254kmSOyCY5zoiMdHaDaqSkvI5KVnR-e;b;{Fw z2Jm+=KIzinp)?497GiZ$XYAR@c`SOw5{tYaqk2M0X((0x2}hM!uOW+aQ>Zo#k&)^h zc=0_7B3&$xX-BxHD^TWv3i*^b3JR!*4s}mKmJzL$k(@5^kI;~h1wNZJx+(AxNyT4v zpa-Qg?HKqH)LqYjs!nOrEDy(&Ct6aDe$S~y?2(OIZvYId*m_Pof`mGq&rNFA{xy$3 z)+OGI8(5nK+D^d7V&`FU8VWBww$B4^1K=!4^psCY`Lz%G-U+^9>5Hj-^%s>v=`~yt z8H=&TO*UNFEZto{#HKvbE;PYicGKL1DYd)2FV@E z6Mw66&o@moyE9UmQ~azhrh)v?kNTrI^)$D%$~YC1v%)4w{FD`m8u9ngssqXk3(chj% z63_~V$E<1LKSAP#a}^cvZY-1tDFf-@=nztMFWpoq^N_(Sr3K{>tu+F+W;y`9-v}=+ zsT*0(ho~OdIHk|AVh{*#@v5bZq(!zft=FC-kAR696&-INAQla+A}3&=I&Eu!zOv)U z0%#HG1_p$r2>sK5`Wf#upsO;n7#YMG({oq>Kuv_KQ0ZuJv6cp^wwFi1YFi$wCj5#4 zXxGCe5+=_fXAaGh!TaxL|j*sc!3vu<@!57}I zf}a98m_A6-28V@BH}%G(8)%~ZPhz(8N{vs~hkCw%pg;H)l-Nh_RTwRNE_!(%pY==_ zt+|%`DU6PSXuF4V|^Tv(_NjhqSg?z{KC`3ckfG(?~hFSmX=k*OY0* zD}`ZLr5Eexy7WSRE=202ZZSl#e{xf3Vwt)p9cTG)M{;r5SzHKhc=Zye8I6Vjq*@G# zy9$p*&%oZ=fY3^Wq51PPnrrXGRruxv6;P>J7{=BrlA1YrmK70AOGOj4iXgRG0k!%( zjptc(OkXkc6cwWbFrxk2Ep zX1M2E-sad)O0%3&qx6oKCdHgq32Wi2$^D&Q$`$wy(|yc4#paa9yk7;Y(^gZjA?|65 zWE#|^zXpzJrJezeEb|PLQ~y<$H8!my7SJR=O|2t48pQTLWTnm#nEsz`&N`eNfQ0;9 zR_Tnwi}U+u3BtfKUpOTh`E@i!_nsXIG9g!6ET6E3yNe}UZmd)@=8O9(fKsZZphzb9 z>XjnhmS7O!xDpCysZeP-IZ1~r=>Co*6=2m62FCJq#+hf*{u*lAWR&tWEDg%9)y8&u zx61G)rR)P0B3xjl3A4sccF)d~)p(l4&s_*DIBmvB_yw9==CT}gNa{Zg>1v#Jm+2h~ zM7@*6!Fz{v_D$#?Y4;(`^bf2-Ni{h1`XK4GD|ld=5{%<+kzB?q2FgYpU}I3ocQXF# zQcDp-TFujd{}~%Rwk{<_R2Dug)6J?%2Qlq>-5|WMF#y+!D!%a7#vQe#Uuv~ zlA`%^+Fenrc4$D?XA4Ay-Kg!g3;?BBuBcX-Bl#h-v}?@lsFyRImH%K z`GDHp3?!b+vDFvZq4FEattg#_5e2fcHlawQ071;?1t^l6v^R>=Uqprq?Q68h{%*J# z`7U*w{mTru{&H3x#{kPVNIYJndIJm6DGiZ`*s)wrNqu#{Fv`*FQw~F1sB~29wozgAA#_{QcGO{fk?h%_gR( zT^kbBe9@eX+;WK99s1dw9pDGr?{DxgtV_7}gIb)Z+Bf>L|Ho9X_y$quEB|681e*oW zQOmW75&yroCyo}?!^XAApVN;pt;t`6K6PHL;GR!=*E@8bb7U?s<7i}D5nl~Iv+_#- zpuAAs9RzZPk2bpoT^l9+GO{WR!xK~&G>uxT zyicud9ERY1j1(ygm?&zx`ed2rD{wjbi|n)?*xj zL63Cu_j8{PS#a2wtj5Z#!tciL`-;#BRy$e*%%OII%=2Cr93pAb7CX^R+M0-%w)`)n zL%wo(Or!_iEO|_+#WmyHx{TE{c?>3KHX9AG>5u*0a5M5<>NxwCPY=EvcKdSK$&e`%q(VS@ma(~X0KOJ!a>w;u5&_^6cFWJ3f-I|eYfbUUsT)N!ih?g!n z)M|&TGtIc<_DFt#5Rx208YH~{iwcY$9Izy}1!6USc39?9LUvo2JY3D{6tZ_T$9@)_ zg8|-mfuwYefNM@mQ}45YU;$J#;p$!@)eGujs*c@2GEDri8|Z{`QHaB-X9)Y4b@Ge= zk7DvxQ+TK3<~L!#m!T{}k@z8Xu6{b*wXCN};U+7SR-&hx>L!Y{S0|iKQ>?i<(Slx0 z8|dlf>5u-FJV8_P{F1)}!ej&sm?P5}UM?YV6=atXIUGRC!o1+zEBPz&wg}=JPs)CC zLEJna1qZS8IyH!|s35+=Aa19)IgABymp4#4*`j?!Suj|6g+iO}7u|Q&$ z%z@=0F|acS5$t9`Q_gM8f%=Mm#$seXiV1D@(1bDrMgT_7z)DEm+0KASq)9raWJlny zm8_#hSjm8S>EezGeLm=2UjC$nBns*;zAu*5-W!yRR7p*ed`JACR)%;MrKLSryRh^T zUgJ12HTxkh%`=ymALJ6>O6Ym#)jS<7sQm3`P9^19e_Yr3N5}xsfr@+cfk{W_$h-en zXso1_9(pa8;@!TI(K%P2j2c0vbv1Jvj@+bVT^7@Lh((ZZ*;LHPfS;FNLzE1I{wkN8 z=Bv`@xD4a}3YQokC@nbR@E>TaXxm})c`?Iz_qyjWJjAA8h>?i?0t_)oK_Vb$GQ`YA zK{zW%SYfU*L0i(=9hw7r&A$jaKSqZT|KWqvRr(HrCof&%9>gt2LdurKEuPiTDC?sU zUGK}>Wl*VPvgC^wsZtr=G2m1h)vi7;Orfd|BP+XM)zo?#kamfcYJ@s<_EsupUlOJ) zQveh^4%R9MKjL8L*Lmc4TF$%{JC03?{*~;zfO+ZjQDF)lYz_#+fNw+xjh#e(cY09Y z^XZli5u}9fTZ8>pSogB033tt&7OfAwr|!=28x*rnP|RG}8l3j!QKy=hybKCi)Y<}i z*KlMl$!cuX5Zr;F5HYgC^GFkGbq>8CbOdv+^v=u!H*95+q-0ij~YC6&tla5{m}w z8CJ|j)?kBsVI;k-j!AhkbxgK;6c|fqq`Iws*QLa?;UsdawfKJ`+mriaJ5F`XnKbNx zD|RrLJU@v%iv+CXJL0M?paXr;D8(O3CRf&=9@6P;Iwn^_mkA0=qGq(Lx@YCcy;t2M z*-5kr_gP80I+QE@CT zGO;zCmeC$G4P|+%80%&NIzVgQQ*OS68YbwjkZUi#1(W`CmN4F0q`ygt*E80b341LG zy~x%r1U;QegrLXNVRxF;L8uH$6}`|2XqI=#TCVPN;U5mfX$pJOiW|zyFT)}sl49(z zdSm1*(M;_xv!}AfW9AGaH7c&twIfUh4K- z{0sIiv{XRp(#x3anH|FTCZ@}e5!)!VH45};-GH7Z&J!Izp#9d45{+88bYE&+r5097 z55@o}bKgzv73kG&mH<)Lbct_s1-~a}4z^ZDd{Z-05VE=l@oT40PkC zU69?xDc&{IEfDGGx7i;}h~5yKAQ!qHuRvvIW;SS|!V>Sb&O&B0^)o_dklPk)dFhjZ zR4ZR1JJmx;UIR7{O@@TJfmwhqTfqqM!`93{%+eO5(DgJx#WU83L2{Q!Zxh_Qke zOsH-YFbLYTpE3vrwb^v&x*{{jKW7q8YWL4!Hwo;!}D|b!5zYwjE zfD=KrE>_nyc#A}H4Ia2_hJ{71mNRFgXg@|&i-`^VVTnXr1eP)+2Ad7F;v&vK?0f=a zC9q6Qqv&=9#)7>TG-M(C9lIXgf>5V?OCmD;ujMZW z8es(*E87S)|5`d0`%#RoSdmPQjb~HS6PzZJ=1nA;)FU^#T41xH&t2AxB9}xiPJwV3 za?*05@0LDpNJtqtn*|rH%0PUroWSo{Fa$#Bw7K+@7PYZ{y?#99+9IGJjA8Z>xYDv^ zK@ZR{HI7MmN22(wygZR>dGr*!N-$I!T2!gA)>VULCQg$fCcMW-nctis$PyPGT0x_= zNyD^W?bqT`o@|tl|JBFcOvPgp(~kRV2p1v|kwQO7Jo#~g zN)V0mQm@1S75r5M(p{UV8#S^|&HwpFs99v&YaU&px*ICwSA&NiGYIQ9yFtnox3+&M zZT*O?D5GRHp++n;p+Hb_DXwZk*M|O0fG%1E&}}b)E`7I2rwh9?AW#808wABqeR%*B zK48u0QVdhb_lcF&^WNg96pGEg6e^)vbT zLgNVNCDS>giKlY_Sf1N5Sz!~2Q_fb!Qmi>o&2+38oPb6hAUz^N5of=7(1S;TrrL!R zh>pmQ$6Tq*qb9?kYlP@L4SKz`&d#UU=2+FHHI_O_y0I<33pLQb6m&e}E_9oC`Llq` z3z>9`RMdaLlGW?v+n{pB)%youXZ5aoA&W?>_xp$2y|E3M{-+O|f|i!EZ~}`$7NxtT zO?us;u~`1*HZED0+sRv?KX>jD3=Ao`8TtSMu_g za${H`-&SZ*x3-y7?TZev$KfCsllomC>KqQ`nbGmm4v)r$BK{ z?eFN9sr@bef}NV$PwCpH_7hx&sin65)I!J8(zoSgO(vj6Nst5t?TzrxsetuT>EiYV3wgky0vJenjURYI|KCoIgmL?aqd%Ki zm2}U6$-VK%_O&z zu{Gf4CT&%rl#5kdtkwmV!R3beF0l&LI3!KC20`irolCk{e|h-~<61HvjK)NB3D<6I z@Afftk!Oa%Jt+5$Y<`)Bd&>ZFRKqK=qBL%5U(&iSg5S`}&71h38-sftH{ z**%o1(nt||mha)l)df}Ht7YiwG_LP)76VCY69 zO#~2brdyZ(+iE^HA!Oug{ywmHa5c-t<|}S+TbAU@7rB}dLM&bx`La>A-NyZLP-e_* z$?y9{2-ufhIbOHR9e97hz$@Jr&aoDWLjKLYPFE!*B(i~9bj|5nfrV>*u`0;R9lH@d zj0(vLqLmH_=zQH{FB&(t50gG(W9#raqm`$>p%YZTtj5whlg1+Q_5xT$RGKQIAI(c~ zkyNI&J*c?2(jxsuBZM-cw-^Fh;}xS2F^47v@c05Bki!gYzRH8)jX|Tg%zC3zTR@XW z`+I0b;;jjCf=>BG8{;1jsx7maD52}4L|e_ZiMB24-6yhgh2zW>%=ftA%>R9S&Zi%o z`Ga`9qP)U!W~bxKsqE@RTkS3rV$+EVXD(KO7-i*s$jWuG%t)JiUV^kZXgZ|AEBJg+ zhU(LPO+XM8gY3kv4jekz5?BT^|E4DQ@y*oa*D)D`YVvVV zc{z3JMQX|rB=P?smq^l(IC13?jj9=*TtD~(<`!u;2}PnB7T(?N1*TgCEh?_Y*A_@8rSe5UrgKk$901`iqP$fFX?X(Em z>Z`NQ>la7mbNVIz!`KlHv!4+GVZE`?v#;^YXI;J6eox25oDIY?^TKC|Hx-`57_^>5 zKc{#MvbXYe#foC3PB4w-NOQ<51WB)cE5|6Vk?6u3Z&iUrniUdb_y;j2L(6=)*Ku%& zhpy5t(1POehj|?d=wT<91bIK)V^G$4_R zA{PCv-7nmx=G#qzbcP9f`UB#&mf1*!U;?s{#}vGr@KVe+#YgtvaXOqe92K_X; zA_XU0ImMoVa18t&k`_4WRgy)g=QeZk3ZP?2|9vFG4rUi zPbve@4fppl42rxZ-##y*QCLL2oP<^T%KVp=)lpe_`2{P$d=ygK?aI`6%7v{F@QL1*k#A03j6|FkSwH+q*l+W#8t=6Gmvr z5+uQFP-Fj~3~IvvAz|?OJ*RSD{tuNi>c;k+HSfut7|d>L@24cVR&;5OAbPr=oHZbO z=&gcj({8hvZhv>{d&MA57^-M*O^70>rq36+F_pS-Z|j^abpBva^E*{r@W*AoAVxI! zUyO#pv6}rwkBNlRSuM6^SoFe`u;|Cm>!QaSr$w(tX^Z{?1Ovaeb)z5v)6~=g3TUfI zfs}9&g&8Y1H;l^rEW^spO{DTZc1wKF;ElwRp=uwbgakV`^MeHP`f`=4COyWd{pUNA zpZbM8*FlgbsSP<7PG zIR3>)=bfa?ZH%ytC7KFC&=7JG(oxx|mg*`)8+#xF+A?AC7ob%Ft06-9K0v)Ac_!~Q z#b_?0IRdNr_y59Z4dpf_eT@o!w^k5w@#D3!uQ_uti(ZAaLLQrwzplMW8W!sNJ1^1b z8AkGJ#*jqU|1kG_JrCUaMw)eGeBPlX-j{%`e0tN&-5`-bF<|Ml;Rw@G% zl@SpQ>ai}w%QtXHGDa@>!Ik1&sp$!k&GtO6L5&UFXJb$siv~3=h>fM;U`bQ*j*MNB zMO%9;Xe)1{Zvhe~uBX`X^s%Y!Z zx~d$^HM+{QR&;f&bh^rC7t~1nA@xV-EiK<>BQgRCVT8W}# zZer}m3aH;sn18YlQV~_bg>1G)gd6H6 ze%*@PTCUB4Quhva$HjWl_nQX790Fic4*&idi1j;h-x_uJgYx5{D1^s30;UT*<(=xO zB91Bg1a&}YcO)Or$>_GpBjaI)(p<$2O}!&hUcwcxpHMDRMHMS<86_ZBkhYEFv{k2( zTw`w{i0#f4=plgeub%v8K9C&WrFfRlH72FA=|Of$ej?|9&f#A=d2vkks1mikqGfk zf?__y5Uk9kCzVy^Q!Pq$m9nKm$>16prmao^`Fz0KG`LLYM?okjW_l)Xs`Zj;4xi21 zSGTSqTv|wx){x@nkw`%)iFJmNVvOi3FYC5joR?=f!zE$S4Tw;?t&5OAzzf*L9tz46 zUkSM_`n!2*`wZ)sMEBYDpDV&ISZDV;!f&mDRiWr*{>$(u?bQw8xAto7a_Fn_H_&Lx zpG!MC*$P>Etq7GG>KUm4wNF`8(B0yNj-$n+oPNaxZ9{_@*lcCHqkm_p%*g?o3Pb&W4-vX(rLcr7m^?G5$18gA%2d9KZ;6 z+aRTZ8@icA$);PwM)vFvyWc?((yUn5we(Dmj@~FEkZ8`qUQ?QRO@ElrDb2j5zq)7U zoBf%eLS8W(01%PmH_w9OM=8gs`4A}+5@;8pOVrwXA+n~8KM-H-f0YRIuao!!gi1?0 z1*xxOCTC2>0{U{3seWQui0z|1ma;CGj^+-_J7C09BJ8%gJn-Kd^R((zY}^N)>ddDq zw$=xA24|90uPbf|Ulk(6UROGX%B{2B>wpx2B@>RtYCxuZxNil$!zG_3QjXZMbrUoU zf(}KyvnQxP0k8b4CzYVXq?@4A=+jDFfr^$_6(S+-W|V^Ky(B0#I@1JO5UE)~NWnL& zR8h;edck*{i6C~T-TF&vxMXAvl=k^!Rl}I5mD7Y~i@m<_lG6gD|25mXh@8p_ARM6p zl_pXn?5{?Rph|siV`DPW3KHnl$jQ!^rB zV9e;V!HrT;9+GuNm>Jb+V+n-8_ztf{Bl!`0~)xy`te#Ca0ZP*X9VcfFlTNoxQ4=5X3+*_!Z|iLSM!d2bq<%fSH~NHw=9sWX2(!B*TJ?2w6m7 z%`mmbxFFees(FZbJc4polGpU0T*=8$ zA|#L%D2P!HIkPgU`20U+MJNF96c-;u+}dgALv67;9favEp(rlSVT$%AOK6IuF+m5S z@>y28{}}??ng?<_(J5qWH~=jO2y+Z9kUd-{H_DHrnv3-^ zI14>QfdV7k+V_7uS?tMAfB}imD#14R{9hTB6j;vAn8WhNt>b0vqKp98*HS$S?4ij9HX`7-Gdd6eS@3R{=;-0`b&7C=L9x ziW0z8U{L~NiW0z_E{CBu+nKQaEK_U>Wz}9Ban+Xdr#SG6PdR(?;z5)ewyBv5VyxIe zmaIh+jQ?s& zap7*je`&E%KYVR`NfTlcFY|s;==cR9yPE^Kzd#t&t#^&}mWrDd%9vD)$zQbz!_QQ) zNm`C2q#QT*)Y@YFWRFZzH@9&o6&oNV7A*`Sb7xU@+o(v~r=^wX{XoiQhq{&3c~2~> zN$tJM!kd%jS96lA(xXd?$$#(@Ii&3`$U4%SdRKyjuxrpnf%W3zu&zG!@O^m9$sn~!pPqY!MRH?isRo^7c zsZUUo_LwYlt@10P#4=@opY2@wY$%IduD`~i&Su$VNokWQ`5zcK8W-F|gJ!!00=1~K ztx=MP*>WQaSjn0jK%$Ep>_cmc;-dgi0Wvy53l(s!g!^;_vl9f5nsSSfI1S<%C$hD1 z9G2u7sB;~YI{nSQ`04N48qxcMQfL(+ftmG_LTc&n`Xy@fRK;9{Y4I-xPKa;1gYO3i z11J9FgL|}8GdcMFF^%+yY05pv(CdJ1Q;wF%C~@fGhI}hr)BJoS7m;s@(h;%^+q4jFGGZu-N?uA6nQUiT z`HASlRTWNyW0Bml5U9SFHF#aM_{8XICP%!kW@#LgUds*`$aWV>#i@8u2p*XMX1ynF z^OagaVD2f+gm2~y)`W(n6G}OolCyLYYuJabVweLP+K* zTpY{TPG}MQk=$VW&YV=6_Gp{V;=NSoK9^yD0q6}SdqXhpQX~>iV&RZj5Na)Y=z=Yw zLcT%8NFZenL&H7g`9zn)e>Ny;59!aYXu4`jyM z#n4IQI!h@FYnFH`pN-F^kaw3*%{1~J_OJv_Wv*Z&#y{?b>JIPzaJaierd+rNA%kRw z33rfT!@`F^xdOYBhyh-P$~!6%nDudikY&BZ;i=#$Wfp@O=3gl(W3Uxx z7?2U1nA=Ko;ii(4WY${7{;lY^;3>scb%%6s(Mj>H-$ob+3I9LCCBlk`GqJX=iL;*b zP_1#fK<4xEmwCfDUq$Bg@;72xwXXB>e^Z(HJXJ3SQU3jUrSDppuV(QMN$M70%fA{) zMMCoOKiNk-(y$m{0j06%~YxxZzzsWAbE!%RKbAC2Bix<4XRCZK(#@A8nJTE z6xRTSwUvw50cq1}o$PD`T4LX%1f{E*MPJbb@+HMuu0dnjCpjYse70O$N;P$ByQyr) z!IM}<{;ChyUo36bKB~Px4o9epnFrKx)Zf|*4f(J$aT?T>y4e1K8yd1`GkvQz*(4ZG#iC>qx4|KN9PFVS7YLzVdtM^v0z3(fUsrqBdmuN zzF$)7DY~=s@>%Y1jtgr&v@mR9w-S#nJdNnd)&MJ!)4}J~*Q*K@XKm4i1nt}U(jw8~ zLM=a`U$EpW`eohWIC2LAtci+18^R22A~YlX4<4ros+y5o+C0JF5VC)XLR)(f->N9 zKo|*u9H~WrBmfx>Q>wvD@rlrP3UL_0M_=Kng@*`{(R!g_E$LrV1u_9343wI)-Gm$! z&$r{G^S(@wxYSt54Ab;GSKSCE>9VQXJ|Gl6PZEeS)?dMX*WzvNG(oj zMn|_KGZ7Wt61O^7BGn`fY zbDE=T{)xJ`<=1eUj{tj3P#{@1l@oKWV zLOPPCm!(lof{arTcKFH6ob0PqJBgOixtuuKnSd2L{a4Vp@D~R?TYV61Y!*05of~M*^r04nzW7=$4N5~Xa%e+R)Vy>l_e7}E11t}4y=)aLjrhG zti%S$NoOVZWwCb?Q^WBAG6@Uj}_6_nxYenG$F!^`)tDd zQ=BkwqUxBz*+wI5WcqNzY{P3#3~8|{RM09`hpSGpre5iNY?Vm09E%y-j|8V&X^QQP zP4Ie~;PGPp$=)jYcgFRq$oe$f>Q}K!!jS;lAi~tZ*LlFfwVbF1`%Q~=A_&T=Tn#uC z>cydIJynC$Vv6HTNK+;f-g%fgZ06Ulu)rL#a`= zXQ|Po+yVzLW}bRX9GVXA&I-dk6A6q80kEf2BRa*5jY&dK-_BskzE?R;tyYB~C2Yxz z#!Tw8m2nP+%6{?JJ}#8?GB~8lo`XcGEEbbrT*dGG6)(2WA-yU)@f)?zITTA}U;K4{ zZ*Q6^+jqyP8eOJNaX63x9Mqk*aFg~SBe>Bx05~}*q~oz>nkyj&%=)F&l`g7{prTzYqPuKblN7Z}J{&wxX2#VjSm4)&B*U!|x zMQyh>e%Igo=u|qcLAyxd!>ptLV|yAB1I`c=G(a1oVmKN68m)VsGcXjv8A)pYx8M+k z4Z+t|3+p6meQz6$LJS-soj)11a^XLvT5wdaorO6IKo$+Nst#9RGV_uOC^ZwvKm}$6 zQJol!kO#sQ;%v@TjY+P}1BvqjQ!PBy&%_%saip`3h&>BRQf$w%*&_}^OPNv$7b9Nf zP{Jtk+N(nb5IVA^hiD~|M*yeUoy}6kXM61=ARshBG!FU7fRG&iADrSIM2^ln zbQD;|6c-88B;KwSfKDZJ%4JZ)qPXOH`dt6MKkxRrfS@@ah}YCA0QGHEFvZLYgk5IQPaF@CZmtzsI8{n)PI|Q8V)Xp1jkF9 zU^9p%<^NtQFbw#;egP1?HoT7ZG@CWL@FD?88l+3K;f(N1?7qX?IIT3%Y*;L-Bw7aE zSFZEE>^l9$G|l@|YY5$l6b27ciEfD;nWC^@hNubmzC`OqniBIu_utYihk?NJH4tDP z1`_slg@ItEu_tjLaXXjEm(@V%4#xfj-8>54k?s%w8XpLB`}6-tjg|-Y_l3W#(ejN> z%isM6{@%-+>*$OsOofbo?g?>r6kaV5({tgroYeANdfXy5}95U7&Y8pR6`KR zf|!PYp(SdpAWCi~YGx{gO^99Y5}VkaUC(IAc9bDa7{ic$I9xWH6=EX3X@=EPe~w{G ze?oayce(4Zq0=tO@!j#SY!9XMH_Ah^ z!VK$b;quTf$wMzc8_fLj!~kku>EFo27_j*tH4#a_>Nph|{;6g+ z`k6qka_KP|l@?R5iP-zLKveD)dA+aYqcI*=Kk!2EFFImS;BO9Exx5pu+L;Ew&oua5 zgYWJN@3Q{>7Yjy=>gaXlLteTNZYQU`*hDhEs(EK`IJErOK{>)CN^{4a=gY%GxGzWH;r|&{Cn3W;-6GpJH-YQKS$^ ztP3^$)Nw)4_KZ*X!DVIf33vi0@Mq$071B7aU>f&l*aTL@XBsa|6y$-*frvz_i^Pr4 zgjZDRHlPll1DJY60Rz#xU18orO+jH6HMN#RK}oJySP$$5E^1x18|4eML80!-#7CD; zJ)d&D#!=%B8(HqQyXPQR`Iba$J=YmKB;tt_Hw`l;rb)V@85vU!^Inw}v!oKeWY9N3@pxfsi7DCxOO9>Rp zBL^SFI?N9N9;9Z@(}k=<`3~M7pdi0Z0yPlC0k5c2g0AJ7M|MTW|8v#xTmY=?1Cj*y z!+ed*BF)lzVE=aheXh{qFJnWN{0GtCt!?=o2qo#mJrL!N0%5(#9!3K3+=s&NFAlxF zuX=sosMqnV_WK2#ynUcxt*b%-kCX|B_TIJF+xxV-?eX9@9Be=})mWdk&F=QD`>c37 zjK5~98Q$U$Uz&c$>ai5ul5N;53V|UO+1%fM`3L{#J)ilbUn-PF%6JtpV(AK0NYh;@ z3FIRLM|$H?rbJ74Z(4ro7fvOm)-sQcaXn$L731|K^&(K{#5wga%9WB7f5FNIZ)tI3}@Vxr z`Ya0zv`&p3p4%)-9dV?zI>J;9&GMRJL;b1EGJ6R%?O=(`ELZfXW|c?KIKj%)tolk| zyV5#IG|bICJ+5V(Pn9$WLd|I7aL%d zt8D>rX?O(M2Bh#;?x9Y)CE}G>kbQ-S8-R9&R~v*^QGy^5N=OyVH|isv2X=(qM6^AQ z%#bF92n{vVqc~Bh=X5#i%s=8Bv`5ZS8`K8 zj+9fA zwwfo6FRbEfpc-GbvI7cge4(tO!&;l6tRh!FhY&R78!=Q|PkLveFiZ4P16GI*fQC0}{R9g;^Orl#gKOEzC%sc0{;M$V#^@b}D=5(2F$G zpSaHTgdJ*bZ6RTQafB9<(~KOq#?aY3Yz&=u2SgV@EQOoJ@jP-1FS$6<#$KP()fJjj z?P4ir%zeMCVaG+&<+h@JaXf9lO}5Jh#MVrh2=heHr37=>v8(v5dK_Y(88XFxbMCN* z*$y;|N>w-(OHbZLW!%8AdvkkCZ+pnuc)<>F@N3-Hm9p`G7c8u%Bq@w+iu*tQwgvv> z{5<}hc#s3CBvE0M)1miGLOq&tFpd=yhlAWz{8Kxz$r(B=d+Z>BqdRBv9k zJK9V|!epx(m+3oLx)d5>mi?)!I}HM~5Z9@}R8kY{0Z&VNjN%`inLMQagwToJlv4R1 zyDN^0ggUt4b(VYR9I|x{HiApa$OBwtou^}19#I^z=;_9wBsnJbE&z)K1iV^|Li&UV zswwgf9oo*JVVWEND<(lf51gJ5yAmv!A|M77MI9SV7o;7CG3iWLW$ff#6dq~dnOFw6 ztJIMIEJX4_8wu%^4G-I?ewv2tbk!PB3GIxS)Cr$dW^;ns4BgB;D#|o&k6r|(C|&9W z$CFa0=9syX14!}9m2Znufl>Wq>gC?D00%J~b!bZ77P+^kgli1B@^eJrj@fD_N-4`pAR{o`NT`w$Z2_X!q*$&yJ-nvzZ@vlb=;x zq@53BEH15Jx)?V9((JaZWfsd4=dSd6`H$%ezuU6lGCp-YXqkN2l8mkANqPKu+IcF! zz*a3frNcBp)|7RrQY<0Gp0PC*sDuTM3fyf%yp5&Src=4Xj7A`*Q_wVHg7-Bls_k@*TMM~b!7fDI*GFI$>6Ff`!_UdGe zBEyf9eChTQ(8*9Tc)zMKz{@(9CBO_RZfo%Ig{b{6z9L^ike0rTE0Lh zZk0(1%0UYae~$&rI?yVl68H&MECzX*D0XQhx7Zz=B50=*JCe3Ig&ad{g=})QLs!5- z3>P-FGud%ny31lY>BbGbfK`JK6s-@dmX)mZL1w^$YF-GH9QWSHszy(>zUU!Qj*Xjo z#9-sIS17g-^quLh>o5pT5QbW9W`s#nAMA;Dph}aVvkqcc;4oxqjXe8&3)0i%1S=Va zXZ>$1Sp1l%+C&b93Njny!@HID^@jI1>AZ(w;i{AUP9DDS8b4R=NLrf!he1u;q8Pia z{i+v->+WI{#xX;H6%*ozQ;3ol>57k}Yc8Icn7DZLs@8^$YgevlPp@A$(`gL+Hx~bE zUNFvolS%bo?XoK4BG2=5@V}8I6vp>-$$#OaY`OnPLed9g*7+$1WBYQ4pvim??!E1o zh#<=&Xfg&|n(6FOzPSaj7*&Jqnco0p5J{|t*=1_DxV5=nLwfFgxTtmU=o;v>(52sp z?aTDx!q!EjYv6;y8Zb_egu^CFomwGe1<4!R8(KR}4rNJ+Iqswa7|{|yZd4l93Z+sz zSJoCV&>gvaDK}3qUNfy<=0i5?RPdfD(!K5P)%9YJGkEyxz~nnm%{3nHtu%|p_ZBNd zd?Byd8M%a*@i&I&V?g9i}xeNr> z>U8w}YgaGx+8Xli^f4}iEX3W{$N+$j)1hu$i3ZdgtB|YgKSgScX#XufIPf*}^_FEi zv0B-Cs`|@nx;d|}U)rztRl`8Lc^ROs5~xPhz|mO7{*jV>$)&1?UQK32*N^t^)h2y(c&!JeuV+omrk5^ z-UPy~1~hS1lWgD)SWlXGYwxyp2`d@9g&!dsAfodU?8K!&xjw0Cw^peAEzaAdNNkb# zYW0Y9^*`^C_NP^{H=P#%iI}Y}Cbj8`9hFl3XmYPO=SX7E(*B*L9et^H^rf|yMs{>s zTYwD)12DoD_2Ydmcd5T2c5P4+!|qSbD^w;%$w+)^jQCuyfs7zNP1_?Jpj)t*GOLxs1~iRz5IYXgy`0*jYRJcvpNRm`dAn^a#(!OHUx z5oC(;dL88NE+3Y3t8X-MjzERNz#!4}p0p~g+Cqg+OZ!;0%O?x!c4n*^xAdT~KmCEX zmk`R`%Ye>eQ5DXOaqeby5ZfXV6(D3WBiSqTt&5=m!tQI+#W27mF-)6?^P7m)Miv{p zU&0tAssPRqgt1h@SYE!Y5&~@*)PyqAp6jbc*_!ww!nse&zalqz8pjn)fZD&F_y@pln+nN63znhZ=C3jSrY)k&ne`iNvB8hHG ze#ft6sGNHjw#28|hm;h&>v3^Gu8lQoOG>EOx1{_@t*Sq)RrOA)dJZM<9IAS*R@Gmf zQ&pFGuU^3bFR}steY`4wsBJCSh8~eW~ zjIBBsrou65tU`;n>uc$HUB?^@zTW;$4qY=-JgB8XjoYC9q}I^``b8I=3GYdXKP^iDbbOUT*SeklawOnsqzt`9472ltsBna?N_#5bq;S|uj9?m z8f~v@U4IU5U)$pNm;kevR4{v?l>Zg2YtNx=9pQ8KbVG;5#3ixqd@qUJt*a|AsPY%L zB(7@hK999s*}Cc+fco;*l@*v~&o`J})_VClbmgV3mz~4gyIL%-Y9ien_)}`Lp76+S|*d}l{}&FD*2jl#eX`T{`F=yjTe-iIj4gUlrR|W zOqX|lq$||os<1S%+X#oR+aB)_xOnWQS zo4W1gJzi(ic5aT)N!OBlwht>Kn2zBpxPY1HGEVcU;#USXH@brvpvl2XAfci`u$);(1KL~9X+4g761y%Vx2W3gBz547>}7{I@6ED4u*ux^d<$RH8@#3# z25i?viIpcT=*ZGYP^P|R<+~}PhZrm^o6;E3D+EXo=(0)nG&ae}=cuS`xo^i5s6gO6 z(Zj*K#70NFMRO<(SXs-@axk9uL1M7Qo}fK+x|-z*)4#SX@b5K>63Dk@x69cxo9zQ@ zFrsEkw5{Ne3+awyh7CtnKH#a55Y@?BObM|&Kviy2!aqFv)4#KqtT3|;$tCf2_9-n} zv4uZomaADc5=X6Kg={&Z08;j1-P27Y-VDMx)hq*J#Y03G6BVpbYlE@+zZAwP8~3#& zG(rOB&T52HgCivMp~fGEM$k_tV1^;tZ5WE?R6QaaH5l4scD7)o%x+4KhIIP}2m zuzCQj20!u4(L4b~2A^n`Mfsj5K9Q7voY+Z&pZ_7Q$xO?sgES)VLDe*1j(1Vnm59xI5n5wnt z10u$hC^xOwUaOhV0n)cwt;HCfjJ1w=t-?|W8>FFpZ*Id$tUyCe!+5%w>Z?(wan$sX zrg2Y{jQo%wR)Z=IEQ6|sMX&_`VcN)f4PE6s>$e4|WdZc$O8L;o6Dl({$Txz7LCr!x zA#dF4GkqN)N{bw2Q~;MkZ}rrcXd**WoZF|GWE@K$$;f2#&HIxNk)={TLR4jW1+f%G zzGCP2#l0k1vw1^uQ4=EFy701%(`z?f(p}lvI@`ElYI0`Fx=ZubFyky;fBCjmD+pu+ zqlt0B&j_0BNbmwOlJX^?2#*jG(1-zdNqPBl4=!Eq!9~kG*cu+xnvFeK((Jb7Dk+wG zuz6|iVJys-$OK00<-T1r^q~5pv)qH3_yBqkwrMG9KPh*`2g88uF84s8lbVesFxWWs zpz77mp$8#4GAS<`dQg3#jaehxSi9VVOTvTNWNr5%4VQ|0ji=a`crjZ$)^Ij@_V`JV zl4M&%aWN2{BfSu+NKPp%W#eS1&0YBJkF)CB>gD=y@p2E=4Lzu;TDjbV>F}U7oP4== zCx;$X;GJFW!G@)^HPKQJax{QaXYj&N0i^Uu241c(&%$TkY3>(M5c5gLTWsdP>DOj6 ze~&zW?pZL+Va8Ce$j~o}hU(ws^=JM1*Hhta@|Aa*|65V$s{b!y{odRk$6FqKq1N0_ z)7;Ytj3VDsR9HCx|5gNd31T)^Km)kDASh-+77g|znc`2na{K+FEDz8;Sswl=^PD^2 zZ`e3)0w2|;WemljE#E*5o-Oo%26a&%U@+y7S`Oqrnhv|kVRDD^L5aVcjx)iU>U z9|W-StkOvzbZsDr2EBLZ3pu>t<(6%<$ESK?wi=V(wWp%t5hP-v4bE|TVZ1kfc7Sz)z}M4<;&2T*F&0c<5E@%KA0GtdDG@TIhuUQ@r z)U?LOO9c4Pc-d-J1GojlS(n)V(eDzuns|xe_N2TJ>?e4gE}{S1n;KWudCpDHn{D3I zroRC7uTA-@VVIppD~z&t zrFNPM7Z!@5=2TJa*`zWkhOsMeY}Ij0O2XZxe~^csN*~uL~im55tkaay5IKhTVZWZDQ=yg z4$~OcS9PrIB+*)R;CSD_{9=Xr)>Pj*b+~oTC)_%HPJlBa61Gl+TPG6lq@dXVH|3CB zslH)NUEN!&`Cm;Z!PJIv4qewfj8y$X7Qxzn*VgvCwz^oOrpIME*B1FeLjr*atKZh9 zY$4S`YS`+H3(2g86-9Lt5}&ys9or_8lOcn%PftY|pApGfduCfjt2z^-zOhb=%QOZ| zr>4I=fiSjot)5K@yygbkS+q5hw)r)*@4?z7Ok;UM^4ib!-TID>NzFw7mqz0eE}K3IH!JxvHs7DT!h= zX`aCqO;jURIb)X!nk|;uf}&>AGGBxt7&Em_;2s&Q&H{$ROvUO1I}jmOSjwspQ7b}* z`87jgj%F&gv=4I-W(3SBHNTo*6DAi8R9*p}TR3wVuYhuHMb&st7M zz_d2xQv{AELi}a7Y_e_2Ne3d4PhaRS@~I0esHoJ#ZfYpV^#3?TYJ`yVG-q>cj#eU_ zURR`D6YKztA8?fm`L+9GI}c!AER6yMa&mA^(^{ z^0ilrpV|H*k{E>zhVIi;*N9$&Z5zrjuC_%Nr*5$m!&1g*`~CUH%q^{ziKI_CWwG4L zo!AxOz7lDepIyrNN0JA#rf45YA?a1vhpEL$y%L%0#+qUy0lhZV^4{^llr{ujnQ5{; z%tw%XITBb22F!s5Io6V;Mq21K)M>$w+btS_(y5^$b1%3GealN=x`yr=u{m!-ReY%J z06pl4^Gd!0#J%{HnZ&r^EAi@#h7r%pr~mG^s2PJ5#tCm3^P8FEtQ$~8sr^d^XZW`K z;B4;C&)^)5&e!1B=H4G1u>cxeoH1bIBq0dUSO36E zbHZ#-DKb%EWrMSRvCcKcW7#Ywlc;Igx-(>)VDe>6luM1A3aZ&~N!8LvFER9C?SsZp zEcD6g@|30$gs}*h&;A!baAas{NDc{0LesuKAYR1HS>7l$D;WE_AS776q4W8BTCK~%!HVX%}KX)+Q?Y+1yw z-~b`0rA%d-^8lAJnSL{bE0CrH(v*}h*J@45Kl{l~Ku#vPx{?)UYl<4(SIlZr3__w9 z1X0hg{;gsVBw{BJ2T>ngX;x?LO3?@fC0M4Ocn(;9Dov&@gb}dgtNidsKS6c^I8|+y zbgsg$r$Yj#tz=uGHIp@Bo&ibHSKUA@a#m#{8L&s2F&e3Db18)-v84F@|IB?(I>66E;Hz$L{3FA-=X zJcQq9(|weSO*E>@#UaB=&Bopz6WUECHek7BRCh;p%XD|c{WP?2E&JtlH~wI``Tp{h z3fOa`C@IOHD;*3f#eoVmX|?KR|9!$3RaK;yGj50cSQjSN@fwNgn{ zEBcR2AOb`KS0)5(Xi0!!(PR zNd@TfvFNK-MgzNkGJSk9oi;I&qY5Ij*MBuIg~dtgEON-QCPK%|&S2egM!mbEG5 z6!6ca7!*Y^9`W7g`@7_R(dX24n(giC89W_Tin^9OhnOq#QL7wZTv)a}WHGg8YkG=& zo4Ge!OxssV%k*4mh(>gtV*NqYLTkAeh!wN?b@(lPY=>brC9{y2rvM1_k+$gOszs*w zx#a$ZqPf5TeYzuzpo+>{F?k3~g%Rb5iBKOV2oR{30XYOkWkP||6cW^EL|!#$amuVs z+`~MSdu|qBNKd2+L6c4LWb>2@%2}$U&skMmj=f7bF>poK)fbi(OID3q#JS zc~W`(Kw>Qs=}o{)pDrXMR z$c4vjiWZoa63$X%nAy^oCKH0RYF;iAI2Z$9w2FF7y&wB&3FTZcpejA${46!CS|Kmd zGwSV;B8``r3q6Gb#AZr!sEr(^W<8&N*eO}e`p-HpFB0X<^dp8~@`XSrQ-adf7zn#` zlv<5kZ4UxRCQ0K$zC3~4CS6D2fG%I8g=*YzPo!|WoWi}mWwAu--UbXZFw10(t+98bK*(7OE4`zV|CpB6I+0kCu)qJ1;Gsx?NpRo{fzdcVHa<-2~KZ^@S4T}yrI zh-dAtFTbF&4gRx{`Yxb8&bv2S%E{bOn*ZBJuek-B$jd+dQKHcP^c~wFlHC2=hq(K> z4Sw^V{*;>)e*N`tkczMT+2@+_W8~#8{x1*QQ*QG|pZamGn@F-&dp@1-iIXt=TVyM; zBxTj$khzDf@xdC=M5&>dDc zU@tIP^9**b%<}lOSh~fyhPRS+sdFVeMGJvU>vgb1Gc0FAHz|Mr=YU(r5IDG2t%yji zP_HZ;fc&5v7RwC}aLgK^J+!CBi}oRqEBQ8KOYErEbi7u!Nc)x_2Bz0mDUD${xmc{A zy9@Ts&7#sXWqJ&!Qf430b95T!N5%KIS17H+nqr;6w6<6?1SakUrqvFnwMyZ)vRHo` zu9>xkY%+Z?T`&NqO%A420@I9vX|;oCEnwn2yJF)_*d7f`^^zKx{{H&n;O1eoVd@^$g8nrZoF-6;GNs0#|<=xUY&WX=#yfKzD zg0VSy!QOetqa@$_7iy5-L7g=B1N@c}s8aP-Na*FHXsEcLwESn)0m==2u}hEsQID8% zR9L0K#R`1k{n88Q*RBQn{riNUXC;X=Z5$-3CahxaZ4X-qXCCERw)OiSRom1u*g%I; z0~^Q=J!UPe;Ae={g}oW&5M@`)aW))Pyxrtnmobo7atNb~<4l>yTnV5iR3y{8N4?C- zF}s$(AA*P#BwKx^lWuI`!6ewDLo^wlx+1GI4%tRkC| z&Mzaol4H2bc+5;;`G&Cy6qZI>Cv_3a^gxFPFBT>(fyPhg8MET?0Y>ttM;@fDFBBQP4>Wy_#Z5f-OUV*Cd zge~sa-V97pB^PBY4@i2LCSSJFuk4A39lnTx;FBN2l%9=bW$amgqHqC>OMLA9@U)lDtZ2i*h7=$btd@xPj)^k z{bkk?#$#aHmKRoQRY&YUqCItZ!{0x5!=p@-Iw|Y!5G<8QSd~wT`F4Iu)l2iHWWq|U zL5mRtt@I38REvc06<;g-aHKSqPqP}EbLr#7)Z7hEJl1O!t+}`TV9|J(dkQlvoT7*) z`NKu)_NN}6yWxkpX*~K?#!TU(z4q--y_K4$iuPMoB_Hu+sxO7q0F8U0VQVgZwAbn) zAc-JNu*Ulkn3B1GgpNM^ssg?jCfN5wtAJrilAf8yB{Kcn-^fu6bQae1(;v+ij~*@V z-GAhv;^2{Eiwh6jwRrI8kz=nsao7I)_TP1I z@u9`L=ZgpD?^-;%P#io~>_7bG{SO^0?m9fbe_{T>b;ZHOt;dQtFC1K4oIg?=J#zRV z{<&*@=XV{OUpTh&P5U3*`Rbz!^E;0{a3_uKU*u}x-orcZI(me=yB4{-Yv=r1=I^>< z;n-{E=Z_V)FYG^Zj0f~>ZvU})%9a#Av{)6t`hkUo`6G+9k9d3k;f4AA2OcW!Ji4%O z^v&}J;{Cl3EbhOP?#1#~->qRDDEOqfD_qaczhx0P96NZ|8x9^hF#neA#T)16-?0DQ zqYoTe+*aDpcLIm~Z<;R_jvies?tS1G|LkA9>+WLl?){5^?C@O=9A=mYu6P~@XwVNV z9(+&$xohX)gLeXf*BpG)JoO!1oWJ)>HGkU!_uk3$9DQSPp#Qe3j+GFJDKNWx+;!7IKS}5 z!$;qIcPeQi!_xKS{*^?9SO5AHvF@W2)Oz~m!~ zz~k865jNE`aOtkQ8Tq~Y-*WKY2ktEn%-^?o_jV@wh`@3ekHLEZ=*ZCr-gI~Irv1m_ zQ0@eOZLRG;vUrfUG?s|>tRhF!`L`TAws?$64Lug0NVreg?a%#ADEwi%YC3U6Su#3;{!*GpfJY^4;A+v zJ;+?!zcy7s?BKok9bM47quvB7Aa6&Hyvgu+|KbA+0Pg=|?_J>ItjhfHX>Lugq)?#T z2LzfzI-N`=lSx`a(;E~@TbodBg=8-8G@(f*&P-b3jTAw=fP%U!qN}Xy1zmSVSHV@p zx`Lvj;Qmxt*9*JiWmi|(71ydr|KIO(&hx%!-cHkk%K!8Keg5M%#vTvlG`PA$sAdA5L01fC$Q_Uwb)?*fbgv_vNMs7arqhX zHU>nPRYaQh^5sefoD1A#=P)>|NWgFrS#D9tEv&7Pmyck^gL3SZ%(|gEOHq)AT!El9 zp&zr1ee{QNO(~!WYd|QE^Xg+>=S)L#BRltg8P3iIuttZcSs~e1E_;h-f2nxeWBFrRL)ox%JLbNb~wKM|ei85h+0Y6nZ2j^ucG>mahDm55`hitJpYIxZwINPv?Vo>ZV0-`*b%X#H; zVUqfSC@2s^z%|$~DwjrfLN7$4s5LH_&KU(PTDJY8f;egV7>ly|(LEy->PDDM@Z*sJ zwM|g=u#k7w1DG=ODX2>*ZB#-^SO`Ou%T7fz`8*gb7D6Qi!)CBkR;mnVCNM>)HpIaX zMVI$RhbqM((*c8qAuz;AZzu{}O=Ldms<^?MRkX$}@-c8} z8-s}fo^6{g`rR=I_rdx2HmwiQ8W3a*RrPbkk_9jU-a-Vk9Uupo@ImWH*Gv|u4wO8| zR8CyfDsHS2P#-!~hN3DsV9pSy0P|!(`)C^w_1jP!7z`N2$oTH!E&)3^0X)$1u~SX< z<6&V4iB*Qtf`S2_ihC#*AV>y9&0PzG!X8;Q(9?tE-OI)YNx&p-u2`^KEXhptl0awS z)Mgxdx4>(X1&obqx`;)|8^Ao-62@TW&)6KX=oQ6DDi0!$6=di9J1AMW?H(Fgy z$d)Hmwb>R0=PphPvj;~E8kV(hCQGI`Q!W>CG&I1U$#gMY)y&^20vHL5Or0U=t26h& zDM=SvWVr})0Fr^zj3pwbpJ~qOcTr;(b1CjbEn@(SWr@{C{Tn7)J_=!6tM0h)ubt6R zZ?`vUI5GL^3d1ER`g6NXYZDZ-ECE#+xPYWG4Vqjk2ENh(w8LyLJQ;=XY+3Rl%c4n) zP!{aLWvS7QP~IWmLUlp*RnYqkaEZZZN1%xSa}`la;1StI<6vZLo0r9m9L^b_O*_7T zwJHwntSNC*(D-wA*tKcpvky#{k)NOsT!?;)!HNvh1gUmW_D{h)7>oLzg0)mGY+~Q& zsGnZmsjGKT=-zIDWCn%2f!!cqLjAzD10yJ!ctEg|Xl!_~NVb!ED8`Fy@TpG+oFx$aavnMM5@Hp!|vEU*ZcvQzGpobNq+3y~KHURd|Dbx05cCm&guA*cI z1D6J{9YMb6i3w|bm_jJXE5nI;fmeZE1W{)^D^NfM>2?bJWk%&kO=choE>+(@fLVbr zkUh7G7OXrl3UowVOxEj2N1-*jQBHKJz$%26YxC$NlxlF57}cmus|4Z;9zci)v9pYj zhOqK;AcadH1(V|V=qRD7BvIN^QWGS6X1hmv_BxZ*8 z2p;GcDkB4>IMBW!5}@eN#)!kuh4tJY<(40_mlPZsuZVFWrN+@RJd zG5iyhZ#+?&3OyHm2MQpx4S1yTKKTU1$si?0OR0A)C&w^&WPPlO3P++NV?hLYc$4{IBF1B^JE;HPhbC#JmHs+U>c z+AcT6V>T_DYGXty4l-f zDR`TgnZV|T0iXy7yb{p|*=>ePTJ8B`2&J&;zl8%C$EHbDr{ zF{sy=$>{~sWhNc;(Nkh(1zvD;LtDZ0Wza>stf*^yr5GI{7EpP>B|5BXn|?6W>4Z`3 zrDkgg+K$c!s&SJ&XiptF43VEu9T|%)%D7XrElMcVnKlc*0;}nRLn0tNX3>H-P9mND ztX+1-ehKU?2hla~jClZ)2Je8Rk&Ow+Sj90tq{yKY0U{ID&rZx+c@#>mmv4(^Co4>V z2sbI%3IW6J`n0YNAe4fsY1D zO{!rt#dc~bcKf_MpvsP*zZ!;%qmVPEn?^uMl}Q?`d1?r;XsdJ*{mhThyTs*70ksEJ zfrZKOk~b<+41`1^4y`Go=1w@2Ojp@cTKAGk3M1Dyp8wdg=w-(5>0qG%!~iEATys)I z*a{IgbTH8kfeZKm6mvSZr9^1n8-+V2-=oeWTEtUr(V-Bn4aK5Ern@~omIH~hFTS|U zC=7QCC^~|UI5Zm+pdJ}*g)J?`Wy*8FP-cR|2W})EwNU~*kcv87f$&O=(i@A(8m~D( zL#9i)Vgrg0L%f;~7)ru`IR$cNK&eXT0Lm!nmOD97gkxA11BOQN zh1N5p;vca6&(p01lMe(I@Fe56wv$U$g+~yuNYv4dJ+=|-^wIwp`;*PJ7hS3fgHDJQ+{3G6GA= z6z+0@V|;SLsN7-a5wWI3WV`*mh%QXA!Y)XeH3)CxIJ9xhIX#LcZ)c{IXZP6ymEyHY zNOsgw<6tL^FIgc@RXYxxG|>7S*Nnftmw8$4D30;CjI$`< z)?%+>(yPf-(m1`P8`#POwV}EhKy1*2@Vme~VoPdV8O0Wmz$uOYB|0`jjhdx!^rJXI zBZY20uzs8g!C{gjgh$5Ii&->LvTn4Vo-GD*#=4;su4YDWP+_gAJvB5=A`Y-aw8jw@?7EnhTrk_80=|cH zAXCu8$s|Tf-b8#rEnRyC3#$Wm687Tt4^exzPT7R zQe5i841{b3dBX>fsWJy_K=3$XlQ%7}!jPREOg<-Z$Qb7;O{+|k)8UTd(0t~5cvV%n zwP>pJx5L{at^{bgG#hgxqtR{NPFfcw@{=tEP3?m+zZ+Vol-Uk)EE&~(O(ri7rGBI8 z3{ckgSFkS#o0-qXwjyQrMS(~xg;shEfO|MKfY{xDB`c3M1lxz#q|#bmwoLXmjq|%z zJnLBM}*?^dPsKoha zO9CGYb{2BnC(G=_`h}3?YW4jUc7Qk^R>me8snMPx(sK$_T40T$K8<1XJP4j~Iu8!y zpk!DT4tkXwStE4G&|^l`O(7ery*BVOv1ywbD-UT+3P0aJF_zKIX1Ji>mw|gU%JUL3 zfIwGtI?JAj4@yU-xKa3WOv;B5fDKRw(E~yNn_?*_^S~Zh;E;Bdnx{qAs5ib7domPc zwtJ>HbyHj1IeI2=tGl5}yYDx(M~5tYIC`}F5WR*|gT=`TH>|Uh1=0FwEZOs!WE7?_ zoEH@=R_?zJai@BsY}2=y#U&?|tb#@_7iL+w3)caO+F!k<8akn?4hs#mvK7v|qMx?T zD|0ucAIrpFvzyTaU1(Z&02#f$btu!?3iJowtENUNO|2T#*jJ27^V&3KX>1#8k z(iFkrc!pW8o3K~sm9jPa2kn6fOmU?3XKmyLESn`ko!ItZ{o|7YQ3$iG4nAUQnbcjR_ABB0|WrTAAF(lH5jwVBc z(l>K@2HXqeI9{QwgYidSkg5gXYk=acLhkioaW5nLD{y!sH-K{*oq~3-#xW14bC82n zX4|Q;T`)=o8yWNDY!ZzaI4xke%j|<6k8x+L;*CzlV8Hu`ss;llj-lcpdVxw8s7%aL z;qLZyk`%DUw@`(d54J2jM^TvF;_~wkHbL#ZZUR&!Gi}T-03-^iLz5~E2voQ0m(7zU zVgMnuL0!Q4+;SO5oM?6!Yz&z#O<~QV9+=}SmEr_OIa=uH$&p<_?Z?nsmqpKwS}GHo zXj|Z(+xc9tp{WwlRLG%o*Iw%8exzp?~iPmL9 zLvTCDnQnMXoFn9zT-ku|dn87W`uWHz#mx^pMAk0RRK^(1$pc--phxSB4K}syevMjT zB{?WA?r4fxxF%>Im_y?@)jyt($^Mm3^TIp;7qrPoLvH9~&NG}C<0q=57)Vpx(VRa$ zkQ57+j|H^>Obg9&g3&Z4A7%;KT~0^pB+NtX0Tq`Qaa!IszQHuU3WV+=BIBU*wX;qrypUa+dfji)>oiYk`d zC1&f^iX~`iI3R_Y;h?Dx7~f1aZqN}WfS6J7y^=XOiq&Zz;75S+l@~I#hf2xbg5GN< zupIhSlV`3%@^fQFb%G0iugZ|q%bWc*qsFN)>u zqLc7xtKnm!`9nuRhF1#o1Dh)%LUoOeRw7*hmyu`G8rBlRcJ&ok$EmhF(6d%pmX^vl z!r5Bw5nk3yfb4fg5mVk$*j8oJwEAu0R8U7^*(P{rO)FapGKjJrFclaj7y;?(S?q@6 ziWX39QEU17{p(#8)}&Zsjd4iJQR7}mfnr{(n<>Ndfi3HeVn11y8(4*EU1U~!ypd2Aa?%}Du8hT0!CV@9K^D3{T7Pjwhp+;1))kO~B|$b~tOP3+u*QKnaxW`QAT@&G z)Ck0cfm+6>vItjwz=e;=b4LP!ZKmUH|y zMgr8uqAVp>3j>k``Hb_%7-YsyaRLN}4{qI6jMT*}3E@k%tOr;kuy9rwh7%^ox-^VV zgK_!7L+D`)`}?MC=^wX$D^17ivVMq!eL(elDG|q@xp&k zm#Fqs#ES;Wr+f~^K60P|vzmzz4=0WnJ| z;+PZ03X{;N5Z3=s^LSOj~Fi?vz|h?y}mZjTF@xe~4zY=`JFA%BP%fu~!%;(DSfz~2E(z-Z2-2}*AP3g+ zV7wza7>G))coHfW@4YT4G-oU&Q5=I954p(XnyZ^)Scs;f#(-g8$~laOLAWev2(EdP z?dmfDjVp=Sp(+eG9;_T3EzFp+ zQ%JB~Hj5hfm1K=0=4~nPTu^XqDT=5)@5S{6b1S&+1g12KOHeUUn1gL5DB-E(vfcrD z1=os+Dr1)THr^P7bb@NoNA@TB7YhnhUrXYu#*ylvFxONpO1=cOfQM+PL``|+Hc&lG zR9wjChFuQhsL&dFKA=Gsw4$Yt!jTUrB`hwTgGPtl@DcP%1v6&I6 zz{XnabMJJvc!;2_vT=yh4Z%FQ$^QNj=8x&yy-Lx8UC7J56d8^Z)S!mm^u#b(_gv={jBm|}2j6GVkALpKp@*!xaO z?nJn$ZqN}%k5G2l#6+AY)Is6Acw^vdh$(;)72q7}i6$z`hpfozSvts$Wy`4OTb;ej z9L?8^iQ7?THwcOX4miLG;&FOKod@d+ExkMUFN+N=@*JhNw&^Lz%sN@w6X`@soHQ^(n9dd`vhWyjgd_#he6fqeihLi zdi9TEPg^&49d?23S}?nHw~2PyMK>T3D+Q9k zrs&BHOfGRhJ~=unE@==E%^nqxQ18SF;EtlgT5J5+8>tg%nhiI}zM>{>*E1EkB95C$ zlQ`$QwOG+yvH_fEK+l3)rH}qes7S~(tTb=DE|a(&P>Np5cbt^5ku6uy%!z@@l(}gQ zrwR_g;8q&c>q#rwAW6!oY3ku9#IESXC{)ncVed2iiT0xcl#3iLo1+|6vJw_C7mC{G z5R7KaSWS4XBiaBNfpJ|``2vhH%Iy4($y)`=leiuYr_h>!6Caw)w~MsGj-5o=)rQ`748QkPeex+&l-K) zTFJBo)I&K^mUB3@!A^vOqr+gdV(H$gq2y0R$SfB_TMSpw`7Z~)ldl=HZH&4_+nyTNyewqvLT8Q$+7z_L#^Ftgz@M0ffQV!Giu z4_M$qGb}96EE0=aMcIHlbvRPY05EHgv-$&$MP<#?CvBArR8jmGFvihk5R2u*MW6++ zdd;S>%r3+n@r!?uMquC~R&j*}vt?lC;1(CjfxV|9O?PwjjMemQ4#o`?v=G>(+^GT! z=UqL}2ajFiWgIx8D2FdwOCC874a8;i(a`H*-((PN^=(JcKyar>{E|u|Iv^Mp=7f@+ z8*5d8NZ2u33frM}d)6W-oK3U`kmVG*kMJ^Ha74|<8x)Sl1u{{rU~uLYG9~X?_^Gki zZ?qri08ke^KW=xPz%T9DMsqdsJPnFDZN?baaNg{|AX<;(n$8_KZ<*8O7Kq}2Ub z@Sibk*Y{Rs!bXv^tFoak;pL3z7H3=5ek{zc&(1O60p`y-^rFR3(>7m(m={2 zB@EC?MLKV|cBCj|91TuIk90-saC@2xIKWg-%5FOS1H9%VLd7D$?q~S3N7^@YPSIq} zgDb9~4)Y8&K$5LRd+fdyVVPm4QNgbMy@ZPSyTI`tb~_HOaZDf(ThDCFM!YLkR`3s z!F;hF06}I5%OCp@p`+8fSbe(ZYPBR%Gw-0pwe)-8(6T>cpirSDQTiP zp?}`arkH`K9Gjp}mOGGk<=e5sIVn0G%J3Re9%s37aOO{0JKP4=bEB~___F}coH4^O zP&(joP0re?6{{YjMe)oN(KuUoXcr`Mgj?aRxMhrTx?uFnr3D55h2|lelhE)K4b8$})5mngm^L0wHRerFl zR5<$}|3u!c2ex2c1lfV(+Z^c++BkSPpqhi;`VcCQ4Fs5K+y~)lC%qT6%IR-!Ab>y? zD9N{M%2eT$t7HGwejmf1$bVs(9xfq359c9f>e5@u)bpF6WypisB0%a3Pa5sy-Hq;=c`G0 zL+_JCnoa8i}}M=+z}>B;A?<8FQ?ujhxb6_A`fhTd}_*USRS?@SmcM z*lM_m+mWEI46RBI8;wr!Cc5^wcJoF;q6e+v_Lm9DpbP~Z&w}9Tw3wk}yas^tbQp58 z{87lw$}k8^-NLowH8c_|Yk5V1c}G=Y5|ao$9|R+}lyKb4pg><=Qc-COAjZ`zo@De* zm=FB{2Qi>c8TibH!@O+kWEQ*599%izRqKqdxup;!nR2pm6eO}8+0_e@g0;JrI!TbB zuX%jwq&MjW$z0rcU3L*i7Ugil$hfs7;Y!wxLeXSkp}>ofDPhCWo{GlCEZ^hIM!Tv+0)!0wx(&TMTSoB(++i8Ww2ucQA*Z3c}De=7;c)xB}!uJMl}2TkDcY{49k zRik{H-@L399F->9M=MSxvkWt%Yl_#=#MH&r>#setoki-P?ow5k7Z!#%+So{WFf--h zFt>4VFpatg){S&tc$&7f(p&-D!*{Xb*fY&$v%`eaa^+QYbvTdk_KufL7GrE$N5t;g zv6!CH+d?fDchO+gnSB*Di`^o61;=APfd}hL)-E=T z=v3;#dxY*Hw-$u0>?~lsIBgS-T^UwTb{;WitR|Bl%%XJMU+O`+(PQAUQEFpCt=(H4 zR`0SZCcxfr5tp1CCe~7I@FxWju|k&h%4uTZ5}Xz6sD?^}@Z}%RH3UKOF(RYn1Ez6b zb&-Tcarlqx4FUzqDk+3FK7bIuK~_|G$X6k}Qh5+71afygH#&(6971RUfnH1OfkOSp z@{;?KMy~3BqOCY6w-g8Jd31?cxWkuWYeO8_ko6Ral0Zs@JOi=wY+YVl-FtAKg>)v{ zd{ups6)-MEvFM@y<9fO&#kE|<%e8UJM${9$Fv-5jR@&Tx`x(Y9iz}`pC7uI@xCusN zPR_EcY7$S-)qsNqv8eEJ@sk9v+EpAwj>>unUgV3hIG5vLwdL?W4{~o9JqJyY!}=5= zj*N_mUKa9_P+8z9ln}EFSHmfhT@>zMsQwAkpo|>Zr*djv6={wd7GdO#NPu@d$&K`xTgr?}60S3pT*z>>OFOUO92Gh)a*Jg3dW7qs{q$ zIl601<5p^@=6%st(;g^gMk+l$0~;?{-#^fI$=1RC^#g-jxAbou*tlggsBCHiM*(>% zN?Q>T3IZVg29SxRgF6UCQ(hMAT?b-NTXF(KCcP1#vN-W4z}<4%f^o9E+-#o6bp<)s zE1pt80Q7kCg$B^4wjiTn7X^0%=v$zf25wB;7&BWDeANmE0L{%fKzLisV#MzER$tV+Q+Pjwqg_^`MJn!s|ZIm<~jxo>4EXeMPNk z)c~)E2%X?{4_Zv`0$pM}W11|=gazNLiM-cR3kD<&xNfT!la>#4Z>H8&8m%aLf$y^f z1C@8|#^@davl9Me+4_W)7(G$!%9%Hu48pdfw~r_I^sywT`6Si6P#{;~m2|CL1(H^! z5U6~z$Ku&AjaKFfyQHt)sAtg96ioSW`}BEr^f>MUU!POgz16DB&W?RYhH0Uehc~Fc z)wj0)^905-&rEX|FOTmA zY?IC9E#_@4mt{ncv9bP9kRNWb%C?_dC>ifkq#tMRa(Fja?I!*19l9YXgoW~U zWgFNZE0n8m=fWpoUj6`6adO-m3%TJ*zHrw6KFpBG!D1gWjx3YKgMqlvhb?_hw_PY; z6lO~V`Z0ZL{L~AufY}W;XF2C$6WK|V3G(*{fPd@+??DxLsUUnxw9bV>u`X$UUp2HA zlCG!6@UNk(LA*S6%Fk`Vs0w!LiF^YaFxjRK5RzLzz<@)$^1U&-^n<(cTqdfJ(m^Wj z0#Re>OUIzF9;{+bCl$Uor&D0`b$HMrPiGoiF<-pK+qQvnRm?5JLU`*;k zsnDGRp;KZKJ|cMwFy}M|_rqWSz#UX{fJYVC9lORAkQn=xtU*cQqd-rG1U>Ry8g6Ra zF+gAhyn){$GF*{h6`pj=7J`CM!Jz_WCP%!dtL; zd&EetJZza2$aX~s^*LpL z0`@d`ebJxnJdEFxpx1hos}uXJ&b8GmVf57!*X9{9v33*JtFX}2?6 zMFK2`*V#FDVvH_sv0@@5vp%z-$k$T1t3bTOt~#)lqShZwx%#sjz~*{<3J>=VycuBj zTB^Xv?Nil|YtT$k!C-}s^=cGu!r5-pkvIeG@ot|OeNwNYxz=SN!luaPl_Ccf)iYz> zxzQWFgs-CIMj9N;L)+G`UB7u?aLa}bn>KD(3J3_sUlf^TerYA?Tp^1i7;yV;xfb z;f;^x`?NwA#0rp0hHT_CL|-7;Dqct-_Iwvk|9#6HI?B@m9js?m+iB%w* z{tz^EXzrNvolHX5_VyJ&3&f=&ZxpfJFoekWO^F2*7=Gq}?IpOyZ@%n>aki>Dx-5D| zFy=E<=F`a}LmR>74v5Qr78tplIp0o9$ey6M^@$ks z)*bmy4d)%kitPd4!DT)wZD=b5oE8Mw382FPXD&OEL1As9w+qjZc7PZ9EsfGc zu7g#o3p6-H?RWxgQS*Yp5$tbJdo?J5@dq;>AB*9_HM??V?eM$9VAH1Iu+u^tcOf3m ze{AbG-s67TFDv`|4W~EqKa{t=l&Mayr43kc7Eak{UIzoxl!H}_utFK|U#+uU$>NZD zwU(?o8d0tE@C?Eie17InaGvKd@As@e|EQxf%4V4?3L3hxGihZ7j^L2mD(C4Op)g6U zNvtj~069M^y99K)*w@_7nIqGHH9;XD+LT#r{u`Mn?D$d#unsaNfYgGb1~}!^pzuM% ztW@Z7K@w|M-ZEI*%n-{*>sqgmKH{t}t~%jVn?^=G?8zg;DrkHZL1?Zx zLjuBA&qUsGE{>r)CJHTqsd^g0?}%K(majxH+r)Cki7Cd)IH8UM+J3IanGf?khk@Zd zI$X&3>OEK+cSm`RC1*cdYu+QwT}PvCK$Z^KJh$f1`2)_oyueY(<}d{EdTxh9N5TBF zJ)R_32Q?3j*D`Y+1mjtJP>@lH?6jBz9UE*NxP0J70-ae0N*4PpdAw5(9RetYY&bNE zEH4(8n<70?UBb?R$LD>8fNwZoK8bgPm6yk3saQf7qd^^ZL~vf-ek;!Ji1`vc28IKK z>^7Gc6;j+Al#ko{qZQAp8LLn*A>bO>b*vQlw?c5SpHIMMcE<4@>rlRbdwqxt$G)H& zZ-egVu9uw4#Qi~cKcDrZd}A63z|PkOMLmU{%%%>+7QkD@LE4Jm$e$d)0M7dvrQC|q z5iAwxTq|}T;x#dF9NG&tw1jHDLPoCJ3~``DufJ0OYKDS&D9mF?mg9+%PIU;cQEi!0a2C?d1ch6ay z*QT*I{^UxVqzyY!qQl_Ij96 zDo*sLI?v1V6!Vq z!8F2aLAK7*5-=FhqJPet)OdOyDg;S*$2;#o+sTL53MaZ@vlyFzbHhCH0PMNLmja|u z#O-*U^E!SD0uGvTk=v%R0X<(6YR@hJRp(>t^{piR#slETHvr=pK%euiNc)B=+I8Y( zhn9nbNR*B8$*3wPg1JxV=#SO+r&uZ_2?GfKMj30#*ek;6kc- z#F8wggW2FvE7gwZdFL6Q!?K~dQ3#kqr6)Qx)Hc^7^0_B!KQ_RtQAN4%KAgcTM`&L3 zWx3_pHCC4$Hp&7Pot*8{vz2-HFnnlqfl}>ec#k<R99D5x~n@KPq(KN>5gt{r`-NYt-B{HUS~s>nDDtEX1(&tuP27|Q2P#2j zhHfPIlB*qv48^azDi(`fUDZ^jWYxp$l-vcNW~{oDd=(7G8mZ6XJD|`HMPDR40rTV) zAD%?R>mP7%wrUz9ZW950$6}FL^^J{9P4%;znw#e=ntSrR6Xq{oaP-3Cj%sMBKlVzc7)?RAN|57m9R;cuINSNHqIKQug7 ze_+nvT{rc{Ti+YM?D99>a@)zLd~e}V7jOFgv#}ND@3?yKlmC9>t#7*hEg$;Wr$6)1 z7r*?K??3gU1CfSBM=xtncJ-`0Z{tN*-}okEe&W-g`Qlf;{^(ObiZm=(D7if=*KgQ( z(KUJR#@pZdS6}}6qYD--TfgzLym#yEA41`WzWjrye)M$1f<@~$=Dq2?H-7y72R`?$ z$DjW1*WC2l*T3UOf4f!B@Td??3vP`+s-b z@u!});eyRuF28ceHLt$@lMj9KTi<>9zkgjSzqvB`mv8^_ffa*i$5wpsqxXI8OOHPO zgF9Eh{f_vXPdo7S1Dm&8dDZOZqgs}(_{A^Bi(TiPzh?byw?B8Ff9K@GUw-TxPyEYI zo;whU4xVwt4;pS**L+e#)1ti}SvdW-ou?i<{bc$JX24a@5*&8zBbPeM=gjn&6wjw(j`46YEZHJf-=}S=ZL@s=L4L8+G5D|E)RSu6w-hJF}i_{At}U zqE9#cwqgF#mA#v{y!qYleoxcvIjQq{xBu#~Z!|1klIq%i*=IYy{^*lO-~9SFz1t^4 zQsL$;dGE>{_uhBX$v56Kr|Y)c@18w(Wp82R&2K3V{^FNcX77CG($-7=>aM^3oA-V2 z?!Wu={SP+Hn}6&nJ?F1~=?6ae$k*+IH!bkBtsZQ9y@>2?y; zP|hptDqr`i>)-Ic4}bKYeUF|0veGNAIpY5AS<|=e?V5Ak+~(;!y6bbzbK=J}o?d@aW)2zmp`o`%u4xWBt^W5nVTyw_yd2^c<9FuOIn`&!lnclZ5 z-#>rW-pGZ`{ik&AoxNf1DfJg@?5bbbJh!QP_T0Ux6ZX!2&7FnGdD9QR;r<&}y!jh9 zT=3WbctiK>a~kS~&YrtrZfoN)H{5fTw|?G=mPM=UPJR3TEWF`Y?_aR@w3qI^<@F7_ z8W+^hncec%q3QpfTW%gde#7*gi|1c9=Y;8-_g+wc)0(4>y=m*YH-BsT@nsh`&TXiB z&7yUCFJ9F&tKrhdlah6N7q&Iz=Wn08pngZgdEKWhXls}Q0&SYU^EKa^x1fG*Q)T`Y zOXoLW6iuzor*50yu(N*Ig1Jrg3*tiyZ+eT%FR^hYIxkOp!Rs>OiITDJ_rL5F9=oub z)9yd;`vV6K%r=ROpF91z$b3B4nfTUIqtlG9ZZh$f*LE}KC6NbCk1+jNTkf$_qx+5A3S;BISk{p)qXY}p8P`r|GzLRa%vzYQ6&84 zz#mR;sYhS=`+cOvl!-(bwQn()w&l?nbD1Nho|XT0D)2o08)9Rhq{_eg$hzi;^f`|B zfdlo^Ox}l5(+3PpGtUnn!}KWs@%QRNq}lYt_U5lXFGG&6mh33z8o$;2$DY{UFvlrD*H~;dXWP=EWMgazkUCLpf+l*x(9uA z5WD|_LEllZ^>Zx!Q4v+ zdHx&uZ~iT@&)U!H0b2kweaL1;?)t*){Xb#bs|<%?I(fi>1K01D0BfQJoq;+Qx&FX` z-~OwB04)5T_Q7c#sbT*`BI4i2r&nhAxlbXQK8C9>zape3N3V7Udc! zJi^r=6|&rJq$d%MAtYh{CH`~@T4uFGbl|t#*#edn{N9DQ z&hB6AYLPm9C{J#5JVLHZ;VTGPj_hSA{q;&~JPzKnF%)AWb&%>KL= z>Fl?rKZa*;-^c|>cia6o(pa8-B0aLqx%gvSWJWRk-G?#15@AO}OQZ|o%kih&`zy0s zB4F75@4JZ4^<%-qb+@!c_Pq;qYJd0OS?58+AHP6YpQ-_CKVTh;wiLF`HJf+)81C0& zfJGee$GX3VDCC$wg>WrGmo`=)z5wa#5pF{WCK@3;{%%HGx$;#fwSae--y?rzXwF6> zPa&>-WZDPjwD|hRPd`>oyFU+={W!`ht{?lCYBxEJLNayd7gz+tDSz} zwIBJ4mk%I*x)c8r;#(0ve!iib^$4#*{4Ru-A^Z(ORg`W4PPHv$MV`jkbxkm?Kelz- z-QB>uMP@!P@7*daMSlPXdRf--(cT9RP5a|0?3d=d%cV5KiHb{62N8X;;&!V=;XQ=@%mW8JIEYQ2VXr z%1C3s??Jf}5I%;Gvi865$M$tR;qnWY7+Iw0A4gf0J2xTErBj#YZ%3Z;BGOjFhk|v@ zxc=BD{@#J|3(ceapNZc*b$3wTg{9R$2v|XhNaT-!bsu0+zWM!}4Ep)WLSR3zA15DX zjQaqKyk23s{R*$^XAUt&t@|~=a^;uX7sUg^Bk9-UfaS`scQ|7V!*b_wF~+O?(eQhJ z!hZb(uw0t>W5)RF&=`M@xauw8F}59M9ve=m#@AfLPjrFUXX1X<46t0DLtf;@x#rzC zdEA+3XH6)b&O*0bxE|xm3*HP~c0S@=m@FN80Wg)0Zgb`n#Ughj?%Ko;qpYs|)5eXR zJ%P0IQ1)J<~kf(hioKdIj z2LO|Oc{9S}5vm=bq1qoB=1`7ytm5hOh?CcU0)M1yP5%|rDYNdg=?EehLyuHG_bmG0 z;;Zd%tH;xivZ{k7kw-qSzgLFJJ|F%4y?{&E$ln980IsX|zXoL#U#^~hr_+B;zXoYa zQ$NJB&JW?wq*LbqKH$1f{arA2W-JNT-?tGETuE8 zy9KbQ>uUT+VO0Q2`>%Dc0j$PDz{(+yYl%Ph>zgi3IAbKNiI=p9uWS`U>U_r|B;9@e zjF!kogm)k$-^)jhkBad4dn4lg2)~c;N`&dtTOyYtycOXVgx^KD6=56dAB#}y^&w8X z@HEt0k5FlxeOZCO&!X?t`A$5wy1hQcuR{8}5W+(o*^lrdgbH`fX{O$L5H5GpA3>b` ztkoX*@|)2fbuj))eZksT^|@+V7zoAR0X*rPJoC}&vhzVxI!}cAew0<&zBrWE7K;BZ z%Bs9ghVnLr;{S-U%J&9Bd848D=TTPau@cI=B@}77<2MfXWE7| zT~`<3nY78@7Ce*3&O=DK$KL~E0e{r`zeWF)FZ~41TL0&GChvO$p~64fd46qv>JUqcZ8;XSYOFqCV+T=c8e1fbXzxa6f#7E`1z@ zvdV?R@;4Il|DA@iN_S!3U`wd%xhSi&v;=vsTx@m9s!Z1K2dKw2`xrv!Nmv%U9 zxaB>h>w4Gr678nFHz4FX{4v5-gu3PzqRwi>`E&cLaDRe+Uu?1?Kg6@rj^^)08f|oi z_a4O8+431YD=u7p?^>iQUe=e)nqn2VeeM6=6~+hh9fTt&v(~o9^1r|wDID$3=VPY) zi73ytS3#)jq!vDZ1sKH37Sy9$eh+1Fol!h1t@~j|V6U*=Ot8*$U?pq7ng>{mweiEiTIImnR0Gy& zp?)bZbim6a$2j1?%GZFkEYz==Z2Y%5utsaZIuEdv*Rcaz5my>?`^J7%99TEvS=Ybf ze*0kcyd7!3e)?|*&*K&7hf4!9!Fr$5uTRt%qZfiT6Yi6r4e0Cs8n9jlST3!;8u6F7 zh_cVb*A55PgMg*HK=Jk0sO#c-CfvLIda6dhJ`7mY%M`Y26SzD!+^?SlR(Kvi30UN> zwP1Y#d5R&zn(vJ9SqGM)N=dl(ncf4U(Cj+k5QCL3!EY*LRwr@0$Ia-Ecc#LN{ zuoUKx089NEtaGHW+G@c1C19yMBCI2&FZNS^+OI!Yd};ceq>(=w*N}DBIk+Ei`lV&s zQ8#EI66r%+Wwe%I7{=GA155k04RuxTXPv7NKb;SuA7NFTe%%d;XK5TL+G|c zTVWLWs}T+$qcroKa>UKG z2+u^w-}~^awEH@gRo=59{Ed1OB?AHlofPoN))KecmjL>lRizt7;= zl}QgHo-kQe|G74w_<~|J&_Ufoze8P@FU}-)4+pF1>Y(3CzEnN`?2G$524!`QAKOmCQzK0IrGG@QM&TK^da zY}!WQALsvJ2bN0@3hQLRBHe1-#qnzaS7jIL9*%BrM|oHOabdZ7!jbgrJ%Gh|*M5Bj zaqeUA=hDZK^y>>V^y?eQQ$3WhetHOev0Ya-gk@h?=F(^T3}BZ-^};fSvc-i)p;65dCF+@Z?z##9cCIK{ZMxyq)b*n6dof# zMVhv8=0nx}X+vD)*vJKjM*j!p>Hod}@iP#rY^fj~L!5K0v~>4n0S}6Qu^M(d6n`)3 zE5Dlmlj^doLuEgVvMO&bL>@%C{~HRG{TRwN+T1YQ;ZWIoXXwL(Q?_)ap^uv{H0$sZ zgrql3*S$WShvmqRB7ZJI;^zUhvk9T%?k|u|`l4@@xYP76BAs%w%cig1X#9>kkLq_s zc4YBDz{?LO%RT})iof`ms&UP=>Hb_f@-SqI=DNOZ*B5jjV7v3-+IcQqw(~Z$tv|P2 z;=o<2Yi%L7->nZ<_j@(sN~z}`ib_e}o+~w1Z>yLPN=FtEz`@RzNN7vN@wq30= zlZ<;9_4W5e4Om|VtRwYf{M3Q44>)0W7D)jJk>os|BzW=h|Mw#bzEg-KB4(2bK-@Ye@}Q3jxa=<4p7D z_A4HO_0dhn$LX#a%FWwsdI=%*7B`=A^CG0vj<^N=xCY^WA{;`v17RFt8X@f+w;tu_ zX-KC$;qU8!p?c%uN2+nZ4sn+k{42^T-`RmY#UbHTLh*k`S+&z%i9FT4S@yf3vOhyv zwXdEEi>Z75_S@0ROV-prsGyP zNu(`jIsE?Tk^qMX@T~ni3S|_A)?@iIk*;gj)yd;XS3D`4Zv!6fb^gAJXVo)5kF`nO zbPLi*D{~QYzdD2PT!j3!Vhq|2<4MGI9E|IawEp0u+H1@uo^=iC9Ir%O*N;1s-}@sD ztQ+yHFf`l@SUL{&VWxF+iv#OjHDFx+k0dEKR!+<#k;$?N-Fqe$_Gz3CopZ z4UbjNW6Mj;K1&`U^_vH_wnVleba~A>#NUN<>Y0}#WZcbP!8p?C198*)5Puf^S{6zt z@A@9nPYb0}cY6=g>4$6CW^`m;zk7)j|Co*c2l~tPRJzsZ+D~D^$^Y&``bLB|gYZvr z;(vu_!q@!w;W>^!wLQXmv!;i2LQN0rga8$}xj(Sc*E7NXHs}LFU5`#u=UV}% z!KTqp;4fV7aB1m7(}Q zI&i3O>TicW*zoF5oU-2i?E@U0uR$kc$a&^tCKS(x;$L?9lXLR&&NCmqP`nU|KL$AJ zm)+^)4Li?#90|p*4aL6?II0)ya`Hx9kq4<0U&UH@Sl=IBTmxto72*q97^Oa8C ztDI*(zB&}YJ``W#*s#-1-d^Xq7G7^~@;?h0)NPjo*IX~Rf^Rn>oJRV2PWszydbs>2 zY`WH`uY~n~b*a&dPTg+g%_opXUinXmlb>t)-8TJykWQYZ=^wJ`tKk!&?mUE$wB-6? zTz|=@9uIUV6cc&MP=EKJzWQY!Mp;+ypzL*j_oA%wzb6j^_p=V%r%@Ke_kUryUqD&q z8;2|V$nz-sEtFOI-j6=GbME%xw-%=QTf%WYxAi@gBOmxVLdt55YpAxR`dwNsH~tvT zkB+|&Y067BJyG4K9f+&kRG-gRQJ%WOAizO z610ILk=qd0a*RI?c%)PQ?m(VCGrkXT7l+?PS;cSoj_wm7xKE+1>e}J5Pln36^Y+tF zoBN%ziX+uS!~0$*z`sV>r{y$X=PA4|cIOplFZR0#xyH5p2;%LCClPi!=?dqU7#rt8 z=iqv@%W`Y+N8GB;6{ZJG56{`e4&$HGwXOcSDAGww?s>m^kfwM=R^&5?D}6DpKhjO> zkAwBx{I9{h>->KOb-BJZ?!t2YOoa9Hj{;aNAy_{F9O}m3KuFt=KX;ET`rT?e+KRZg z$+8RJA5@-nc_=Sj*4yg%K z>wO4)cIjGqw9WQ|Fr82TTQGM@W1j*ncg=hO@pF9$!9$qNUsnUxFHo2GSJ-a9euKQz zEjYru4fXYRmjg@FmJC+=Nff`DuOVSQ;lR4vfu;R86R=eGWxbhv2=_R!_SJxu04x_@ zGxh849|mK5xCX5ALjAfp1iNaC4y?y&z;4kuUAlMsHIuA})_}Diu*mNf_H&3+e(&*FK4m^Wm1K&*mni#}V#8xD4SbLoJa>gl|De8?6E9YO|k@G3b~^F+Rl!ibZZj zT=gx+f9(Zj_v4u|VGZh2<`P%@U5@yr2>%WtZTn`FqaE)d1rPs zpK1TaUGJazVbEXg_i2FT@{XBc?L&S2JyrwOIe_J^E7iZWj)q}6`DqB2J3qAXZU@{m z5xVKC5g$T2^*%Q}jd%yrb=|po&4o`@%YMZzs>sik$=9K*i{o%vSN^IzBoJ3#e;@rg z$$+j(ch7OSXXn*d&nkyHzoR~03pUaM|1s^4@Q?j7v51#v(&Z?XZxT+fxmdm@E z9a!4#DwKD5ggeGH$m2TWFAOVM16J54u6BTd5d0@BS7%N;ut?u7U9kP*hs{~ar_i6U zFPU`nPNZ)P)$2q2^+@O1Rr}#Qz+wHZ_+vZey=K4vQ0ZZN163l^*9JOt_`Jg6p9FKo zvady1)fG-go~ysMh2n2RS*3^YJ?TvjT(za|*k#URstu;N{ypH3FKtEsdW4#<_3lFc z#q1n@kD-j}jQ9UX^}1>J&+7hu6J>S3elhZt4-rlq;%Zkg{(Y3y_>NH73gQZfWuHP> zwFgKS?(adAt>ViltMP`PRrld!#2cN;e{jmK3zgjwD%&_3)D8FH#!%V0D672kBO$mC zhRPm;vZ}v_&p0&vyt@BOXDB;ARCXoG9%IM4IF#2Gif=|)>L&b!&rWPYS(hfSLfPX@ z(MTBXju6}u%Idu3LwT~WRzL2YFzaaE%gmYHixEPC{6|R;$5$&Fh{HKd%-D&ztz$d)dA>>?Ydbs{Ok*~7oQNU0d|0bTf&-E7w$s@IX z9^>MEoyHX&k|G6^RX^hxo@oP~fpDEu{!sOw2HeCEltYo4^Or(>>UP?%L$$;D?%5@^ zWq&(n@c1=^Z7hVJTTW&9yOAH2T=&96bXTadpFd6XI7K%6=XfA`{9d6Vke zuR$7RMs)IEAJH(S&>c`%>dAICiLYlpWz6RdsZqq_m?Sf|oVu$oa{e@kk>dSj?x zu05jl7_whO4yW4)PRt#)8-tpV#Z=!fzj z!kP(RF77X{0qYUKa&6Qj#n(g)SpN!GD#zI`r6WGOKjQ1IUkCHZxc-zTegar7?vEH2 z`lWnbVLby_uAb+fi*ldYkJmZY3qda+<_S5Z) z@_vPN2kPtZZU>gu)iZn=cVQ{NR9N>ou=e3uZ3eA7fPRq|XxxS6&O>+}pQr)r8o+Y> zzb-5fdCGqX>uIN75zIq)9$#G#| z153yFOTbb+lJJid_m=}!m{#`#)}d(C<%^uh3Dno$bd7%1?WyKDMsPz~UmW!`D z99UXz5$d{pHHtWOj_{ALTwZvO1B>|TfAzud>w68->yf?{;dfqj@L8f8k^UB>Ux@H5 z{P9OvH{q`r>C^?Eex>mUCi>7R4q-i-Lyr&=PT2z!tpM|dCN)YH#FcqPIc z5mHBKLP%cX)~6rl>(?1u(M_k1Y8%owA=G}o8*##S%k?4teau@Wl+N)!h;-`WZh7jW z7b2bK4Aky^73QfO@sltCoP*WVW{>^p>&^V=9{W9rQ+8;&zdtu=%ITRe)y4G8m)h~+ zb|zkfcOe1ZOVB9swH9&q^{yKYPxv@O(q|bV*UzgEk{{k~(;q{48RDl~BfdU{kh9PkqroQm>0?n;uolt zzt??nyv0L!>hFguEavMVSQ_lpB z0hz4-ainuzA4W($OY_S%|5r$-kM(!&Fy+35IAMR!*82{GI_KpHt9Z3wAvh2j0o!c#nLM>(K4vKk@B zHGs|#{~Es#@m9qD+&}kw0nV2`4%zH}63dJ~ewgLJ=kE2(*pJQNTLyuK#>{>1c@Ga5 z2o_KS_|cz!H6pVAsOW8PHSg?t@-Hw;K-iOSH#T!*R$YBVW7F*BIn8tB%Od!$$T9e~ z(sA-pk&{osmqdbZ%bgxP^63nGTIB4yrFE@%UUts8b#2S>-Hp1sc0?1*=dYu#E@_^Q z_@rxkS~;Pk^641YZ%9OpJ)C3?REFoM;7x->&{o=@eTG$an^jMR`wLH8*ERc>lQJV z8}%|J{g!?wJxwRoNUs2LzPM+6 z_VI2eJ|kJd2k%Glq59^dt21^NcX@M8sZL|zoHwYj=9(&{L}zDvH$LfF8YxW8lTPAG zwD`33WTlXv-y$F?#ZqRcH&`kbD+`vmDfq%LKBrlhoP|=>AYr0}ufktTu~P@x$IfM)G5N;$ zam{=#lsxbF;Z+kEe!F^*pMUS^@yv&7%RN2C3H;kQK2pJlic8T9z6)NvTt85j86A1K z*W1&Bk6D}No}S?}K8M+1B$KvLw7)%5+Bjb6NW6ds(;Z!@jF(RpQmI10Yxknhqrp`2 z1vD5>btJmGyU}Jc?R9n}Pai$h2#=IZ*Lgm1f>8584D*@DCGv%i_RfxcsuQ2>_0Blt z@N8>GLaH-0*xjCMPjwf%ymThn?Ip7>Syw&0kz!Aed=HDLF=z-80>v4n5V4;JtdaxSn;cXuk4 z>(0beN$`=>(&QoQ;j_hB3k;_{oy;T)-Cicu+0ov*%+#95;7gdh@Kv&&9(g2AGTmNB z+UrVtg|2LSp<~&flR4pI&K-q9cSo)}*Oka8^XFW=D$HfJW%g|Ma;pZ~qJ6!XU&#hH z2X1%*PUSLre0aX2y^u|{pSx#OximI9m@AIs0F>=a$HAhr>4Jx~mg-!7wbCO$SDFLM zHNjeZXC4DuHQAAHnPhdLbspogqWJ*u-5Cg-Tvw`)28&F`bFpJwRzLW1uT=E%D`JK; z%m?it_O6=%o`jIRJb)y-x;netyK?z-x;@*ODa0#(RxI1DC*wI_INOmdbb4M_Jlp=~ zo!e|?l&TQtwj-M>WU}#iI+twEcXuXUGs}$E7J(*kNijb;>RDD$J@fL>dlXqaSt@zs zxv5pF27E#*Pn9bk^ooH}W~72?vLv=KPXeO?G8puN%&a?|$)$7o?o7Ma(NX%dAw5?d z8yf-94ky#8uI>aru-?&`Dr6zo%eppm#nDmF1oROMEn7iXdwPVpAw-KCDZVdmi*6Un zG_*vK-qWMVU@U`W03FIcVZh^1yU=JN=e2hf@cs9$Og!72Ds*0WNNl4LwPzPogE=TM z6=7$?xz1EBoy8~Ua8m3ffh$ZikhwbL7i<_y+nd$wn!G7MWJheEU< zNT(f;Z0+%UJmIC%?Va(JyA8=ectVB(1Vlo~E90ThJgo9p8f1#${~IZ256wzzqNfng zK#MQL(Q*=OFu&>u=OLARo(-k*>8^a2mq>V>+4hW=KJTTg#yLqPh_aC}ti81mijF49 z84P4a&Aunn`FuLpnaO1HsWfbm-bsTq?>a9xNz6mZ(#KW(!l>G!YhWGhYKyLgIK^UZ zi*C(Kjd|mE=o=k1Jg_VhdSYU9Y7ix0B$h{VgEC{#MKD!`4lh;6VOe&0$#i=ze*Qyb zrnTpLay&Qe<#xer8-ozdP>hSv3n2IOT&iU*ks?+suGgkl*$Hop%KW11KvY|_e`M!) zrUI=&<{{L+GO4v}JOi=4%8r*qlOAy#+4gucQ7FWrBYBDTuGKvTeag~(iGVs8t8UXuTty?Mx&x$wZ>m;bPI`Ng^GNcxK70jiU)zRreCC(($ zV35g=rm@Ml(~EnXStT!#AeM3)N}!xlDIQS4TWw$fu!lWHws05S(;! z6!T*~iyWwhiF`+Ag0@L_G8a$gIxZRrcbL4zXDh{VyR1xCp)RyVH*twME-RuTl}P5= z(>X|qY%-t8T)geDLVSA$Q(0LLm48ZLiz;FOdsN1U^WE75yae%V9C`-mWm7zaBhyi= zw()X-ddo2I(Afof3q+*T>0IuTbf|`L5Q*f>WxynQdPa*GPGdfkFJwSVG(tOJU~ax9 zj1^P$GI*G_j~#m2OqWnXtPjQ}E3$SonMB4*W^#q@I1Ib=mY0X&D}B@C`IC@|uOD_4 zI5QNGS>`oMt`FJWrDoCVL*_Zwq+ro;=cf>mra3sOlF66cyhVs)esJaXJ6xdHT+nr7J zzal&bW{!Pvy?%VR&)kFcYzlefyWyBC^z>|i{G*1wacp9AYpJ+<1U`UO>t%%?g^E!I z|AxD>-C$E*XCmDWgDl%MaI=*rVZeXl)-f}#?;1VHLQBbYbil@J_qw~YU6;OyJ*hUw zL5rDG7OMg3Ak=Pob;`OaJ_-gVgxFJc#H1CcpolDTxgJJAWE z^a_b=_VO386D1D{7FE7{cP`b@S;&DVy5XGZxZ*|Z1Sdlncp>BEvR-?(kc>m)&1SAt zBmPBLCBF4B+?mV4tC`3Z3fV#?-PL~8O)nl%fLl<_7CouUE3|j#(ur&i>Q&ZD?6~p8 z?Z>EB5L3TB?WG{N+Ea!0_Rf6b>KAcR0?&$<>C7ac2q!x8nJoHq&8;sUGInQ1Ct+(_ zMWbZgYY8YB`J`9KCsOHTAv^dYvQcy-UmOEpm!1?-*wx6ir}MddHXqLWD$f!5(1HP&N=6tbI$nl>oh%ic2_6cly3KK=5_b$7k@c!srn?dYzOcsc0J1@ zX-d`q!>yFPLZ;&TVd}Bz8Lp9%;Dax06dXRu%?c1=J+wAEz18#SN!PSJmAPidxKd7* z9lJ)`=*19eLUS~+u)3Z0!86Z3qrGqc-m~`YZyz}8aQo=-HI<$#%gHIHEOM3Qijp48 zHVaB%0sd=Y#ufSv5{m;Tk(P3&iRr^Srr^((>kv|O_Ki)1>R5BLO9-DMO5N3Vl{t1o zhfacSOJm{_!%mjYA0IHEx4oojh!ipj0?i}|O~*$5j!_Rt?CukB3m+#B*Z1$1B&s3cGW{|Cn zEa4~Q>iyl-vB?R%2vXNKUEc^-&m4aIBD39JjgkqdK)DKAf$JF%5~1yevF(~&(Bc7t zuh@}*h5=g`u;mX82Cx&yj^(S+gkCl+R`j)rg!V>3aX{G>KQs{5;xc`9cpA}b`0(aF zjGOWd7gXqe2PUXR>g(-gvX$3_Ug@Swf(v$B&yU;$oDP`IhB;oJIrak6WTF9H8BUzV zQM9q6q3^gh{Uy?a&`2$JvmzaezKDBE%VenVKsgyE1QwA*^-G66D^)HDJmhi~dU5ZZ z8DB48&^<+~iw7j{W&P+bUqHOXTE}8Sj@&U5Is!V7g`b_s4=%V?8|d7TyDHYk0!SqG z2R0)TJ;1Hbbvs9rD9gIb>8be&I&h`_Sg4-4cmnQQdP43sOdKZ$%`;**Q$}{-DQnVo zsHm1ConMDS7jBH6SmMc`Je3?{sSjU9_l$ddrg=m{_w%qAYmH@Ij{*OClQz9afB* z0_NL*BSkf!HlsA!jM}0&gWio>}s`_wai{a*&hL^@x8mfnBvs5M17|PN1W5gt`X(m=;fJ%hcqyZnkZCCNgNwpMh~Z1M%e0|=ek1@s!jdN{jJd<#!MLIN`r>I( z&SBOOuNh`;!enFfN=>-%hii8!CQ2VUYED^+Q|fg|CR$)4+Tg3ePA1z_beXni+V{s# zc~;_tTL_X6Rw}TP%eB+C&`5LMyG{rk7+R*~Sf1&qM`-sOZfR)l7s{2*x`Vbp@e`l* z4h4yA`4&W8@<^>a}=~| zp_fK(U|R+=+>akU^YQlP0PXfyQWd9glgwokRij6?%) zKaQ@LeZ5j~x4oT0`DO-G%#BQ4x~tjJ zF}j5gAoD3HNV3n!B46hX8YV2jleA&>GQR);HKAj>x7yo4a#36}bVI}U;>eC{2zb+e z^30uMYkI`g2~*dP4J!dsK>l;3cHMl)$NocGMLr4@%$AXlf{-udP)?8`G;-r83w z2)nX`PNuuQ(N4SkhT&s_Ikms^Q*_sJy86hjg>8%d*vcdg5SGFps1Pbz%8ox(`T%&H#qU60jKJiqKbf^z#w(862uZo9Xu`WwA! z5Qm2C`-Td!L?8-zHlgkoqut1?OOPclZ&Y|@Xi6A$+M7)tR7$iSYFytWga3M3qWpG{;k}F2SsJ3wwE9SF~ab< zJB|H4U<$ZNpI{MHi=m#U-F@-iz2MFZ?fXp3AZmrba_xks;v z8+g6t2LO@8x<{j!X?&AVB|%#ku$5f9)0doho{gj|HWS7^0)^|eQWu!2l`hmyLe}3L z_*I{F1@nvi7)@AaS_yNXWadTM)|7Ql8sOB*0w6UXiWuu8$sF=JTXM}91xDDMxxMJS})Z~ ziQyfnTftTGLW$12(l5WA-xV>rX3JR$=2tY7lw9dk>sf$^*tlKev7ZfcVm>n zfHbc7lLF`E+SO&0(s-70yMT2Y2M9YFDd^}l8r}be$>FgE)n=kjo6n0;hYv8(ksm2U zJ(=YvW^#j8=_XF>z}f7I`nk`kBw(DlZ_tAWsfm8$71f^6=&a`Kxqyyq=Tis94S$7? zVZ;)NJAFbc z^CKHKB#Ueom|^q=?QT;SroznKUs`xgzF}fDHvNqEl%!_xM(sPJlex;M@7Ytm0Wf*q z2|Z=*=IBucoR$eyu054GUvU$HWwQmY$)AfSHCk&-B4F>_n1%c@AB4Gw=48~V^^!nZ z9h<)L0Dzc_e)gs<4hT${q`om>9NJ08%ig@x_XiGTghpsu9yUZba^Ir$nn5U+3DVh_2lLtu=E+RTWzP4%{& z_K=feXaaRGJ@DAXR&UqtT#RsVlnwC&H2a1Z9rZRlT|DUp3F}2xYBA|TmK8X);2jkl zd`z@cYf+Dlb^Wd3DjMkHT`YWGmb zw*vhqIQXK_k%z@*YgzBwY42rDfVsl=StXDg``Np<_&OaU4Ge-dTLq4SEqKofj)xV( z?1Y7k=o=HK=e}1vSgZiK4;&<;%AOm4n>)#KG=_X4uia31%3V?|&vslFD%Qb_`aaEC zyj^bRYx8Ck~4(n}X5nJ>$xOb3 zrXX@ZRD}`M{H|9B9%hMR7gD}L0H97r8UT?H+U%?B7Qu&iI;xNuW@ct0m9fxZy1_@Z zGl$aZGrGrShouEr#|_$~D*{-?X@vG9wLYrde=tiQp^x?#rlSF@ZV+}Ua`${#47Qbj zl`cvvkrW~cywzBc3}K|*=wsT02ES2Uy@6rQzIp?`9Biw)dK0LO&{ttY!HFKBCv*Id zSDW~_H!D%wD9P;j3Z@cF+d=M#a{3e6{$iCJ*96d@5>Q}CGU&cNPhvJV4KlbZB2LUN z44O|)YiH18mIm)e5 zr!{x*TFr^kz(UYBx$G(AwU~rpxIa@pYw;QC$dEf?Xau5dwlG2&f=~LXokSkWXs|%% zv)W*ZhhmW4`{;cbbOQcISf=P|WQQ4wYIYXvQcf0qj>{JdL88Qyu&2Ae-o0>k=?tvQ z!Y>85iiiR|@AI%PqwSp8+nn80sM46g8;d07dBjg&m=&=jk)mb{PC+PF)X&}*HDk;Y zJ5cF^mcfu!0`h?-F?7GARjT?iNzG`|vh8$!W0}z;SsoxkAC60|yK*kteFh-O1 z4ef!&{64XlUso4WqKoT?JT(?oZ0`_SG5Hhd|mP`w>lYC@beF3wPo1 zCCrVM2kqHo`G6Ynt+#yijUdog7=wDEa|ypw1?J`#Im?y9x)E6<3kOkkZbQc%$^zvXsoaeyc` zaDs;pB3i1kWVRn5AdEuqXW9u+X$GEy``!%GOjH1Y`E!&)| z6&US=FC3|A;pO{azb;|Uov|eaA8aA*vMj`TuxOs^c)vWc zm%|?q>kQvYeX58OF2B=D+|-M7{v}sfE7RPJX|| z8!{3z#Rncc)Oe$EMDmAf?~#gUV}U~9^@ zS{f2QVoO(XoPd|5uxyU|r~cM4xs{>)quf@hu%qZ0HbZpqQR@5|c%a-m=5DIF6;aiQ z+2Lel=hUHbl8g0HJ22c;LrLWsxh6O662@&Kt;CZ~)uv1#xE+;43|&=t zue?6yHm(U#h49%S83hi&y73UbF4i{nnn%_8%Dx`{GeO52blbccGzdiGril{qrRBH} z)$5W7Q!jgPRYc|&sME-k)!A$k-R*R==ew3+*aW$jN8#GwVR~IGZR*wcM(gXxx7*W7 zAuwQF7g?6+y7nb{ZSJ8MUH&8$*0!5Z(4yLq9it0L}Nte57!TkpPKWAcGRZCA#W3Q;Fe+VT&5>8 z8!Wb;s!CF2ubftw$U(@Fq+krVqdX^4m+K|}KHObRpr**H+d`*G6owF%`U(m=0hL{p zZ9Zb2Hlj5cO|)bi1tANKfOQp-3cQVF`{^U;zG22{Ad(sk6vjlZma7sAf)NlI+QomA zzBO@#1z1P9)WA|m?>#4ew0`5*5TXHI?jVF{pqkqWA)1(HjE!HEZ0yFYb*6gE79X6N z#Rhf!s6?Rf>;~QydN?-oJgc`!D2~2X3`kN%OGX0zJ~Cln>c|GL+mGGpTQo4`m?p*n zhnl;Yn?6pzL>~``mub>~lWmfMZ!{5KtaYlnsg8u{bn1@pT4*Fw^(Xj8h3$_86^&F? zK&?P$#&U<}vV3R4gUE-)!qQK6rni~XtEFd7v5Kb_)?L)gOg8)RJMCEl8=p$ejBU!b zQUmG-z3f^g7!wx5IJG4Bb~5{*l!9&eSv5Esit*^%4otxOY!7+>b`M33;XIAL9b|K4my|g* z75$+6D@DIZTP;``a>}RQG|fEYrfKGx)thbzDdye$aX3+VD@lQOC<_z$&(ceuQ=P!h z+Y&p0X~W}yd&BX&$+N4LYG20OExCq?K8^Zs6t^=y=Q(;hVL~)o+m_?oMNVoiaHIsKul;; zKeS_LA3uUUd>;A21PrISh*LiQ9GK++>EJL(G|eFC`lz`h0V=};;?#V;e(Sx$N@C9z zsp<>#zs-MbNHMO_|1STlvJxKWJ)l*4p?*EV%D`?^%h&S{oN~$t@tYHc^Wz*-8_(NX zES#IW7N~Mp6hIwBJFvkS5y~o;LfkN!*Xm+<7-+Vlr1r>3AV)9kvL#R1X9YxOKN@$+ z1)&M&AcPDFs!drIfJb_rUXgjZ++g?mF%HK7DqXyNJCFT~g(v?vk!UrQ42%bi6OjQm zYTJnuzeu0S&6%M~xp|-Z?vxG5oaDv&ZS%L*R}&O3?j`zd&a7O{RpRkd{lBZBHyHHR z=-4!`(GWpU7pN%Au07~1kVgyqdh6LQuCsIl$Tw^Nwy>#Gc1C*&$XO`zOf5aQJa1dDDsAyheABA214l$-zn#8q$uZE@5yKR}jX%~7J_xk+MAy?W@@@Dm*|NX$NH40|E zR{yu7(XnGHJ=!i=>Ih4BaLO|F7WdX_+nw1!GoZ91#2S#HtSKzFQSvrDYCghH6bS&n z4Wz|SV2mlD9K-CvBUo>*l8oBVF}|u^Gv- zFH2aIA3_KOH*C!%+_1$+>VM>4WOnn%i(@CTh69A*aFl4-2FHQC1zd!zI zEFunNc$jvnx`l81JynP}S0e+D1C`Do^5XzKLEswi)k{BizonreKtj2S#&eqhr{#pU z9C3v5g^b9J-Zy(E=9N=vMIe1!2x{;B`dx~xzQ_45d2O$_+m+e71fa2pACKlgEqA-; z_oM)gfs$0tkWo~f^K8@lfPS%7G>}_PtB|Fji^_kH6KqKT<&V7l`XV1KD(4g*$WK*Z z5zOtK^2cJKwBaX@_PNdIv0eR9_QvHl7xZc;Wlav9X0((gPlh=w0%u*4fSdL*n-q+%aDH+DX) z-)%6hF3DoT|FR-gQDlCjU8xy6=p;}xi$gx;h@3F{j2<=yX*Jm?6}5U+Ud2D(iOPch zAys84B?j3b^})^Pv-<8iFJC94l*AK@3YFdyN0gG*=kz^uw$YcCbdYLNV21)xSiMuM zI-j5WM(PE;gJ%FkHV4yD@e_qs`i1%1sQBLwbd#_GR!Wt>gepT{)c4N$Fb&KAw>G8$ z#%h{c26H6)(%g4ar_3D8M9d%HO=E0Oe8v5;e)^nuQnn#ze~xx_fcbHfLS&MwazvB) z75(5An_8i%{KT9Nm3XAGIO|4689QZvb?!$iBSltZf&lnu+*Itu9C>AZZSE1%-<3KH z5{|7)@F0VG17d!C?nXp-DiJkzLV0@=YrTS`<-d;k4gJ(Pd!`7oIuzo|C@m6mpc&Cq zWPWq*28xKH%F(W-_~#1 zVoI399EJwErYyu%6n;m)iA5qd24>%;CK2_=C?=x5tE(YAs~)F20<oK%Kx|%qzAb0|9SJ*&RF#N&KTK;;(P3`MrEcsx~V5 zI)z&Cs!-Mr1$JbI!H=tmf9%&M#K=I*B9sMhwo_t=pHvb5JZ&^@hBIc&ki+>H)zmu( zjGyW=t5;$pgrNy3pvuVtf$9CM%IzAP#MBP3*gAZJv|cjA#4>+g<#rPq7~ciZM3m3; z0!mjQT~xs@K+tk{cfMAdoj~B7Q9Rd-0>cBq4}YnbMfVy_4J8T_eUeSEX-d&O3KLO9 z$r1<B zPOgoAQ@ytd4NQ1%Y(~^P#hi(j9udrMtM@ivE6w-jkoCfcK^1`>8m9R>y)?s&cH-0r zbG?|gH^fxK@tSGu{a!B*D4O2R_~&Crq0R!YrxY#%4C@d2S(DcB=1mPX)_hDUwnym= z++FC>O(Xu}7Af?EwA>~Grkb^st26$z#qYE9aw-^sG+Pr#$|QfT*1MYhX+FrvddKQ* zV_E{Frk*85FfMMDnvStwAL@rnz)iJ#aV=9Lf@$xn2e(QZb)GhweTgOzzS?u3`at;| z>mjXDcvUwvG~LdKHZasgXQq*X4RlddLu zCIa^zh}bwB3f*EL=P$+NPIN?IzHa&6-g3Cbe2+XMoT6G9T>;jPsf z@2;rcaya*uY~zBgAXs4>5@!lCauCR6t@7Z+Ne_4?yv<5)rGAlnX+9v4Tg5JmyH9Pf%+2eWHF zf-qBv27`pOjW77wEwChAhe(|uHHq87d`5WJTo*1Id)FB6Qz zh9h4?x{COVLI3F1{s~NMeaZ4-hszSOt4a>hVB{iHqiR(qipVT{Ol$X)(#R{(MRl2E z4*EjsBmyVs5!>NJ1F8>3Hkj)bQ|{%M@QF}h@GD1D`3nq)985sL84M5{(SZF37k*?u zwl#-?8e9nI%Hh207!2D^AJ@9;lm|dgnHLF{#W)u=aaqR(Mlgv4sl{s1%Hvyy3UDXq zIs2aKCVJVVKnpK8bYo@ePO)E*cL4nbob?cgPiUP00|xdg4h^uu;1q#_9XzphuZj>I z=GMm@yxle8# znDVNcW9^6(=oVE~QR5m17pMNo`O>CgdvmFNcXpNI0^HC?6P;SW0Le3ZG2q?-S zJcV7o`CL*Lq!4{IFu$>t%aM&^-=X}2%L!*r{M6Q-MSQrjOOF)`jzth$BtVFF;>dDs zmD%=Hty1CI+~ar5A1lW&LM-q;hsIKW%zj$yHtVcN?N}Y-#7quvB!hc;>u)&!`&c{g zi)XZMo&S>Jz(Y*&%<@-|Yx(tAt=sfJS{@Ys?AE_DrqPAe$dEY>5`&2cnhBPOMaOtf zYetnG0B{_t925#{=+Prrw@xj=@O%!=b{Wg5rTFcToMAHt0Df+3W^PF)mS*ffXe-%v zE#rBuQxq8VzOc~kYkYxlU326)QxpFC7Z(iHlHL(>g%8r4` zlH&j=O+nJDu4~=Be5s?X&%v}fdAZSEUV@`uZbOQbasCwboE6-qk-Ug)Lwa-QT@8K- zfgh}gD^^TujYP(aTO~7-_hcn}IoHIA-RWLPY186(C4n$QW~Us@i(xB#N$amx)Cy+p zm*zhtYsX*K`fL71EY{Z-f3>pq^46`|?OwWc!RC^EL+h5X40!gI>{qnzDtqV>XVA6f zBnpsZmLr5xa?K?<11+DDOW3^H8y%_1!FY&WiaN!V#^U@~_m%UtAUGy1$nZ*`v2A>x z*!I|Dv*<>d$8u{c-E?!w`HOqq3ITfBOMsa4TXM$zu^#3x?G}ew8*agC4Q|apb7(d- vfbS3=*Zxv&F!@*Wj<$P8;|{BGe8Teag_9_x@31WU{sLbK?_k*c@8tgjj%3m( literal 888467 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

4&2c*fDTNB4uL zy`|-|5pBzJXig{E#*AchY2>p_=G-9HgskIQ7-Mt5r_+{`T$l`JKmFZ#E~-)FCI4(F z5+EHn>6Nu?r$6cS$q$A&YP?ytZ?_`Gv-~KLWyQ13SfX1!Mha)W0j{&|E30%liJ@mS zoh|5Jo3}eSI)W;Gpra=Ge*E*D-yhugc=HeKWL5|1-8FAVp-1VGH_!njSvSht%{?n0 zowGv)b^3(X!f~1z#|l%X022QjDN|=qov|!W?C#MyRj!JgoI@6mQ;*4OZJlFyWR6T( z1&~WzDdNp`tSA@D_qD)q`2-uvKQ&uzUF^?@uC%i0xNu@R6!oaorXGS~U&Y$>Vpe^}+0AJ})9mgoCOMRF`4kGhs9byy%un0Lk#;RCRZv!ZB3&lDJ@zFUp;5TT@ z7Gz9w@H%Hsaefvg+AN=HEba?6d;zfduKPj^06U`LalJWj>YW?;<B>>ukLoI$@zV53-7;W~EB_p~hUcvsp0y>c8{n{5L|GAV z->bu5w>NfZ*O_MdL;6+jus3{@w`TdySmrcp@BL&fb6U2tpSCiN4P0n66gx4f9i%!8 zsiT69L+>r#%WEB?K!zuR+w1JqM)i>s6G-XHQ#988S*!ju#rK>Jv zr~m(~BTJscd6wsK{rCLq@~_9gOZa!LSo2|yGRcm2$Yo^OXX`aj2>98NS!M4kC3fb` z6)PHZ?U`)8JG-LQOPd||OQHoZaa361JJG^j5-loY_tMI<2uqQ|R^=5a6ZkcO}5FgaA0}BA@&D)uk|*2d7Hl;ZT7U_fztgw&K;yqD5*!A2$QqAuO7Ck z6I47GR_7Xen>t|4?&<>!joAQSlLa|PRe7cS0V~rKvD~FApRW){Y)fl}yeq&!Zb!3$8?-gT> zad6?VG4YH8G_M-tgX1^$>Zy%Ux}SZ{1FZ(~Ik&rST4RH%v2#z<*w;>NjMDw=20hx? zw(e!q8rxPicHXqcY(-+={8vqFjMDuaP%_%s1>Khn8#})O;{{b?3nyyql~Ws|bbs%H zvBnmh8tW-Ja_11=Zd2tGnU1&#lTXtnL=7 zyYs3$G@$jR)jfxEOR=xpz1`fzCASoGdO$rcP19PnPH*RU0d0)Falv@Ox#I;iH~Ptz zVS!G8?ew;zj7R#hZuo}xLnnZZyuqB>XaO5djTSJC84KF9($Yx_?NEmuP~0$7%ly=x z^A0wN;`(MTtMXTjps#!@|Ty!it*)ULs9kRSl@4BZT z6F}V5Gwa<}1NO{9=ZKi{{N-ME&PAx&4bn!8n^BgjEAF1TXI2gMHbE4 z;hcI-l7?c7-Fc^IsYm{o?-uuZ3Xl3{_6P^a9zX(_4K&BeFSGd^-NYrjQl*Nf2A-dz zm$QD9n9vj zu*GAM5Hv~=g4%aNU`U`y4kxs*yTU04v>I)Io9Yd%2KR@5aIo*rJpQ^KeW}W@4b@oa1^MB}nf1c#KioY1?>}v1q zs?b@0t3Gp%;c);v1)LVrdG5aaj(ZBW5-J{7YdV^`l|T2M!6%bAKU?D$xJ!Iuf*zzF zz;5Keo_J}S5K$^Vd7Q&0EX(cj1U5m`bm%2Kq78^1cefmN%$qtAn0M_6K(RyH*r6?U z_*7#2fQ(w?%}>!M{wL;!#}DP7Os?UKuNGGsFr1gT+1a*DyNDdvmf>94+ic_y>o(L3 z{f2SXexe<8JJuPUr^!f04!EPYv0poBLPQNg+lj+Fb>gtKTYSneqZSk_@hh)2>1QQU z=)3RMWlmej- zrHt>xDMIHXoMhc7KAK8G{#MF?+`pZcS@AKQ2U$GKv!wVqa=Q4Pv}_fhNb?JeN7C{v zm>D|bwuUSqHcxC%-e-G?DB_*UJNbg`U)ywZ8e@o5 zYPQ?41AwHa-Qx28^xtR)-}BODa@u&-)t(I<>OssMM%Wr@ zjwr7&PE(CH^Esl+^kGgl%~6x`YVGLw3)IO4k$r@O%$KjyDMl~lO)h)s1_qU~w-p9t z3Uv3#))up7XVCpYTMso8?2t1v0E64brCNupTrI<-7gZ!QCM^6_gwZ zRsB&Ynvz5NsJB!{ZxNE29p|IYbaa>PY@q*lG_taP_*TTRZIegl({lyFCeU*v8e&Yu z3Y%br^Pifix`1L1#+^V6BwRy{&?VdmW7wK6rd6ywEReiWD!;AlzuA94($Dox$06NW zLbveJPh~LHZ=y8{{EOo5EZT$}S+P-6MyDXSLS+x0huP6)0>7Z>yK@963KzNskGst@ zq^8AuF5exr=vS%7b99&Xzlv6O^N*^FJ^Xti|6atu7xV8W2rQkPyiBQL^E~HaNXWK& zDB3k2(#?l8(2pcJ^;VMOLrMN&)7G7wcg%^E8@pw|%gF4F0Q*DO3yqxb>|K!kk;LtX z4=0f1M|g@rw8xCuM8XvRgsFqjLP0grQK5Ftksz)=N>H!(Ep_m>)zy#TZx;_I$mEa9 zJp3Iq4?kh%;UftLV;?!vFMc;cTK^s~kK*@}@}K_kOW$5Rnv|Cne~?Ii|6!7!SNxF_ zfywLhipTV}!Bb$64m8V=Gpd&-wQW0sbAj(#d>_!w`_=tl8inrzN&fx-U*4&~ zmzRO>dLZzC!I$ssUEupm0lx1Se1FN|YmZL^Uu&VDnsNB9E&d+?^q1AaUlCA#RZ#u! z2GwH*)emR@zb1hHdXk@8JeZU#9dhRuzoF8mPV?3PE6B0;+VUW0DGLRVV;ZdZ*$BCN zb#tFO_MQrIZcgU+Ci#5*ow!KX35*1$Fxu1)29Ic~Shgq+H?f(ohUW2{2pfM8>At#{m^> z+#z4;`;#e-iqdmv=?9Rd=1ct`?M~VW=j3OV3((`8>gEqwH{W61{9$$TF8%LElKiaV zM@M|AE*&^ebGem{-b6qDjjXSK zE92|m@!8G%yCvUT+$zyjQjuKK8Sh~`^swVSd zoq=xV+X4a~^G%bb@X)f%w|srR))dL_rukY_JmdYnG~Ymw2cG!-G(H|YnwB>&7Jnev z{9y_Z{)jw+;xXCXkIM}Iq^#{vnYH~yDun-WT5c{rO-;q0=$p?_Q}L%Vv#;)Ur5C>m zFpUC@g+ptN?xk7R*A@7F#pc!kl*;F?G($`>}VGU!fl~f(gDrKnu zEwGfy`-Kc*6VSvif|?91hHz`~cNsFzG^(hglS3K53!k*n9HuSAWH-oO1u*7wMnj4& znuHAHg0Rru=Q8AQU=+ZyAzx?isYYq6_D%F?y}Gl(t*CD{G$x>sIl&rZ9s{&c36T@M()?5^1=fm1`05#GwzNFw1C zxq~p{u30DW(5!9VrwkeYtH@@sAcvp=-1+>fc|YTrL`(pzIn-kG+&3DlWKf(dB8A4p&Y`^H zkqoAXY+7p$$HRzG(^^#|gHo}MO$|}4B#*+W#KCM{tF1dBwyoL0h}e2pk2@)39R<%) zUjXA$VG9C8niDsW?pn(87v_>e*u9K@d-+#_BAY>|W3nr;H-r$5$s_U zIugRaT>k|EUzrdf*Ku_tNwa3FJu^EuzxAxM&pCJ7_U)bgjrm5&Vd4q=>*TMW>WAdt z5)zsIJjI0imbxSICYe|&mZWReegv7G|k^M#T8NU{@xm@f0Kz@T3t_&6RDU>Di*SxB*IYU z66pkv?`6jtLXl{7RkaG{xf8`>m=n0RXRznr53nNsTL?l+SBedMNJfSFEw&T=Hn=H=)<`)zi+;Q1TcTv{;YrL~I#`$`t?0#!Vg z4FAVHw~|!?KDiMLxu`Fe)3uT!?_>ZC_q2e=1;^8DP2L2YQ4#reRsd z`|;h4E-Ngrl-ComjQh&0K=*aJe6<;JpG%MYp@jo@z|K&Z9?D(R_s;KEdX>k8r1OAc*d?aJQ-_4FjHrBUgjP-l6 za==*cWvqMm_kPzARaIW0s!)v!c7P}-3)0H4;Ui|>!P`T^nU z2ea~AaP?on)rfw^znw}NJWurVd{Iu# z>pq3E>3=NZKl5MNMsOV4E6bRwAN{yPk+2p1|t*dD&9{T@#u{DDjnkQlk2Qh`aw> z;`=Ys@^JAvO?dpjX_>>H?_@CFtlspV(@{jbD=T~g(x)O?^b+BI8n(N?DS&#LJij}m zv(4^9W^MdbW(f};v>%=B<+3*L$Nx6df;(GJ`2{;_sgW}uFnc)vv-DQs`x_X@Rdss+ zer!bHW+EL(2e~gOL;j7r2IvUN0L>*2q1vczf>wH8C4WccceFle?UfAT?}zgAAEHct zO5*Y#B|ZPAWb6ORz{eM}@;p%SqktjE-~GM!R(hb`0^k0V!1KTL*_Twok!E=|-+m9@ zuG`NFvh|Gob@&tkh4G3rWRoBv8o0D^Hu)sKdc{K0$Tok~_EvM|?7efdoo;VMf90MR zty#V9ysv%r*Ijr1!Ph@$$Ijr65d~Cl?<-BqW2!nQeWNuGa6g5zqbzE z_X_O3Yfy04f~!|z0KZD%#jjO(@zvD99CPt?Q0sMk_Vr9BUZ3}i*DxP{b@#JW@tXV< zi^Xg6*ANgM%u^i&*MwCvugR~qyYne~Wmp@-dz$0p(l6#@jrd>a>MJqjc_IHg_1N>d z^6Nr|6oy1IzwR(O=#uC&Kz1ho`YUB$Fy3lTV)30I$zc5He(6 zmtTKHZ%;lu;%J?saedpAaWU4QS)akUDom)O5Ur!YvSmeWO0tuag`w6F7HV@1!h(t` zEC49E(gZ&K4-vGcmMqaYsIzxch{NXO4V91L!FL~{3Z-&cx-1lZzW7F|T={E@*W|Cw zFTbL9UqU{pS8gnLbAF>(@a6-(-%4|SjI!Y3l@uEb-dwTZ%@qrNFFgt@cvL;MXzafp zWx+!tTqx*JehV!*3*NGr-=%y*XDUgIliXk?KOKMfWdg zY_qfAx59#lVZm>M1>Xz{e!E!kEn>m%pboL%cfx}I9u|BnEcjip-))G*+w-l(5sYZ+ z`W$r~N%C)9EWSJ8M(oHMk##CNY+N{_+i$bmx9N@i&4DHLa=-W<{|e@u;L0~I4vs3) zkbkGTAK3E$WA9Diow;sQe0_f_^atYHg+?8p*U5l|6D5Kuu;1O;(L1>ybvPF45x+&eb}2><`{zMuC4 zH{Da+U3IoPb?VfqQ~QQlHwv%h_LUnf+lS@$lfrB1mbMWKf%sxzSy|37Ex0o1f4<@l zAtK4k1AEc8w|3Mozpko{*2oL&a9>lu{HprpSBCDFc$C`r%R?jgjU8%}9jJD?{aMF4 zjGGpGR~DKJ+Mo&QD+5i|H13Q+Avs)Xyi`3GLRuHIUT{L>j=&#Mawibi{=JwBzgxS) zQPGY(vA%GE*`_ug@nSk49n|a%2WGwDNaF1CBhu04dODHkM@Np3CtCG=;zV9NDRRe0 z3v@Xy+FO@nqd{GRQs2+0Sz-kMR%iW0BGDM42$rh8MD=S;t&K*&zsc6jvYDK%HIZ}FfI7~(BGh>iE7r+k#gUz_0L2R; zVrDK>7~@42#&|KYTv2j~!n&4NSl6W%)^%Cr)=4hMX$Lfa6fxX4A#aDfJc7pD0=bvl z5?enf7o{mrCV1p>TyYx}#^9Ga1xMXzN>An8LLpg~+td8*cy3Skw=x#ah-|AhneE+~ zQU8X#yB@b^Srddqm)zO@mYC!5an*vN$!8&GP{kP-tmpuS4p3!K(!(CT9$@6*m~>q! z8?!#^$1DM`L+yhs=i62?TdY!8)8Nk3^1=4$u(9G-^u#$3rGQ#5yYqF&^#U5#5wKbY z6WA4icIQgQq;Kf`d=nIorkwn0)i~!N)P62XzIh+r;8o7B>bEi(R>j&Q*R0rA6)Jvu zsEYMqDtks+D(sy!!%^D#T!dV(=$Yx~^DQL0h<0X2fM;eJ5+d=MR;yN-O3FKo61#wkN!8*j zW@U7HkK@3KEyVsDRV;aFA%!}dq{3*7Q_M@nKpN`-!ThZ>?y9Q!KmfuZ0{dz!dqbqAGj2 ziMsw)v@of-8zOf#<5UMX^r_$<;HeJ-x7VZ{ag-Q@zg@k{i;vW+y;jT5peH*|^?i#os_EWp-E!NVvm~d%Eg%j(IbY0=ife2IQ z9>{S|eQ~=VI`#GVxT{X6jyj3o z2Eclme^_K^s(SLX-N zRa|6p}X1b_$8p6PM5*9#jhmq)6)=^OZL+m;}71`LD-44c9I z#0G&M8=W7?x<#h}&_(qg5NlK&18V0whxSEd%OjnDiFZvf_i&NZr2|}869<}dfV^yw zQ|a{D1F`Hb{*#FmAb&uRo6i~8^i2vm^U)0Q&t;JJyT_%Deu_vw2J{a_U)sn0jGHH- z1tP7-pc9`(#WPat@Bv0R;U0}XPM?G+O1t2H@}nnowQLw!7c3+Wz{o~Z(OXiX?k*hk zD?gdbFcBV+Xxzjjt};0TLtm4+)$(d8nQ*BI#jjgMQY3J)R6PkmACMwpK_ny0@f7Mc zob%#{rt?xV+N5?|`iK@GO@^DgsbH`jv|gNsPV-i0{RNO>dlb1FY|^^%)LO6Q zfJl0n9RDG5n`!`L9l}CU>fKs*e-A%>80d=-+b_Z-%vLp+GE-%JV8a689T_vNVZQJa zD*uZZe(yY#1hbf>fKawdpf>oiu)d!4z$_MB#gba1oZ`-XrW1`1#tKVyqG)v7SVvOW znTDe?XV~7R0?O%tf(#Kuv_+(4lqkXa^;2G0rs#W}9i2t~H()Bmd31ek;*zenyRli|N3!*|5aez(f-%gFE@UWWgk z%J5jdn9A_iGa3GxWEgkDA6rCttoxIR@GIc`r^vlxO?nZ2g%|%3xxXR8T>gp(bNS0) z5vDY)SQ1R*R%QJaFTtcrss5STH)G8fm(D-+cC;Y*m-eE*DtFIoa`*h3rKIF_J%gMq zWW5nhiIPR}6qg*RJOc-5Q`Et>De90|9@Rr*RMufyBRpI_2jf9<1i=}}k&0|NDh+Bm zI&KgXcZ@QI$J`0kGh(enQ~H`WPS4Z>_iz8>EdN$DIa@aq*r+`bkk5(T z8~C!ktSpMP3UNlvU~*u5#FF~Cu{$Wnr+J>X_KT(xA}oN#LiT+A(MCTYmm)tQuAoKg z8nwsy<-dF!;7uzSA%+{0rOZKbfGSqMws@;%gcxej!maWh2C;fK;{b085n>pyvYMyY zZVQ@7Bat^4E%k_sr`9$e5Fxf%b&~*cg*)igCwjeSFulIFg7jL}o?a^c-$AeM1$tpG zdV1a3o?a@>C0Pq`lM`8+Pb2EM>rHlJwZ=`uCc{g6nPRCf*V_CQ>UUSFvn|zn{Z;C5 z-%5Mj)#_{4sMF4G2P0JW&qwVG{kL7JmI;iwYf7_|&y-63m+09*HWg2ibgf5LW z%VjQU6TQ+#g@XH*_Neg4f9$S~_fB6`y<%(0T}AK4RB+eCnBo|4VtclUfJQFk`EHc4 zccEbOBw@Hijb$zhhpVtx6{Ult;9YrplD-qfGfHi%PLmIv68jdv>L)PHu<&$=voQT zbrPWKB|tYwfNqok-INN@%@UwnR5YXdQ>!6J&=s+2yEc^}?ypaU=s*TBFGZAI*CIwY z3>KrCf*ASF-OZ^O-C!SjF}g8`(JgJoh*rMM3kOCmf<)69 zPik*yFSROeBehz}9w@cVW&3v|wXPh325G{Zx*-hSz zx=P;0P3v^P-(aqcuHFI9-pdGIag6eRW;V*$J0`hRl6#v(^>zvE9TLuElHog3p}k8& zd$-=5QGJ#=PB#OA1{uq#={7H@tQN)Yc7NYt?^Mlaqqj2-r`#^NI|hsHvLL#5S|#qT zRCMpii7pM82E02JUA1~Eg{Nz}Ye_s2US)Ma;{Z<_(a|K~b}br#BTG3w}Kaz2R|xgCfC zpX9#BS7kS8y27&cEAP?ja1X>g+5<8TD7V`rbJUV z!?L!Ag|U=%nMqujYUv{3Vao#{qq>anmr?$Lw_SzAsA#c7sQ|T-Gl_(2S#rG}+mS$o zU?P7ldyQC=k*(4h1haEGLB;lKuwd$e^eEu6Oy@-^t}diizZXNx9crA2gibt99SLay zco%1D$$dZ8TE;`MT=Eab%|wVE9(o6wz%n7`my|qc9R?Z>Is;9=S{>8sGk}J^FwoGg zDQE;R;qp%XMFI_-uMJKlqe?-m7-$s(4JS@p(3HAQF19ZBaJ;wD*mddkq&w^DU3~au zS#i7w7#7yTt^1KzdlhuWG~!#c_n8!U1JP@Pbp5WKHt_3rh8ZMCG5aQ*1&K7WMW`u0 zLJmJLPI2oJZt_LpeD#1Eo_L4Lf$kOa$O?FZQ(PwqXpKPk9%H=ixCYIah_2(FMsoaM zRmt;12CWZ4oMhTZ52n^u6Z=tD9_lgGOZ0UzNlRm?pq@ifi=h5+#Rc`Dp#)VA1`8^@ zA0ViV_V1FQ0zrF0)q}x;N*@{^sPv)#oq|eF!>8Y7*wTZ5Sx!*BRJI7J+`0d!1(k)X z_JXPhg9TNQ2m=K5tbv01$chUpzGdmx!5UQ$1`Dd`&lZvq&-E?|DiE|6R6Q6hsHQ(# zG%9`Qf2W|*)7lHF9t;*#FO@A+KlcBEpt2m-UQqR5u%IfmBnWCc`YPI>MWa5D7t~)y zEd#7i>Z=xIl`_KOgZAw+ddYD`&RRl4OsDHnCJ{<$ZfTG`|1}UPX}boZF9;-k9tK&Z z%^hq2bcVdSHW2YP3*{Pr@)4nGUBjdeR(@d$81zd$Ndt~D`uYJ!4+3yl*C}xHq%z|T zz@>?3=}Bb)H%TkOj7|b>unFMz{_>ivB`#^;h*H(0bXL4^3!T6BR_J{9&~(8xbVdjU&>10k2XyYq(ODtfEp-0DTcI-^&!Oa5j|S7(q_>66 ztjoS@bOwg@bk>8xbT;X2k!OV99niTmM`xLoEp)#Bt20C&Uhg8E zfuTK}^w z!C*R@^tR9$A$a?AhRQgFe!-w|Sya76bPhw3!UWKs>AWb!{siS7K3Nh~Z_0h5Ro6HB z|wcp6C048|n!r-FhINQU?pfOzC_U4pswH;%BFt=OLA>24rF0 ztX7X_xCiuZhHy1w%LI(*{leiHJOx~y##O-OmrTfgIGYTF4$(kCI@AUd?2aM~-U7!5 zr8g3y&76_$SNJ2h#jA)bigXwS(ydd|uj86R0Lpl{>v(h?<(*rj>USu5F$VYNA>xbX zij-qteowh2-3y*Epe{1K5bx#bXYmVRW2t-2-q9O=XQ@5{{)+np=-O%z75zSYsUv(K z*Z7OE`yGJDvSaIEL0b>C%0rT;PuprNz`FnO>$0D+Bu`TgA#?IF&Po&wX8CtkB*l}@ zr)kNZbjYN(3r{9nXQ_ITE!mQc;pGg#Kgmt(J^YmaB}V~0A-)XMUX~ZQxd!$(kkA^~ z-|c1hO6mdjl?thn`)i=eKQgLN`yW*ZrMcxf?TQNgc*%a)hY3GR?$5Na7&2u$`%lsC z&Otl-sp_@Z{WAyiYjR^7%&)e>e4tKVr{>o^%m)?2y4|bIrrn~V=j6e~=DHpA`%eTa zKbr6J<6i+EZr`wa{7WnZd0Z$jxqpL;oOT&5-y8~;L+M;yerv66)rr~dQ*5FA5dn`Q zi=v-9D#hav`|W9ec);W66c0y+11p4J-1>I~t2N_cRT2bu7`309hxNpvU?s7^G1jDq z_jus-bU&^Y-jf5oCwh2KN#Q*%2k$onyr-t{0w(qQPXs1En(y=DSbgAMI?3wsFJ*M+ z74|OCvV2e(-H&gJi$l#UCxKalFiVNp@(inpkrJPtrcKtT6UC97QAEL?sbmgkX^ZmN zX-0>0l+oebVq+AGF%JL)pPydT(wjS@IIVUm;m0PZ9d_lQ2#`@pSGw|irl`nxnOk{2 zD^T)mPswvqN}idc$;0!vqSB$sL_K~&{`8)PK(L;#C%LDM9Bq; z{jlR$lMA^OYcJAfj$6cz@95!->NQ}UkBqp^2xyTJH~8C@$cXE$ zES1k22Q%j8z!?9ryCr4JjXB2L6d3cJlrf-`kBqpM=WQY*@b*KPZ_}oDFn^eDZn5hgapYdH>prpTyD7Ww7rVY!q?695-axa8F$j??EcD-% zGK~9sQjWERA>7@mrc^8s7+W9AQlYdv3S>Y+P_5q)$r zhHYNjP0rpBB1@dMQ>|+I?-_KgPq96f(`UM?qpZ8>pU&!|k)lt&Uvv+dP)drvkNyod zE9F1*Qf^keo_L$}AxV4FX8lo+^hfMv_v2L3eWl)RdN@e>Pf|%&s}HKs1HkiOvr_(m z{qVLEKZ!l3g)dYeGiV<#x<_+RJq}dfI(n=Xs-Fj_p72opB8BR)X65dw0M##3r~rog z{U@RZKbr6J37QRQ;8@i&sb}ot4oax1*7^iGnCs5~26=XUU1xp&I&U3kIE1 z^{=^(`$~~%@jt=-6*G}E&ScZ#zvtLdaeptin-;&CQ7cS~`N-txwUqQsi~p6q)ZzRG zk^xfv`~!-z02Kn#rq-T~xVMP3d@>*R)0nk_e^c>KWzMpzpd=3j(>mlgY&Uw{!z$R} z)a!y3-$F2>k?nLEzbFfF3-I!x!TUxAuNfvCf-rax`Wc{0)t8}K7F)&6En=7svdZ|J z`-A=c3dB|&LMpuhHvXX@EyiJ1i95U$W~qnRZ|g8>zyLj>l=>TJ^*{>S$5!=M?*-sD z)yqL0+mTw?%RwDO!3o9eC@|tH>}3p3^sAx;+r<>>r4Uo7$;}Wkg{HHO0n3Xi(P0(%~+&qJ1@5FmF9v^z>Fo{i2qsXx+a?v+r* z9a(B8^~c#elC>a3d}PcyK4VUYJ2rc%!}$-y$fHW`Xt>>9{fXGa(H_YOczJZN$BA5R zs}FuK(Y<-J2Ug-qrSudRwrn^YUYd`6lc*ET$4+L4O>zoH<|U_=8tY*+%2RqWIJs{E z*U7@MZKpZKqZ&HRDMGbvr#UIZB%sTOhVH2uy3I~=a>?9opVjEyba#bAUO<_Hbu`w@ z(`0JHWUlut?!jDg41C%XKF#6!3I1kt|4FPTavs+{W7(ph)Kj>3gpWQJ{khsvClC+Y z@^8f|#^=%~*j(vBSlCOUJJk$-v*)i)eFizYX{xwR{FXXC7hihodK9&^!B` z0*3mwdf)7tCNfK}>9GdsHHCW+f+-^DHKSSj#d-mPwC1da^o6V-g*mM%{UW`l#LrRvv2f>QOX{_+)n*~eeLEV`5k2(-(W{AGc^ z>@D(?$jM}vFZj#n{pE8aPpP_>=u)cA7nMrYe*f#U{w#^l_{*pL<$wI;Q~vTvfBA&J z?CCG_{AI4c?BOqS{AISk%<>mfG3&JH-TY-&f0^koyZFn0`^$g%%g6oYKmFxn{_;_O z`G~*l>@QGIRYP4}ptUYgUKjYF3tZ6!R_Ovab(!WbNP&JK6S^QFx*#vQAU(PuXSyJD zx*&tPyx(6CO#MPybwPG@L6UVru63F0FI)J_d;Mi|f7#4mHuaZH{AFW*ndC1M{beJ6 z+0XE*JFdu;?A0BGC@yt$5;S^v>Hcg6(}ch1O+Rnq)cZ5P}sokuK^ujklQ@tdm?>1bZFEq;(Xk!A2ek%?NuA zYY=R9B1=m=y|%so*}6&cFxJ$z7qNI4Myn0=Ub;t;BjCb5UqXYA2u=#78rsSEhLP%g zoEL9I?tE)XsFb+xckI_YlvOn@hp?)~3uW4t)4eHvBcyJ#;wHhw{MC4S6GFs1C=IePHX{fuSTxfJRM*rZi$Y z1&LI9Gn-Jw=z|0RcBM(3H14MvxH|;M%+;pXrUj6jc@)Y9GUYjt6*#4Ih1CGEZD&{L z6jm;105ZZS8N>xO1jw|;8MyA`Sczgz0pwFHxLPH)0oh$B9`P?++o3i>ygM(hU&#Gv z?W>1_7ixEio$|)B3&mGc*`q4_*r*^U1Rn>^mSE%#wc#?*7Moa}VOihLj@_9tk4Vo* zZkNGboTrjuUei`oKz7F>DV-E(p5;ocaxmv*wWY*fQmuK&_o{g_e3?`zY#m`OyJG-N z8)3KUcgMxr;(a{eg*S_nBHr4DFOE#txQp&}i#6k4Bw1wq7apTY(KcICH@DQ`y0QxV zQQgY0nVQma(Xwj1zAWwS>KBpHE}kacAda$I7A!gg7ECa$FL!7eUeO(AYtq>Pv=%F! zKJ~L7>(WBFjzJGbavL54O(Q#qNOYD`J33t;1s#6-XbR);u_Ryot=XSHlejA_?L@6{~k$a)<(X68Hq??x4_naVycB(=9 zsCxX78$BT%*YMImypJ&eDqU zmX?gUVm3lp#BU%zGmrl>qf4c_xezkFfvW5Bj%rVD^Iqra-P3dsQ$tV4tZmCgr&(`q zsk&3Uk*%3&3;<)2154PZ2eD$6989)`z&4!<%H#%c~;d9xZI=lcr{yQwv zZ7v$VR|JHq*=oX=aByfKu&p*A*4{^Okws$-UIbbaXKQqq#@vN?3#t%X!%Yt)723sTEzer!_?aw}XhPenootk4=6m^dD=YFL$^d(eN|j`-Eulq-gMzXz=qC z{a*}wJ}eJ?>=SN2&RBh$+BJXl`)Z}Sk35$)P>_pu1o zJCqRfML5DkY_vj;T%VXNxJoKZdT|165KNt(cDM8k%vB|IRr=DAh>O0H( zkB)5P$4}K7)<*$KA6ZJ@s^b;)tUOwS(lHu}j@8I?oSd4+m&}QQ13FtM=t#e85vojo zu=L_3EC1N$$0PjAw%1>>gWv6$CXqSPG=~}`MDg|cgbZWZZ-;S4hF&73(;FL6lV)x8ke`i zgb+Q=773nCggY0B;SP+*b#F<4Ar zDd{%e0)wk<8BA#gbH-qs9T?Dg2Afoxu_}2A7HsG`TJ_}CE z!l{-#R|Ses_Z3>z<|^H)%`7WfM?di?(KJn^^{H}s3xys(W3hRt;=b*?#d;HL@{na< zYbv2sYD_E!gDp=~7f{o7fSO64d{W>7!$?RdR`qy5mHtdn4ggTO&KIC@-zecQ?o0D z*()H2*(-5JuMEdUG+f!1xZ3Q$7eoXK zPiq{*gWT)%NuSACax&aM9f8uobzJ6^l5Kn#nIoS_TyN5_DgPW8J)P9(CN>dL-0igM zk@ROfsx+e^W&||sM*gwTjE3DBx3uO+wopVV_QZpW5*x;RlYhh^(2#cM&PKydqhV)W zY!E8ZaO4z6inUQmM-K8P&`ri8-vZhgKM3eN<5QrK$U#6el(Yf5h4HlWri@Re)$f7m zFx2av^W7+UYC7F0wwnlA(*)W_A`)8$d6AgX9EsCiBq_AEBRA|KF=)-Bi?1gmv4@sM zRDvM(yIwac3=<=lNYWGriWm-aU2?vSkN~1(>E@CgK1bq$EXq44x(5xZk2{eXIH_9; z^XQcDbvpca-g9Glj4k6)OMg#&9qAHsdWB!o1CMt^JqK7Xq3@f5QEpQlBT0vK0gAfn z#rU(pFDzh7uI`_ca#81*!3W?J=X25&si6f_q+$0?ZDTFe(ph1p*15-k2XUY zt-4JdyG{_lWLO^Ak{VBAztYWp<7}`SI`j@ z-TieAI+scez~R)*(MEtNCqj3p0Ct4 zHhs$hQ#Lg9AT&8Wjg)12T01rvy`h-p1Vnph9RO<|f@y((0mr&)-e7`jN-K(z$W+iU+^NrYOV)zK%fw<7_oHA?I-;KM$r=R%E*4?SAqv)?sU7X(ia{v6 zSV<_F$K!f`fuyC%gUVlqN1Gqe6qe=Rxq^I4oVl`-ZSIPO4J)LFb&u}hL^eRy$#_7f z^R0C<9=E-#50^U09u%4ne7T<_ThuMCH2*bbga_Luf69hbNZoNm*Ty@+FEWDL;1>z6 zd)w1|egQ6wB?!7OiA_xezk%o?{bC(S;XitbJg%|S7nKI&dbw>yZixChV0Nhbp-DF7 zrcv}{*6w)UE(gpGXm@zN-6lB0+85W_7gq-qd(feO4^Dw%`j7r}f4b%7P8}YGNIFUvt0l>z9wh2z3 zO}PquW1ast^bDi2aRnb$U>#!VLqc@~MGUe$cHI`*$s%Ufl`tXgBUZmW zge*H!qMH3%Hf*LHPcsUc3#IBXH9m}t&_dp5GYk{ms;afLKMKQ!j|^=$I<#MFwm;Ih zze;G|Y7I0h&_MR)Feh5t;}QB=aM7e~$%(M{BR5=dRR!1TF4K~$d(f?L%_guER}I)P zEx@kjfn8fKx^)7uR+s5JH`W8|Qev&{R`Wou&Z7X->TXrt+6M`J#gXv3gozIbeJ*K& z(3jF{Tnh*jJP7L=2aRNu@^>Q6QTz|Azx(m)HM@+g&upy8G;-)lVF;2o$cCWi+fn=C zLcX|iV=?N|R2q?MPNls<$2wz0z-(_BWi#(yKTU;zb+ zyyfOgv4Jt(bZ}Nt##;!&G~+F`hs{8<)bnP)*-60xlti;&pn^PQv)^b#_FFmFZ;&QT zqrClAdGHs}dwULu_m6Rg=x-bDd%1Sn?|AW>WRzxWQhsE-st*H*6A5!4|}a z#8aZlaUbPZzkD}=B@V4EDu}b(Z4r~uyK&PZjM*5Yu9p|b$G0vr?K(cD9EU`~*H>r| zzJgK~9|(`OXb}WLdwc)C@E->L0UF|&8cqj8$t@vVCB^q>D1u}b-t_-2R6(j@^Mm$a zvzlKmbe76-S9eFH*b@~jZq|@Zm@Oq;3U_L(vr~Q_NC>2`btIS?XyliuRUzC^g)4QU&*Xy78I*#v9SzjndAw zEeJV|s#i0Al`Jyrm@jE`@~PVNtdHqV*FIRFdJIDdaj94FIbnXrA=-Xe_3k(Oyqy2M zrq8R{=cVehH~V~e{`20})<;xtd$Z5!kWJtRv|hIT49mrR`JXGL%W^+oKJM4Ov(L5R z`W>`>)p9-`DZWQ}(v51R{AfE4a;Vl<8T9!8%CB0zw0-NT?(u{ z-%`J*=l(u?<~$lHMVWruP!?IOYvf)bi?tN)=CW8!6EnT7ujU)6%KNMAFsSDVao^;k zQk7#2|*QC2ySKW=SN`U9?>PQ;cq|M40t+qF~ zY#o*A=%`~BFzsSdLsnHe?WBa=Os}o)%K1*ZzClw<)=&&x+_>Kl9XU*vQBoJLHXMiu z!-=;Cq+1Zh@$o(Rk!DRw$AVv3_zgpwFxOfOn9w-8>z6dnTGMN@98pF>1Q(PRFnAsK z$1X_5atr)rw-z{*QXJw2jr6;cB;$F=3pEYF|WB8JG5a>xzl&^il}byk=|!@(#~%H<(BR9`Mea^(u6aVbW< zu09YWW)*EDZnnp0&OnU%24ggCK{9RyF=Aiz5f@FLuTodxb)n1@Hu%)U_ zCm53c>o1r78vw2_-mppk^;eAkdwBZKT><)UxB&meiuL)F{!0uc>+Q)#ZRkHSqyHpN z|BXRHwBMvj`-wT)&*fkqqy47SYxCU3ZD_yAf@G7F_M5H{?W@XxJ0#tgubGMhSCF@8 zCTU=Wew$|Mg}_bWVSArP0LT5F5+u`1-hb^ilY%!>1bRRK54Sggf@ZS0RuH7_ftsmI zKkibBhavIVj7L~QgGLRnnKlP<$x&Y_M)_J9eG8Jl6_%ut!1La!(lDhxc?<3a_GG#CeNUe3CFy;9CP~^dWyA=k zxJ^cULci3DVZtI^hD6EMoWf2f{>V>uVTT}g&0<&?p zq2T@1#U5tvd#a?k68zkksvPed?t4NrQT1fQD_?t=ce+%&%#4Xujy$Bm3*E7HzeGnYeNvDLtVz@l4L81gy@53aY?c@v{?gqDph4U4qe|?g5N0s zOiZN#GPpB{zGFb61&RcwGRR%qryAx$i?BK?^iPLL4TH8)OHpkq|T&!*r zHxY2-?fidC_=>?d%z&uPr$srNI^`RtD*l^D^_=&(qe|tI9LpyY@d}T{Dg0rDeH3vz zDavUg9^tW5YyZKW0uILVz_;())jBIvV})OI@1&(=kkfEeE^f!ani|-2yX1PNF)QUV z1Ng_f9y9cO44t1smlrS;26MW{MtO)_OszeeORwpQ+0c!{YfX*jG}2T3O2v(tTB~ut zU87{FxTdfr>4U5wZV#+B!%wC*x{_)B7i`&qgEV(!0-Q|e+|CctO0rYqGs%B6*f5Vj zE%`7EC?z{j8Jm1$ic3DqTIk1Ec>GURH$ToQ>wmHO`QJ1oMy|%+>iqRpKL&9;5TCGT zUCAe5`lo1e^Zw+2xcxL$e1@OM4a@PLof0Me=2lMTtI55lRFluq*yn-z3ypn~FE+lG z?9Iua3pfJwOF+A@v8<4MnfQ)m9~N4_qD9xvp-zDfBV77wWifR z(ue`-KRM^k1GNY_Ob*0;N)CeH$-yjnCWl0TWAe`W$)U(=a#&UZkq*b~N{&#(W^yE) zNsc0fGfIw*pwuxiBsrExQF5I2kRBgFs}myNKT#R%PO`is5%fBlCFtZ70(O#9BOp30 zni40cN8oja;1LDa=Fjn_0Xt5>mXfo?*RuueIfCirBn#wV=I5(0*GO zTq}^Ti$wYBsqKK|h6vi<7&Q*rpTpw;Q7h!afh-t>%P2>gqw*u=qYwdT@lv47% zT6;lY{yu6vUEsKAfPGQGzGU?Iqo94+p#77e{j;F`i`uvgqdNJk?(Wpx-;6hZH{QGw zHC~O9e~4iJ6igi8ThIZ%1s&ikHg$R=h^&{#+l$jUe}^EA=S8V-V%ZXXw28h!OY2Sk zQ7`G;%f*ulI8HVy5d1(Yy0ROG5+7yriuV} zny3R!_J9s^`J2VxO#U{5CcE&*X~Yl*SefKn;3N)1tz~gxp7ueC8M(G+ZKGr-dPi=y z-`oyeceK5E(L#C?Vc>X#ZTaGm{rl@98%!KmrIk7HcIkg^~!uedr^%hGcydN{4NhSo+vH8^mm3PSDBPv_qPMe}c((Kv0ihH^VFm@JC5OF7T( z#1q2ST9eJ)9%Ax)#ofMSWX9yNZl>W*Z8P0wV)9&u!?K$TlQ&yBrF2+*PfciG@}5h; z)-zczi_N>ZSuE77QQrkNGr}sOc$cZQohoh@Xv{w>#FE-u3?C^j(#8ATJjSN|_I7g? zu(7p1&lkh+&HWt=f3NP!u5V{1&T~bKxo(z5oLPbyCbPy|PG+VIH%kYP#%!>&wNL~i z)@tZVvL*@N*i#L6nF(30u3B+hdU>1BuLG?MI?%eL1FfUv)EE`OdDaJztxQ_$44tZd zW~@=?tQb9THr(NaYK=PQQcCf8F}h~4pJEHg^I3#e4uo{nzc5DATofZO7gMAy-l=Ra ziP378>fFrBLgDCsP7g*qU7<7=SH@Gu==9(*Iz4!QogR$(zdDxYzb2ki)LF68DFvMu zTkz+__EkUHLb``g896sWu>4sb1_r;J3^U9<;9Uh_T718~Ub(R6 zbAGPM843W}AZ<0F11rNGZ)_k%$DG^NRSE`hKLq;D;5vY{`V}5dJiWYDoO*WGyZIEm-&l=ffQI*s@a$@_Ua`jXC zxpw%8n&u5lc*GFyUx})F>Xk6wR_E#m<6!!bTtcBL%3q7BWE1kgd-%=%c|QrHGfC*- zrFSiH598J4eIE=?Cidhno#GC2n=Cy9&gz^WG8Q$f-%J^SOvHQ{#}dcDJ1x)omDEjx z??bD(=K9cliKffScg>155euJEtKNrKQt2nG^b^b#*aN{Mh76`dU12sfj*mqVb&-h- zqby)EA;D@u2QJdIV3DFzqUkJy;d$(@Z^HJK+Gf1A$@CiYP7S&YS6arlsBk|ZFlaHY zu@l7c8*2{?)0*kH`Iy!azQcdn9vDhBtr^EBibNmBv}P+5tfn>D1{jRZ_tAX9u8wip zw8k2An=ndtCCr`pWFpfqO>I0>SXoD@FqTT8amsy_oKj<8VpI_?QKY8& zlhLUDWOGfXtRJi#j)_b7p%ory^Ym1|(l%%If~pOyT?-u(tC1RQwif|X4vuy+Yg;O{ zlsFV6;+C8V7zN@(QHKuuVU3JYd8k*OPHTGGtRG9k(TmMRBznf8rzD>Ur$f!zQlI`$EjpHxtyzD>8 zK=^ZdUiM#fUiM$(#xRBs!EKH&`N>y6vjdSCmSxlJo0)Fs7)Kp{+8nW0h8CFOIN;mc z1*5#)#t0_e0w~=@crm0@%=F#D^B$piuTZ=%Me(~r@qXS*z85!oJf69YmZ=T?|6l)a zQouzv1M1MOARinrMvuv?3fo#qNxE!RbgP@xt!7fkNKpOxTM=C!py;fMwXKRCs(6Yj zdfXPi(aEx6-j^9L*TweowXwZj;ce1}x5_y-_5+!XJ=h}dV8k;MOzRPui;$>;d5V)AI* zsG!tz09Z@c1Z2`W$1-Y0w=v@16l7WM_PGK5m;tS+mzh_xS%Hp$0Nw@Izj_N`4;{z~rGK3Pjk_fE)nCUB z0&O(m5Urxa9M$%c-w4>>3fSia)b9lG^TOhV6zty%>^}(X7h{~ZeTvk3>z&H=4I5F2 zqjE=QS9i~dQDfE^>-uKQsJPYZySOR+=7p8X+ELt&e`V`^a3^+K?Vx$>OgB{*90Vvx zy^Mdr?KrLWCFbn-2Nnv!W`Nh!ute{sluP3NQ~kMnG-_Aq`=b@E-PerscnV+q89*=@aJp4jqqpUjh)EkDX0Q)?`QJ97=~!4nUFw;e=|x&8IIGcYqH z7*JJWBBzKP6|>zu);_eB;SruEX0PUUk#lD?4-gk6tYms1q?fvn>|fv0eH1s(6Os9O z1m_cxVYZs|Wswg*wwHk`m!1NF1SCE^osC{j$h29+8}u=DkZG6dw0-Kh@*)S4Tg0SB za=UBUiYMmwb03F@?mz7up~(FgE+O;%xc}~VbNt=*{ccx(H?808raN}pOs`!PRd1)c zwcMvH(9bQLR@;Zw0+{v{x29VwIP1J8(0zeM_!1hF1CJv2i5-!IP8^<*`!YLT1mHgS z@Z48OYUl|(*i-60gQt|I@{QU8rgNX-YfZIW+-LToGp^-6xlh8XySmO7Z2$f@ z{EtssCs|WQXtkwaISzig1L20kO z-6t0=0METJKO^^zC16;tbp&GW=k}F6?dv|Z5G=T8l@8fQp8A%$&qk32nY@>CY( zx!qSZFY@*m_M#ifJsej#{%Bvb%PBF5;;4k8`?|!_hiy7i!AHSt3T@lY3d_z zrtjrdwN1T&CyS>#6piSyI5LvDJ~(RX>!bJ{W#o>wkTKAU+_7jSQ2sQ>%aB`?FAk(& zyG(0SbEdZsqSft;*JKFpug{c*nCE{V#_zfMy@$xtm+az;gYaAMq^s`+{L^X;XD?a| zabN1&cB;(wZvoP2crQx)`{nwsOWo-a4r6y>1nVCQs$@~Lqwb|IW>2l1sS)4|5aVVx z*v-*WE43({iRci4k;htBX?$L;m*l_Ti_@ZgjH+d~ySD#C()hbFe9uQ0Cx#fHnHhD*r_mq#OY0k^i- zi)*`+qP>`J`n8U;XkW=KQH+EuxhPrNCTn`fYsSMOG8lW+INPhnU0PJ*$(sDSZ$?2m zo}%%_ljT%ygHnW@sm_Fx(y;~S+&a^1SNP*&V?TtOFnr#fCy`|QKi{rMfH-c9ckUcG z?AMTxfR^`n5AP!ydY?gGwt(K3@u*kbVoO&G@5AqNA)mS7`=-_2hexW2&+BttUkE8=R0RV#I0sq3knXgu2t4pVS7s(rjAHx%8q2-Cp~%LvyNGWR z)jzFPcagQX$l4PK^;y$v2S#o#L-$4njghncVWTtM#dIHioQ5!#-6bY+vw(W0TVkC~ zZNcoayUaS?%ul;Zq4?!|c@_o#RpHPDcMI)yYJ+2(qx)XaPgz*^^z?&hDgCy=2|6eJ zt^;p_hkQ#Ybsg=qqGA|aA`F0iiHChdU@r&QJ*l)7qlmegKz9zgs&5cF3s9Saj1-cZK_WC7ST-pUEJbRZLKZ76e3Z--c(bO}-p>Lbh)9%X8GNj!n<$+p_-1(- z(qtltp&a@qPpr5>9W9et_5~4%vvjGMWisO$gTCECJfNpY(vmZZuAu*aCvsOxnf-)A zEh84d4F8`*5>CGGDu6GSq61{h$v8Sm9pCE!ota%`bzMr}7JExvp%+&n8VO-=B&#Ef zmez?Q#H`=#sc4?aUBzvm@B824)^?FZ?rLslZdK3=*Kj+>-+r50Y%G;t%Pl&k;Oaot zpVZZ`5Q|vg=kYkx63+qB0})}pxADpYk(=PX<)WAMsM`@7wsNXR3C26Penvm_z9Qv6 z>(=xAsov+7SvR^}-N;8fyF010tUBS`UFq0WcK28p>ie|28xZg1tNWrEuop@`2sNaN z1&??EMEox`{9v@yeb>g6`^APIhcV?=r0~aZK`D4-opOddJs{LHA47S*P1!Zm{RDVXi`Ky&O|{-!-gykb zaW#J0{S<~h&Swv?c2QJ>$N(rtdMJ_r#ZfI#9R0STh?5kGcpwz9&Z8Ir#fVlY_RW)G zzqd{Hr*v;J{ zzH$-6vh)DYWZUyQ*^~bAROEhcHW4>Ju)bzDEqd=~Uhh4j4);i^_r6b$d&KL#r-I(& z%O`VsPs%RzItApGS#?z3`?O&owa_p$oHu4>Qo%mSzhwYC#|^P0ZNg<)2TV4VOMO%K3+wBfy5G|Y_Xb9K%mTqkQt&YC zZ1!Zxzp>j?0~R*ZAB+o|x)-S+-J*o+hgr&|$jnRVfLPT{tBFXe{qy>%_UgD6zL4#f znd$y$`uC-5-r#}iqn4Mc8w;9_J=6WkIyQxW0mKqstg^$H`7_k|9p67q$7cElR&qaZ zVJT!duW(x-^FG$&8xbSyA_i%_5d()7#D67#-Z2Z9h#EyjYtxCz>u5`(d%Z8=(2D^q zN)`pn-^4LbU)|e~K)0L?8|HG=fcDD>x|3`lJI!r6Ro*A0$-GZu2;`OP0EPYxLau1g zzss=E>gg*OHf5vGKNzbNGE{Q2HB!w6@r4Y2x-z$dzX)VHnKC zFt`kf>BBIXJC!rCxlLwQcuvHN}DbD6>V@4~{(Kn0*GZ!!hL?$v2iPUtna3xF(^@GjPX=%>j(#q=vYQ5P5j!HpA3Xaa>f%Q03MQ5!v4tMbM!@Kq zM~M$d3*=*3`M?%m;{$>>SBoDV$w4t9cyR1yCWr9hAjMZUO$b%WrU{jac2HNF2?dlk zVP;JMCbN}=&eSwrcBRrrEXvd8*f?nt=(u<=g^rIQkt7b~*Z9$^%kcO%`p~n+K4g(e zm)F@$B7oSs+ku>Kv^X*qEp1S;zN{!K%{NRV=tdf$lxYN&(07rQ17iu#K%yZtvl>rh zBS>EKiu`wDs8RP~*0Hg;bzCfV9S<9hkB#gn#JbZ6bRvZ(m`I)|kp!`soCgDcp~2i# z9AT=RSt!roT;;BXZO>v5TQ?-oE)^B|@n$iwylMl9Mkx1M#4l+yE0ZTjGa%*odkxe3 zc{9CVkR|Y=-~y43{87Z0uLd)K51*#3)CICI^MIHm&p(x4<=@fPkwWNaZ&j#qVG^Uw z0nBj75uwSD+=n)p{3`Q}^C0oHo;j$bI=$s%!x z(yy}AcRKmH<`WLkqj%-h--|tgK4!mzbA+VyPK#3mIO513^EeSc(&5gEv(*tDc*UIL z(;Skcv#9pw%pzhjrE6t^C|-#3i9)=P1$`>(b%DpS(4{VBqmsK_c|M5ECU8gx8tETs z%NU%17)riJQ|$u;>-5?p`i*Ru_u(DHl*&gAVF=Inkwa){a;>|W(`!GC7(PzrBqMS( z^PgO=WzJIC(H_XtI)~?Sv(CX)rfo~u0i1axH6d5)oT;^=B{<1kd}ciHZTtA49t5ca zNt5w0o4LeJgxbcqhRcb9qJ$elc78af>Oy$ojR0&qqG4ReQg=~&n47!w5G+346`y9> z@FYGlq-kFN9!41PiOB-LjZqjjOcv&(lX@NI6nvvOo`r$R^Q;6b%7b}^e>BfC&bk9= zGY%BC%8%Vp4A)D9b_cB8S%8yFX%S1HY7xtel=eL0FTcc2!C{f=LWU1phTDWz^@)0m zkT~B0bEnrXfP*Z-)bV85h|`hb&?0xXq?O9u@@4MIct-8ND_9YX=o(iqHd)nSywlVg zzO(7I3q>>^tBeB;Arm*eDC}y0E_7ETzUCZ~9A87HD7h=)#co1bgh~G+DNL!5Ml45e zH@6Fhgo0nd8FkKRFYcxWz^-GUJ6>K&*O#nMvu?O4v>i{fnJ?qSlz9sOZm+3RDf zxiUsoA*a{JVQop`c|A+DT3jk6yHy;o?V{H-Phrdz*=GsK-PI3FG*gBOBf{8}kG9K} z`@~T#`RyvMBG$2bn5}Qt#VZHU(`r*FF-rmR(ow$|i_Vw~GRk6pPSVLKaq-8>=7Rmu(zmu^~StV?5g z>P^rd4jv-u!H2z|U5g~iNyK+o#Z5n*ge%Nfg@2h)Xw6sW=_R3$M^4jK+-jPxvI;3> zc)iUn@za5&>841idB^;9vD?x{svD^88@3IYvmK|_{=u3T!Il4@baoomIMYXUX;fq@ zhV8KkJwmWEt(Ueb=P@`CmW|z z_2q6UZLV12$RN&lPowNMeBW!nv=ItVwSC8geL}fqvAfADZ1ejr14K=M%kDez!a!V2 z58Q3mHF5mf%kFl6jvf9E`z?Y;?p71qvb#g_CW8C={U_oLjWyrr#|`?xzjTY$<6p}1 zA@T~2a$3GP(wU~ilQrBfwGXmKhHt(Hq+R|9cip0y0s5|1pzjSp-{*n;ZVL2WIiT+e zK;NGNP0h{{2Vi$o`$bXp(UrqDQ>Za2((g{^XW$*1T z`{N-*L&wApPgZgBYX4Pb)LRL{Gb9jNsaS^NOoU!lKx~WXs^yPYIWX7HROjk=d5HFC z?0#TG^W1qf6RC$=x${Wi&JR6zew=dW;T(5<6u9$~lsmqD|B0AFW6k&Z@lX&cZXd`v zClEqPQpzLueOgw$NUwV^CMBABA!8nyh^E$__j-X7;c4la*gcWM;y@V$wjk^2oTDA7sH{TfWF5-)h7@oTCU#5E>7X6m`G z>hsoxkd6WQIo_tG1ZxX?>%wF&n~QOdnn4Cg`4ZHOlD`;jUT&q$p8{?E>}m6tlr}Fn zQFMO{wE1gBo1!mM3(mhOAy6BhC`I=YWZ9v1R#aVPc(37ht!=6^6X|Us``tSx!I1sE zz0x7c3-G=XyH^Y~FEejsz2aZ3ba^e%lo_AwXFQl$BK<7RgG5 zPY0IBWLZh@X(gnkTSQf#_AqN=@CK2P$EOP_|RM@DEL1mQw?vVm^2 z@Ks`AskSt#`XrMXuitU^0g{38go2-|)NhR*RGJ+AIq_Y|vXu!Fo1Z+GV98`qzz5(3sd2FXDrIF2szh+0#QaVHDd%5Xv!?c zl#yu(;VS&nlu>ax5~;p=A{>NJD+k<(=a1~EQ$B?jhsdH4K>)K-Y`jP{{@5N zJdJnrbO1;hA4p`gU)i9IZq525rhnA!4{2akP9LRMftiHipaGL9hrtIotfOq7lX&ZZEqdik>W?Qg68)!bVXUy+?8&j;9Q*E>fXyi04q% z1KMy=6$?;|al~+n{ky+I_S1q0Y@Ws4g%8;XjO~9D+jlXx|6OcOlf6yz$;bw(1fh?KjE_GWrfos|>P*|gqR zCHVkKU|E5wWeG|k0ieo={*FYP_Mllo3LO_LXT{)?VkW^(Mp2vITCMe9*Xft(7Z~RI zvFxaKrb}9FYjgbUsTL_`x+w*ZYj_M7sMC>ao(`%c-)v@FWdShyA;RX|AHaj9a#Mo~ zl5JC`Fg?~VvE#RNM^`qr!agy1QDdBr_!cd9zz{egjmn3W*=>DDXxnXC-tjB(&7wiP z&cQ7}({gXoojsP@LVfd|nlDanWzWn#v?x=~lvX%gHYX3kohP2*Mg+3D7TwIBlyOrO zbh}ALP>H6w#994-o@0_l9D{(K)Rv_KiwM*~I+FR|B9ePZ5s^Mr=Q1D0meJ&J@>1FH z_DAS&<|FwmIZChfRp(c1@=27KCZFVdV@qvBkb83nar<4q19u3|4EuT0?YHUgp0qCA zuyI|Rc)@(Y=G}Cca^#z3|F7)>&faT<$hHCxg0mbTXni*=-PCH{)Yr_ntlN7Wbragt zNov}0tqu0HuNDG4DK_ovPTyJ%T;S~Y05^Aar*F?nA<+#7^9geXG~1>et~p2yAN27& zgKVBN$i%Vy`(W4dJqAbG`le}Xy2+@~f5+1G_5k|W@0726-<5}k zF40#Vsr911>L|q<+XWA?e&L7EMd_HhD4`LTE`QO`I$CzKT`F8wQ7V8wGOpNwv0A0U zX67mvY2z^!6KIqyU9id};zD7}g;$DP_)ZsU(S@pYp*>vyP#4b0)`fGjb>W07U55D! zxe@dWO{&Y=-!E>Tv+A!}=y1Bw@9kicFl71&{~;|$X}diq7oDu#K72a3Dti>bFxM2P z?M-sE$wjF_G7xNlhGJzGi%Pl%wUthQZ15>AZ*_qLGG(`ZgT;^a&6ZM}ANlgo6l1Ar zz)Z)CRER%QK_8nDVW=pDF(ZjFXENz1F$+0+Rn=oUrIdqEt(p z&;ig4)djb!fHsBa$G2Mm0ex6h6qi)5H~sXcj;`TlD>M_+3JL!9<-9sx%d_=~a16bBRnrWOsoBQWW)Qo#lMo_rLp153%^f11#uizAO_Nx3 zPUL-*N4RWDMZ*n8OAvpL_ee-m?pL-K#f11#Pnh~)&!cXuDUqT6lt;Y_)NL9h)XSvt z@k22q@96$_vQOGivkZH(g#wUKo$PLV0snGwM}&ntB3w3}55Qd#O$KlHOH%C#?meEr z>k8BLa{PV3V@d3}7)*j5$@sg#V9TG@+*4f+JSy4x*$9Kva!|i59^LGrr^hSc!$aTX z(TWHt+#F&fdkcdkF@ZrGvPi1VA%#;fBA#L5p=@B8(9&619#&`7Rxh7MH51yBZM7I_ z1Q{t@1`;G1QfPDiwa>Uotf?80S$Fj^yAtS;<0ev@^|!vMq>PiuksKD);j>U#yi7rd zgAiIkSJz^>j@)!rpUHK!-@`%~yIE?!jG4Tp<}F~UN*z02%sHcR;}%$j^{GIC0*a3k zn~V)Up2QN8kd6eww#2C<{gl=yC}yO@w-!2LnPkhdoOSk@Z@-xs%Y_3~KCo2h?;Pf~ zwaO-|6Ioh?d?l-9mDsDbDKbolA52^jb<1>MN?nM5{3NwhE)wJcK~xgpt$My)dp7@Lls= z6-I3Fg>H?s&8-5yThpfH{b&i!$@lVMt+-ZOakX08;+pD|%975gszdIUEsE@rI|K(e z6uJlbk-IOkNOwhzwg0cklA{teGxjs0u&G9rkTb{%2V=yXxDsyCN@dt!r_p^9jz-`REI-aw5Ya_Qi_euayy9> zh{3DkdB8XVL&%nfio*F}ijZQ~QRRVe-?!UM!dT9^b{zXuBBl*fSQE6OA7k-2-2^&u zV{G0YJXuAuh>@z`l2O#CR?Q*|juZ5lUtIY$hP%bwaUms%k`_R1R+U?ZD}gj2<~2Vg zS{`(L#3v9Jx>UP0LlogV`Ri5nn@f@gz;F#ej4-o67mg!ew z&h{Fj{L}@}8eSvdbtuzovAl>%FCZ`4W7AFlS6Y0;NZJJN9g}%_>Uxk66g8bu~uZ6_T0W zfilB)5*YYT$T~5%Z4?J*`eBZG;Yu||4h*!lzC^#uLJkT8fO|wDv-ymHdALiN{#yxf zTkABDv(LT4dlR_vds>fXN)|kL9rhb_9e#`T{uOR~>1`cxne%CVpLP~G8#lhDy$&QZ z-f7LGh+LU7X6Rl|Phl?S{o(bF#+ZeTF<-8ucS*j(++3?wn(85RgsdQT3^#TRK(9uU z#;IrARZz#k8b?eunJ;P>FEcNA?3h~aeFGBb~n)kNsOrWXWh?)Tf8h?cloqi7hWm#Epew?{ETtgaSX?ojIiI*}h+!rnkZw7j7V7}ogH1`FDep9n%{V;$dKRVjJW z_P}1872J1#y(#AO=T5xW*?65tFKLM+`vwM-yr78bY)}=w^iP*)r*kA0Jxxg}N;Drp z9vUfd?#Sd&94(~NVD&HGyVc!?hx(W0>etH*1cx|gI{rvdY0Sz4ol(sO$gaF0%eVkZ zWzW6~hHSlOWtp;!AtH%v*VLZ1e8^!K@fcJY0X4H5#-A)&S+bbbP5Tvt(`QGfGs)I$ zTCbL>tHIs-YAHBL9K>O$Ys1)Cb_iVzHuL&mpHoovIu++H+az+938 zrNID~DQJd*u5<`%n!=~cGu&bcA45qyL-=(0hL7+@@e#V06@00L@=cB4OS^J|8K2}$ zU{~1lU@OQ{-tpbikS)6d8+~Q~WR)wP8AY zcRALsS-)oOc87Jf@KxoARm(b(UB|e0s82s#o?kEZvGmYbT*N zUku|W^Uo8Yru3IL5GKSY$3}Ls+Xuzg3BRyaUaJ5;VH06^@{6(9moXP%LTQb-GG_r( zY#jA3`DbR#@(EAs5gaW7pe`pwjX#{etk77^zuYUE7Z7>PDKU|~=SoZ{qRGX@8r7q; z2e!Y4&wCrEpLG|*VWZG%XAFxR(3%aazWQFS(4#>qF923)h6Ya2gFRz7(>1Q~9CghQ zBt_CiM=II0OW<@(i9X8yNOdgz6X+TBDpwwGyL$J>Fv5$zn%)Jq5sgvwawa(VGc~pq z#ur{ZYdcMsIz_9(gu-vn+D@7MF+e61ev#gfYHWta;4?dF*ko)JuW*C_N9d$7*V!1S z-@VP>YwC9y`g9-v6U_cW2D5HqiF+>=4I7*yTV=AaQnVbdV3pbo;0@oD;?y56Q;9%E;!X@eb=*D;ij?D0# z41Lut3LNaBesd}FFH{0O5OWfZ>xq-;lkL*JsMaqk;w|EOX|Z0N?>7T8b=5HfRZU_! z+Gt^&!IS@n;X7h{-chAyZ3}dblYr2LfWUi?jh!Vh%;RGgE!y)Ufzq{wz8IG9Ce`Eq zaGA36s%BWL$oDkHh#9RSKWu1`SFOO_tIiLI%nvn+_8`a+c4kE-;;3l^Q;Jf#CBhHc zO+QfUitLYPrGPg^+p3v(NTZsb6JYSFUZs@YoG+#K)+jaY>vdv>Jx6^aJ3v>S5}|P< z5oOivvVLp@I3%iBeR>1+T1yKu^@<|YhFK$!{zYapfR|adSk-9@^=1otW?=hg+-7w* z^bFutt8cg7Lhi-%v}HD$m@tU|S(A%=lf#`yRmiD`>hTh#z*`XwR9z)45qKb5xQ<^{Fri+7NluYLY83U1w+UZdRUMNF zz;qI~df}u-Fo;(S1M?cmzG-5RgHD_-Nud~4-guyAuW7-ujiu+_S&$M8JVy7 z=duE0=}v^4y_MV1A*gG-zna0yoXA4!MuqEU{;DH1tUUc)2+O*1VoQGC*WdePKT=|X zD!e8I66~?COIW(z$sO)07p>YE;S`c3934>Hza(q;goLq{&jhv6a>IUXq$!Fl|zyd+TUFBq*8?kDgqd z%VU468Ajnog)VtI*)N4rh)=DH-dO$(3H2qIN8t5q_lf`O#znp`A9b=-K0IT9`-0q`2)*-QhGl3hS} z!A&`4PXJH8UOlN9+$n_nZ5=&@Lq$}Y%kUSs5*`gDH<(Qo`5G&y-00Y+_bUp$`kg#< z+cNXf6bh&fGCg=&56a4hk%w=YeLSj3w0o@}o6g{Uv^*A%3!3tTLS=ICCMp_VP)2kv zMZ8m5-JpSIm6;n~P}XR7)@N@53TT%aA~1vksN0)TSJ@w)DsCNFGbS2pN1@^JuUO@# zbqo*Lcr03=gbaC;g@9<*q8E2w@J$b(dMIzD`Qx+?k&Ng!6-9M5?uX89;_^Eik6m;p zvu!m?rWi3?JqGgU3F<{LbSaRo_hxPL$kw6+TV_$x+$5UaIy##>-zyMEdIcDwTGJH- zbFA24VvCBVD^bWXDm7hOJeodX6qXQ~f5EzQE0Sj;`s9{~QR{^_bS-aDAYYQTj1z^_ zUZmnND*j8Q2>9Zd4dOZ7tO&!#c}U4{TVHIP#qBVEdjhwq;>xf-0$(0gnLcYOtj3x4 zuJ6hj*Dh4y1p1UF-*Mv#d&hS?)n|oQXN7spu(g;GEi(2^qH}K@ozA_6WjdH9OH!#2 zo_}#M&0}6;H+#lybQ(5iP)Sn8j8WAi>P)ya>H2SS)J!RSlsOUgv(_1|IPUvYA%E&5m18Q>};zcDJ)!;hJhu%Go0NS{VeDS%qZzEDprmS&hy5 zygkCajki=;)W)+(DYl2NjCQQDqNZ)CKExyXJ49G+PTJO9SuJ9Nk0eb*@_VnWbJ@V9 zwP(c8q5d=itA{HC3Lh(bwJf3Kd>m&VyV4TkP+jrsOIT^F|3B=#4V+z7dGEjXKIhC# zX3m*8c_k2D_BlkDAb}7dL4uk+nqZ7ruvD>#hBv{1wt!Jld5MA;tF5V0c~NVu+Qcd~ zT5V~yHVCbFYyX{EYwfM~HdgQd(pzs$Tiepwd;NcZ&$HG(`<$6c0%&jl|Ic5{?0xoL zd%ZmCd4Ha@7X8;4w&JxZ*bu*%*s|g#^4S=;{NNl9~lmp&p%a(+i2Q2>ICHZ8QpoQMJLfsGpF zw|-)K4F_?qpYWPsU}t)27-iqJC6~kp=|w5o?SZ;c5~_2`JX(Z-C5YYo*Ev^o3;sTi z6*Jl)m_x({b(k^Fer5bw8_Y4CX0;{7U+>%xJ(dn{akJtWAy;dFlZC!oLxP&y-rfu2 zpmadct3C&UUcSd;#7Z8A^fdz4HYg%76s%f2Tp+VCRoFeuR-4Pz{Z7r0P#vBFxB*F$ zfQsQ+*^!V%>Aeq~OHiDx)o4kZU7-0i#yz$#%Q7@%bmN@e-c}}>d-KVKC~BW~(vScL zQSeT}-b(LeR=9VP&zOvy7v^ls=%-RM+W<{HSBU|~Bvh+iO_3O1QZg(|{oPEqU#MTL`~5F6K?+q7|*g=WjlT3DmMK+ZLU*K1o%_1no^`+d8%4 z7^E8txg!T2mEu@Kv3PgZ2@hA6>#`|N6vyeX2g0Ls=EIEcD zNLdU>ia8}VV~DennvVBZRSX>&#L#&loO&&X#KMrsI3g?@o&{ms+!21H1e#*kzdfYT zwE;ZEv$~hx;`D<3f_&&=9LG5FZsCwh$0ptw?9IU)pym$lZ|*e*cLdX)?==T^DvRerben`j)Z{~q+n4`l(SNUB)SCY0L zf8~4Yf%6M{_6wY&`EY>b#R8|0mk-5N3wwEM7tJuQ-wK#-?Kax7F_jd@_HB8>$Bp(M z!&Gr`mk1Stc#crT9eejDg%*|%j9luh;hm^Iay^PYS;|et-Ehfk8yct=usk|T?w;(9>bxXtF|B5a&j zvMEy_-ACM>!&wry=_WnmPK33AxRb((o0^);hKQR^4_T-41vZ4(_dZ!fi*u0qEI~B8 zk79(OA%G4vo~uYNIKsM@Ze7A@j{h zx&`*&S?H!ctgp?$;P(`_smjLI)+@oo1=Ev>OS6XEAyHN*X=g;2q?1AI_3k7&;XKYJc(L3D{Xy91LM zP}6;Cjvi^kxO}5$(yo1fLFpeWr#aFOKA#qo(`O{wo3B>vBMq4P#cxL~V;M!lpJES6 z{w(T$YJttHIHr6`5!|7qI@k80`)TU%d)m|?!$_PYTfZQ2@@i_`WkJ7CeQAjKbKo1B zjd)|_fpP3)e4fMQ_F-7PRf&$3Ab2czB zt27Zzj7<==+w_q#8>iDK+Nh-mc#`720!(wZEr$6R=rm78rD9fsvjN#y*W%#9FsQem zmHdr9nOL9vN%-_2Q2&deCMSXg!gAa$=?%(l@ya7Z#>4RQkh^LmVaO_m!G)g}jHXp)26nx}f!N8u){T01p#!M?Pc&frnK&hCPGEO2(miEO~Xa z{FVZB{~=)gC^@7;V%7z3ru~;7!esX8z#;cJhZHBA#Ubrr%v!O-iA)M(UhRKi+{PKt zG5c7af;D!xh`UGKXkN_ie!rEGu%zUn&P~Nbn+g*mVdCtHhqk5(U>IMWu(x8&lODR9DtI4)k31H86|iJMr-9vAHY=*Kk54bhnV4+m=1JH1AVVigZHazcObg0B_qql z4!Z6{;Fj;?Ex-({lHh@{%2tn6!g!rkN*2w@D$CJ}KRU3g9oglhAB_V$Tce@Xy2r`D z+pjBmhBz5pDH%GBSf2PNROXEnT1wSMFOS<>8H!Sthk@lj$*ODZX2#U+SmIDWS{UT zzHYZCIMFccujubSKt-Y(+M%LDem~$E{TM2yDk~+M#IN9A^^jgF)!|@vA?LKtJD7n! z7^;gp=j;rQg9+rA7aG(X5Hg4D(aXI@9c=~D4~zdTSg>)ylYqtKkvE)A+=3&awW|5C zl9v8oNe)UVajs;u-sTJ{$l>FG9QHan$hs)Wf%{S0^VnG)r+}r!xWvc?63_zb=via} z#UyOVpPMGpV;B?~ot{iFp(IK86?g=wm?DoPqa-JdOPKxP3!l;4g8c!@n@dhcivl+4 za*o}1bgngvfHtF3v0CW-))jm^C>j-CaM1|P&JvCCez<6qPQQm8Fydgv>?C4}PuRm9 zHFaG%AqX|n@T6Tg)?*ZK1-84gb;&Q-y+~?(@&UUq?lw`pA^AmqMl%7Zgpo#mDy)|g zgHW~o9CR|nTvV? zL@-hi@O|G(3y_UrRU;r=Js%JVX30sTFNK1t(*t9?CUrFWT{6ptibc552s6E!Ns*`b z^yHg6%s(EZQ-8k0{NtH{-; za$;*j<26j-akR#IYreBnuCwBdp0$+~Pcw`tJB$w`r<1IneGLqmp3e*kOX^^G35tL@ zT0{_@`RJ{jXEuR4S7)B6FoSYEcUA zb!>#766~_-dz2`o)-xmANYF;AVU~7@R83W2XNjmTE0*r2jH|iyK9H}R3nE{IPGKCH ztVk-w4sUyaq|FVnF4IXQ6c38<4y;i32C;G%Sss$Fy?1RnoW@;E9SSSqdXwW=ldC#$@s@@IpQbvm*HVD5_seQ!dH%I9Z*K z%TL8uM?kiej|BM?b>UjSF1*M*2aC{!A@AayyyZ#7ZNON_h)w=MS8&&KVckm;CK=%e zKd9a4zJu^kz5{L}C`=(PNkQg+NxNkIM1}Y{J~}4T62|~+MIqk8%O9RX40_C`5VLcz z&JL<*cvsA+;jx3NFfD3${48aY)S2Gkvx-832jzY5-H&76Uz?UE8l1}r>Jcb9-qn42 z4b_A!NdvJ}vu~bih~{skHNBokvodAU-m6#AIV;idmpZSKW`%?4V!W*qUqJ!2CcB3l z;QT#{{fh0jX&LUL{mp~;H$Ku6`OZh=kaUHBP^L2tBcUK|26#r`5{R6U(q}ArZw4?| zV+m$CX+H;J0bEV;oAJ~$hkG)A)VWMBv!j3csKv_`9^(#dhm4q;cdE()4!SGR-Hyj= z>`wZ#TxnG^Smhj3kj3$nYORvkhB60Y+kGM#l68^H*39m-L#p7Fs*rro{6*aTvnaVj z@<{FE`+C;ILugm`5F&0W_`RQG)6b!BFZbTgi6*ibG8HDn)Eu&S9VTdE`~iOkgpg#)<=E4xc<9L?`YXK6!YqxqR7w zZipy8L^OlQ1Xdj%QA6Zt#BC%%L#YOe(74+_4KAF6Rb2%G~ipDa9q*-Mz<~?Xx8OP^!NkCOnmu3X3d9lj5bJGV=rHv$UP&-UDi-%S#zIPXL z9=gZI+aucGzPQ8ubiFn|Br5_`GW~~I#R0O4FoVYK`2ot>lWH`j(L3gZT_s-Tu+uKi z|L`4?Px}>tHB)|5>w|P}5>uyOtECU7(ZqcPDB>pWKlGcpe-q8xWL5I5c)zI7q3uk* zl2}Nuht8rFQ4Q2zo{ZlS(@hDIShOegYOTU=e^z{aCzBQ$ zJ&ZDd=BLVqV1s%pd}^w_KKq_=N|jibK`Mq>{5=Rh{HDQbW=Qt+Pcf^Y@>hqtjrIKH z7c1JBX90SFCYczr5)Ka2-t>4}b`->%^3fgX+?0408lpK|+XW!Wo*U0)wE?+5Y&hK!2oi#F8Q$BQ!{? zsNdve%D2UgIg5AcGc8ZyHS21iq4poK3uceH*i$|7UO9i8?>DX(GH~QKQ3ejAm}e#m z*k%}3pl~&LwMuyh+ltCKI2gPqvUL2D8kigb-rYtCH-oxl4C5HXJ@J-BQzQZ z^AT8SqhaiWC?R=MwbE41QRfg=no&O(p(%!kRwbhZf}zb1-AXf>v=;kG_FbQcWP9cs zdP%iEj`Cv7*&&<=T7(0`@}Zk+17v1~e3uV4#=2JO+{{pig&C|n(LQR$@N4r0uhu;q zsF1Y0T4*T1)q5!PKgkT zR17umqKb$;n_7!OpVt^tk>CDAa6nG1BeB%2oasD=zySl-+&F+^_(z5V=wb~0myEF< z7}D+^r!%VWcs86V+jQLaq7-Xl{Umcn0Tw~?7cLM5E7lDfJ5u#d>}+FRB!%grvW-YV zYX6xvv6JlUGmFRF_CBVA|725ZN2)zCO#a%3o?$kNiixt93}F$-N2r<{7fy|#W6e%h zBd3!YH-E6+kc%9SQ3$KW?4kReJymu2G()Ku*FtmJ8xPEovxyzQRFXYKK?cRzbuBtyhhMzl#_Wgb~^JmMj!7v#zoPm`+g&I`TNb_xU zc;3br4m55uk>W#I?-;RZ5SFE1xF42-g2tg)#@&TngIYJ5u0+Kw#$NRfKhss3!MHnf z`tIG#Y0sn>kaPW$IiO0RmL74#ZLCPZB*q{!2TIN}ZBl3~!nlHFKxtWA&3nw%(zMWx zwe2oEy3R`0F{{P!;)lv(hT|NH!+=0+yX0xQC5R<)28jvxvZx2{Of4TT$T3 z4#s&YJNO>VMFxEa9lX{$==!Fl`K}&whQ^(5n`z&d9zbspmvcnoWX=yp;_B7Zw0cZU zt1C6F-j|wIS8AFzXcb~8VG;84NE{bWO+$Z@NwBGPN%JM@xvTe^T5t5{fai^%wdS0MlHJvn_O*wXjXmsF%;Iy3X)Qm@x5$K9$H+f2)O^9%)MLXP+to+2 z9PyS$Mc<@8u#QpKuATSVazhn<>NheG7=ABvvV-nnQ%V{rG^Ocg2JADoqf{3gc{`|r zJG2n5_+Y6DHh*Fs!UldEB{I~!LW{U#dTW$+{VIX$9`v6NGDbyj$gpT_=BDt&`n0?X z5S&dPeQDLq?vNKE9~$eYcK7kc{qZNS9*p=Bi-{T?d zdv2~NBmG^!~Fd#QYZal$DeI6m!^C{`0hiaM%;f6oUQoQl91Ssu1prAW5_6 zgD?sKINEF#d?@)a)cy$DX7HmAelpthpah&iJs-qG1$Q@CJIM83)+C%y-c_azn7M3e zU9S7>ylwK|7_>R|z*HmB=H;TzQPC#F?5sA@M;d(5*v_tj99yB&b)P*}eANkMCG7jc zDs%YB=B4@>cx3Cj%}wGJ0Ufi7WZ0h-pQR3SUiYhl{WRp77*$G!2Mc~cAJcTejZ8-E z6O8yR)(U$ow?lyHy!}}0>6W#Bj|Lt9tWn&jyG?RYiM6n`a-8{enjpW*o?`{Y`{cKdAreBY?W+ z`<-(fz*v-T5FCIo=qLyG-EKTlf*eRO1o2?Q+V=Zl1p=@TWIfM<&x;C8sM(I`R&sFI zO125HSHL@fXqO$9$ zdRyUsdIMJ(4R1;^E=Q>4UGt8RRTJk6n>0d%<(AeB{XAhqXMU4XaLMI9MqC?Q1JVj97(AUgv0t%u+?U(l*UD*v4be2U7 zW`V|lxZZpY;1m;LwcwfBx>TK}izL0<=6m1%M6jnTt8@>0``CdmxDo#84}`D3b7#1j ziLd@GR{Z5y=G*b+!7qi+?|dYD^^R!OKl*5Rbs*jxwlkFii^8B*hU?&OplO4S*Z6*I zc%FxArAo9o`{bx_J#BW8O6j?82bMM?SG~@5xW?c6lUbF=d6MA^0(RNK%yGkP5wMxL zzXUA#9_b*q0V)VmFTTUCQ6ZWAVv|8nUeK?Ak=e_@7b6IGpdk}mGFdc@1BZ;YFI{I0 zs}S#-#jidfTNd(XBOPtf)3eBJTOB=ts}wsbR$#>sCkst1S7?suBW|o)LL?eZ5*R5g z&~|^~4V$l9mxR^QbIrdi@p{gC=SZfSVcX8V@aBx zq#H<6GS68~Bu$63GaGwmvP9*aktVF?a8V`p>HFrqX;0xhlew<-uTj53*ZTW-zqmNb z)haX|shnCAa@2q+PPcig5&sV=N5!$thRu=r)U+G%H2oL#Lb0YJ(F^H?`r5A-Y5*4X zs_2ExZpq&&Dq;Doq7eEsklr$&R8pv=AL+#qykS%%;7!sN4J+P`HY zUxqML>E5Gy^8{noGnicn5j(|cglz!Fd>cSJt;ccF5Yd${!BF(0c`)r5)38H8Ejo>T zSzU>u#Rr2+jBT0pJJ+#Z8)QB zDpHl?qMkAAz?`lXA7aO3_IU{-k4wE>b?`hTf*h7JhUm0)+-QP*%ZJgdEMG}_)PXtB zPGdZvMFwoMhSOstt}p0JuoVm6JeF0xItMbKp#$F7ybZ0z_>(DbUUhXsH3{S<)r!9Z z%cP!o+SC8kuV=xMYQ>*(Yq9!T@n5(F3CKUSH~)>FQMr(gko>7MgLkkSqbUs}S9y|^ zC3*_IjoWPJ`Ylxyf?0h)HzH4Ls_OBYQa6vkxgt1~@AYyYN-Ei(Awewk9(=AJK`+Gv|gSk9WgeOOz6 zp&4Z-W5W|rx|}_xp4>;a0&=M3OY+6-867^a5jxkJZ-g#2=N%z_irFLVN!lvcvJncI z=AuNpFG`%xWo<&%v~W$L7YHE0R)4WR`1#L}qmidBL1@aI-2~q_Y^@ zgvl=EA6t0O*YA0fkLI%Vz2ozD`LMP=omA+zv&4J0M7??t*VV*Sk}sLEP2%tnM_*RH zcSlN-tW`T_Pm8nDr)X61V6=?D`em#rlN3iSgs^7zZ-CC2=T4NfNP_CZkj+pD+nTm4`&M$u?Qn;u+N1{%siAi@I*5Y zam8bSV0R{qqSHqH1jFo#(W?@zepce6AyD6C3F;o z5i9#$L^#EI(NJd0m4sRDuAb|X+7BcOQli=u7^4~4KUnaxf283%^NS|XXw?K_yWWbl zo98y#w$T>OgLVtpT+Q7P^j$C;3+$kHleir2qAFVN%Zewo);siEPDH~>Lu}6LqW*zu z2iC)*J6C0y73yt!|1rQLa za5Qiy#M=b|;0W#T5WX2~7ki2mv>SaVDg{oRsKjE#gr<3ys95OD^OaRX$%;S!}kK5BQXrANY7}=&yOWp?>uohoN zX6AZ*_tXcb*4!47ITkBm%&vDYAaNOXn1V(tx~n-s;26y$ANx$MiY(e5*-W0|kBX7b z>QK^Vv#PGfN!5yE)9-|<7#O7vV#q53E30=7+z(B+8NjYljMNDdQq?9>5*~1>ICIeS zIGbcLbH^6`GD{?}0h35VMBLJGv;5S~X^2Aiy)nDt^Z@_OuoecHWuZXEb9zOF5vs&V zkdKnK;^lJ`=LR^fBjRx&7ddzNmhPGr`7o$1Xa5>>6{Hkv9%yS#dCq`8qPa8jh2_Y@ zCYKBI)8iv!DS(b0W@5%-uLA}s9JdX&-5js#g=*T!_uJ8h(xXyHLn#Cl~WV z;ZC3>#+*-=P_*Dm?4op>vU3t^4jcan%gzqPZIV7l!tMwgkl{(IE0UC-%7GLho>-i+ zu1*`vX;#{Pppfx=7KJR#1BHZA!lwM`5in}l$%3KPA5d=lX%CR?Zkpa`k?R1A(PGW@ zpw${3X}(&$QB3Q?Y4%?fmdnkzntrafqovhJQIXNsi@QT4O93j@lyb5uP$vI)g^h_x z)LdF+3#hESfLt>rSCYe`KQ2$8(Re0?KLBh!Obs;Jho?@X5XbP=R^42Vh7C`;qKQ5E zsJT$_ZEj~`xk!AVU~F0O0K5wZw#blVWxhxZ3?x};9D$=lg(iX>yv#8LUS@2K0kX}6 zKI@F;W8V7O@glIi$utl7p*PN+YV{#?64oD>q$IBiy1?SpU zI>SOsM4b+dKbc_yUzjTYAv(IKLxL~7Kqnx;1p{o!M+I!^j20pQSLM#gUDSiC5>enQ z#88#j6uNVZm@3d2W?p-UFe=V7>MT{$i1mV)GSPy=KzIYT99nx?FxzYtg1QV6DD2E! z@Pv*K`N%dROpG-st`he1QY_hBjvu~%W7P4LxA{IljyTi(-SNJ(auz-rZC@RuxwY+` z(a=OC7|}@0agC1`W4wKIIa?$#WC{5ocqpw$lnt`VmF#I^D}dHr%`0Bdz1>P_{59zqw)zajx&rO zJUpxYrxx>ARl8&gpiE{Ls|(8n`x#s{!TQi+=4s0Tp zti%@R$G3q@@)Pot#H3dkw2e?*lTj%qKXk=49(y(r7~)y2s8^!`c`h9-&zGOyI$GxA zX(hX@M8**}%5jm{v1>?g%NKeM<2Ka^6oH(D+C6dPZPfEmk|u}Y*b8=%-1Qwi^lH*?l+XBC?etVZhX z0M5Ds_AsD;Dk6|#zp+w?)Mi@~t4RG5jbk&53R#u=^2IO|`&rjQZj)wOfvkUqk13KB zcNE%(m(RBBB2q7HP{}8@F`vsYJ08i5HW#v!NjM%!^e({~jz`LLAC5<2?VKHtND>re`7DA98&=E34gDLabd06JN|zZ$#FfqE;v|Bz=ZR3` zGXQjdFKi=-4~kA;GfS>mIaLh-dJNt~r?_8#4Bo^=l>EgKOv@!GR~kI)Kj}M6AOB?e zyv2(0m^oU(pn)@O7?*UKBLH{QHL{H;H1!C0SbpRZJ;2+>3(|7KDvN^xg(QSObHJAf zDUA6K3v}G_=Hxrd1^Q9InG^$gPs=`MeTWjlg#27`XZLK2G8Nz5Lx8R4;V<#0bZzzU zhkED29H4vzm}3W0pv?+%q~3(^D6p#QaeAkCvBik4(H!uWE;seJLtfslpamI9$x{6hJ#%)6jsyzQwj7Ntt<_QZ@FhUu zVQG}z%W;9W=NrAy(Ql>NIsxa1s0L1L1_<||9LhNfOYq$Co%yh=4u}t*i<avR42QZAGcr&$Xi)(^N&|EzJMwAQ_F z%(b@k5~tWd%*m=_2Nu_cI6`sR?Hrmola+@(_ajU1*L=s=rgB2>OyfDWX~BL$MRj$k zVb9LAlYzoDX+}Ebx){MEOKtOaI?U<8VkmaBCVL(}q+POg2$s(E)?}eFV^uW*n*|7d zj&|F7=LKd9s#Jm3mAPQnCeI}2N-a8#f|x5XavYk>n%$uXrXEjj}w3WLZ0Sj#Zq; zZ&MxHq(0HNj)+O%Yfg7!(YB&p{&dN7M?g^l_A?r%xe5MZ!(c`Yb=WY5*eSDdE}O~| z>KO$ma85DK94&*(O59cs@f3ee19t%D-FFvFcUjAoHKYBmJwsr{1Dse6!|JLDHqXypw8a_qcp9+|C7D8pZW)JD_}qV3M~|z1 zaA&$91=Q9}`z*8v2pjoAMNTL3rTjO6Yj|N5!-xs*=^iIvzSdoXV^Ai#_;Gmi>sXgC zrQ-t1VN&KO7>#_9y4jFdZiQy6p|dCKsQL!DogeMbn$!7mzXQ*g_#NB*9qV^^4B~hN ziJT!np31M@kZJC~4kK>Zia{2g>7`WKWxAbE=#@>i3wD<#5p5}Gx0L-S2o%)DOp~*L z2shK(Mv*3!UMqnDH7x*_G}dBBNY&5^3{CJ2CT}?2PCsrD8*|=wv-3V4s;!hZcd}Zr z-Kt5Pr^JG&Rcv0`bxKslJ_LEFkXw0ZKnd#7>{zuJkb`w)&T;Jv=cCt`9}hIE4L^+6 z+ET0@X;UXCn(Nf}_9tt{5T#kF#nMaVY6Cc17#8>2al$tEuRVwd?8+)m10I+gBVX#6 zu$0!XhwIpe9j3Gx2WlY*A{#j_uoK)`D%=GJd;+Z_)TtGp7Ux0VT$kOzTS%BKB~rx- zcXIVkvaHiESma_AC{*a1UimbOme`qs>8^JgKC3;E5ZJGw2;kN+g_;BMc~z-sGH>&| zJ0YM<2q>cv18d5--`-s&CY3J(D9Z!_o^C>V^BLWnz)^P$F{paeG!f@%^Vdk+c#ax* zYO=kr#vy7f;B(#(#}^@sU{2*v1pP9IPs$5OB*bSF@Keb+8x0g-3{ngYzdfT8Z7?vX z1R@nug$htMoPzRf7Zt!9Gty7dPu?F_GQY_45G*v>Y7*(NljQ35y=Hdf#xIT8cA5M7D+Y+ zUW72GKda$J6OkKDI5(PbZq%kjycQPY8S#C>#Esgng2F)v^{Cn|%*z;2JLt=S5w%@4 zQ+HGsLl+}z!w|XERD??VYce(z%KN9L&gs)id%j0m$%6m_uF;jr#F+V|mj!=)yn>a| zHa^oxv)dyQ&40}kL4|`Ux6<=;e7v2u+wH7YZw$4E+asjgB|Qyuf*;IVqQSi;x69F_ z`sg8#sAOnsYg9~me0X9anP^UE{k6_AHxP_-8`RhEk++P-FC_(;UxH!D3L1%(%TNixXh*>K7|ldMSC=M|N_J%w z3~(8apNDU-KW0NXm<$cdu5sit7}~uI-XvNK6QTtCpEe`r;}0W8kdiNReb}BY*bTxt z=u^0=d5c}*VFVYv!Gt;=UrP+nD7@@?ZJ_I6L>gQb+Tn3J_v57cc1C9xxvrb7 zOoX?#8oj2TT2PUY#Mj=t(Y+qr|6lRmcPXMAmV2JAPeKL(_!@!><}XqT{c^_AmTjSM zM;TVYVYR9zFNf2L%FN233eeu?TVs)~xGMQ*yq_qJN4!MHuS>LG!AzR2*>nt6AjyF| zv2W@B0rD7fX89T9^8k4bb2i*%%n|aCRwK~n4vqFb;IvE}mI%ti&@0p5z7W5 zX+97oijSQyUxh{Blg04?5IxQApN59&7{{soYupA@+J=p^Y}KJp8P({I9L%`$uxGI; znP^4Am2+C-5&tlW^un?}M}%2C#5SU@Jndlmb^wOJBa@I~to;sEJKOczwNXK}YKyN^ z_3&hdL<)vI38jF8;CqL)_`PcTYV0b3=SkH$TCKCct53R41=7ml|B(9Gtk(HM>SwE3 z=MSl$g?;WVO9UUN0jQDchJemV8nb0rayGbYRlgC)tG{8LQAdB4P-fHb;A>-k2Rj?JyL<#Z zpTe)}5dchGGQjjk3=pT(;}dKj549akuItvE`HN)c{?7ukmdB#ZKSfpl(rIt^)gfG~&&W;`P{KC5StCKLa_o~rsWO%Q?$4hK^ zMbUL-(I{=Tqo_5nU~n}!F8wIoRujDliCAF zTLl$zfJJXn!wdmD7B#W4)mWbLUKIHEQH@cY&DqYFD~;l1vko=gr$#|RzR{kNjivsp zarP2Z<1%oO@nr`_QS!%Nd%QMe)s|z8t!%1i-QXTA3NM^?NTCn);?Lf;A9hkKBmp}k z0%0EV(O!LFVHge4Si5lyZAqD=9;p@i z>Uhd)?eygO4e7;nv{`wUUc4c_Uftvqu!1mC^^24*)?lg_^iK5(W5H@AYc`~(0(ZlB z$i{rSh2$Lc2heRn0O6{{1U(f@&Ti?{4alNEPNMBKw%2g6H29n7gpMI^8TI^Qq!=fr zgYhTC^jN%KTAb~E3Y|3V#DovDSUo^YPa7bn9$kWw79hm_h1a1benD@Zv^ z5JE`V=wNb^DLYEQx2gOfP!xQR$UO%#V*h{w!jj?Q7_A9tv8LsJfz!4=AWj_AaaY0`7AX2qJFC!4NO;HFf z^$<)v5bW226IRJrP&K(=Ln^-YWqS&DU{45lYDj)P;2N1i$k zk5}qWF9C-^4(3gqr@;p<1HfSj8Mh5g11Ns7hCkilg0D0vNYEZE(SImE`Wz4mvVm!f zoYrs|U6-B5g=0^2?3>9;TP`{MH8CR7uu&z?d;GeaO9X=bDvm{8F#(Y(U$!pu(UM z9fnt9^=X_^$EUIX@`kasXxnG-PuDj88ncv61_ecuY z{Z6e`-mfCNVc-<3O}AIFgLSqy6W5%~KFnt5y6(;punk)YgkugGQ&78Ju;i~0sMJR^ z{3I!MeBlrOW=KxcthnXI!ZzCc_wOQj+o7ASmRzA0sc&ifO^ZVih1G^x+Sy&YOrezw zRS;_!b(STV=hqr1&l$n_^_a{>8G z3YJ;>Tt{m#jDpD&>$)_*h)Y1ldVZ0`o|x|!i5I<$a$m0*Te>X&aXoo?ez7jE$bUkY zZTX9JxjcV~E?4B2=yGNLQeCdfe^QsLMWh;Xx2x0zKQVX|M_Uz&bKN5!N4IugX;G7O zd@LERH?olhLu0j3*s&ch*uAFUbRAHu_dCJ)R{h<$fZs60Sbp?^)&d=;6n~@Vj|lwn zcm0Cau)9C9VJG-FOPy{Ca=A44M!f=nVRNc1dQ?*A&TShDU(l8aZ&A8t63z>(a(F#B1bY8`a>h5n(OR zu&yaa$SKf(u94$!SVOs{fB@}Kjceq8Y^eL!6k|wYb^MxQ0lwZbvOKNJ>ONh&O1$)H zcbHwS`)&GjxjnGHU#8zLN3J$){9w8kM1tC>HfO1EY0W$E`2aHi^SnDgo-~HCBuN(3 zn(z)B{*zKWHI|%G`-jve*n=wx57rUmZ68g2|(EXyT zgw56d_1^yYSl?GRAQNSp))wvJ3sH0)wfS~-l-3F>BC=8jqi$Izgu75t*?JEMKamfjC@gkdC?RA zuZ$B5&+1+z?5#}kMN<3Z4YmPmSswGagn6Wf#q{OjG{2IH)czxC|MxVa-&gxzBsSZ5 zl-Hdv;oYa%<>LBjbEV_wiGJz&rQ;V&J>l*NemUMR$NA-0zpU`fFK7Y@3~_1u1@hD{$Ws@HMwjM1R5}lHqT^z}k};BR4K8e3 zG0KJHEVNO$5q%t03dsl;vP4+?4ilm+i$e}`Vg39VmvoFdBvfa*h6L3s^Gi!9RX;u5 zNwUIjqQ)2ira-V_1L>kgnQSweL>WL*ubEZj!91ZpZ-r#$Rt%Hb69!o`VW}6D$6u$-*<>Wt^h1Mj$kmGZ)E#T;0m1l zrjDpUAW+_w!+`uNadi>^Si5V`=uQ|sRF$X|*XRU9Baj2|b9l$)yw145j^*;Bus*Ol zT54rCR>u>VIP8<^#3?WG`PzJ6lg9)@>nq6mNG%Yf`-T0$5HLXs0|>Z13m|A(1`tfv z3P9F4K+Xan;9s>VC7Rs(-Y;0Q6Gz(AVuO7|_DK?)da$4LrcRyRloHrtQ%lRH7Hf(f zNsP)`q`EQL{bO5Z4We1v*zn3O>ovF%m@y4`H(dd3h|n~^BGG?5fn)_&)1%7vEv`zj zmV*)~Zt^6*KBWmVThbx3gB*(`AfvJxmLoxqMs6%FKK1>F$b>`UvM{i7EE457WX$o! z_x_c~ClufM!Y98q)XDjx!@p%xLC{{C(q2t!KHD;Sn}s;rvjWRG6v3N}eWn;hN%Hxt zFzZ-8jx9GOW8ez;JgzjAXG~)7o_~HQDb{HPpF{WG^KZUve8f4x$b`b;`cH7QY&87< z?i1qpHuJnWTKpe})?%fpjpxTJb1BVF*i3Ly7JHuazyxJ}j4^`z7&f{6b;J$yP5#X^ zCt@xFJ18Rd+Tqy>)yU+#b-g@3@ehu*=F+@%9c`vtTUqg-rZX*0>U2r89KWD-GdXtS z`Ek;^Hnnap{;R*vdEK_`$F7xGsJ_NBCv>{SNB&9GsKf|WsAr_%;6-cY$8T=s&6^Dt z`SKhaAidFa0UeGS+1;|h?nsLoWOpYT1xV)*LnFd-Vvhojl~_uO$7vfkBI{|ooXAxi zTO6NvXa%~UV~>NE#odfTJSC+g{f&k>v4(*>1QGeHHyrsa4u(p@Z8`<%EtyU0D=W1A zw7HrplFmtNzBh}~y}3x~c-Je_ivOzT>rpGuDIU}9Ga%%1i@(?HhT`9JIS&=`nZ<5Z^{nD-PD@*Ysj5;guH@ zAJgpxEPQ<-hTM+<#0xn;1k1i#Job+dB~0vVb%JQO_`d&o&78EKPv)zjv*Hio5S`14 z)gbjG2%DdRZ4RAspPu6x5 zsy()g=VW>QG^#xns=irdsrupj4Es!iFVY3X%ukfY zwG2uS{o?XSuzts?eHhQzz#Z~4wzf_LYUAS*$%2)`jgk6LRvTNnawQHU9;f+Q!Er4& zX9|uhG2cROPPE>%PRzG;CiBbl)8!7!Pu<+w+&qy&{+ljL!qQa&m~C!d-0Ui45RGy) ze=awhj0ui%w|O&+WOMmwv9*1^+CD!#Z1HJqyW?$l2HSpN6YVR_pQrkt$ITY6-zs~) zDtmr-*rMDi4(78Q%!1%avKwL>Cpfg3I=ibtJ3n`8Yv~aHJU6F7nip!hpyksA!n`*O zZ-V*a)ea^b3Ki*kp7iMJtiwz~nCEItC5oPYx$&DX0l>$y3{JHy>GHn%47XOxd7Y_J>D zzYXDG3-?VNtdjy1F$;3XI@&&4Up|{JHwxx#$sfO5;b2-Z_~pjt3jgvfeW}n(zV1b> z6=UGNQKO;Bx}?S!Pdqo7g)K`QTh2VcWp`D`oV}I79-cgx25h-N?O#C8U#On5=R)lH z(cW_>rwYM66Q_!^{zji*85OI0!_8n#eKD&g;ywIhJkl}%oulIgBf;L z1vZ#bKY}4o$Z1yX3&O0&Rc(~dl!_k83^LudIIHG+_blzW*H`!Gth%3pdn?K$L~XxJ zI?6|fOtQPm=#FS;%Nbh0QbcS&mWHZ9vB9cyu=Gd(r`qQM$_B*(=6QFDvfcZD0%scl z_C&;uSYIkm*3#Vj?{l1qy1n-{0xq7`EE@2&R;FAkmk0)CV!0?3aQs+KH>aE z^9JRw4c;Ic`YE1Ri#L`n<~QlqKIpuT+J5@{)*4O%q|}?!{0+T6yqVM#9Bp*s*1k^M z?wxp}O6EJi z4}UJr-;(ya_;Y0!ccy)P{8@{Drukh~IDdQWCCh{2*z>oc&}nq7;fKc^?0GOuRKrlJ83z9^B3vei0s59*DWd~t^Is|M}Hx7^j+T3cgK$Ye5IpW z@S{)fjvb}C+#b>yZoO>Tj02A6Y5va8nVhUL++P>alce}SK*xtf4>!ncRIqo1$?|j` zLbY!Z!YcZ%w4RY?S(IJ3?Ppma-ae?`gg?5~ev@J=O}`BLWkMH1wKzMm0{64v2~Ug? zPH3duDw7C4Tbr`=@AKsHTNHXhenQjs_Z)iQPV$540O=qPsw0HDtwSU-C>KC(L;t4z z<{D`eWKPOr#=j%Qp2|;8_toT+rx20o;s7TosTV|{!?~n26(iZek_@?@d>G%9^^KlwD`(QTIN>o%>Z-zEbyy>-1y0+T%C>zb9o;(mm+|QDI@O((_miMXQ{FiAU%|C>nRiV$N&6j$CIzv#aKS`PVJt>KBp=tg8C7R^&0RVcMYV2q3KQ;K^ z`Z0mYP!azV*(%`ZJ)o8lPp3SF+pwPO{#0dnE*JxOoD&KNotrGD4=i+J3C`3V9HF~L z3G~pvhhl|U4E33xRB1u)u}1IHsAvbA@a{nJd?|c-M`~*& zEw_e8ylCI4$tTsuaShz`7z)J9Lge=;3Z+m=Z6kojA|4EWfM6C)xi4kP?-!;h_76tf zmwG%$NTJ@D@724dMXIU|o0}T>1ivdcq??KJ(V$Bb@Ws0lIsuv8KHa%Loxd{-+&c3f zb>_ZGXCUaXMyk@8_ZW8j{lJ2)*n{n_anpy zJA9SWd~to}S3ro)9s=T>y`)xmKB~CzuL6e7$I>bAY)8BE@w8aoc>s>kc`xbconK4w zT-~Es^(WHew$8p3Z0&q9ovL*{l}=@yUsw7}=hKQ{e}&wt;zfJ@48e!(l8KZq%K_&a~t%4n`U{;iLM8~LNo z7GMh9{EKCwZumgL@Jng_2oyYNVdg8wibrsWk`9OmyZ|;9P|U)$7OwF*>0kCfK9A+_ zuG{l??K#!UD&r^d3U)W2CNK1VoQqOQPEr`vF3Muym(mfqX#P$fvn&BF2^{qtbw1UZ z(Ymbj%h`T8%Y**-95ddn^=SVYep%yz+S65M+C0rKtNn7SU!LxlQ~a{ZFOzbRlCw7cv%fA!9)oG8S|pV?h@(7IYzF zK^HO>bRlCw7cv%fA!9)o9c?mCXcak_B`FO4w^HQG9#HkSg!a(-az}IST95to4xBJX}1oYp}c`GaZaVk-YEbuNM5Z}%4T6C0vuJlsS11g1h|-DO5u zP^ZN0GMt+|ackn4j(wtR>tj)-@$tvCY>O(8axWK;L!|yHom-Z_JpZ6c8Xh39yGqaN zz6dn})X_GRZkytNRes zA4>TwA8)^<*7=>l3-gZ|`FB2_=DX9*?|S4s)}kwwe1^z^D*FuqFNe2GF!*1i*^6YG z@_QUM@}Rx!synpS-O_qG5AOr8+xT)k--h0RAxQJdJK~^*hhUF8}Ah=8EiE2?V?gP4)j4>>ScnmW6U^@ z?$f-|51Y$vGG;$-S_ZhF+2wL6wc8jz$?xBllp5EdO^SB51yBONEf5vLBs{00OQ}_p zV0dlToVGb(7;1Bj*L#hygrLMhKq9rsj9v6&El`T9+?0Uw<=m?S`j{x8(t^C=?xm83 z;1zGCg=1TId8w+i>>aw`D4B3AQSxN_F+WP4+?#QV+9peU(L>2$B|!`0NW}cYyz_F% zIoUtQoYWYTg*iiw*0ojNm*j+@)uYr0=YCSylM!FTYT(+gv4Mg0f3t~Gfy8T4l z?M*2~=OSV#vY&_?47%?cQDjK+56#fR`8*{pbVc&Q0ZY!Zd}BdIh$$$MYdj{=_)$Lk zETH1Kp{{ISh+IVsy2ec;-a0}%1RS!`tROy+t%3pSGFzQXXj(ks{lc+v%8l2p0(khT3LBRz!BZuBrF`*+(q`A z?s6WBLES)2LQb1vq+zi~oqxt=KK7mV#-N^UTv)$%A=4t1A?#X=ottdr@^y^(HC$Jp zo8(*=pmLlh&SeJ#`-M5LUkP8Dn+yb4m#t**E#_P)?f?$gp{E)fF!;$jGbIxid}awF;|*aY(y6Xi#F6PIVOM+xy0ra+tKubILQh_GF#m9 z4X9(PzCL?IRDwIM>M)ZlE5LcDoCZ|JU-`F6w*o6WLJ4y#+-rE`_Nx|s*sc_yKS;7G z>wuWtyd#6uxb7sC&NKBK`|K+@At)zd5D?YA`JPxY-y8&CXQP~)kG}r}Soc1VSbjlu z6Nlq_aD;K9P#Qgs?_=nDwZsUI%ZGJk&7JuX%fZ=-zV_P~aJi_4$us9-pl)7#nr$BB z{r`Bt@Dt$`{4}`Q`p^L3{dHd-8gpN}q>&3RSVtqqz@X&7)a}(}6H2&M3%yzz1bc-(3p=~(?^GF{DPukjxY}vq9F+mi~`5A z;;C1{BTl`(3*RQ?CH|-FI3ZRg46|a&C?>thW=6zA_DjfrE^zcrgaSB`7KdAwCa8Ut z9g(SYrSnaQm`qVIlgVjv+0;5)GZme9hN!&RN5>z`QL!-okY{W`{2^wN`VTl?tC&!V zm?QVe?0Cx#eO|Xe%E@xhC&D%#{)nSh8u{YBN9=KTl{T)h<-cBv_`ntUviK-E@1YA2 zbX9G)ZF;M7d-5w(hOvy}JPH@wugKw;J@-fvrY(EJnVP2aP~^Sx9sXz2>BqelPB%sM>lbzdvPTu zj`M^fQ0x&CH!^$T7R;Ww#_Wl^>WC(;H&;wtZ?2fQ-dr(paWmv`dYKQ!K9&;)d_!V- zoEb^=t3^O0p=t)4_KXyTIxvR!rZC21kw}t>wuCisNjmagb2!+_)$2v7#yYRFyBylp zK1(LZ*zz1MXrU9UgjKCo&p1r9H0@5UBQBY zGOUVynu)e@!r|QDNx$svstDq$MyH_a;Ik^~;>L~Nmgb#26Z^%c@A z9XETu(w?0{fBSaqyY0F*G#a_Rrp=6Yv!FU#ndEkSUfRAT3ZC9on?u;~)|sdTd6tQe zJZwe;Rt^MIfb+Wz59Z{JEhI%qyrI7|j9k*3!%JN1OH60%&6@Ge4-!(2wfh;_!`qAH zuhBaG8qWP8xp$H&0<<^K*6u(&hkuY2^3J90TfOgUhqwW2@H9Fpmaq^j!woz@^We|n zGydE+L9fN<@Bn}AdvBG`5jFn2v;Y7KA!YO*0>%a&mVb1^9v1$a#7uT#^8IbZh9;4Q z)!#7L(dut#haHi6phthOCh%T^fJ#gT&RjkKw4;5W0MoI)2LQ9#_W&ri;sb$iC#Sd^5cqhJ zwtvF*8xpzks;!+PfpG>hYo*Rbh zc?CoD+%Qzndl*_AaK+PSbl|zwqlvB5qw?0So>$t{bL*#`a|~nHx6SGYFTDQA{^uZ2 z#H7CRV46Qar!24eeh}K<$-LwF2txlVN1>N{Wd6c3OmhgcuIR5_oU~`i_?A zZz{vk8;Hv2)o#m<=?&yH9=@r7%Jm1V6FP0sEWgnkYSWpbdQ$`$l9R z-c&#t7=*Aw-&BC9H?Wdsc(bMin|QLAPAk0W2k1^YCn7+hvz=Ln-Z7QE2>P1ESZNeB zg(*h<1um%v;6mJY-AjNpB<2L3q!M6VJdQTwd;RY55q|SQJO;zwQ={p3#zlDF$3*xI zHuZQ2zrms&3*k4|)5k%?fVVl;h?(R@RT5S0+g#|NU>QXDD{!SZ6@O;iH3JOXA`=fMl-7)#>2#+kNhv%auNqk|woB<$s=XC*Qu8ll6kM8rg+^k=11vYPYt*{Rfg zmfkW}$3oLW&kK*dUVFqoI$q4{wP)>2(qf95D<&%R;LaFMC!_T=04ge0o+ z2~?GvA22C)aBJs(B>BSiwVMG0ySCjxPf2Q{ZV^v_Q;^+b|EZP^YbUqfzKQ21B0Kqn zz%WQ~K#9mUG9kz)OUQ|eM3)U{(5K+SfsLz_%E5!}2612O){5GVs1_3XdZ(rLNI!Ip zT9LiBgSpB{MmWebaeQ6IKx%BdlHX%wZ?RJ$;P>1Q@O$(yc+zU3_aoc$+D*MGZ4Gdc zOX3@BTQ3sD#iQEUQmCkH=?-&js|giTjyOWLtbN3!$uLS@cDg=XonXRlziF@)meeu6 zt*kp?hcLAwMGuFIw^FB-`j+kp+f7zmsg98eD?>%De;P7&F8}4=HKcLE))no2s5o9qLRAXS+yJ2h_NrBlwke%|Ln7g7 z&m1)4AuIk8j=`pgft^$6zgHd@o1;H$`V_wctjUG!WM?cpd5P_mJDL2r0mQb|o(~S? zFlRwZG!5fZjw2xT-p1y9V>HtR*dwwc)@?5^+#W*u9=Fy$xsu$&{(O10+bQ1n7r3N> z7qX9IE>)0%O*LJ*@(r{SgFV412p|Wez3U|qgu}6y!nGF|`;hjtW_|5K=F;3rv!D?b zAsU8lY)H}^B6dfHtS|9P^I1^Oh0fVwxmjU>Z7)VoVjoLhPiOpDMZV!BfZ$T4toa)3~~`4u4aL;w;^ zW*AH`nbCZjRA-DMA~&;OcBu6SG-gCzD{^!c37erPY=*9r^eBamSOJsW z6En6FbsbXKAg6H-wfFY>wBzt@n~I&we`KWzplPJe{A1Mm%^-pdO(=Ui$@St z#ExV?e%f!DOMyi|SS?^^(AmdF2nEqj@i{Am%?xa`>GIcgWgF%hZ9h3AwG!lFIq%`| zfm~lybE%ioguA1?vHLFLjQ+>N=o>-=4yn+CVwVk?Q!I(AqMh?-GP}EO6k~Frq#;@5 zbJ0*kG^Cp5r6Gc~>>NBN4FSVi^Wq~JUvF%^k?Ah+2zif}%zAJ**xf<*BHa4x24);5 zZ!~1gh0}EOpn?E4tHwM*04wWLY*Q``EFgr`5}#|spdM}*E(l%rOC>kto6I(V7vPid5&>>={V*48Ieql^W~*=x@{W8FDtJ;SKu zakI@0Q69(Pu1_Yjf6EB9;R$|&_Mv$NX$N-dz^|rLq8LHd5>-Y~iW+&VGeNvVZcf9l zDz`Lk1L(@Mb7q6iyrspyY4Qq2j?>PazPl>r=T=r~u8fa-c*+voZ=v_F9G&dO`AO8*QhL+n z7+%?7{7>mglTUlPff_{*=f2>}*57$H7C0MfxD`weA_-^TY7k+9>k*5<(2G%|?gMdG2qd8_(ae=>=2I ze|GUa8>aJ@Tf-L(@lg955*iI$QwLH6x-o_+axv~G=IOMxzV?`yW@NZM9x9$%kO^J# z^m|iy`lbFbP!Q~#pfrba_CPo{a)O5g$oWyhvxl7HJ>x z49wisVC^9lBx;&RL4u=`!Hxq}@&`3TJVMN(^vmuw!Ru=2-V7FY4kaGUOf5D3wU7O) zrHnRDd1CBh)^HzAeY{$|`S25jU5}us%@PGG>mSGl9X^kAwW#%Ze)6jV2PYpJ==M=_1(VTEwklwR>5BF$ek3U zM^Zy6iOmEioF-g$CDj{~Wen$$oQfuk`k==+-Fk|ym8Scpm^S5^xIUXYE3;yj-LIBM zi(LN%yl93tu45Ma%}@X=2G+B4M$5Q3uZ&-e$`suwWxy>_*^*|7GMq^nU&z5Du|)rA zXhS-qvEJLmihDr;s-Dc=$5yaD^QOvb>~pBH7L}fG6-;M6{;X8lT0Rl9FBqrw7)Ru@ zgPl7eJC~WW4kJlr63@_)UqfhPBo(6Va-M=sg2rTDFf@i}Mu)mRr_oVb8o~HjOhLSY zrFL`!m_ucHRy8kfmZfTI^rLBfi50YC70f(Y9L$r&Zl17Rz6@s0{90Ap#zu#=4j~+t z_BtMtKgx>J*ZPkZKQ#S=D;!UYC~^(#4`s*TJ+4Rai4sO34s$cf_#V5d;F7zdi?x zw0RGzx3uop8>%q#QSZjAk24>wt`2;ptge5GO(|xLllu<9HJf9!<2c8foS+~}ZIo^y z7e$z3X}|}tZQ|4&XfUA5{b877&|p>Vv4-ZWn6aY9NM=IGRkg1-Izqii?VTAVkHT%K zWHS451K$$-@oH)QufR<-r6q;;2-SQ1QD=#wKMtWP3_;>f6ZWtr!nl`23q*e;4ExS$ zgYxIMwlzO$P~L@uE{(+=$MrvUtaYhd95{Ht_a?&X-Xb_fpOtO_TC^EjaAAHW~C zeh1*QdJ6e$eBbNs zdxPv0b?S{7b5S5tHAx*quqXr`=bUW^ue4dQGb_Z5F{Y##cg_gUqD%XRoP#Y1`C7)} zV0Jb#`>`^Ns*kB5Cwgu*L2xU{#0i5xs(PTPV&b*#v zK;rcbU8I!uq=mwJUEEC;Q2X=BAS5N^EjoQ(n?wcq}6_Gfr6*0^(8uh!; z>(Kc6^}9yiGf?3Oqk-&s?DA5&-LXB!T1FX!5{HU1i~_R0D1+;EVzM(s-84iTxc*v< zIB?ZCB$Ia=b{(uq_?S#NSYzDpw{bsS>mN6SGuC{+eb7H@umepVARI|>rDv4m8?h{! znnq6K-+5gnzS1{xkE8U76yuA;S%82>yH8rJ3}lUbxH}$3&ei-+RV5Z-EpL~L3xvm( z78`)cM(4g1crGXqK4%A|6+2&bKW<8E&}suLr7k&Wz|-K{%r~`OAaY*mMiyrTZEBqw zeVez*m_t5P#P9sB&D(`9rG{mnxsqj`&DG6cv`K+nLdzsbZ&l03ddr+rw5hc^wtV{& zX?e$?ovNob-|g(lOn6hCX7HUa6$@4ezM26S<&*X)9`e6McbA)!27A2J0rt_}smWcl zMJxgL!!XwEX!C>C-lM(t9;H20ACxuP>Os@I71b#>Z3mO8=jB9G-Gb>Wzj;(%0kRPz zoR~V@w1Q4_xp^`f>6I55ugzYw-iRTBLJ7-gCv!>y^ z?$QUQmfz;AqxHgkc#k9D3nTht1q&I&l4f+)-dyfyF58k^s^}5nj?Fe%r;$A!kbej| zM5WiEW*Bb0ufNXMyqe6u!Iv5=?hliJ#t??OkgYtoIagCupqC(}5Ie!e9UfGnb)(ch0}d~*x>anlCnz)Txdm1w-kw3*+Ml{(Mr5Gr)3 zzfX)=)!CXH%Z71B`h&HOA*Yo!65NZ`O-cMUA;8uQ;;V^eCjfoCMhg34O$_=Ho66hk zHbmQM?lg$s+pFweD!W}Dy-)d!lm|sA$2yX%*xf6(n_@T$QC`Yo4T_nLGh@Zv?9wQJ z5b6rjrR;&r*LJahPmI)d^=jTl%{HvNaTCyJzX55HX7B9Zcc3*>%Z}cw9rg--VIbB?lL8H8T;C7{qaI9V-x&tf76uWzuFAeK zEFy$6a;T23ghAT6-dTH~!xD?m0?@zJywkZ{uenEQ?u{z<i*EhE`Joq4ok#O>(1uN_A*C3x*7U$C2Np-gK!YNsT-O|wBtkK)EVLfZ^ zFlbb{K4zX6zGoA%bZrY}ym%~vK4w`G`7)l5prcQ4(6qM zWUm*`uE3JxKLekRGaKcei$keXHdp=zo!^4M0a@Q<)daEcsI!Q}Xz zwLEtij5pL}+;3G^{zjV*#||g$x*$&F7gh@|>-;3&!aq<0i(*rnsu3l`0H)l)Vn9t^H&CCf3V#R(G>vF8tH@kfRQcJrTgdbN+cND#4`%qge$YZnyz8JkN zw!~S)7pnzpX$38L$}_yJ)6Y|P*-xHEbSI6W6NoUWM|9e%>1)%^QSJMzBR^D4`oP}D zaT7*8Z04U*S}wv|G;b4C|3=bST)&&^gNj~b`O>xq%yTvCjlF~?y%XL|Jh4|3a%PxO zr$P78O&JeKeFS?XT*;lzT+6SRe@C^*v^=Us6y(AtE z4u?{<5Z15D$*{Cs)WVIe-5HU~)`$!klC`KW+({3&cM+#VOyE)?0O2wCi2A0uj$L8q zYi=7j$X%UQ$f?JhaFH*>p_J^!0aLt%vswV=WtX0j>QUlMliLUgCoU`(AZI#(Iv|i% z25HSIMZiV0+y`W_0GaDow8CZbD?U0bCWps>C^fVm+!IiXJM_m$5qMY}WVUg$u zDWS;@JzQkwT3cejvo^H%^f<@o(#~2{6>M7hSxi{TC~aOi#U=c7apwYy#g{Lrt5vp1 z9kOeaImo)cV)Ab*r;`%6t$l1cB)vr2^4T`xP?Sa1atN@EnAKOtaA8;)v+XdXGF!=b z#5b3R@vvy$b_N{XiF}%VZlaH|$9Jxt5|=)QHI!4}GqIZvz5yCs_>%#{XKZ?ls<&uz zp*IN)C{X^s$iCxY;lAzYO0gs9GvH*5_?hB<&cefxGD9gU`DCpqE63CL%*CCjOh4HP zGc3k6qvmNCt;}Zba%sF=qOH+hI=!_#S#a=Ap+jR~airQoMGj^jPy9UsXR9n9GjWiP zX5w_hQU&6*+0o9A^o(5NQ{iOYPBVC8KF$hkU|Gh;88K*ic1^kvoy}EdXKrBzim8$koKzp+ zR=WrOfZr7w0Pwniqkas>VOhBpsc^FU#+UogDgMJ~H6l7}mPiLp2vmU{$sO*VTf(zy zXKg3Ar`C2ND3;2H$Op&f7pJoMfZ6AHkATx8|M5!+~#y7_p z7KE8|szy+p%EW5)Ha6ahQ_p~=kt2-Y8LH|dxUl*$m@f|Equ>Z1M3&774Py}Xc#)+1 zSoM;6cwSHs+4JJ?j8)ItN|XWh5a!?H5J);sJ_^0|Ohmm#x-o*0e;2YZjDaNH3uu?6 z5p44B6C?iujT<{!owgl6OEqA|IQ6_U*d=BbiBzlsd>fXtOm5GC ziqMFEf#Dl?fJz!D=(o+{lf8m^82qijY2RSX5)8xd6YvN`Yo}A!cO<0esCavxkV1+t zyN{WS2K~kar|N%^#c`W!7U;0+=);Y_x*6r)6AVMpzS}bv-QFci6kX z0}B+!&k)o$sfj-NGqDT>A&+VkPi!*o?JMdx0tZMDxV0FhZZ85{v@0=_j=k(1Elfb~ z_`5*L1_gFLHXz0J=vor11^Z?>o_PFLZF?W#I=^-McCAg+Fj6WP)oo#128B+)WqaX3 znGU}tPt#a!x8P9H#0WuE*!oUf3}KDL)_0JV9?rmcpA>^O7w#i(0w0;$uC*Bp&yhE@ zI?VDAbwnCVVsJdsUPc~#4;_75I0-w6a4)2(l&uX3vGSqe%3&q|IA}=DX?1LaoH&eZ zt}ALZ^}98If@4lIMs(`9hI^3MotB4AGjN^FBd@l@wUS}>D~34+>_BpnLZRO{^kzgF zkui{Iji@FTC&M(kc;v9j#T+giT>CK<%rX}K81vHjjxviilBq_Vk2cHdoq9iXpK~MA zX%RJYuFe`9f}hCxgdpZjst4B3$SyWe#1}EaQ<0Rd2&l>5EL@P_uErVT8~N7MamJ3q zG~ggM28Mvx$Z>tdg3gF+xF+)6AXmeQxGK`h8@$>TTs9UKxnJKYlEu1V&)7idTwOC( zqAIPDn7cK0%Oa^K51 z^h0G|-nqYDHsxg>`U9``hk4GnM{FJc4|Tnw=iUfnQ|To;vpJsRRF$Ei$c~pW &> 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%0A2G5M)&RXo6RbY%T@Cl3JPfunj5X$qqjA4 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 diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs index 32d2a7b141d02..3da15255ae695 100644 --- a/srml/consensus/src/lib.rs +++ b/srml/consensus/src/lib.rs @@ -34,7 +34,7 @@ use inherents::{ }; #[cfg(any(feature = "std", test))] -use substrate_primitives::Ed25519AuthorityId; +use substrate_primitives::ed25519::Public as AuthorityId; mod mock; mod tests; @@ -135,7 +135,7 @@ impl RawLog { // Implementation for tests outside of this crate. #[cfg(any(feature = "std", test))] -impl From> for primitives::testing::DigestItem where N: Into { +impl From> for primitives::testing::DigestItem where N: Into { fn from(log: RawLog) -> primitives::testing::DigestItem { match log { RawLog::AuthoritiesChange(authorities) => diff --git a/srml/contract/src/lib.rs b/srml/contract/src/lib.rs index 8de372ffe894d..3f6cbde88f17a 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contract/src/lib.rs @@ -67,6 +67,7 @@ use crate::account_db::AccountDb; #[cfg(feature = "std")] use serde_derive::{Serialize, Deserialize}; +use substrate_primitives::crypto::UncheckedFrom; use rstd::prelude::*; use rstd::marker::PhantomData; use parity_codec::{Codec, Encode, Decode}; @@ -120,7 +121,7 @@ pub trait Trait: fees::Trait + balances::Trait + timestamp::Trait { pub struct SimpleAddressDeterminator(PhantomData); impl ContractAddressFor, T::AccountId> for SimpleAddressDeterminator where - T::AccountId: From + AsRef<[u8]> + T::AccountId: UncheckedFrom + AsRef<[u8]> { fn contract_address_for(code_hash: &CodeHash, data: &[u8], origin: &T::AccountId) -> T::AccountId { let data_hash = T::Hashing::hash(data); @@ -130,7 +131,7 @@ where buf.extend_from_slice(data_hash.as_ref()); buf.extend_from_slice(origin.as_ref()); - T::Hashing::hash(&buf[..]).into() + UncheckedFrom::unchecked_from(T::Hashing::hash(&buf[..])) } } diff --git a/srml/contract/src/wasm/mod.rs b/srml/contract/src/wasm/mod.rs index c617725c51782..04428280d05bb 100644 --- a/srml/contract/src/wasm/mod.rs +++ b/srml/contract/src/wasm/mod.rs @@ -580,7 +580,7 @@ mod tests { /// calls `ext_caller`, loads the address from the scratch buffer and /// compares it with the constant 42. - const CODE_CALLER: &'static str = r#" + const CODE_CALLER: &str = r#" (module (import "env" "ext_caller" (func $ext_caller)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) @@ -645,7 +645,7 @@ mod tests { /// calls `ext_address`, loads the address from the scratch buffer and /// compares it with the constant 69. - const CODE_ADDRESS: &'static str = r#" + const CODE_ADDRESS: &str = r#" (module (import "env" "ext_address" (func $ext_address)) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml index ac4ea857de063..de260b622e51e 100644 --- a/srml/grandpa/Cargo.toml +++ b/srml/grandpa/Cargo.toml @@ -16,6 +16,7 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } +consensus = { package = "srml-consensus", path = "../consensus", default-features = false } finality-tracker = { package = "srml-finality-tracker", path = "../finality-tracker", default-features = false } [dev-dependencies] @@ -33,6 +34,7 @@ std = [ "srml-support/std", "primitives/std", "system/std", + "consensus/std", "session/std", "finality-tracker/std", ] diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs index 37d2da66c0887..0715ce034ad7b 100644 --- a/srml/grandpa/src/lib.rs +++ b/srml/grandpa/src/lib.rs @@ -40,10 +40,11 @@ use srml_support::{Parameter, decl_event, decl_storage, decl_module}; use srml_support::dispatch::Result; use srml_support::storage::StorageValue; use srml_support::storage::unhashed::StorageVec; -use primitives::traits::{CurrentHeight, Convert}; -use substrate_primitives::Ed25519AuthorityId; +use primitives::traits::CurrentHeight; +use substrate_primitives::ed25519; use system::ensure_signed; use primitives::traits::MaybeSerializeDebug; +use ed25519::Public as AuthorityId; mod mock; mod tests; @@ -100,7 +101,7 @@ impl RawLog { } impl GrandpaChangeSignal for RawLog - where N: Clone, SessionKey: Clone + Into, + where N: Clone, SessionKey: Clone + Into, { fn as_signal(&self) -> Option> { RawLog::as_signal(self).map(|(delay, next_authorities)| ScheduledChange { @@ -309,7 +310,7 @@ impl Module { } } -impl Module where Ed25519AuthorityId: core::convert::From<::SessionKey> { +impl Module where AuthorityId: core::convert::From<::SessionKey> { /// See if the digest contains any standard scheduled change. pub fn scrape_digest_change(log: &Log) -> Option> @@ -340,19 +341,14 @@ impl Default for SyncedAuthorities { } impl session::OnSessionChange for SyncedAuthorities where - T: Trait, - T: session::Trait, - ::ConvertAccountIdToSessionKey: Convert< - ::AccountId, - ::SessionKey, - >, + T: Trait + consensus::Trait::SessionKey>, + ::Log: From::SessionKey>> { fn on_session_change(_: X, _: bool) { use primitives::traits::Zero; - let next_authorities = >::validators() + let next_authorities = >::authorities() .into_iter() - .map(T::ConvertAccountIdToSessionKey::convert) .map(|key| (key, 1)) // evenly-weighted. .collect::::SessionKey, u64)>>(); @@ -365,22 +361,17 @@ impl session::OnSessionChange for SyncedAuthorities where } impl finality_tracker::OnFinalizationStalled for SyncedAuthorities where - T: Trait, - T: session::Trait, + T: Trait + consensus::Trait::SessionKey>, + ::Log: From::SessionKey>>, T: finality_tracker::Trait, - ::ConvertAccountIdToSessionKey: Convert< - ::AccountId, - ::SessionKey, - >, { fn on_stalled(further_wait: T::BlockNumber) { // when we record old authority sets, we can use `finality_tracker::median` // to figure out _who_ failed. until then, we can't meaningfully guard // against `next == last` the way that normal session changes do. - let next_authorities = >::validators() + let next_authorities = >::authorities() .into_iter() - .map(T::ConvertAccountIdToSessionKey::convert) .map(|key| (key, 1)) // evenly-weighted. .collect::::SessionKey, u64)>>(); diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs index 433602342f5a3..37902cfb17d8c 100644 --- a/srml/grandpa/src/tests.rs +++ b/srml/grandpa/src/tests.rs @@ -193,5 +193,6 @@ fn dispatch_forced_change() { Grandpa::on_finalise(11); header = System::finalise(); } + let _ = header; }); } diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 8530e5bed656d..47fb0fca41734 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -51,7 +51,7 @@ macro_rules! impl_session_change { for_each_tuple!(impl_session_change); pub trait Trait: timestamp::Trait + consensus::Trait { - type ConvertAccountIdToSessionKey: Convert; + type ConvertAccountIdToSessionKey: Convert>; type OnSessionChange: OnSessionChange; type Event: From> + Into<::Event>; } @@ -184,16 +184,17 @@ impl Module { >::put(block_number); } - T::OnSessionChange::on_session_change(time_elapsed, apply_rewards); - // Update any changes in session keys. for (i, v) in Self::validators().into_iter().enumerate() { >::set_authority( i as u32, &>::get(&v) - .unwrap_or_else(|| T::ConvertAccountIdToSessionKey::convert(v)) + .or_else(|| T::ConvertAccountIdToSessionKey::convert(v)) + .unwrap_or_default() ); }; + + T::OnSessionChange::on_session_change(time_elapsed, apply_rewards); } /// Get the time that should have elapsed over a session if everything was working perfectly. diff --git a/subkey/Cargo.toml b/subkey/Cargo.toml index c5006c891684f..d6f8cdd88cdb1 100644 --- a/subkey/Cargo.toml +++ b/subkey/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subkey" -version = "0.1.0" +version = "0.2.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,6 +12,7 @@ tiny-bip39 = "0.6.0" rustc-hex = "2.0" substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39" } schnorrkel = { git = "https://github.com/w3f/schnorrkel" } +hex = "0.3" [features] bench = [] diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml index a9182886167d7..cc131703eb8df 100644 --- a/subkey/src/cli.yml +++ b/subkey/src/cli.yml @@ -1,12 +1,7 @@ name: subkey author: "Parity Team " -about: A substrate key utility +about: Utility for generating and restoring with Substrate keys args: - - ed25519-legacy: - short: o - long: legacy - help: Use legacy, outdated Ed25519 cryptography - takes_value: false - ed25519: short: e long: ed25519 @@ -26,15 +21,41 @@ args: subcommands: - generate: about: Generate a random account - - restore: - about: Gets a public key and a SS58 address from the provided seed phrase + - inspect: + about: Gets a public key and a SS58 address from the provided Secret URI + args: + - uri: + index: 1 + required: true + help: A Key URI to be inspected. May be a secret seed, secret URI (with derivation paths and password), SS58 or public URI. + - sign: + about: Sign a message, provided on STDIN, with a given (secret) key + args: + - suri: + index: 1 + required: true + help: The secret key URI. + - hex: + short: h + long: hex + help: The message on STDIN is hex-encoded data + takes_value: false + - verify: + about: Verify a signature for a message, provided on STDIN, with a given (public or secret) key args: - - seed: + - sig: index: 1 required: true - help: 32 bytes long seed phrase used to restore the public key. If the provided seed is shorter than that, then - it will be right-padded with 0x20 bytes (ASCII space). If the provided seed is longer than - 32 bytes then seed will be truncated. + help: Signature, hex-encoded. + - uri: + index: 2 + required: true + help: The public or secret key URI. + - hex: + short: h + long: hex + help: The message on STDIN is hex-encoded data + takes_value: false - vanity: about: Generate a seed that provides a vanity address args: @@ -47,9 +68,3 @@ subcommands: help: Number of keys to generate takes_value: true default_value: "1" - - query: - about: Query an account by its seed - args: - - seed: - index: 1 - help: The 0x prefixed seed diff --git a/subkey/src/main.rs b/subkey/src/main.rs index 7cc28d857c65d..5caf58d45ba14 100644 --- a/subkey/src/main.rs +++ b/subkey/src/main.rs @@ -21,30 +21,35 @@ extern crate test; extern crate substrate_bip39; extern crate rustc_hex; +use std::io::{stdin, Read}; use clap::load_yaml; use rand::{RngCore, rngs::OsRng}; -use substrate_bip39::{mini_secret_from_entropy}; +use substrate_bip39::mini_secret_from_entropy; use bip39::{Mnemonic, Language, MnemonicType}; -use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay}; +use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec}; use schnorrkel::keys::MiniSecretKey; -use rustc_hex::FromHex; mod vanity; trait Crypto { type Seed: AsRef<[u8]> + AsMut<[u8]> + Sized + Default; - type Pair; + type Pair: Pair; fn generate_phrase() -> String { Mnemonic::new(MnemonicType::Words12, Language::English).phrase().to_owned() } - fn generate_seed() -> Self::Seed; + fn generate_seed() -> Self::Seed { + let mut seed: Self::Seed = Default::default(); + OsRng::new().unwrap().fill_bytes(seed.as_mut()); + seed + } fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed; fn pair_from_seed(seed: &Self::Seed) -> Self::Pair; - fn pair_from_phrase(phrase: &str, password: Option<&str>) -> Self::Pair { + fn pair_from_suri(phrase: &str, password: Option<&str>) -> Self::Pair { Self::pair_from_seed(&Self::seed_from_phrase(phrase, password)) } fn ss58_from_pair(pair: &Self::Pair) -> String; fn public_from_pair(pair: &Self::Pair) -> Vec; + fn seed_from_pair(_pair: &Self::Pair) -> Option<&Self::Seed> { None } fn print_from_seed(seed: &Self::Seed) { let pair = Self::pair_from_seed(seed); println!("Seed 0x{} is account:\n Public key (hex): 0x{}\n Address (SS58): {}", @@ -63,43 +68,43 @@ trait Crypto { Self::ss58_from_pair(&pair) ); } + fn print_from_uri(uri: &str, password: Option<&str>) where ::Public: Sized + Ss58Codec + AsRef<[u8]> { + if let Ok(pair) = Self::Pair::from_string(uri, password) { + let seed_text = Self::seed_from_pair(&pair) + .map_or_else(Default::default, |s| format!("\n Seed: 0x{}", HexDisplay::from(&s.as_ref()))); + println!("Secret Key URI `{}` is account:{}\n Public key (hex): 0x{}\n Address (SS58): {}", + uri, + seed_text, + HexDisplay::from(&Self::public_from_pair(&pair)), + Self::ss58_from_pair(&pair) + ); + } + if let Ok(public) = ::Public::from_string(uri) { + println!("Public Key URI `{}` is account:\n Public key (hex): 0x{}\n Address (SS58): {}", + uri, + HexDisplay::from(&public.as_ref()), + public.to_ss58check() + ); + } + } } -struct OriginalEd25519; +struct Ed25519; -impl Crypto for OriginalEd25519 { +impl Crypto for Ed25519 { type Seed = [u8; 32]; type Pair = ed25519::Pair; - fn generate_seed() -> Self::Seed { - let mut seed = [0u8; 32]; - OsRng::new().unwrap().fill_bytes(&mut seed[..]); - seed - } - fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed { - if password.is_some() { - panic!("Ed25519 original doesn't support passwords") - } - - let mut raw_seed = phrase.as_bytes(); - - if raw_seed.len() > 32 { - raw_seed = &raw_seed[..32]; - println!("seed is too long and will be truncated to: {}", HexDisplay::from(&raw_seed)); - } - - // Copy the raw_seed into a buffer that already contains ' ' 0x20. - // This will effectively get us padding for seeds shorter than 32. - let mut seed = [' ' as u8; 32]; - let len = raw_seed.len().min(32); - seed[..len].copy_from_slice(&raw_seed[..len]); - seed + Sr25519::seed_from_phrase(phrase, password) } - - fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { ed25519::Pair::from_seed(seed) } + fn pair_from_suri(suri: &str, password_override: Option<&str>) -> Self::Pair { + ed25519::Pair::from_legacy_string(suri, password_override) + } + fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { ed25519::Pair::from_seed(seed.clone()) } fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() } fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() } + fn seed_from_pair(pair: &Self::Pair) -> Option<&Self::Seed> { Some(pair.seed()) } } struct Sr25519; @@ -108,12 +113,6 @@ impl Crypto for Sr25519 { type Seed = [u8; 32]; type Pair = sr25519::Pair; - fn generate_seed() -> Self::Seed { - let mut seed = [0u8; 32]; - OsRng::new().unwrap().fill_bytes(&mut seed[..]); - seed - } - fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed { mini_secret_from_entropy( Mnemonic::from_phrase(phrase, Language::English) @@ -127,11 +126,8 @@ impl Crypto for Sr25519 { .to_bytes() } - fn pair_from_phrase(phrase: &str, password: Option<&str>) -> Self::Pair { - sr25519::Pair::from_phrase(phrase, password) - .unwrap_or_else(|| - panic!("Phrase is not a valid BIP-39 phrase: \n {}", phrase) - ) + fn pair_from_suri(suri: &str, password: Option<&str>) -> Self::Pair { + sr25519::Pair::from_string(suri, password).expect("Invalid phrase") } fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { @@ -143,7 +139,10 @@ impl Crypto for Sr25519 { fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() } } -fn execute>(matches: clap::ArgMatches) { +fn execute>(matches: clap::ArgMatches) where + <::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default, + <::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>, +{ let password = matches.value_of("password"); match matches.subcommand() { ("generate", Some(_matches)) => { @@ -156,38 +155,61 @@ fn execute>(matches: clap::ArgMatches) { let key = vanity::generate_key::(&desired).expect("Key generation failed"); C::print_from_seed(&key.seed); } - ("restore", Some(matches)) => { - let phrase = matches.value_of("seed") - .expect("seed parameter is required; thus it can't be None; qed"); - C::print_from_phrase(phrase, password); + ("inspect", Some(matches)) => { + // TODO: Accept public key with derivation path. + let uri = matches.value_of("uri") + .expect("URI parameter is required; thus it can't be None; qed"); + C::print_from_uri(uri, password); }, - ("query", Some(matches)) => { - let seed_data = matches.value_of("seed") - .expect("seed parameter is required; thus it can't be None; qed"); - let seed_data = if seed_data.starts_with("0x") { - &seed_data[2..] + ("sign", Some(matches)) => { + let suri = matches.value_of("suri") + .expect("secret URI parameter is required; thus it can't be None; qed"); + let pair = C::pair_from_suri(suri, password); + let mut message = vec![]; + stdin().lock().read_to_end(&mut message).expect("Error reading from stdin"); + if matches.is_present("hex") { + message = hex::decode(&message).expect("Invalid hex in message"); + } + let sig = pair.sign(&message); + println!("{}", hex::encode(&sig)); + } + ("verify", Some(matches)) => { + let sig_data = matches.value_of("sig") + .expect("signature parameter is required; thus it can't be None; qed"); + let mut sig = <::Pair as Pair>::Signature::default(); + let sig_data = hex::decode(sig_data).expect("signature is invalid hex"); + if sig_data.len() != sig.as_ref().len() { + panic!("signature is an invalid length. {} bytes is not the expected value of {} bytes", sig_data.len(), sig.as_ref().len()); + } + sig.as_mut().copy_from_slice(&sig_data); + let uri = matches.value_of("uri") + .expect("public uri parameter is required; thus it can't be None; qed"); + let pubkey = <::Pair as Pair>::Public::from_string(uri).ok().or_else(|| + ::Pair::from_string(uri, password).ok().map(|p| p.public()) + ).expect("Invalid URI; expecting either a secret URI or a public URI."); + let mut message = vec![]; + stdin().lock().read_to_end(&mut message).expect("Error reading from stdin"); + if matches.is_present("hex") { + message = hex::decode(&message).expect("Invalid hex in message"); + } + if <::Pair as Pair>::verify(&sig, &message, &pubkey) { + println!("Signature verifies correctly.") } else { - seed_data - }; - let seed_data: Vec = seed_data.from_hex().expect("seed is not valid hex"); - let correct_size = ::std::mem::size_of::(); - if seed_data.len() != correct_size { - panic!("Seed is incorrect size. It must be {} bytes for this cryptography", correct_size); + println!("Signature invalid.") } - let mut seed = C::Seed::default(); - seed.as_mut().copy_from_slice(&seed_data); - C::print_from_seed(&seed); - }, + } _ => print_usage(&matches), } } fn main() { let yaml = load_yaml!("cli.yml"); - let matches = clap::App::from_yaml(yaml).get_matches(); + let matches = clap::App::from_yaml(yaml) + .version(env!("CARGO_PKG_VERSION")) + .get_matches(); - if matches.is_present("ed25519original") { - execute::(matches) + if matches.is_present("ed25519") { + execute::(matches) } else { execute::(matches) } diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs index 07486cff4b851..785eb95aa5b20 100644 --- a/subkey/src/vanity.rs +++ b/subkey/src/vanity.rs @@ -104,13 +104,14 @@ pub(super) fn generate_key>(desired: &str) -> Result("j").unwrap().pair.public().to_ss58check().contains("j")); + assert!(generate_key::("j").unwrap().pair.public().to_ss58check().contains("j")); } #[test]