From 14ca726b9028e2ae6ec0a2136564d6774fb8b01a Mon Sep 17 00:00:00 2001 From: raykast Date: Tue, 26 Mar 2024 22:27:02 -0700 Subject: [PATCH] Replace all cargo targets w/ deprecation warnings. --- Cargo.lock | 7204 +---------------------- bot/Cargo.toml | 40 +- bot/src/data_center_info.rs | 148 - bot/src/db.rs | 271 - bot/src/generic_stake_pool.rs | 53 - bot/src/main.rs | 3339 +---------- bot/src/noop_stake_pool.rs | 52 - bot/src/performance_db_utils.rs | 302 - bot/src/rpc_client_utils.rs | 865 --- bot/src/slack_utils.rs | 42 - bot/src/stake_pool.rs | 1332 ----- bot/src/stake_pool_v0.rs | 1198 ---- bot/src/validator_list.rs | 8110 -------------------------- bot/src/validators_app.rs | 342 -- bot/tests/fixtures/spl_stake_pool.so | Bin 488064 -> 0 bytes cli/Cargo.toml | 15 +- cli/README.md | 58 - cli/src/lib.rs | 52 +- cli/src/main.rs | 880 +-- program/Cargo.toml | 12 +- program/src/entrypoint.rs | 16 - program/src/instruction.rs | 194 - program/src/lib.rs | 13 +- program/src/processor.rs | 380 -- program/src/state.rs | 68 - 25 files changed, 16 insertions(+), 24970 deletions(-) delete mode 100644 bot/src/data_center_info.rs delete mode 100644 bot/src/db.rs delete mode 100644 bot/src/generic_stake_pool.rs delete mode 100644 bot/src/noop_stake_pool.rs delete mode 100644 bot/src/performance_db_utils.rs delete mode 100644 bot/src/rpc_client_utils.rs delete mode 100644 bot/src/slack_utils.rs delete mode 100644 bot/src/stake_pool.rs delete mode 100644 bot/src/stake_pool_v0.rs delete mode 100644 bot/src/validator_list.rs delete mode 100644 bot/src/validators_app.rs delete mode 100644 bot/tests/fixtures/spl_stake_pool.so delete mode 100644 cli/README.md delete mode 100644 program/src/entrypoint.rs delete mode 100644 program/src/instruction.rs delete mode 100644 program/src/processor.rs delete mode 100644 program/src/state.rs diff --git a/Cargo.lock b/Cargo.lock index 569a1f97..8ef7da8d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7207 +3,13 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug", -] - -[[package]] -name = "aes-gcm-siv" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" -dependencies = [ - "aead", - "aes", - "cipher 0.3.0", - "ctr", - "polyval", - "subtle", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom 0.2.8", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "anyhow" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" - -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "ascii" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" - -[[package]] -name = "asn1-rs" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6690c370453db30743b373a60ba498fc0d6d83b11f4abfd87a84a075db5dd4" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.17", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "async-compression" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" -dependencies = [ - "brotli", - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-mutex" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "async-trait" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "axum" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43" -dependencies = [ - "async-trait", - "axum-core", - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "hyper", - "itoa 1.0.5", - "matchit", - "memchr", - "mime", - "percent-encoding 2.2.0", - "pin-project-lite", - "serde", - "sync_wrapper", - "tokio", - "tower", - "tower-http", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "mime", - "tower-layer", - "tower-service", -] - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "futures-core", - "getrandom 0.2.8", - "instant", - "pin-project-lite", - "rand 0.8.5", - "tokio", -] - -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "base64ct" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2 1.0.51", - "quote 1.0.23", - "regex", - "rustc-hash", - "shlex", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "blake3" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if 1.0.0", - "constant_time_eq", - "digest 0.10.6", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "borsh" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b13fa9bf62be34702e5ee4526aff22530ae22fe34a0c4290d30d5e4e782e6" -dependencies = [ - "borsh-derive 0.7.2", -] - -[[package]] -name = "borsh" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" -dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", -] - -[[package]] -name = "borsh-derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6aaa45f8eec26e4bf71e7e5492cf53a91591af8f871f422d550e7cc43f6b927" -dependencies = [ - "borsh-derive-internal 0.7.2", - "borsh-schema-derive-internal 0.7.2", - "proc-macro2 1.0.51", - "syn 1.0.107", -] - -[[package]] -name = "borsh-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307f3740906bac2c118a8122fe22681232b244f1369273e45f1156b45c43d2dd" -dependencies = [ - "borsh-derive-internal 0.8.2", - "borsh-schema-derive-internal 0.8.2", - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.51", - "syn 1.0.107", -] - -[[package]] -name = "borsh-derive" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" -dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.51", - "syn 1.0.107", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61621b9d3cca65cc54e2583db84ef912d59ae60d2f04ba61bc0d7fc57556bda2" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2104c73179359431cc98e016998f2f23bc7a05bc53e79741bcba705f30047bc" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b38abfda570837b0949c2c7ebd31417e15607861c23eacb2f668c69f6f3bf7" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae29eb8418fcd46f723f8691a2ac06857d31179d33d2f2d91eb13967de97c728" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "brotli" -version = "3.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] - -[[package]] -name = "bstr" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f0778972c64420fdedc63f09919c8a88bda7b25135357fd25a5d9f3257e832" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" - -[[package]] -name = "bv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" -dependencies = [ - "feature-probe", - "serde", -] - -[[package]] -name = "bytemuck" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "caps" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" -dependencies = [ - "libc", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "serde", - "time 0.1.45", - "wasm-bindgen", - "winapi 0.3.9", -] - -[[package]] -name = "chrono-humanize" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32dce1ea1988dbdf9f9815ff11425828523bd2a134ec0805d2ac8af26ee6096e" -dependencies = [ - "chrono", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "cmake" -version = "0.1.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db34956e100b30725f2eb215f90d4871051239535632f84fea3bc92722c66b7c" -dependencies = [ - "cc", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii", - "byteorder", - "either", - "memchr", - "unreachable", -] - -[[package]] -name = "console" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.42.0", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "console_log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" -dependencies = [ - "log", - "web-sys", -] - -[[package]] -name = "const-oid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" - -[[package]] -name = "const_fn" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" - -[[package]] -name = "constant_time_eq" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "core_affinity" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8a03115cc34fb0d7c321dd154a3914b3ca082ccc5c11d91bf7117dbbe7171f" -dependencies = [ - "kernel32-sys", - "libc", - "num_cpus", - "winapi 0.2.8", -] - -[[package]] -name = "cpufeatures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils", - "memoffset 0.7.1", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "csv" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" -dependencies = [ - "bstr 0.2.17", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", -] - -[[package]] -name = "cxx" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2 1.0.51", - "quote 1.0.23", - "scratch", - "syn 1.0.107", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if 1.0.0", - "num_cpus", - "rayon", -] - -[[package]] -name = "data-encoding" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" - -[[package]] -name = "der" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" -dependencies = [ - "const-oid", -] - -[[package]] -name = "der-parser" -version = "8.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d4bc9b0db0a0df9ae64634ac5bdefb7afcb534e182275ca0beadbe486701c1" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.3", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "derivation-path" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2 1.0.51", - "quote 1.0.23", - "rustc_version 0.4.0", - "syn 1.0.107", -] - -[[package]] -name = "dialoguer" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3c796f3b0b408d9fd581611b47fa850821fcb84aa640b83a3c1a5be2d691f2" -dependencies = [ - "console", - "shell-words", - "tempfile", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer 0.10.3", - "crypto-common", - "subtle", -] - -[[package]] -name = "dir-diff" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2860407d7d7e2e004bb2128510ad9e8d669e76fa005ccf567977b5d71b8b4a0b" -dependencies = [ - "walkdir", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[package]] -name = "displaydoc" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "dlopen" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" -dependencies = [ - "dlopen_derive", - "lazy_static", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "dlopen_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" -dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature", -] +name = "solana-foundation-delegation-program-cli" +version = "1.0.7" [[package]] -name = "ed25519-dalek" +name = "solana-foundation-delegation-program-registry" version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" -dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac 0.12.1", - "sha2 0.10.6", -] [[package]] -name = "educe" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0188e3c3ba8df5753894d54461f0e39bc91741dc5b22e1c46999ec2c71f4e4" -dependencies = [ - "enum-ordinalize", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-iterator" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "enum-ordinalize" -version = "3.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bb1df8b45ecb7ffa78dca1c17a438fb193eb083db0b1b494d2a61bcb5096a" -dependencies = [ - "num-bigint 0.4.3", - "num-traits", - "proc-macro2 1.0.51", - "quote 1.0.23", - "rustc_version 0.4.0", - "syn 1.0.107", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" -dependencies = [ - "once_cell", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "etcd-client" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bfae4cb9cd8c3c2a552d45e155cafd079f385a3b9421b9a010878f44531f1e" -dependencies = [ - "http", - "prost 0.9.0", - "tokio", - "tokio-stream", - "tonic 0.6.2", - "tonic-build 0.6.2", - "tower-service", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fast-math" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" -dependencies = [ - "ieee754", -] - -[[package]] -name = "fastrand" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] - -[[package]] -name = "fd-lock" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef1a30ae415c3a691a4f41afddc2dbcd6d70baf338368d85ebc1e8ed92cedb9" -dependencies = [ - "cfg-if 1.0.0", - "rustix", - "windows-sys 0.45.0", -] - -[[package]] -name = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[package]] -name = "filetime" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "windows-sys 0.42.0", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding 2.2.0", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - -[[package]] -name = "futures" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" - -[[package]] -name = "futures-executor" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" - -[[package]] -name = "futures-macro" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "futures-sink" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" - -[[package]] -name = "futures-task" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" - -[[package]] -name = "futures-util" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" -dependencies = [ - "futures 0.1.31", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" -dependencies = [ - "serde", - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" -dependencies = [ - "aho-corasick", - "bstr 1.2.0", - "fnv", - "log", - "regex", -] - -[[package]] -name = "goauth" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f3d68c8343245dc047982651b5afb8bd659c9959ed72efe5a73bf22684e5fd" -dependencies = [ - "arc-swap", - "futures 0.3.26", - "log", - "reqwest", - "serde", - "serde_derive", - "serde_json", - "simpl", - "smpl_jwt", - "time 0.3.17", - "tokio", -] - -[[package]] -name = "goblin" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32401e89c6446dcd28185931a01b1093726d0356820ac744023e6850689bf926" -dependencies = [ - "log", - "plain", - "scroll", -] - -[[package]] -name = "h2" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util 0.7.2", - "tracing", -] - -[[package]] -name = "hash32" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "headers" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" -dependencies = [ - "base64 0.13.1", - "bitflags", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1 0.10.5", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hidapi" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "798154e4b6570af74899d71155fb0072d5b17e6aa12f39c8ef22c60fb8ec99e7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "winapi 0.3.9", -] - -[[package]] -name = "histogram" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", -] - -[[package]] -name = "http" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" -dependencies = [ - "bytes", - "fnv", - "itoa 1.0.5", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "http-range-header" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa 1.0.5", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-proxy" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" -dependencies = [ - "bytes", - "futures 0.3.26", - "headers", - "http", - "hyper", - "hyper-tls", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "rustls 0.20.8", - "tokio", - "tokio-rustls 0.23.4", -] - -[[package]] -name = "hyper-timeout" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-io-timeout", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "winapi 0.3.9", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" -dependencies = [ - "cxx", - "cxx-build", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "ieee754" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" - -[[package]] -name = "im" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" -dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "rayon", - "serde", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "index_list" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9d968042a4902e08810946fc7cd5851eb75e80301342305af755ca06cb82ce" - -[[package]] -name = "indexmap" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "rayon", -] - -[[package]] -name = "indicatif" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" -dependencies = [ - "console", - "lazy_static", - "number_prefix", - "regex", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" -dependencies = [ - "libc", - "windows-sys 0.45.0", -] - -[[package]] -name = "ipnet" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "itoa" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" - -[[package]] -name = "jobserver" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonrpc-client-transports" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" -dependencies = [ - "derive_more", - "futures 0.3.26", - "jsonrpc-core", - "jsonrpc-pubsub", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "serde", - "serde_json", - "tokio", - "url 1.7.2", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures 0.3.26", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core-client" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" -dependencies = [ - "futures 0.3.26", - "jsonrpc-client-transports", -] - -[[package]] -name = "jsonrpc-derive" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "jsonrpc-http-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" -dependencies = [ - "futures 0.3.26", - "hyper", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.11.2", - "unicase", -] - -[[package]] -name = "jsonrpc-ipc-server" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" -dependencies = [ - "futures 0.3.26", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot 0.11.2", - "tower-service", -] - -[[package]] -name = "jsonrpc-pubsub" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" -dependencies = [ - "futures 0.3.26", - "jsonrpc-core", - "lazy_static", - "log", - "parking_lot 0.11.2", - "rand 0.7.3", - "serde", -] - -[[package]] -name = "jsonrpc-server-utils" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" -dependencies = [ - "bytes", - "futures 0.3.26", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio", - "tokio-stream", - "tokio-util 0.6.10", - "unicase", -] - -[[package]] -name = "keccak" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - -[[package]] -name = "libm" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" - -[[package]] -name = "librocksdb-sys" -version = "0.6.1+6.28.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc587013734dadb7cf23468e531aa120788b87243648be42e2d3a072186291" -dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", -] - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libz-sys" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "lru" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "lz4" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" -dependencies = [ - "libc", - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "matchit" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memmap2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "min-max-heap" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" -dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi 0.3.9", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "modular-bitfield" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "net2" -version = "0.2.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nom8" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" -dependencies = [ - "memchr", -] - -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "num" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" -dependencies = [ - "num-bigint 0.2.6", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "num-format" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" -dependencies = [ - "arrayvec", - "itoa 1.0.5", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg", - "num-bigint 0.2.6", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" -dependencies = [ - "hermit-abi 0.2.6", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" -dependencies = [ - "proc-macro-crate 1.3.0", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" -dependencies = [ - "bitflags", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-src" -version = "111.24.0+1.1.1s" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" -dependencies = [ - "autocfg", - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf9b1c4e9a6c4de793c632496fa490bdc0e1eea73f0c91394f7b6990935d22" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures 0.3.26", - "js-sys", - "lazy_static", - "percent-encoding 2.2.0", - "pin-project", - "rand 0.8.5", - "thiserror", -] - -[[package]] -name = "ouroboros" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71643f290d126e18ac2598876d01e1d57aed164afc78fdb6e2a0c6589a1f6662" -dependencies = [ - "aliasable", - "ouroboros_macro", - "stable_deref_trait", -] - -[[package]] -name = "ouroboros_macro" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9a247206016d424fe8497bc611e510887af5c261fbbf977877c4bb55ca4d82" -dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "parity-tokio-ipc" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" -dependencies = [ - "futures 0.3.26", - "libc", - "log", - "rand 0.7.3", - "tokio", - "winapi 0.3.9", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi 0.3.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "smallvec", - "windows-sys 0.45.0", -] - -[[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac", -] - -[[package]] -name = "pbkdf2" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" -dependencies = [ - "digest 0.10.6", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "percentage" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" -dependencies = [ - "num", -] - -[[package]] -name = "pest" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ab62d2fa33726dbe6321cc97ef96d8cde531e3eeaf858a058de53a8a6d40d8f" -dependencies = [ - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf026e2d0581559db66d837fe5242320f525d85c76283c61f4d51a1238d65ea" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b27bd18aa01d91c8ed2b61ea23406a676b42d82609c6e2581fba42f0c15f17f" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "pest_meta" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02b677c1859756359fc9983c2e56a0237f18624a3789528804406b7e915e5d" -dependencies = [ - "once_cell", - "pest", - "sha2 0.10.6", -] - -[[package]] -name = "petgraph" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pin-project" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" -dependencies = [ - "der", - "spki", - "zeroize", -] - -[[package]] -name = "pkg-config" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78" -dependencies = [ - "proc-macro2 1.0.51", - "syn 1.0.107", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" -dependencies = [ - "bytes", - "prost-derive 0.9.0", -] - -[[package]] -name = "prost" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" -dependencies = [ - "bytes", - "prost-derive 0.10.1", -] - -[[package]] -name = "prost-build" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" -dependencies = [ - "bytes", - "heck 0.3.3", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost 0.9.0", - "prost-types 0.9.0", - "regex", - "tempfile", - "which", -] - -[[package]] -name = "prost-build" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" -dependencies = [ - "bytes", - "cfg-if 1.0.0", - "cmake", - "heck 0.4.1", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost 0.10.4", - "prost-types 0.10.1", - "regex", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "prost-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "prost-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" -dependencies = [ - "bytes", - "prost 0.9.0", -] - -[[package]] -name = "prost-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" -dependencies = [ - "bytes", - "prost 0.10.4", -] - -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding 2.2.0", -] - -[[package]] -name = "quinn" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "fxhash", - "quinn-proto", - "quinn-udp", - "rustls 0.20.8", - "thiserror", - "tokio", - "tracing", - "webpki 0.22.0", -] - -[[package]] -name = "quinn-proto" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce546b9688f767a57530652488420d419a8b1f44a478b451c3d1ab6d992a55" -dependencies = [ - "bytes", - "fxhash", - "rand 0.8.5", - "ring", - "rustls 0.20.8", - "rustls-native-certs", - "rustls-pemfile 0.2.1", - "slab", - "thiserror", - "tinyvec", - "tracing", - "webpki 0.22.0", -] - -[[package]] -name = "quinn-udp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07946277141531aea269befd949ed16b2c85a780ba1043244eda0969e538e54" -dependencies = [ - "futures-util", - "libc", - "quinn-proto", - "socket2", - "tokio", - "tracing", -] - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" -dependencies = [ - "proc-macro2 1.0.51", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.8", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "rcgen" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" -dependencies = [ - "pem", - "ring", - "time 0.3.17", - "yasna", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.8", - "redox_syscall", - "thiserror", -] - -[[package]] -name = "reed-solomon-erasure" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fe31452b684b8b33f65f8730c8b8812c3f5a0bb8a096934717edb1ac488641" -dependencies = [ - "cc", - "libc", - "libm", - "parking_lot 0.11.2", - "smallvec", - "spin 0.9.4", -] - -[[package]] -name = "regex" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - -[[package]] -name = "regex-syntax" -version = "0.6.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "reqwest" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" -dependencies = [ - "async-compression", - "base64 0.21.0", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding 2.2.0", - "pin-project-lite", - "rustls 0.20.8", - "rustls-pemfile 1.0.2", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tokio-rustls 0.23.4", - "tokio-util 0.7.2", - "tower-service", - "url 2.3.1", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "retain_mut" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "rocksdb" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[package]] -name = "rpassword" -version = "6.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956" -dependencies = [ - "libc", - "serde", - "serde_json", - "winapi 0.3.9", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.16", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.36.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.45.0", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct 0.7.0", - "webpki 0.22.0", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.2", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" -dependencies = [ - "base64 0.21.0", -] - -[[package]] -name = "rustversion" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" - -[[package]] -name = "ryu" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" -dependencies = [ - "windows-sys 0.42.0", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" - -[[package]] -name = "scroll" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec" -dependencies = [ - "scroll_derive", -] - -[[package]] -name = "scroll_derive" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "serde_json" -version = "1.0.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" -dependencies = [ - "itoa 1.0.5", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa 1.0.5", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" -dependencies = [ - "digest 0.10.6", - "keccak", -] - -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "signal-hook" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "simpl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a30f10c911c0355f80f1c2faa8096efc4a58cdf8590b954d5b395efa071c711" - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "slab" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" - -[[package]] -name = "smpl_jwt" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4370044f8b20f944e05c35d77edd3518e6f21fc4de77e593919f287c6a3f428a" -dependencies = [ - "base64 0.13.1", - "log", - "openssl", - "serde", - "serde_derive", - "serde_json", - "simpl", - "time 0.2.27", -] - -[[package]] -name = "socket2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" -dependencies = [ - "base64 0.13.1", - "bytes", - "futures 0.3.26", - "httparse", - "log", - "rand 0.8.5", - "sha-1 0.9.8", -] - -[[package]] -name = "solana-account-decoder" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd16f344fe90259904100d960a347db6026f83ebca89b34e03f9754b10ed6bb" -dependencies = [ - "Inflector", - "base64 0.13.1", - "bincode", - "bs58", - "bv", - "lazy_static", - "serde", - "serde_derive", - "serde_json", - "solana-config-program", - "solana-sdk", - "solana-vote-program", - "spl-token", - "spl-token-2022", - "thiserror", - "zstd", -] - -[[package]] -name = "solana-address-lookup-table-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3ff449d6c6c5065c94c594ba7448b1dbef2ec22bfb177acca025a9a9e46b22" -dependencies = [ - "bincode", - "bytemuck", - "log", - "num-derive", - "num-traits", - "rustc_version 0.4.0", - "serde", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", -] - -[[package]] -name = "solana-banks-client" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20774323f93fdc96baa3d66ceff3c9fb3f29bed9c81942e047f2f4874ae6b29e" -dependencies = [ - "borsh 0.9.3", - "futures 0.3.26", - "solana-banks-interface", - "solana-program", - "solana-sdk", - "tarpc", - "thiserror", - "tokio", - "tokio-serde", -] - -[[package]] -name = "solana-banks-interface" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea65ba6fc9fd555c58fdf0955be334c81382a30b5b9167a29bc876cf8adb9329" -dependencies = [ - "serde", - "solana-sdk", - "tarpc", -] - -[[package]] -name = "solana-banks-server" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83eb9f108a75636bebdf52d778f4cbc7ad48ca5e76df0b97e075b55cc724ecd" -dependencies = [ - "bincode", - "crossbeam-channel", - "futures 0.3.26", - "solana-banks-interface", - "solana-client", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "tarpc", - "tokio", - "tokio-serde", - "tokio-stream", -] - -[[package]] -name = "solana-bloom" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0da93e2b6cd72afe2d113a02d3b4962d69e2496c5a178cb76399826b5f759a" -dependencies = [ - "bv", - "fnv", - "log", - "rand 0.7.3", - "rayon", - "rustc_version 0.4.0", - "serde", - "serde_derive", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-sdk", -] - -[[package]] -name = "solana-bpf-loader-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c62bf3f88e1d0821c85584c695241be0a7a0ab71c92ea16aa330f22babaa30" -dependencies = [ - "bincode", - "byteorder", - "libsecp256k1", - "log", - "solana-measure", - "solana-metrics", - "solana-program-runtime", - "solana-sdk", - "solana-zk-token-sdk", - "solana_rbpf", - "thiserror", -] - -[[package]] -name = "solana-bucket-map" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e5e2ee1fba469478e157d779c481b80ea82692b3c856250bc65d509958e9b" -dependencies = [ - "log", - "memmap2", - "modular-bitfield", - "rand 0.7.3", - "solana-measure", - "solana-sdk", - "tempfile", -] - -[[package]] -name = "solana-clap-utils" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1cd75f21f4abda4fc38a6f7cd5f4caf705a38db9c41575296dcccce2758a973" -dependencies = [ - "chrono", - "clap", - "rpassword", - "solana-perf", - "solana-remote-wallet", - "solana-sdk", - "thiserror", - "tiny-bip39", - "uriparse", - "url 2.3.1", -] - -[[package]] -name = "solana-cli-config" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6e2c5b2bd3026067fb721eae8d97f6c9bf241b5ba9e0b3fc12b85a5792a9a1" -dependencies = [ - "dirs-next", - "lazy_static", - "serde", - "serde_derive", - "serde_yaml", - "solana-clap-utils", - "solana-sdk", - "url 2.3.1", -] - -[[package]] -name = "solana-cli-output" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4595f84b8d3d728e3aa19a7677c27b8f65c7158dc748391fb3f3d059afeab3de" -dependencies = [ - "Inflector", - "base64 0.13.1", - "chrono", - "clap", - "console", - "humantime", - "indicatif", - "semver 1.0.16", - "serde", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-cli-config", - "solana-client", - "solana-sdk", - "solana-transaction-status", - "solana-vote-program", - "spl-memo", -] - -[[package]] -name = "solana-client" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d075dd1c5c213a9f50999d92d65a98ee124b622cd991ebfbcb75379501fd6b58" -dependencies = [ - "async-mutex", - "async-trait", - "base64 0.13.1", - "bincode", - "bs58", - "bytes", - "clap", - "crossbeam-channel", - "enum_dispatch", - "futures 0.3.26", - "futures-util", - "indexmap", - "indicatif", - "itertools", - "jsonrpc-core", - "lazy_static", - "log", - "lru", - "quinn", - "quinn-proto", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rayon", - "reqwest", - "rustls 0.20.8", - "semver 1.0.16", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-faucet", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-sdk", - "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "spl-token-2022", - "thiserror", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url 2.3.1", -] - -[[package]] -name = "solana-compute-budget-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9680ee7824d272016106dae1b05a542420776bb1df1bda70ac1154169e00cf0b" -dependencies = [ - "solana-program-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-config-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7896f0b395f048d95fd37690ff9f8caa634660bd955c2172bfa847cc44cf8cc" -dependencies = [ - "bincode", - "chrono", - "serde", - "serde_derive", - "solana-program-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-core" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49dc69c95b1fa2a16e3c0c1665a71487c32ce811d8a52d58ab9d1d3a3cad8e3" -dependencies = [ - "ahash", - "base64 0.13.1", - "bincode", - "bs58", - "chrono", - "crossbeam-channel", - "dashmap", - "etcd-client", - "fs_extra", - "histogram", - "itertools", - "log", - "lru", - "min-max-heap", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rayon", - "retain_mut", - "rustc_version 0.4.0", - "serde", - "serde_derive", - "solana-address-lookup-table-program", - "solana-bloom", - "solana-client", - "solana-entry", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-geyser-plugin-manager", - "solana-gossip", - "solana-ledger", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-perf", - "solana-poh", - "solana-program-runtime", - "solana-rayon-threadlimit", - "solana-replica-lib", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "sys-info", - "sysctl", - "tempfile", - "thiserror", - "tokio", - "trees", -] - -[[package]] -name = "solana-download-utils" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d80ac0aacc1c24869560c54a8c27aecf6413b32ae26e6c96f1adea9491bf492" -dependencies = [ - "console", - "indicatif", - "log", - "reqwest", - "solana-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-entry" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6218ca8e0d56a24bc15b3bd928c3c6dcfe9aeb37043e5bd282f6b509dfffd011" -dependencies = [ - "bincode", - "crossbeam-channel", - "dlopen", - "dlopen_derive", - "log", - "rand 0.7.3", - "rayon", - "serde", - "solana-measure", - "solana-merkle-tree", - "solana-metrics", - "solana-perf", - "solana-rayon-threadlimit", - "solana-sdk", -] - -[[package]] -name = "solana-faucet" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba8e6d7b099c1d56ffaa540ee98bf09ec4c8b476b3ae00b6d6e844c51a95da0" -dependencies = [ - "bincode", - "byteorder", - "clap", - "crossbeam-channel", - "log", - "serde", - "serde_derive", - "solana-clap-utils", - "solana-cli-config", - "solana-logger", - "solana-metrics", - "solana-sdk", - "solana-version", - "spl-memo", - "thiserror", - "tokio", -] - -[[package]] -name = "solana-foundation-delegation-program-cli" -version = "1.0.7" -dependencies = [ - "clap", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-cli-config", - "solana-client", - "solana-foundation-delegation-program-registry", - "solana-logger", - "solana-remote-wallet", - "solana-sdk", - "tokio", -] - -[[package]] -name = "solana-foundation-delegation-program-registry" -version = "1.0.1" -dependencies = [ - "assert_matches", - "borsh 0.9.3", - "borsh-derive 0.9.3", - "solana-program", - "solana-program-test", - "solana-sdk", -] - -[[package]] -name = "solana-frozen-abi" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f845c62a8aee31ad250c08345818a7b0da10ebf7e1e5fdf5f5e735b6dee766" -dependencies = [ - "bs58", - "bv", - "generic-array", - "im", - "lazy_static", - "log", - "memmap2", - "rustc_version 0.4.0", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.6", - "solana-frozen-abi-macro", - "thiserror", -] - -[[package]] -name = "solana-frozen-abi-macro" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ebd2c533f11262885f1131e52ea6136e7c72fffb18c858ffee05964c5d2beb7" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "rustc_version 0.4.0", - "syn 1.0.107", -] - -[[package]] -name = "solana-genesis-utils" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d28c521d0f196edfc95d51ccda658512f0488c4b66574e702e76de8aa4997" -dependencies = [ - "solana-download-utils", - "solana-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-geyser-plugin-interface" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615c43289ff7b371fcacad0e560911eb3a5d95d491dd8b65622d534fa8463bb0" -dependencies = [ - "log", - "solana-sdk", - "solana-transaction-status", - "thiserror", -] - -[[package]] -name = "solana-geyser-plugin-manager" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1ee2da7e94b52f98d90a983a92423544262a0bf16877ded694bfdc02b6730b" -dependencies = [ - "bs58", - "crossbeam-channel", - "json5", - "libloading", - "log", - "serde_json", - "solana-geyser-plugin-interface", - "solana-measure", - "solana-metrics", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "solana-transaction-status", - "thiserror", -] - -[[package]] -name = "solana-gossip" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f4a5699c9283702244220754ae510eacdeaca904c433310bda706cdbd860da" -dependencies = [ - "bincode", - "bv", - "clap", - "crossbeam-channel", - "flate2", - "indexmap", - "itertools", - "log", - "lru", - "matches", - "num-traits", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rayon", - "rustc_version 0.4.0", - "serde", - "serde_bytes", - "serde_derive", - "solana-bloom", - "solana-clap-utils", - "solana-client", - "solana-entry", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-ledger", - "solana-logger", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-perf", - "solana-rayon-threadlimit", - "solana-runtime", - "solana-sdk", - "solana-streamer", - "solana-version", - "solana-vote-program", - "thiserror", -] - -[[package]] -name = "solana-ledger" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "800b1a46a0adce218456d1a1ccf5f4cdd2bf9994dbb7513f62622cb65567df8a" -dependencies = [ - "bincode", - "bitflags", - "byteorder", - "chrono", - "chrono-humanize", - "crossbeam-channel", - "fs_extra", - "futures 0.3.26", - "itertools", - "lazy_static", - "libc", - "log", - "lru", - "num_cpus", - "num_enum", - "prost 0.10.4", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rayon", - "reed-solomon-erasure", - "rocksdb", - "rustc_version 0.4.0", - "serde", - "serde_bytes", - "sha2 0.10.6", - "solana-account-decoder", - "solana-bpf-loader-program", - "solana-entry", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-measure", - "solana-metrics", - "solana-perf", - "solana-program-runtime", - "solana-rayon-threadlimit", - "solana-runtime", - "solana-sdk", - "solana-storage-bigtable", - "solana-storage-proto", - "solana-transaction-status", - "solana-vote-program", - "spl-token", - "spl-token-2022", - "tempfile", - "thiserror", - "tokio", - "tokio-stream", - "trees", -] - -[[package]] -name = "solana-logger" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6829405e67e41d2598ad3b5fb3fab83798332897d08b6a43df1b124e12aae43" -dependencies = [ - "env_logger", - "lazy_static", - "log", -] - -[[package]] -name = "solana-measure" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba179113437b5d1dded5075f954d5a9220fe2fad67726a096be396e7cb76ab" -dependencies = [ - "log", - "solana-sdk", -] - -[[package]] -name = "solana-merkle-tree" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cce89ffaa53e0f446e100fe799729b4a311c1f6d00d9c01ec41ef177d83ccc" -dependencies = [ - "fast-math", - "matches", - "solana-program", -] - -[[package]] -name = "solana-metrics" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c49cc205c220e613ec3345444494227bac59ad859f6666d7407b3179b65b279" -dependencies = [ - "crossbeam-channel", - "gethostname", - "lazy_static", - "log", - "reqwest", - "solana-sdk", -] - -[[package]] -name = "solana-net-utils" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fa45807d26420120db6bdde956d841c1854051c757a8d25bc7de4e7e65c946" -dependencies = [ - "bincode", - "clap", - "crossbeam-channel", - "log", - "nix", - "rand 0.7.3", - "serde", - "serde_derive", - "socket2", - "solana-logger", - "solana-sdk", - "solana-version", - "tokio", - "url 2.3.1", -] - -[[package]] -name = "solana-notifier" -version = "1.14.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "108585d6088e92cc6dea51068bd816189275d59ab2c69c2eff0989cbd8d5b4c0" -dependencies = [ - "log", - "reqwest", - "serde_json", -] - -[[package]] -name = "solana-perf" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903ee53296c6ee8903fcc2684aead757be92f7ba9bfe6dd66990b55122acbccd" -dependencies = [ - "ahash", - "bincode", - "bv", - "caps", - "curve25519-dalek", - "dlopen", - "dlopen_derive", - "fnv", - "lazy_static", - "libc", - "log", - "nix", - "rand 0.7.3", - "rayon", - "serde", - "solana-metrics", - "solana-rayon-threadlimit", - "solana-sdk", - "solana-vote-program", -] - -[[package]] -name = "solana-poh" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0daa2b5e3686c4ec07cd7c7be655da2de2bd1d44a200220ed9b7acb4489269e" -dependencies = [ - "core_affinity", - "crossbeam-channel", - "log", - "solana-entry", - "solana-ledger", - "solana-measure", - "solana-metrics", - "solana-runtime", - "solana-sdk", - "solana-sys-tuner", - "thiserror", -] - -[[package]] -name = "solana-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b218d6f58a793dfd2a7df80c5e9d289d1d78a22dc4975aa9962b9726f5c182ae" -dependencies = [ - "base64 0.13.1", - "bincode", - "bitflags", - "blake3", - "borsh 0.9.3", - "borsh-derive 0.9.3", - "bs58", - "bv", - "bytemuck", - "console_error_panic_hook", - "console_log", - "curve25519-dalek", - "getrandom 0.1.16", - "itertools", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "num-derive", - "num-traits", - "parking_lot 0.12.1", - "rand 0.7.3", - "rustc_version 0.4.0", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.6", - "sha3 0.10.6", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-sdk-macro", - "thiserror", - "wasm-bindgen", -] - -[[package]] -name = "solana-program-runtime" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6571d34ae29ddff6aa5e99e5f22163e4194ca93be7ab5f61a4d86a0579b0d90" -dependencies = [ - "base64 0.13.1", - "bincode", - "enum-iterator", - "itertools", - "libc", - "libloading", - "log", - "num-derive", - "num-traits", - "rustc_version 0.4.0", - "serde", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-measure", - "solana-sdk", - "thiserror", -] - -[[package]] -name = "solana-program-test" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449ef5718c7489dc5d977877b992b968b277636efb0731f427ab8161eb5c2d04" -dependencies = [ - "async-trait", - "base64 0.13.1", - "bincode", - "chrono-humanize", - "log", - "serde", - "solana-banks-client", - "solana-banks-server", - "solana-bpf-loader-program", - "solana-logger", - "solana-program-runtime", - "solana-runtime", - "solana-sdk", - "solana-vote-program", - "thiserror", - "tokio", -] - -[[package]] -name = "solana-rayon-threadlimit" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670aec12c5465ea0b0e9548dab14df88ff730a0ea5f1697232de9266b0a4858c" -dependencies = [ - "lazy_static", - "num_cpus", -] - -[[package]] -name = "solana-remote-wallet" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64434153aead05974538271e5895d57dba678fb7d2fa0c5ae5c8f8bb437ab15c" -dependencies = [ - "console", - "dialoguer", - "hidapi", - "log", - "num-derive", - "num-traits", - "parking_lot 0.12.1", - "qstring", - "semver 1.0.16", - "solana-sdk", - "thiserror", - "uriparse", -] - -[[package]] -name = "solana-replica-lib" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc0edd22473b56c232e6c403705f6fa0d8185d1945d67ded6f1632f2e5bf509" -dependencies = [ - "crossbeam-channel", - "futures-util", - "log", - "prost 0.10.4", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "tokio", - "tonic 0.7.2", - "tonic-build 0.7.2", -] - -[[package]] -name = "solana-rpc" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e42d89151df3a4eb767661eccac2eedb5dabba71db57b2a3b942e5c01da75d" -dependencies = [ - "base64 0.13.1", - "bincode", - "bs58", - "crossbeam-channel", - "dashmap", - "itertools", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-http-server", - "jsonrpc-pubsub", - "libc", - "log", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "soketto", - "solana-account-decoder", - "solana-client", - "solana-entry", - "solana-faucet", - "solana-gossip", - "solana-ledger", - "solana-measure", - "solana-metrics", - "solana-perf", - "solana-poh", - "solana-rayon-threadlimit", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "solana-storage-bigtable", - "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "spl-token", - "spl-token-2022", - "stream-cancel", - "thiserror", - "tokio", - "tokio-util 0.6.10", -] - -[[package]] -name = "solana-runtime" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d114828b6e3357d3c0fed4c39f7c726fc28fc8d05286b7586fee359d6fd4e978" -dependencies = [ - "arrayref", - "bincode", - "blake3", - "bv", - "bytemuck", - "byteorder", - "bzip2", - "crossbeam-channel", - "dashmap", - "dir-diff", - "flate2", - "fnv", - "im", - "index_list", - "itertools", - "lazy_static", - "log", - "lz4", - "memmap2", - "num-derive", - "num-traits", - "num_cpus", - "ouroboros", - "rand 0.7.3", - "rayon", - "regex", - "rustc_version 0.4.0", - "serde", - "serde_derive", - "solana-address-lookup-table-program", - "solana-bucket-map", - "solana-compute-budget-program", - "solana-config-program", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-measure", - "solana-metrics", - "solana-program-runtime", - "solana-rayon-threadlimit", - "solana-sdk", - "solana-stake-program", - "solana-vote-program", - "solana-zk-token-proof-program", - "solana-zk-token-sdk", - "strum", - "strum_macros", - "symlink", - "tar", - "tempfile", - "thiserror", - "zstd", -] - -[[package]] -name = "solana-sdk" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad11e736b23ba40f3e245c2d558a2bb57e733a2c6bb6874d48f3efc6c16b435" -dependencies = [ - "assert_matches", - "base64 0.13.1", - "bincode", - "bitflags", - "borsh 0.9.3", - "bs58", - "bytemuck", - "byteorder", - "chrono", - "derivation-path", - "digest 0.10.6", - "ed25519-dalek", - "ed25519-dalek-bip32", - "generic-array", - "hmac 0.12.1", - "itertools", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2", - "num-derive", - "num-traits", - "pbkdf2 0.10.1", - "qstring", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rustc_version 0.4.0", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "sha2 0.10.6", - "sha3 0.10.6", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-logger", - "solana-program", - "solana-sdk-macro", - "thiserror", - "uriparse", - "wasm-bindgen", -] - -[[package]] -name = "solana-sdk-macro" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ea5bf7eca00bc00e34453e11ee0f35cc15dab08c7167b5b01ef88623628246" -dependencies = [ - "bs58", - "proc-macro2 1.0.51", - "quote 1.0.23", - "rustversion", - "syn 1.0.107", -] - -[[package]] -name = "solana-send-transaction-service" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f06b9cf7e816c3fa2ff2fd41868ebda34c3a8889f1d4630c84571e4cff3bb310" -dependencies = [ - "crossbeam-channel", - "log", - "solana-client", - "solana-measure", - "solana-metrics", - "solana-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-stake-o-matic" -version = "0.0.0" -dependencies = [ - "base64 0.13.1", - "bincode", - "borsh 0.9.3", - "bs58", - "chrono", - "clap", - "csv", - "indicatif", - "itertools", - "log", - "num-format", - "openssl", - "regex", - "reqwest", - "semver 1.0.16", - "serde", - "serde_json", - "serde_yaml", - "solana-account-decoder", - "solana-clap-utils", - "solana-cli-config", - "solana-client", - "solana-foundation-delegation-program-cli", - "solana-foundation-delegation-program-registry", - "solana-logger", - "solana-notifier", - "solana-sdk", - "solana-transaction-status", - "solana-validator", - "solana-vote-program", - "spl-stake-pool", - "spl-token", - "thiserror", -] - -[[package]] -name = "solana-stake-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d26d40d4f0dc68d41613cfbd475c28ce0eea09d21482dde6ad77d90a05ea07a" -dependencies = [ - "bincode", - "log", - "num-derive", - "num-traits", - "rustc_version 0.4.0", - "serde", - "serde_derive", - "solana-config-program", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-metrics", - "solana-program-runtime", - "solana-sdk", - "solana-vote-program", - "thiserror", -] - -[[package]] -name = "solana-storage-bigtable" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7ffcbbc2c88aaa85b8aad51843d22260f33c28457337962cbb91e479817de2b" -dependencies = [ - "backoff", - "bincode", - "bytes", - "bzip2", - "enum-iterator", - "flate2", - "futures 0.3.26", - "goauth", - "http", - "hyper", - "hyper-proxy", - "log", - "openssl", - "prost 0.10.4", - "prost-types 0.10.1", - "serde", - "serde_derive", - "smpl_jwt", - "solana-metrics", - "solana-sdk", - "solana-storage-proto", - "solana-transaction-status", - "thiserror", - "tokio", - "tonic 0.7.2", - "zstd", -] - -[[package]] -name = "solana-storage-proto" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84143eba3c91d1d0796ce49b8a0942050248f4d8dba8125fdca79e0d4aa3c8d0" -dependencies = [ - "bincode", - "bs58", - "prost 0.10.4", - "serde", - "solana-account-decoder", - "solana-sdk", - "solana-transaction-status", - "tonic-build 0.7.2", -] - -[[package]] -name = "solana-streamer" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29839f37991646765c4baff237d734623fe77d8c32d3f97406041ef1c99e66a1" -dependencies = [ - "crossbeam-channel", - "futures-util", - "histogram", - "indexmap", - "itertools", - "libc", - "log", - "nix", - "pem", - "percentage", - "pkcs8", - "quinn", - "rand 0.7.3", - "rcgen", - "rustls 0.20.8", - "solana-metrics", - "solana-perf", - "solana-sdk", - "thiserror", - "tokio", - "x509-parser", -] - -[[package]] -name = "solana-sys-tuner" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b084b9e68abacdd2d171ec15c8cddaa5fc0442c6c50f9f6ed97fddb4d774714" -dependencies = [ - "clap", - "libc", - "log", - "nix", - "solana-logger", - "solana-version", - "sysctl", - "unix_socket2", - "users", -] - -[[package]] -name = "solana-test-validator" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5472985ac72ee4a3ccb51787667c29a22efb14d63f7fb41c9713ad136504f19a" -dependencies = [ - "base64 0.13.1", - "log", - "serde_derive", - "serde_json", - "solana-cli-output", - "solana-client", - "solana-core", - "solana-gossip", - "solana-ledger", - "solana-logger", - "solana-net-utils", - "solana-program-test", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "solana-streamer", - "tokio", -] - -[[package]] -name = "solana-transaction-status" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2416f64ddcd0dd8177242156d31c477a87f08b521423c12834b85a68446606ff" -dependencies = [ - "Inflector", - "base64 0.13.1", - "bincode", - "borsh 0.9.3", - "bs58", - "lazy_static", - "log", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-measure", - "solana-metrics", - "solana-sdk", - "solana-vote-program", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "spl-token-2022", - "thiserror", -] - -[[package]] -name = "solana-validator" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11f6df35170daee95cf97d2b36a6386d479ceaca56899fd05eeff397acd2d2a" -dependencies = [ - "chrono", - "clap", - "console", - "core_affinity", - "crossbeam-channel", - "fd-lock", - "indicatif", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-ipc-server", - "jsonrpc-server-utils", - "libc", - "log", - "num_cpus", - "rand 0.7.3", - "serde", - "serde_json", - "signal-hook", - "solana-clap-utils", - "solana-cli-config", - "solana-client", - "solana-core", - "solana-download-utils", - "solana-entry", - "solana-faucet", - "solana-genesis-utils", - "solana-gossip", - "solana-ledger", - "solana-logger", - "solana-metrics", - "solana-net-utils", - "solana-perf", - "solana-poh", - "solana-replica-lib", - "solana-rpc", - "solana-runtime", - "solana-sdk", - "solana-send-transaction-service", - "solana-storage-bigtable", - "solana-streamer", - "solana-test-validator", - "solana-version", - "solana-vote-program", - "symlink", - "tikv-jemallocator", -] - -[[package]] -name = "solana-version" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76876be993e1b9bc84ade46031401a5a3fe12398be6541adee08f82752f591f7" -dependencies = [ - "log", - "rustc_version 0.4.0", - "semver 1.0.16", - "serde", - "serde_derive", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-sdk", -] - -[[package]] -name = "solana-vote-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63290a58e00fb083547e29e05165bcd2d32f3287da0c2edf997c1c284e78470" -dependencies = [ - "bincode", - "log", - "num-derive", - "num-traits", - "rustc_version 0.4.0", - "serde", - "serde_derive", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-metrics", - "solana-program-runtime", - "solana-sdk", - "thiserror", -] - -[[package]] -name = "solana-zk-token-proof-program" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecc69567a1382483176a5a9c034b98ff7669522215f01259ac8aaa67e984f86" -dependencies = [ - "bytemuck", - "getrandom 0.1.16", - "num-derive", - "num-traits", - "solana-program-runtime", - "solana-sdk", - "solana-zk-token-sdk", -] - -[[package]] -name = "solana-zk-token-sdk" -version = "1.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f631034507984b0199e6e6be15d8c8bda33607b523094139b6ece91cd267c733" -dependencies = [ - "aes-gcm-siv", - "arrayref", - "base64 0.13.1", - "bincode", - "bytemuck", - "byteorder", - "cipher 0.4.3", - "curve25519-dalek", - "getrandom 0.1.16", - "lazy_static", - "merlin", - "num-derive", - "num-traits", - "rand 0.7.3", - "serde", - "serde_json", - "sha3 0.9.1", - "solana-program", - "solana-sdk", - "subtle", - "thiserror", - "zeroize", -] - -[[package]] -name = "solana_rbpf" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41e138f6d6d4eb6a65f8e9f01ca620bc9907d79648d5038a69dd3f07b6ed3f1f" -dependencies = [ - "byteorder", - "combine", - "goblin", - "hash32", - "libc", - "log", - "rand 0.7.3", - "rustc-demangle", - "scroll", - "thiserror", - "time 0.1.45", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" - -[[package]] -name = "spki" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "spl-associated-token-account" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a33ecc83137583902c3e13c02f34151c8b2f2b74120f9c2b3ff841953e083d" -dependencies = [ - "assert_matches", - "borsh 0.9.3", - "num-derive", - "num-traits", - "solana-program", - "spl-token", - "spl-token-2022", - "thiserror", -] - -[[package]] -name = "spl-math" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ecdd22720b9e5ab578a862928f5010ca197419502bdace600ccd5d23dae9352" -dependencies = [ - "borsh 0.7.2", - "borsh-derive 0.8.2", - "num-derive", - "num-traits", - "solana-program", - "thiserror", - "uint", -] - -[[package]] -name = "spl-memo" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" -dependencies = [ - "solana-program", -] - -[[package]] -name = "spl-stake-pool" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027ca58e3b61c000dcc264878d4b6fd98f6f89ad363d91e972c11abf167168c5" -dependencies = [ - "arrayref", - "bincode", - "borsh 0.9.3", - "num-derive", - "num-traits", - "num_enum", - "serde", - "serde_derive", - "solana-program", - "spl-math", - "spl-token", - "thiserror", -] - -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-program", - "thiserror", -] - -[[package]] -name = "spl-token-2022" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a97cbf60b91b610c846ccf8eecca96d92a24a19ffbf9fe06cd0c84e76ec45e" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-token", - "thiserror", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "serde", - "serde_derive", - "syn 1.0.107", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2 1.0.51", - "quote 1.0.23", - "serde", - "serde_derive", - "serde_json", - "sha1 0.6.1", - "syn 1.0.107", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - -[[package]] -name = "stream-cancel" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0a9eb2715209fb8cc0d942fcdff45674bfc9f0090a0d897e85a22955ad159b" -dependencies = [ - "futures-core", - "pin-project", - "tokio", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.51", - "quote 1.0.23", - "rustversion", - "syn 1.0.107", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "symlink" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "unicode-xid 0.2.4", -] - -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "sysctl" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8" -dependencies = [ - "bitflags", - "byteorder", - "libc", - "thiserror", - "walkdir", -] - -[[package]] -name = "tar" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tarpc" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85d0a9369a919ba0db919b142a2b704cd207dfc676f7a43c2d105d0bc225487" -dependencies = [ - "anyhow", - "fnv", - "futures 0.3.26", - "humantime", - "opentelemetry", - "pin-project", - "rand 0.8.5", - "serde", - "static_assertions", - "tarpc-plugins", - "thiserror", - "tokio", - "tokio-serde", - "tokio-util 0.6.10", - "tracing", - "tracing-opentelemetry", -] - -[[package]] -name = "tarpc-plugins" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "tempfile" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "thread_local" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.4.3+5.2.1-patched.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b7bcecfafe4998587d636f9ae9d55eb9d0499877b88757767c346875067098" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros 0.1.1", - "version_check", - "winapi 0.3.9", -] - -[[package]] -name = "time" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" -dependencies = [ - "itoa 1.0.5", - "serde", - "time-core", - "time-macros 0.2.6", -] - -[[package]] -name = "time-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" -dependencies = [ - "time-core", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2 1.0.51", - "quote 1.0.23", - "standback", - "syn 1.0.107", -] - -[[package]] -name = "tiny-bip39" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" -dependencies = [ - "anyhow", - "hmac 0.8.1", - "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d0183f6f6001549ab68f8c7585093bb732beefbcf6d23a10b9b95c73a1dd49" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "once_cell", - "parking_lot 0.11.2", - "pin-project-lite", - "signal-hook-registry", - "tokio-macros", - "winapi 0.3.9", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-macros" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-serde" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" -dependencies = [ - "bincode", - "bytes", - "educe", - "futures-core", - "futures-sink", - "pin-project", - "serde", - "serde_json", -] - -[[package]] -name = "tokio-stream" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" -dependencies = [ - "futures-util", - "log", - "rustls 0.20.8", - "tokio", - "tokio-rustls 0.23.4", - "tungstenite", - "webpki 0.22.0", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "log", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" - -[[package]] -name = "toml_edit" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" -dependencies = [ - "indexmap", - "nom8", - "toml_datetime", -] - -[[package]] -name = "tonic" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" -dependencies = [ - "async-stream", - "async-trait", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding 2.2.0", - "pin-project", - "prost 0.9.0", - "prost-derive 0.9.0", - "tokio", - "tokio-rustls 0.22.0", - "tokio-stream", - "tokio-util 0.6.10", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - -[[package]] -name = "tonic" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9d60db39854b30b835107500cf0aca0b0d14d6e1c3de124217c23a29c2ddb" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding 2.2.0", - "pin-project", - "prost 0.10.4", - "prost-derive 0.10.1", - "rustls-pemfile 1.0.2", - "tokio", - "tokio-rustls 0.23.4", - "tokio-stream", - "tokio-util 0.7.2", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - -[[package]] -name = "tonic-build" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" -dependencies = [ - "proc-macro2 1.0.51", - "prost-build 0.9.0", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "tonic-build" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9263bf4c9bfaae7317c1c2faf7f18491d2fe476f70c414b73bf5d445b00ffa1" -dependencies = [ - "prettyplease", - "proc-macro2 1.0.51", - "prost-build 0.10.4", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util 0.7.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" -dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "tracing-core" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599f388ecb26b28d9c1b2e4437ae019a7b336018b45ed911458cd9ebf91129f6" -dependencies = [ - "opentelemetry", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - -[[package]] -name = "trees" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de5f738ceab88e2491a94ddc33c3feeadfa95fedc60363ef110845df12f3878" - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes", - "http", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.20.8", - "sha-1 0.10.1", - "thiserror", - "url 2.3.1", - "utf-8", - "webpki 0.22.0", - "webpki-roots", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" - -[[package]] -name = "uint" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" -dependencies = [ - "byteorder", - "crunchy", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" - -[[package]] -name = "unicode-ident" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "unix_socket2" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57c6eace16c00eccb98a28e85db3370eab0685bdd5e13831d59e2bcb49a1d8a" -dependencies = [ - "libc", -] - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "uriparse" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" -dependencies = [ - "fnv", - "lazy_static", -] - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna 0.3.0", - "percent-encoding 2.2.0", -] - -[[package]] -name = "users" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4227e95324a443c9fcb06e03d4d85e91aabe9a5a02aa818688b6918b6af486" -dependencies = [ - "libc", - "log", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi 0.3.9", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" -dependencies = [ - "quote 1.0.23", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" - -[[package]] -name = "web-sys" -version = "0.3.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] - -[[package]] -name = "which" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" -dependencies = [ - "either", - "libc", - "once_cell", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "x509-parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" -dependencies = [ - "asn1-rs", - "base64 0.13.1", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror", - "time 0.3.17", -] - -[[package]] -name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "yasna" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" -dependencies = [ - "time 0.3.17", -] - -[[package]] -name = "zeroize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" -dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.107", - "synstructure", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.6+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a3f9792c0c3dc6c165840a75f47ae1f4da402c2d006881129579f6597e801b" -dependencies = [ - "cc", - "libc", - "pkg-config", -] +name = "solana-stake-o-matic" +version = "0.0.0" diff --git a/bot/Cargo.toml b/bot/Cargo.toml index a5648008..e242d5f0 100644 --- a/bot/Cargo.toml +++ b/bot/Cargo.toml @@ -7,46 +7,8 @@ documentation = "https://docs.rs/" license = "Apache-2.0" name = "solana-stake-o-matic" repository = "https://github.com/solana-labs/stake-o-matic" -version = "0.0.0" +version = "0.1.0" publish = false -[dependencies] -base64 = "0.13" -bincode = "1.3.3" -borsh = "0.9" -bs58 = "0.4.0" -chrono = "0.4.19" -clap = "2.33.0" -csv = "1.1" -indicatif = "0.16.2" -itertools = "0.10.3" -log = "0.4.11" -num-format = "0.4.4" -openssl = "0.10" -regex = "1.5.4" -reqwest = { version = "0.11.3", default-features = false, features = ["blocking", "rustls-tls", "json"] } -semver = { version = "1.0.3", features = ["serde"] } -serde = { version = "1.0.126", features = ["derive"] } -serde_json = "1.0.62" -serde_yaml = "0.8.13" -solana-account-decoder = "1.13.6" -solana-clap-utils = "1.13.6" -solana-cli-config = "1.13.6" -solana-client = "1.13.6" -solana-foundation-delegation-program-cli = { path = "../cli" } -solana-foundation-delegation-program-registry = { path = "../program" } -solana-logger = "1.13.6" -solana-notifier = "1.13.6" -solana-sdk = "1.13.6" -solana-transaction-status = "1.13.6" -solana-vote-program = "1.13.6" -spl-stake-pool = "0.6.4" -spl-token = "3.2" -thiserror = "1.0.25" - -[dev-dependencies] -solana-validator = "1.13.6" -solana-vote-program = "1.13.6" - [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bot/src/data_center_info.rs b/bot/src/data_center_info.rs deleted file mode 100644 index 0955d3d8..00000000 --- a/bot/src/data_center_info.rs +++ /dev/null @@ -1,148 +0,0 @@ -use crate::Cluster; -use { - crate::validators_app, - log::*, - serde::{Deserialize, Serialize}, - solana_sdk::pubkey::Pubkey, - std::{collections::HashMap, error, str::FromStr}, -}; - -const DATA_CENTER_ID_UNKNOWN: &str = "0-Unknown"; - -#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)] -pub struct DataCenterId { - pub asn: u64, - pub location: String, -} - -impl Default for DataCenterId { - fn default() -> Self { - Self::from_str(DATA_CENTER_ID_UNKNOWN).unwrap() - } -} - -impl std::str::FromStr for DataCenterId { - type Err = String; - fn from_str(s: &str) -> Result { - let mut parts = s.splitn(2, '-'); - let asn = parts.next(); - let location = parts.next(); - if let (Some(asn), Some(location)) = (asn, location) { - let asn = asn.parse().map_err(|e| format!("{:?}", e))?; - let location = location.to_string(); - Ok(Self { asn, location }) - } else { - Err(format!("cannot construct DataCenterId from input: {}", s)) - } - } -} - -impl std::fmt::Display for DataCenterId { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}-{}", self.asn, self.location) - } -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct DataCenterInfo { - pub id: DataCenterId, - pub stake: u64, - pub stake_percent: f64, - pub validators: Vec, - pub validators_stake: Option>, -} - -impl DataCenterInfo { - pub fn new(id: DataCenterId) -> Self { - Self { - id, - ..Self::default() - } - } -} - -impl std::fmt::Display for DataCenterInfo { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!( - f, - "{:<30} {:>20} {:>5.2} {}", - self.id.to_string(), - self.stake, - self.stake_percent, - self.validators.len() - ) - } -} - -#[derive(Debug, Default)] -pub struct DataCenters { - pub info: Vec, - pub by_identity: HashMap, -} - -pub fn get(cluster: Cluster) -> Result> { - let client = validators_app::Client::new_with_cluster(cluster)?; - - let validators = client.validators(None, None)?; - let mut data_center_map = HashMap::new(); - let mut total_stake = 0; - let mut unknown_data_center_stake: u64 = 0; - - let mut by_identity = HashMap::new(); - for v in validators.as_ref() { - let identity = v - .account - .as_ref() - .and_then(|pubkey| Pubkey::from_str(pubkey).ok()); - let identity = if let Some(identity) = identity { - identity - } else { - warn!("No identity for: {:?}", v); - continue; - }; - - let stake = v.active_stake.unwrap_or(0); - - let data_center = v - .data_center_key - .as_deref() - .or_else(|| { - unknown_data_center_stake = unknown_data_center_stake.saturating_add(stake); - None - }) - .unwrap_or(DATA_CENTER_ID_UNKNOWN); - let data_center_id = DataCenterId::from_str(data_center) - .map_err(|e| { - unknown_data_center_stake = unknown_data_center_stake.saturating_add(stake); - e - }) - .unwrap_or_default(); - - by_identity.insert(identity, data_center_id.clone()); - - let mut data_center_info = data_center_map - .entry(data_center_id.clone()) - .or_insert_with(|| DataCenterInfo::new(data_center_id)); - data_center_info.stake += stake; - total_stake += stake; - data_center_info.validators.push(identity); - data_center_info - .validators_stake - .as_mut() - .map(|vs| vs.insert(identity, stake)); - } - - let unknown_percent = 100f64 * (unknown_data_center_stake as f64) / total_stake as f64; - if unknown_percent > 3f64 { - warn!("unknown data center percentage: {:.0}%", unknown_percent); - } - - let info = data_center_map - .drain() - .map(|(_, mut i)| { - i.stake_percent = 100f64 * i.stake as f64 / total_stake as f64; - i - }) - .collect(); - Ok(DataCenters { info, by_identity }) -} diff --git a/bot/src/db.rs b/bot/src/db.rs deleted file mode 100644 index 03f153f5..00000000 --- a/bot/src/db.rs +++ /dev/null @@ -1,271 +0,0 @@ -use { - crate::{ - data_center_info::{DataCenterId, DataCenterInfo}, - generic_stake_pool::ValidatorStakeState, - InfrastructureConcentrationAffects, - }, - log::*, - semver::Version, - serde::{Deserialize, Serialize}, - solana_sdk::{clock::Epoch, pubkey::Pubkey}, - std::{ - collections::HashMap, - fs::{self, File}, - io::{self, Write}, - path::{Path, PathBuf}, - }, -}; - -#[derive(Default, Clone, Deserialize, Serialize)] -pub struct ValidatorClassification { - pub identity: Pubkey, - // Validator identity - pub vote_address: Pubkey, - - pub stake_state: ValidatorStakeState, - pub stake_state_reason: String, - - // Summary of the action was taken this epoch to advance the validator's stake - pub stake_action: Option, - - // History of stake states, newest first, including (`stake_state`, `stake_state_reason`) at index 0 - pub stake_states: Option>, - - // Informational notes regarding this validator - pub notes: Vec, - - // Map of data center to number of times the validator has been observed there. - pub data_center_residency: Option>, - - // The data center that the validator was observed at for this classification - pub current_data_center: Option, - - // The identity of the staking program participant, used to establish a link between - // testnet and mainnet validator classifications - pub participant: Option, - - // The validator was not funded this epoch and should be prioritized next epoch - pub prioritize_funding_in_next_epoch: Option, - - pub blocks: Option, - pub slots: Option, - - pub vote_credits: Option, - pub commission: Option, - - pub self_stake: Option, - - // Whether this is the first epoch the validator is a resident of current_data_center - pub new_data_center_residency: Option, - - pub release_version: Option, - - // The number of times the validator has exceeded the max commission - // Note we only started counting this around Jan 2022; epochs prior to Jan 2022 are not counted - pub num_epochs_max_commission_exceeded: Option, - - // The number of times the validator was below max_commission at the end of one epoch, then above max_commission at - // the end of a subsequent epoch - // Note that we only started counting this around April/May 2022 - pub num_epochs_commission_increased_above_max: Option, - - // Whether the validator reported stats during the epoch - // If false, String gives the reason for passing or failing - pub self_reported_metrics: Option<(bool, String)>, - - /// Whether the validator meets the requirements for self-reporting metrics, and the reason why - /// Note that this will be set whether self-reported metrics are required or not - pub self_reported_metrics_summary: Option<(bool, String)>, -} - -pub type ValidatorClassificationByIdentity = - HashMap; - -#[derive(Default, Deserialize, Serialize, Clone)] -pub struct EpochClassificationV1 { - // Data Center observations for this epoch - pub data_center_info: Vec, - - // `None` indicates a pause due to unusual observations during classification - pub validator_classifications: Option, - - // Informational notes regarding this epoch - pub notes: Vec, - - // Config values from Config struct - pub config: Option, - - // General info about the Epoch - pub stats: Option, - - // Whether distribution of stake is pending, in progress, or has been cancelled. - // If --require-dry-run-to-distribute-stake is set, distribution_state will be set to `Pending`, and stake will be distributed the next time the bot is run. - // - // To prevent the bot from distributing stake, set distribution_state to `Cancelled`. - // To re-classify validators, delete the yml file or set the --ignore-existing-classification flag - pub distribution_state: Option, -} - -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] -pub enum DistributionState { - // Stake has not been distributed yet, but next time the bot is run it will be distributed - Pending, - Distributing, - // if set, prevents stake from being distributed - Cancelled, -} - -#[derive(Clone, Deserialize, Serialize)] -pub struct EpochStats { - pub bonus_stake_amount: u64, - pub min_epoch_credits: u64, - pub avg_epoch_credits: u64, - pub max_skip_rate: usize, - pub cluster_average_skip_rate: usize, - pub total_active_stake: u64, -} - -#[derive(Clone, Deserialize, Serialize)] -pub struct EpochConfig { - pub require_classification: Option, - pub quality_block_producer_percentage: Option, - pub max_poor_block_producer_percentage: Option, - pub max_commission: Option, - pub min_release_version: Option, - pub max_release_version: Option, - pub max_old_release_version_percentage: Option, - pub max_poor_voter_percentage: Option, - pub max_infrastructure_concentration: Option, - pub infrastructure_concentration_affects: Option, - pub bad_cluster_average_skip_rate: Option, - pub min_epoch_credit_percentage_of_average: Option, - pub min_self_stake_lamports: Option, - pub max_active_stake_lamports: Option, - pub enforce_min_self_stake: Option, - pub enforce_testnet_participation: Option, - pub min_testnet_participation: Option<(/*n:*/ usize, /*m:*/ usize)>, - pub baseline_stake_amount_lamports: Option, - pub require_performance_metrics_reporting: Option, - pub performance_waiver_release_version: Option, -} - -#[derive(Deserialize, Serialize, Clone)] -pub enum EpochClassification { - V1(EpochClassificationV1), -} - -impl Default for EpochClassification { - fn default() -> Self { - Self::V1(EpochClassificationV1::default()) - } -} - -impl EpochClassification { - pub fn new(v1: EpochClassificationV1) -> Self { - EpochClassification::V1(v1) - } - - pub fn into_current(self) -> EpochClassificationV1 { - match self { - EpochClassification::V1(v1) => v1, - } - } - - fn file_name

(epoch: Epoch, path: P) -> PathBuf - where - P: AsRef, - { - path.as_ref().join(format!("epoch-{}.yml", epoch)) - } - - pub fn exists

(epoch: Epoch, path: P) -> bool - where - P: AsRef, - { - Self::file_name(epoch, path).exists() - } - - pub fn load

(epoch: Epoch, path: P) -> Result - where - P: AsRef, - { - let file = File::open(Self::file_name(epoch, path))?; - serde_yaml::from_reader(file) - .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err))) - } - - // Loads the first epoch older than `epoch` that contains `Some(validator_classifications)`. - // Returns `Ok(None)` if no previous epochs are available - // Note that the epoch returned is the epoch _after_ the epoch being evaluated in the file - pub fn load_previous

(epoch: Epoch, path: P) -> Result, io::Error> - where - P: AsRef, - { - let mut previous_epoch = epoch; - loop { - if previous_epoch == 0 { - info!( - "No previous EpochClassification found at {}", - path.as_ref().display() - ); - return Ok(None); - } - previous_epoch -= 1; - - if Self::exists(previous_epoch, &path) { - let previous_epoch_classification = - Self::load_if_validators_classified(previous_epoch, &path)?; - - if let Some(epoch_classification) = previous_epoch_classification { - info!( - "Previous EpochClassification found for epoch {} at {}", - previous_epoch, - path.as_ref().display() - ); - return Ok(Some(( - previous_epoch, - Self::V1(epoch_classification.into_current()), - ))); - } else { - info!( - "Skipping previous EpochClassification for epoch {}", - previous_epoch - ); - } - } - } - } - - // Returns the EpochClassification for `epoch` at `path` if it exists and if it contains validator_classifications - // (that is, if stake was adjusted for validators for the epoch) - pub fn load_if_validators_classified

( - epoch: Epoch, - path: P, - ) -> Result, io::Error> - where - P: AsRef + Copy, - { - if Self::exists(epoch, path) { - let epoch_classification = Self::load(epoch, &path)?.into_current(); - - if epoch_classification.validator_classifications.is_some() { - return Ok(Some(Self::V1(epoch_classification))); - } - } - Ok(None) - } - - pub fn save

(&self, epoch: Epoch, path: P) -> Result<(), io::Error> - where - P: AsRef, - { - let serialized = serde_yaml::to_string(self) - .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{:?}", err)))?; - - fs::create_dir_all(&path)?; - let mut file = File::create(Self::file_name(epoch, path))?; - file.write_all(&serialized.into_bytes())?; - - Ok(()) - } -} diff --git a/bot/src/generic_stake_pool.rs b/bot/src/generic_stake_pool.rs deleted file mode 100644 index dded407c..00000000 --- a/bot/src/generic_stake_pool.rs +++ /dev/null @@ -1,53 +0,0 @@ -use { - crate::rpc_client_utils::MultiClient, - serde::{Deserialize, Serialize}, - solana_sdk::pubkey::Pubkey, - std::{ - collections::{HashMap, HashSet}, - error, - }, -}; - -#[derive(Debug, PartialEq, Clone, Copy, Deserialize, Serialize)] -pub enum ValidatorStakeState { - None, // Validator should receive no stake - Baseline, // Validator has earned the baseline stake level - Bonus, // Validator has earned the bonus stake level -} - -impl Default for ValidatorStakeState { - fn default() -> Self { - Self::None - } -} - -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct ValidatorStake { - pub identity: Pubkey, - pub vote_address: Pubkey, - pub stake_state: ValidatorStakeState, - pub priority: bool, -} - -pub type EpochStakeNotes = Vec; -pub type ValidatorStakeActions = HashMap; -pub type UnfundedValidators = HashSet; - -pub trait GenericStakePool { - /// Fourth value in returned tuple is the calculated bonus stake amount - fn apply( - &mut self, - client: &MultiClient, - dry_run: bool, - desired_validator_stake: &[ValidatorStake], - bonus_multiplier: Option, - ) -> Result< - ( - EpochStakeNotes, - ValidatorStakeActions, - UnfundedValidators, - u64, // bonus stake amount - ), - Box, - >; -} diff --git a/bot/src/main.rs b/bot/src/main.rs index cd1bbd7c..13a1a9c2 100644 --- a/bot/src/main.rs +++ b/bot/src/main.rs @@ -1,3337 +1,4 @@ -use crate::data_center_info::{DataCenterInfo, DataCenters}; -use crate::db::DistributionState; -use crate::performance_db_utils::{ - get_reported_performance_metrics, NUM_SAMPLED_REPORTING_EPOCHS, SUCCESS_MIN_PERCENT, -}; -use crate::slack_utils::send_slack_channel_message; -use crate::stake_pool_v0::MIN_STAKE_ACCOUNT_BALANCE; -use crate::validators_app::CommissionChangeIndexHistoryEntry; -use crate::Cluster::{MainnetBeta, Testnet}; -use solana_client::tpu_client::TpuClient; -use std::env; -use { - crate::{db::*, generic_stake_pool::*, rpc_client_utils::*}, - chrono::{Duration as ChronoDuration, Utc}, - clap::{ - crate_description, crate_name, value_t, value_t_or_exit, values_t, App, AppSettings, Arg, - ArgMatches, SubCommand, - }, - itertools::Itertools, - log::*, - openssl::rsa::{Padding, Rsa}, - serde::{Deserialize, Serialize}, - solana_clap_utils::{ - input_parsers::{keypair_of, lamports_of_sol, pubkey_of}, - input_validators::{ - is_amount, is_keypair, is_parsable, is_pubkey_or_keypair, is_url, is_valid_percentage, - }, - }, - solana_client::rpc_client::RpcClient, - solana_foundation_delegation_program_cli::get_participants_with_state, - solana_foundation_delegation_program_registry::state::{Participant, ParticipantState}, - solana_notifier::Notifier, - solana_sdk::{ - account::from_account, - account_utils::StateMut, - clock::{Epoch, Slot}, - commitment_config::CommitmentConfig, - native_token::*, - pubkey::Pubkey, - slot_history::{self, SlotHistory}, - stake::state::StakeState, - stake_history::StakeHistory, - sysvar, - }, - solana_vote_program::vote_state::VoteState, - std::{ - collections::{HashMap, HashSet}, - error, fs, - fs::File, - io::{Read, Write}, - path::PathBuf, - process, - str::FromStr, - sync::Arc, - time::Duration, - }, - thiserror::Error, -}; - -mod data_center_info; -mod db; -mod generic_stake_pool; -mod noop_stake_pool; -mod performance_db_utils; -mod rpc_client_utils; -mod slack_utils; -mod stake_pool; -mod stake_pool_v0; -mod validator_list; -mod validators_app; - -type BoxResult = Result>; -type ValidatorList = HashSet; -type IdentityToParticipant = HashMap; - -pub enum InfrastructureConcentrationAffectKind { - Destake(String), - Warn(String), -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -pub enum InfrastructureConcentrationAffects { - WarnAll, - DestakeListed(ValidatorList), - DestakeAll, - DestakeNew, - DestakeOverflow, -} - -#[derive(Debug, Error)] -#[error("cannot convert to InfrastructureConcentrationAffects: {0}")] -pub struct InfrastructureConcentrationAffectsFromStrError(String); - -impl FromStr for InfrastructureConcentrationAffects { - type Err = InfrastructureConcentrationAffectsFromStrError; - fn from_str(s: &str) -> Result { - let lower = s.to_ascii_lowercase(); - match lower.as_str() { - "warn" => Ok(Self::WarnAll), - "destake-all" => Ok(Self::DestakeAll), - "destake-new" => Ok(Self::DestakeNew), - "destake-overflow" => Ok(Self::DestakeOverflow), - _ => { - let file = File::open(s) - .map_err(|_| InfrastructureConcentrationAffectsFromStrError(s.to_string()))?; - let mut list: Vec = serde_yaml::from_reader(file) - .map_err(|_| InfrastructureConcentrationAffectsFromStrError(s.to_string()))?; - let list = list - .drain(..) - .filter_map(|ref s| Pubkey::from_str(s).ok()) - .collect(); - Ok(Self::DestakeListed(list)) - } - } - } -} - -fn is_release_version(string: String) -> Result<(), String> { - if string.starts_with('v') && semver::Version::parse(string.split_at(1).1).is_ok() { - return Ok(()); - } - semver::Version::parse(&string) - .map(|_| ()) - .map_err(|err| format!("{:?}", err)) -} - -fn release_version_of(matches: &ArgMatches<'_>, name: &str) -> Option { - matches - .value_of(name) - .map(ToString::to_string) - .map(|string| { - if string.starts_with('v') { - semver::Version::parse(string.split_at(1).1) - } else { - semver::Version::parse(&string) - } - .expect("semver::Version") - }) -} - -#[derive(Debug, Clone, Copy, PartialEq, Serialize)] -pub enum Cluster { - Testnet, - MainnetBeta, -} - -#[derive(Debug, Clone, Copy, PartialEq, Serialize)] -pub enum OutputMode { - Yes, - First, - No, -} - -impl std::fmt::Display for Cluster { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "{}", - match self { - Self::Testnet => "testnet", - Self::MainnetBeta => "mainnet-beta", - } - ) - } -} - -#[derive(Debug, Serialize)] -pub struct Config { - cluster: Cluster, - db_path: PathBuf, - db_suffix: String, - require_classification: bool, - csv_output_mode: OutputMode, - epoch_classification: OutputMode, - - /// Perform all stake processing, without sending transactions to the network - dry_run: bool, - - /// If set, classifies validators even if an existing classification exists in a wiki file - ignore_existing_classification: bool, - - /// Quality validators produce within this percentage of the cluster average skip rate over - /// the previous epoch - quality_block_producer_percentage: usize, - - /// Don't ever unstake more than this percentage of the cluster at one time for poor block - /// production - max_poor_block_producer_percentage: usize, - - /// Vote accounts with a larger commission than this amount will not be staked. - max_commission: u8, - - /// If Some(), destake validators with a version less than this version subject to the - /// `max_old_release_version_percentage` limit - min_release_version: Option, - - /// If Some(), destake validators with a version greater than this version - max_release_version: Option, - - /// Do not unstake more than this percentage of the cluster at one time for running an - /// older software version - max_old_release_version_percentage: usize, - - /// Do not unstake more than this percentage of the cluster at one time for being poor - /// voters - max_poor_voter_percentage: usize, - - /// Base path of confirmed block cache - confirmed_block_cache_path: PathBuf, - - /// Vote accounts sharing infrastructure with larger than this amount will not be staked - /// None: skip infrastructure concentration check - max_infrastructure_concentration: Option, - - /// How validators with infrastruction concentration above `max_infrastructure_concentration` - /// will be affected. Accepted values are: - /// 1) "warn" - Stake unaffected. A warning message is notified - /// 2) "destake" - Removes all validator stake - /// 3) PATH_TO_YAML - Reads a list of validator identity pubkeys from the specified YAML file - /// destaking those in the list and warning any others - /// 4) "destake-new" - When infrastructure concentration is too high, only destake validators - /// who are new to the data center - /// 5) "destake-overflow" = Destake "junior" validators who are causing the infrastructure to be - /// over max_infrastructure_concentration - infrastructure_concentration_affects: InfrastructureConcentrationAffects, - - bad_cluster_average_skip_rate: usize, - - /// Destake if the validator's vote credits for the latest full epoch are less than this percentage - /// of the cluster average - min_epoch_credit_percentage_of_average: usize, - - /// Minimum amount of lamports a validator must stake on itself to be eligible for a delegation - min_self_stake_lamports: u64, - - /// identities of validators who don't have to meet the min_self_stake requirement - min_self_stake_exceptions: Vec, - - /// Validators with more than this amount of active stake are not eligible for a delegation - max_active_stake_lamports: u64, - - /// If true, enforce the `min_self_stake_lamports` limit. If false, only warn on insufficient stake - enforce_min_self_stake: bool, - - /// If true, enforce `min_testnet_staked_epochs`. If false, only warn if - /// `min_testnet_staked_epochs` is Some. - /// - /// This setting is ignored if `cluster` is not `"mainnet-beta"` or `min_testnet_participation - /// is `None`. - enforce_testnet_participation: bool, - - /// If Some, require that the participant's mainnet-beta validator be staked for `n` out of the - /// last `m` epochs to be delegable for mainnet-beta stake - /// - /// This setting is ignored if `cluster` is not `"mainnet-beta"` - min_testnet_participation: Option<(/*n:*/ usize, /*m:*/ usize)>, - - /// Stake amount earned for baseline - baseline_stake_amount_lamports: Option, - - /// Whether to require that validators report their performance metrics - require_performance_metrics_reporting: bool, - - /// URL and token for the performance metrics influxdb - performance_db_url: Option, - performance_db_token: Option, - blocklist_datacenter_asns: Option>, - require_dry_run_to_distribute_stake: bool, - performance_waiver_release_version: Option, - use_rpc_tx_submission: bool, - use_preflight: bool, -} - -const DEFAULT_MAINNET_BETA_JSON_RPC_URL: &str = "https://api.mainnet-beta.solana.com"; -const DEFAULT_TESTNET_JSON_RPC_URL: &str = "https://api.testnet.solana.com"; - -impl Config { - #[cfg(test)] - pub fn default_for_test() -> Self { - Self { - cluster: MainnetBeta, - db_path: PathBuf::default(), - db_suffix: "".to_string(), - csv_output_mode: OutputMode::No, - epoch_classification: OutputMode::No, - require_classification: false, - dry_run: true, - ignore_existing_classification: false, - quality_block_producer_percentage: 15, - max_poor_block_producer_percentage: 20, - max_commission: 100, - min_release_version: None, - max_release_version: None, - max_old_release_version_percentage: 10, - max_poor_voter_percentage: 20, - confirmed_block_cache_path: default_confirmed_block_cache_path(), - max_infrastructure_concentration: Some(100.0), - infrastructure_concentration_affects: InfrastructureConcentrationAffects::WarnAll, - bad_cluster_average_skip_rate: 50, - min_epoch_credit_percentage_of_average: 50, - min_self_stake_lamports: 0, - // TODO: this should be empty - min_self_stake_exceptions: vec![], - max_active_stake_lamports: u64::MAX, - enforce_min_self_stake: false, - enforce_testnet_participation: false, - min_testnet_participation: None, - baseline_stake_amount_lamports: None, - performance_db_url: None, - performance_db_token: None, - require_performance_metrics_reporting: false, - blocklist_datacenter_asns: None, - require_dry_run_to_distribute_stake: false, - performance_waiver_release_version: None, - use_rpc_tx_submission: false, - use_preflight: false, - } - } - - fn cluster_db_path_for(&self, cluster: Cluster) -> PathBuf { - if self.db_suffix.is_empty() { - self.db_path.join(format!("data-{}", cluster)) - } else { - self.db_path - .join(format!("data-{}-{}", cluster, self.db_suffix)) - } - } - - fn cluster_db_path(&self) -> PathBuf { - self.cluster_db_path_for(self.cluster) - } -} - -fn default_confirmed_block_cache_path() -> PathBuf { - let home_dir = std::env::var("HOME").unwrap(); - PathBuf::from(home_dir).join(".cache/solana/som/confirmed-block-cache/") -} - -fn app_version() -> String { - // Determine version based on the environment variables set by Github Actions - let tag = option_env!("GITHUB_REF") - .and_then(|github_ref| github_ref.strip_prefix("refs/tags/").map(|s| s.to_string())); - - tag.unwrap_or_else(|| match option_env!("GITHUB_SHA") { - None => "devbuild".to_string(), - Some(commit) => commit[..8].to_string(), - }) -} - -struct GetConfigResult { - config: Config, - mainnet_beta_multi_client: MultiClient, - testnet_multi_client: MultiClient, - stake_pool: Box, -} - -fn get_config() -> BoxResult { - let default_confirmed_block_cache_path = default_confirmed_block_cache_path() - .to_str() - .unwrap() - .to_string(); - let app_version = &*app_version(); - let min_stake_account_balance = &*lamports_to_sol(MIN_STAKE_ACCOUNT_BALANCE).to_string(); - let matches = App::new(crate_name!()) - .about(crate_description!()) - .version(app_version) - .setting(AppSettings::SubcommandRequiredElseHelp) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::InferSubcommands) - .arg( - Arg::with_name("mainnet_beta_json_rpc_url") - .long("mainnet-beta-json-rpc-url") - .value_name("URL") - .takes_value(true) - .multiple(true) - .validator(is_url) - .help("Mainnet Beta JSON RPC URLs for the cluster. Bot will use first URL that works") - ) - .arg( - Arg::with_name("testnet_json_rpc_url") - .long("testnet-json-rpc-url") - .value_name("URL") - .takes_value(true) - .multiple(true) - .validator(is_url) - .help("Testnet JSON RPC URLs for the cluster. Bot will use first URL that works") - ) - .arg( - Arg::with_name("cluster") - .long("cluster") - .value_name("NAME") - .possible_values(&["mainnet-beta", "testnet"]) - .takes_value(true) - .default_value("testnet") - .required(true) - .help("Name of the cluster to operate on") - ) - .arg( - Arg::with_name("confirm") - .long("confirm") - .takes_value(false) - .help("Confirm that the stake adjustments should actually be made") - ) - .arg( - Arg::with_name("ignore_existing_classification") - .long("ignore-existing-classification") - .takes_value(false) - .help("Forces new classification of validators to happen, even if an existing one exists") - ) - .arg( - Arg::with_name("csv-output-mode") - .long("csv-output-mode") - .value_name("no|yes|first") - .takes_value(true) - .default_value("no") - .possible_values(&["no", "yes", "first"]) - .help("Output summary CSV. If \"first\", CSV will only be generated on the first run. If \"yes\", CSV will always be generated. If \"no\", no CSV is ever generated.") - ) - .arg( - Arg::with_name("epoch_classification") - .long("epoch-classification") - .value_name("no|yes|first") - .takes_value(true) - .default_value("no") - .possible_values(&["no", "yes", "first"]) - .help("Output epoch classification. If \"first\", classification will only be output on the first run. If \"yes\", classification will always be dumped. If \"no\", no classification is ever dumped.") - ) - .arg( - Arg::with_name("db_path") - .long("db-path") - .value_name("PATH") - .takes_value(true) - .default_value("db") - .help("Location for storing staking history") - ) - .arg( - Arg::with_name("db_suffix") - .long("db-suffix") - .value_name("SUFFIX") - .takes_value(true) - .default_value("") - .help("Suffix for filename storing staking history") - ) - .arg( - Arg::with_name("require_classification") - .long("require-classification") - .takes_value(false) - .help("Fail if the classification for the previous epoch does not exist") - ) - .arg( - Arg::with_name("quality_block_producer_percentage") - .long("quality-block-producer-percentage") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("15") - .validator(is_valid_percentage) - .help("Quality validators have a skip rate within this percentage of \ - the cluster average in the previous epoch.") - ) - .arg( - Arg::with_name("bad_cluster_average_skip_rate") - .long("bad-cluster-average-skip-rate") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("50") - .validator(is_valid_percentage) - .help("Threshold to notify for a poor average cluster skip rate.") - ) - .arg( - Arg::with_name("max_poor_block_producer_percentage") - .long("max-poor-block-producer-percentage") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("20") - .validator(is_valid_percentage) - .help("Do not add or remove bonus stake if at least this \ - percentage of all validators are poor block producers") - ) - .arg( - Arg::with_name("min_epoch_credit_percentage_of_average") - .long("min-epoch-credit-percentage-of-average") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("50") - .validator(is_valid_percentage) - .help("Validator vote credits for the latest full epoch must \ - be at least this percentage of the cluster average vote credits") - ) - .arg( - Arg::with_name("max_commission") - .long("max-commission") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("100") - .validator(is_valid_percentage) - .help("Vote accounts with a larger commission than this amount will not be staked") - ) - .arg( - Arg::with_name("min_release_version") - .long("min-release-version") - .value_name("SEMVER") - .takes_value(true) - .validator(is_release_version) - .help("Remove the base and bonus stake from validators with \ - a release version older than this one") - ) - .arg( - Arg::with_name("max_release_version") - .long("max-release-version") - .value_name("SEMVER") - .takes_value(true) - .validator(is_release_version) - .help("Remove the base and bonus stake from validators with \ - a release version greater than this one") - ) - .arg( - Arg::with_name("performance_waiver_release_version") - .long("performance-waiver-release-version") - .value_name("SEMVER") - .takes_value(true) - .validator(is_release_version) - .help("Validators running this release version or higher do not have to meet some performance requirements") - ) - .arg( - Arg::with_name("max_poor_voter_percentage") - .long("max-poor-voter-percentage") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("20") - .validator(is_valid_percentage) - .help("Do not remove stake from validators poor voting history \ - if more than this percentage of all validators have a \ - poor voting history") - ) - .arg( - Arg::with_name("max_old_release_version_percentage") - .long("max-old-release-version-percentage") - .value_name("PERCENTAGE") - .takes_value(true) - .default_value("10") - .validator(is_valid_percentage) - .help("Do not remove stake from validators running older \ - software versions if more than this percentage of \ - all validators are running an older software version") - ) - .arg( - Arg::with_name("confirmed_block_cache_path") - .long("confirmed-block-cache-path") - .takes_value(true) - .value_name("PATH") - .default_value(&default_confirmed_block_cache_path) - .help("Base path of confirmed block cache") - ) - .arg( - Arg::with_name("max_infrastructure_concentration") - .long("max-infrastructure-concentration") - .takes_value(true) - .value_name("PERCENTAGE") - .validator(is_valid_percentage) - .help("Vote accounts sharing infrastructure with larger than this amount will not be staked") - ) - .arg( - Arg::with_name("infrastructure_concentration_affects") - .long("infrastructure-concentration-affects") - .takes_value(true) - .value_name("AFFECTS") - .default_value("warn") - .validator(|ref s| { - InfrastructureConcentrationAffects::from_str(s) - .map(|_| ()) - .map_err(|e| format!("{}", e)) - }) - .help("How validators with infrastruction concentration above \ - `max_infrastructure_concentration` will be affected. \ - Accepted values are:\n\ - 1) warn - Stake unaffected. A warning message is notified\n\ - 2) destake-new - Will not stake new validators, existing validator retain their stake\n\ - 3) destake-all - Removes all validator stake \n\ - 4) PATH_TO_YAML - Reads a list of validator identity \ - pubkeys from the specified YAML file \ - destaking those in the list and warning \ - any others") - ) - .arg( - Arg::with_name("min_self_stake") - .long("min-self-stake") - .value_name("AMOUNT") - .takes_value(true) - .validator(is_amount) - .default_value("0") - .required(true) - .help("Minimum amount of SOL a validator must stake on itself to be eligible for a delegation"), - ) - .arg( - Arg::with_name("max_active_stake") - .long("max-active-stake") - .value_name("AMOUNT") - .takes_value(true) - .validator(is_amount) - .default_value("3500000") - .required(true) - .help("Maximum amount of stake a validator may have to be eligible for a delegation"), - ) - .arg( - Arg::with_name("enforce_min_self_stake") - .long("enforce-min-self-stake") - .takes_value(false) - .help("Enforce the minimum self-stake requirement") - ) - .arg( - Arg::with_name("min_self_stake_exceptions_file") - .long("min-self-stake-exceptions-file") - .takes_value(true) - .value_name("YAML_PATH") - ) - .arg( - Arg::with_name("min_self_stake_exceptions_key") - .long("min-self-stake-exceptions-key") - .takes_value(true) - .value_name("KEY") - .help("Private key") - ) - .arg( - Arg::with_name("min_testnet_participation") - .long("min-testnet-participation") - .value_name("N M") - .multiple(true) - .min_values(2) - .max_values(2) - .validator(is_parsable::) - .help("Require that the participant's mainnet-beta validator be staked for N out of the \ - last M epochs to be delegable for mainnet-beta stake.\n\ - This setting is ignored if the --cluster is not `mainnet-beta`") - ) - .arg( - Arg::with_name("enforce_testnet_participation") - .long("enforce-testnet-participation") - .takes_value(false) - .help("Enforce the minimum testnet participation requirement.\n - This setting is ignored if the --cluster is not `mainnet-beta`") - ) - .arg( - Arg::with_name("require_performance_metrics_reporting") - .long("require-performance-metrics-reporting") - .takes_value(false) - .help("Require that validators report their performance metrics`") - ) - .arg( - Arg::with_name("performance_db_url") - .long("performance-db-url") - .takes_value(true) - .value_name("URL") - .help("URL of InfluxDB used to collect self-reported performance data") - ) - .arg( - Arg::with_name("performance_db_token") - .long("performance-db-token") - .takes_value(true) - .value_name("TOKEN") - .help("Token used to authenticate for InfluxDB connection") - ) - .arg( - Arg::with_name("blocklist_datacenter_asns") - .multiple(true) - .long("blocklist-datacenter-asns") - .takes_value(true) - .value_name("ASNS") - .help("List of data center ASNS. Validators in these data centers will be destaked") - ) - .arg( - Arg::with_name("require_dry_run_to_distribute_stake") - .long("require-dry-run-to-distribute-stake") - .takes_value(false) - .help("If set, only distribute stake if there is a dry run summary in the wiki repo") - ) - .arg( - Arg::with_name("use_rpc_tx_submission") - .long("use-rpc-tx-submission") - .takes_value(true) - .help("Submit transactions via RPC client instead of TPU client. If \"preflight\" does preflight") - ) - .subcommand( - SubCommand::with_name("stake-pool-v0").about("Use the stake-pool v0 solution") - .arg( - Arg::with_name("reserve_stake_address") - .index(1) - .value_name("RESERVE_STAKE_ADDRESS") - .takes_value(true) - .required(true) - .validator(is_pubkey_or_keypair) - .help("The reserve stake account used to fund the stake pool") - ) - .arg( - Arg::with_name("authorized_staker") - .index(2) - .value_name("KEYPAIR") - .validator(is_keypair) - .required(true) - .takes_value(true) - .help("Keypair of the authorized staker") - ) - .arg( - Arg::with_name("min_reserve_stake_balance") - .long("min-reserve-stake-balance") - .value_name("SOL") - .takes_value(true) - .default_value(min_stake_account_balance) - .validator(is_amount) - .help("The minimum balance to keep in the reserve stake account") - ) - .arg( - Arg::with_name("baseline_stake_amount") - .index(3) - .value_name("SOL") - .validator(is_amount) - .required(true) - .takes_value(true) - .help("The baseline SOL amount to stake to validators with adequate performance") - ) - .arg( - Arg::with_name("ignore_stake_distribution_errors") - .long("ignore-stake-distribution-errors") - .required(false) - .takes_value(false) - .help("If set, do not fail when transactions fail while distributing stake") - - ) - ) - .subcommand( - SubCommand::with_name("stake-pool").about("Use a stake pool") - .arg( - Arg::with_name("pool_address") - .index(1) - .value_name("POOL_ADDRESS") - .takes_value(true) - .required(true) - .validator(is_pubkey_or_keypair) - .help("The stake pool address") - ) - .arg( - Arg::with_name("authorized_staker") - .index(2) - .value_name("KEYPAIR") - .validator(is_keypair) - .required(true) - .takes_value(true) - .help("Keypair of the authorized staker") - ) - .arg( - Arg::with_name("min_reserve_stake_balance") - .long("min-reserve-stake-balance") - .value_name("SOL") - .takes_value(true) - .default_value(min_stake_account_balance) - .validator(is_amount) - .help("The minimum balance to keep in the reserve stake account") - ) - .arg( - Arg::with_name("baseline_stake_amount") - .index(3) - .value_name("SOL") - .validator(is_amount) - .required(true) - .takes_value(true) - .help("The baseline SOL amount to stake to validators with adequate performance") - ) - ) - .subcommand( - SubCommand::with_name("noop-stake-pool").about("Use a no-op stake pool. Useful for testing classification and generating output from an existing db.") - ) - .get_matches(); - - let dry_run = !matches.is_present("confirm"); - if dry_run { - info!("Doing a dry run; stake will not be distributed"); - } - - let ignore_existing_classification = matches.is_present("ignore_existing_classification"); - - let cluster = match value_t_or_exit!(matches, "cluster", String).as_str() { - "mainnet-beta" => Cluster::MainnetBeta, - "testnet" => Cluster::Testnet, - _ => unreachable!(), - }; - let quality_block_producer_percentage = - value_t_or_exit!(matches, "quality_block_producer_percentage", usize); - let min_epoch_credit_percentage_of_average = - value_t_or_exit!(matches, "min_epoch_credit_percentage_of_average", usize); - let max_commission = value_t_or_exit!(matches, "max_commission", u8); - let max_poor_voter_percentage = value_t_or_exit!(matches, "max_poor_voter_percentage", usize); - info!("max_poor_voter_percentage: {}", max_poor_voter_percentage); - let max_poor_block_producer_percentage = - value_t_or_exit!(matches, "max_poor_block_producer_percentage", usize); - let max_old_release_version_percentage = - value_t_or_exit!(matches, "max_old_release_version_percentage", usize); - let min_release_version = release_version_of(&matches, "min_release_version"); - let max_release_version = release_version_of(&matches, "max_release_version"); - let performance_waiver_release_version = - release_version_of(&matches, "performance_waiver_release_version"); - - let enforce_min_self_stake = matches.is_present("enforce_min_self_stake"); - let min_self_stake_lamports = lamports_of_sol(&matches, "min_self_stake").unwrap(); - - let min_self_stake_exceptions = match matches.value_of("min_self_stake_exceptions_file") { - Some(filename) => { - let mut file = File::open(filename)?; - - let mut list: Vec = match matches.value_of("min_self_stake_exceptions_key") { - Some(key_str) => { - info!("Attempting to decrypt {:?}", filename); - - let metadata = fs::metadata(&filename).expect("unable to read metadata"); - let mut file_buffer = vec![0; metadata.len() as usize]; - file.read_exact(&mut file_buffer)?; - - let key = base64::decode(key_str)?; - let rsa = Rsa::private_key_from_der(&*key)?; - let mut out_buffer: Vec = vec![0; rsa.size() as usize]; - let _ = rsa - .private_decrypt(&*file_buffer, &mut out_buffer, Padding::PKCS1) - .unwrap(); - let text = String::from_utf8(out_buffer)?; - info!("File decrypted"); - - serde_yaml::from_str(&text)? - } - _ => serde_yaml::from_reader(file)?, - }; - - list.drain(..) - .filter_map(|ref s| Pubkey::from_str(s).ok()) - .collect() - } - _ => vec![], - }; - - debug!("min_self_stake_exceptions: {:?}", min_self_stake_exceptions); - - let max_active_stake_lamports = lamports_of_sol(&matches, "max_active_stake").unwrap(); - - let enforce_testnet_participation = matches.is_present("enforce_testnet_participation"); - let min_testnet_participation = values_t!(matches, "min_testnet_participation", usize) - .ok() - .map(|v| (v[0], v[1])); - if min_testnet_participation.is_some() && cluster != Cluster::MainnetBeta { - error!("--min-testnet-participation only available for `--cluster mainnet-beta`"); - process::exit(1); - } - - let db_path = value_t_or_exit!(matches, "db_path", PathBuf); - let db_suffix = matches.value_of("db_suffix").unwrap().to_string(); - let csv_output_mode = match value_t_or_exit!(matches, "csv-output-mode", String).as_str() { - "first" => OutputMode::First, - "yes" => OutputMode::Yes, - "no" => OutputMode::No, - _ => unreachable!(), - }; - let epoch_classification = - match value_t_or_exit!(matches, "epoch_classification", String).as_str() { - "first" => OutputMode::First, - "yes" => OutputMode::Yes, - "no" => OutputMode::No, - _ => unreachable!(), - }; - let require_classification = matches.is_present("require_classification"); - - let confirmed_block_cache_path = matches - .value_of("confirmed_block_cache_path") - .map(PathBuf::from) - .unwrap(); - - let bad_cluster_average_skip_rate = - value_t!(matches, "bad_cluster_average_skip_rate", usize).unwrap_or(50); - let max_infrastructure_concentration = - value_t!(matches, "max_infrastructure_concentration", f64).ok(); - let infrastructure_concentration_affects = value_t!( - matches, - "infrastructure_concentration_affects", - InfrastructureConcentrationAffects - ) - .unwrap(); - - let require_performance_metrics_reporting = - matches.is_present("require_performance_metrics_reporting"); - - let performance_db_url = matches.value_of("performance_db_url").map(str::to_string); - let performance_db_token = matches.value_of("performance_db_token").map(str::to_string); - - let blocklist_datacenter_asns = values_t!(matches, "blocklist_datacenter_asns", u64).ok(); - - let require_dry_run_to_distribute_stake = - matches.is_present("require_dry_run_to_distribute_stake"); - - let (use_rpc_tx_submission, use_preflight) = match matches.value_of("use_rpc_tx_submission") { - None => (false, false), - Some(value) => (true, value == "preflight"), - }; - - let mut config = Config { - cluster, - db_path, - db_suffix, - require_classification, - csv_output_mode, - epoch_classification, - dry_run, - ignore_existing_classification, - quality_block_producer_percentage, - max_poor_block_producer_percentage, - max_commission, - min_release_version, - max_release_version, - max_old_release_version_percentage, - max_poor_voter_percentage, - confirmed_block_cache_path, - max_infrastructure_concentration, - infrastructure_concentration_affects, - bad_cluster_average_skip_rate, - min_epoch_credit_percentage_of_average, - min_self_stake_lamports, - min_self_stake_exceptions, - max_active_stake_lamports, - enforce_min_self_stake, - enforce_testnet_participation, - min_testnet_participation, - baseline_stake_amount_lamports: None, - require_performance_metrics_reporting, - performance_db_url, - performance_db_token, - blocklist_datacenter_asns, - require_dry_run_to_distribute_stake, - performance_waiver_release_version, - use_rpc_tx_submission, - use_preflight, - }; - - let mut mainnet_urls_to_try = - values_t!(matches, "mainnet_beta_json_rpc_url", String).unwrap_or_default(); - mainnet_urls_to_try.push(DEFAULT_MAINNET_BETA_JSON_RPC_URL.parse().unwrap()); - let (mainnet_beta_rpc_client, mainnet_beta_tpu_client) = - try_json_rpc_urls(mainnet_urls_to_try)?; - let mainnet_beta_multi_client = - MultiClient::new(mainnet_beta_rpc_client, mainnet_beta_tpu_client, &config); - - info!( - "Using Mainnet Beta RPC URL {}", - mainnet_beta_multi_client.url() - ); - - let mut testnet_urls_to_try = - values_t!(matches, "testnet_json_rpc_url", String).unwrap_or_default(); - testnet_urls_to_try.push(DEFAULT_TESTNET_JSON_RPC_URL.parse().unwrap()); - let (testnet_rpc_client, testnet_tpu_client) = try_json_rpc_urls(testnet_urls_to_try)?; - let testnet_multi_client = MultiClient::new(testnet_rpc_client, testnet_tpu_client, &config); - info!("Using Testnet RPC URL {}", testnet_multi_client.url()); - - let cluster_multi_client = match cluster { - Testnet => &testnet_multi_client, - MainnetBeta => &mainnet_beta_multi_client, - }; - - let stake_pool: Box = match matches.subcommand() { - ("stake-pool-v0", Some(matches)) => { - let authorized_staker = keypair_of(matches, "authorized_staker").unwrap(); - let reserve_stake_address = pubkey_of(matches, "reserve_stake_address").unwrap(); - - let ignore_stake_distribution_errors = - matches.is_present("ignore_stake_distribution_errors"); - let min_reserve_stake_balance = - sol_to_lamports(value_t_or_exit!(matches, "min_reserve_stake_balance", f64)); - let baseline_stake_amount = match value_t!(matches, "baseline_stake_amount", f64) { - Ok(amt) => sol_to_lamports(amt), - Err(_) => { - println!("Missing baseline_stake_amount"); - process::exit(1) - } - }; - - config.baseline_stake_amount_lamports = Some(baseline_stake_amount); - - Box::new(stake_pool_v0::new( - cluster_multi_client, - authorized_staker, - baseline_stake_amount, - reserve_stake_address, - min_reserve_stake_balance, - ignore_stake_distribution_errors, - )?) - } - ("stake-pool", Some(matches)) => { - let authorized_staker = keypair_of(matches, "authorized_staker").unwrap(); - let pool_address = pubkey_of(matches, "pool_address").unwrap(); - let min_reserve_stake_balance = - sol_to_lamports(value_t_or_exit!(matches, "min_reserve_stake_balance", f64)); - let baseline_stake_amount = match value_t!(matches, "baseline_stake_amount", f64) { - Ok(amt) => sol_to_lamports(amt), - Err(_) => { - println!("Missing baseline_stake_amount"); - process::exit(1) - } - }; - - config.baseline_stake_amount_lamports = Some(baseline_stake_amount); - - Box::new(stake_pool::new( - cluster_multi_client, - authorized_staker, - pool_address, - baseline_stake_amount, - min_reserve_stake_balance, - )?) - } - ("noop-stake-pool", _) => Box::new(noop_stake_pool::new()), - _ => unreachable!(), - }; - - Ok(GetConfigResult { - config, - mainnet_beta_multi_client, - testnet_multi_client, - stake_pool, - }) -} - -/// Takes a list of JSON RPC Urls, and returns an RpcClient and TpuClient for the first server that is health -fn try_json_rpc_urls(urls_to_try: Vec) -> BoxResult<(Arc, TpuClient)> { - let (rpc_client, json_rpc_url) = urls_to_try - .iter() - .map(|url| { - let rpc_client = Arc::new(RpcClient::new_with_timeout_and_commitment( - url.clone(), - Duration::from_secs(180), - CommitmentConfig::confirmed(), - )); - (rpc_client, url.clone()) - }) - .find(|(rpc_client, url)| { - info!("Checking health of {}", url); - matches!(check_rpc_health(rpc_client), Ok(_)) - }) - .unwrap_or_else(|| { - error!("All RPC servers are unhealthy. Exiting."); - process::exit(1); - }); - - let websocket_url = solana_cli_config::Config::compute_websocket_url(&json_rpc_url); - let tpu_client = new_tpu_client_with_retry(&rpc_client, &websocket_url).unwrap_or_else(|e| { - error!("Unable to connect to TPU at {websocket_url}: {e:?}"); - process::exit(1); - }); - - Ok((rpc_client, tpu_client)) -} - -type ClassifyResult = ( - // quality - ValidatorList, - // poor - ValidatorList, - // classification reason - HashMap, - // cluster_skip_rate - usize, - // too_many_poor_block_producers - bool, - // Pubkey => (blocks, slots) - HashMap, -); - -fn classify_producers( - first_slot_in_epoch: Slot, - confirmed_blocks: HashSet, - leader_schedule: HashMap>, - config: &Config, -) -> BoxResult { - let mut poor_block_producers = HashSet::new(); - let mut quality_block_producers = HashSet::new(); - let mut blocks_and_slots = HashMap::new(); - let mut reason_msg = HashMap::new(); - - let mut total_blocks = 0; - let mut total_slots = 0; - for (validator_identity, relative_slots) in leader_schedule { - let mut validator_blocks = 0; - let mut validator_slots = 0; - for relative_slot in relative_slots { - let slot = first_slot_in_epoch + relative_slot as Slot; - total_slots += 1; - validator_slots += 1; - if confirmed_blocks.contains(&slot) { - total_blocks += 1; - validator_blocks += 1; - } - } - if validator_slots > 0 { - let validator_identity = Pubkey::from_str(&validator_identity)?; - let e = blocks_and_slots.entry(validator_identity).or_insert((0, 0)); - e.0 += validator_blocks; - e.1 += validator_slots; - } - } - let cluster_average_skip_rate = 100 - total_blocks * 100 / total_slots; - for (validator_identity, (blocks, slots)) in blocks_and_slots.clone() { - let skip_rate: usize = 100 - (blocks * 100 / slots); - - let msg = format!( - "{} blocks in {} slots, {:.2}% skip rate", - blocks, slots, skip_rate - ); - trace!("Validator {} produced {}", validator_identity, msg); - reason_msg.insert(validator_identity, msg); - - if skip_rate.saturating_sub(config.quality_block_producer_percentage) - > cluster_average_skip_rate - { - poor_block_producers.insert(validator_identity); - } else { - quality_block_producers.insert(validator_identity); - } - } - - let poor_block_producer_percentage = poor_block_producers.len() * 100 - / (quality_block_producers.len() + poor_block_producers.len()); - let too_many_poor_block_producers = - poor_block_producer_percentage > config.max_poor_block_producer_percentage; - - info!("cluster_average_skip_rate: {}", cluster_average_skip_rate); - info!("quality_block_producers: {}", quality_block_producers.len()); - trace!("quality_block_producers: {:?}", quality_block_producers); - info!("poor_block_producers: {}", poor_block_producers.len()); - trace!("poor_block_producers: {:?}", poor_block_producers); - info!( - "poor_block_producer_percentage: {}% (too many poor producers={})", - poor_block_producer_percentage, too_many_poor_block_producers, - ); - - Ok(( - quality_block_producers, - poor_block_producers, - reason_msg, - cluster_average_skip_rate, - too_many_poor_block_producers, - blocks_and_slots, - )) -} - -fn classify_poor_voters( - config: &Config, - vote_account_info: &[VoteAccountInfo], -) -> (ValidatorList, usize, u64, u64, bool) { - let avg_epoch_credits = vote_account_info - .iter() - .map(|vai| vai.epoch_credits) - .sum::() - / vote_account_info.len() as u64; - - let min_epoch_credits = - avg_epoch_credits * (100 - config.min_epoch_credit_percentage_of_average as u64) / 100; - - let poor_voters = vote_account_info - .iter() - .filter_map(|vai| { - if vai.epoch_credits < min_epoch_credits { - Some(vai.identity) - } else { - None - } - }) - .collect::>(); - - let max_poor_voters = vote_account_info.len() * config.max_poor_voter_percentage / 100; - let poor_voter_percentage = poor_voters.len() * 100 / vote_account_info.len(); - let too_many_poor_voters = poor_voters.len() > max_poor_voters; - - info!("Cluster average epoch credits: {}", avg_epoch_credits); - info!("Minimum required epoch credits: {}", min_epoch_credits); - info!("Poor voter: {}%", poor_voter_percentage); - debug!( - "poor_voters: {}, max poor_voters: {}", - poor_voters.len(), - max_poor_voters - ); - trace!("poor_voters: {:?}", poor_voters); - - ( - poor_voters, - poor_voter_percentage, - min_epoch_credits, - avg_epoch_credits, - too_many_poor_voters, - ) -} - -fn get_confirmed_blocks( - rpc_client: &RpcClient, - start_slot: Slot, - end_slot: Slot, -) -> BoxResult> { - info!( - "loading slot history. slot range is [{},{}]", - start_slot, end_slot - ); - let slot_history_account = rpc_client - .get_account_with_commitment(&sysvar::slot_history::id(), CommitmentConfig::finalized())? - .value - .unwrap(); - - let slot_history: SlotHistory = - from_account(&slot_history_account).ok_or("Failed to deserialize slot history")?; - - if start_slot >= slot_history.oldest() && end_slot <= slot_history.newest() { - info!("slot range within the SlotHistory sysvar"); - Ok((start_slot..=end_slot) - .filter(|slot| slot_history.check(*slot) == slot_history::Check::Found) - .collect()) - } else { - Err("slot range is not within the SlotHistory sysvar".into()) - } -} - -/// Split validators into quality/poor lists based on their block production over the given `epoch` -fn classify_block_producers( - rpc_client: &RpcClient, - config: &Config, - epoch: Epoch, -) -> BoxResult { - let epoch_schedule = rpc_client.get_epoch_schedule()?; - let first_slot_in_epoch = epoch_schedule.get_first_slot_in_epoch(epoch); - let last_slot_in_epoch = epoch_schedule.get_last_slot_in_epoch(epoch); - - let confirmed_blocks = - get_confirmed_blocks(rpc_client, first_slot_in_epoch, last_slot_in_epoch)?; - - let leader_schedule = rpc_client - .get_leader_schedule_with_commitment( - Some(first_slot_in_epoch), - CommitmentConfig::finalized(), - )? - .unwrap(); - - classify_producers( - first_slot_in_epoch, - confirmed_blocks, - leader_schedule, - config, - ) -} - -// Look for self stake, where the stake withdraw authority matches the vote account withdraw -// authority -fn get_self_stake_by_vote_account( - rpc_client: &RpcClient, - epoch: Epoch, - vote_account_info: &[VoteAccountInfo], -) -> BoxResult> { - let mut self_stake_by_vote_account = HashMap::new(); - - info!("Building list of authorized voters..."); - - let mut authorized_withdrawer = HashMap::new(); - for VoteAccountInfo { vote_address, .. } in vote_account_info { - let vote_account = rpc_client.get_account(vote_address)?; - - if let Some(vote_state) = VoteState::from(&vote_account) { - authorized_withdrawer.insert(vote_address, vote_state.authorized_withdrawer); - } - } - - info!("Fetching stake accounts..."); - let all_stake_accounts = get_all_stake_with_retry(rpc_client, None)?; - - let stake_history_account = rpc_client - .get_account_with_commitment(&sysvar::stake_history::id(), CommitmentConfig::finalized())? - .value - .unwrap(); - - let stake_history: StakeHistory = - from_account(&stake_history_account).ok_or("Failed to deserialize stake history")?; - - for (_stake_pubkey, stake_account) in all_stake_accounts { - if let Ok(StakeState::Stake(meta, stake)) = stake_account.state() { - let vote_address = &stake.delegation.voter_pubkey; - if let Some(vote_account_authorized_withdrawer) = - authorized_withdrawer.get(vote_address) - { - if *vote_account_authorized_withdrawer == meta.authorized.withdrawer { - let effective_stake = stake - .delegation - .stake_activating_and_deactivating(epoch, Some(&stake_history)) - .effective; - if effective_stake > 0 { - *self_stake_by_vote_account.entry(*vote_address).or_default() += - effective_stake; - } - } - } - } - } - - Ok(self_stake_by_vote_account) -} - -// Returns HashMap -fn get_testnet_participation( - config: &Config, - testnet_epoch: &Epoch, -) -> BoxResult>> { - if let Some((n, m)) = &config.min_testnet_participation { - assert_eq!(config.cluster, Cluster::MainnetBeta); - - let db_testnet_path = &config.cluster_db_path_for(Cluster::Testnet); - - let mut validator_stake_count: HashMap = HashMap::new(); - let mut num_classified_epochs = 0; - let mut epoch = *testnet_epoch; - - while num_classified_epochs < *m { - if let Some(epoch_classification) = - EpochClassification::load_if_validators_classified(epoch, db_testnet_path)? - { - if let Some(validator_classifications) = epoch_classification - .into_current() - .validator_classifications - { - num_classified_epochs += 1; - for (_pubkey, validator_classification) in validator_classifications { - let identity = validator_classification.identity; - let count = *validator_stake_count.entry(identity).or_insert(0); - if validator_classification.stake_state != ValidatorStakeState::None { - validator_stake_count.insert(identity, count + 1); - } - } - } - } - epoch -= 1; - } - - let testnet_participation: HashMap = validator_stake_count - .iter() - .map(|(pubkey, c)| (*pubkey, c >= n)) - .collect(); - - let num_poor_testnet_participants = - testnet_participation.iter().filter(|(_, v)| !*v).count(); - - let poor_testnet_particiant_percentage = if testnet_participation.is_empty() { - 100 - } else { - num_poor_testnet_participants * 100 / testnet_participation.len() - }; - - info!( - "Total testnet participation: {}", - testnet_participation.len() - ); - info!( - "Poor testnet participants: {} ({}%)", - num_poor_testnet_participants, poor_testnet_particiant_percentage - ); - - Ok(Some(testnet_participation)) - } else { - Ok(None) - } -} - -#[allow(clippy::too_many_arguments)] -fn classify( - rpc_client: &RpcClient, - testnet_rpc_client: &RpcClient, - config: &Config, - epoch: Epoch, - validator_list: &ValidatorList, - identity_to_participant: &IdentityToParticipant, - previous_epoch_validator_classifications: Option<&ValidatorClassificationByIdentity>, - non_rejected_participants: HashMap, -) -> BoxResult { - let last_epoch = epoch - 1; - - let testnet_epoch = testnet_rpc_client.get_epoch_info()?.epoch; - info!( - "Using testnet epoch {:?} as most recent epoch for testnet metrics", - testnet_epoch - ); - - let testnet_participation: Option> = - match get_testnet_participation(config, &testnet_epoch)? { - Some(tn_participation) => { - // We have a map from testnet pubkey to whether testnet participation requirements were met. Convert to a map from - // mainnet pubkeys to whether testnet requirements were met - let mb_to_tn: HashMap = non_rejected_participants - .iter() - .map(|(_, participant)| { - (participant.testnet_identity, participant.mainnet_identity) - }) - .collect(); - - Some( - tn_participation - .iter() - .filter_map(|(tn_pubkey, passed)| { - mb_to_tn - .get(tn_pubkey) - .map(|mb_pubkey| (*mb_pubkey, *passed)) - }) - .collect(), - ) - } - _ => None, - }; - - let data_centers = match data_center_info::get(config.cluster) { - Ok(data_centers) => { - // Sanity check the infrastructure stake percent data. More than 35% indicates there's - // probably a bug in the data source. Abort if so. - let max_infrastucture_stake_percent = data_centers - .info - .iter() - .map(|dci| dci.stake_percent.round() as usize) - .max() - .unwrap_or(100); - - info!( - "Largest data center stake concentration: ~{}%", - max_infrastucture_stake_percent - ); - if max_infrastucture_stake_percent > 35 { - return Err("Largest data center stake concentration is too high".into()); - } - data_centers - } - Err(err) => { - if config.max_infrastructure_concentration.is_some() { - return Err(err); - } - warn!("infrastructure concentration skipped: {}", err); - data_center_info::DataCenters::default() - } - }; - - let (vote_account_info, total_active_stake) = get_vote_account_info(rpc_client, last_epoch)?; - - let self_stake_by_vote_account = - get_self_stake_by_vote_account(rpc_client, epoch, &vote_account_info)?; - - let mut cluster_nodes_with_old_version: HashMap = HashMap::new(); - let mut cluster_nodes_with_too_new_version: HashMap = HashMap::new(); - - let release_versions: HashMap = rpc_client - .get_cluster_nodes()? - .into_iter() - .filter_map(|rpc_contact_info| { - if let Ok(identity) = Pubkey::from_str(&rpc_contact_info.pubkey) { - if validator_list.contains(&identity) { - if let Some(ref version) = rpc_contact_info.version { - if let Ok(semver) = semver::Version::parse(version) { - if let Some(min_release_version) = &config.min_release_version { - if semver < *min_release_version { - cluster_nodes_with_old_version - .insert(identity.to_string(), semver.clone()); - } - } - if let Some(max_release_version) = &config.max_release_version { - if semver > *max_release_version { - cluster_nodes_with_too_new_version - .insert(identity.to_string(), semver.clone()); - } - } - return Some((identity, semver)); - } - } - } - } - None - }) - .collect(); - - let min_release_version = match &config.min_release_version { - Some(v) => v.to_string(), - None => "".to_string(), - }; - - if let Some(ref min_release_version) = config.min_release_version { - info!( - "Validators running a release older than {}: {:?}", - min_release_version, cluster_nodes_with_old_version, - ); - } - if let Some(ref max_release_version) = config.max_release_version { - info!( - "Validators running a release newer than {}: {:?}", - max_release_version, cluster_nodes_with_too_new_version, - ); - } - - let ( - quality_block_producers, - poor_block_producers, - block_producer_classification_reason, - cluster_average_skip_rate, - too_many_poor_block_producers, - blocks_and_slots, - ) = classify_block_producers(rpc_client, config, last_epoch)?; - - let not_in_leader_schedule: ValidatorList = validator_list - .difference( - &quality_block_producers - .intersection(&poor_block_producers) - .cloned() - .collect(), - ) - .cloned() - .collect(); - - let too_many_old_validators = cluster_nodes_with_old_version.len() - > (poor_block_producers.len() + quality_block_producers.len()) - * config.max_old_release_version_percentage - / 100; - - let ( - poor_voters, - poor_voter_percentage, - min_epoch_credits, - avg_epoch_credits, - too_many_poor_voters, - ) = classify_poor_voters(config, &vote_account_info); - - let mut notes = vec![ - format!( - "Minimum vote credits required for epoch {}: {} (cluster average: {}, grace: {}%)", - last_epoch, - min_epoch_credits, - avg_epoch_credits, - config.min_epoch_credit_percentage_of_average, - ), - format!( - "Maximum allowed skip rate for epoch {}: {:.2}% (cluster average: {:.2}%, grace: {}%)", - last_epoch, - cluster_average_skip_rate + config.quality_block_producer_percentage, - cluster_average_skip_rate, - config.quality_block_producer_percentage, - ), - format!("Solana release {} or greater required", min_release_version), - format!("Maximum commission: {}%", config.max_commission), - format!( - "Minimum required self stake: {}", - Sol(config.min_self_stake_lamports) - ), - format!( - "Maximum active stake allowed: {}", - Sol(config.max_active_stake_lamports) - ), - ]; - if let Some(max_infrastructure_concentration) = config.max_infrastructure_concentration { - notes.push(format!( - "Maximum infrastructure concentration: {:0}%", - max_infrastructure_concentration - )); - } - if let Some((n, m)) = &config.min_testnet_participation { - notes.push(format!( - "Participants must maintain Baseline or Bonus stake level for {} of the last {} Testnet epochs", - n, m - )); - } - - if cluster_average_skip_rate > config.bad_cluster_average_skip_rate { - notes.push("Cluster average skip rate is poor".to_string()); - } - - if too_many_poor_voters { - notes.push(format!( - "Too many validators classified as poor voters for epoch {}: {}% (limit: {}%)", - last_epoch, poor_voter_percentage, config.max_poor_voter_percentage - )); - } - if too_many_old_validators { - notes.push(format!( - "Over {}% of validators classified as running an older release", - config.max_old_release_version_percentage - )); - } - if too_many_poor_block_producers { - notes.push(format!( - "Over {}% of validators classified as poor block producers in epoch {}", - config.max_poor_block_producer_percentage, last_epoch, - )); - } - - let validator_classifications = if too_many_poor_voters - || too_many_old_validators - || too_many_poor_block_producers - { - notes.push("Stake adjustments skipped this epoch".to_string()); - - if env::var("SEND_SLACK_MESSAGES").is_ok() { - if let Err(e) = send_slack_channel_message(¬es.join("\n")) { - info!("Could not send slack message: {:?}", e); - }; - } - - None - } else { - let mut validator_classifications = HashMap::new(); - - // Get all commission changes, so we can figure out what the validator's commission was - let validators_app_client = validators_app::Client::new_with_cluster(config.cluster)?; - // We need records from last_epoch+1. Epochs are approximately 3 days long, so 5 days should be more than enough - let five_days_ago = Utc::now() - ChronoDuration::days(5); - let all_commission_changes = - validators_app_client.get_all_commision_changes_since(five_days_ago)?; - - let performance_metrics_for_this_epoch: Option> = - if let Some(performance_db_url) = &config.performance_db_url { - let reported_performance_metrics = get_reported_performance_metrics( - performance_db_url, - &config.performance_db_token, - &config.cluster, - rpc_client, - &(epoch - 1), - &non_rejected_participants, - ); - - if let Ok(metrics) = reported_performance_metrics { - Some(metrics) - } else { - info!( - "Could not get reported performance metrics: {:?}", - reported_performance_metrics.err().unwrap() - ); - None - } - } else { - None - }; - - let mut reporting_counts: HashMap> = HashMap::new(); - - let mut number_sampled_epochs: u64 = 0; - if let Some(metrics) = performance_metrics_for_this_epoch.as_ref() { - metrics.iter().for_each(|(pk, (passed, _b))| { - reporting_counts.insert(*pk, HashMap::from([(epoch - 1, *passed)])); - }); - number_sampled_epochs = 1; - } else { - notes.push("Could not get reported performance metrics".to_string()); - }; - - let mut number_loops = 0; - let mut reporting_epoch = epoch - 2; - while number_sampled_epochs < NUM_SAMPLED_REPORTING_EPOCHS as u64 && reporting_epoch > 0 { - // Fetch from wiki repo - if let Some(epoch_classification) = EpochClassification::load_if_validators_classified( - reporting_epoch + 1, - &config.cluster_db_path(), - )? { - // Whether any "passed" records are found. If none are found, don't use the epoch. - let mut some_validators_reported = false; - - let mut this_epoch_reporting_counts: HashMap = HashMap::new(); - - epoch_classification - .into_current() - .validator_classifications - .unwrap() - .iter() - .for_each(|(pk, classification)| { - if let Some((passed, _reason)) = - classification.self_reported_metrics.as_ref() - { - if *passed { - some_validators_reported = true; - } - this_epoch_reporting_counts.insert(*pk, *passed); - } - }); - - // if some validators reported, we use the epoch to determine if validators reported in n/10 of the last epochs - if some_validators_reported { - this_epoch_reporting_counts.iter().for_each(|(pk, passed)| { - let entry = reporting_counts.entry(*pk).or_insert_with(HashMap::new); - entry.insert(reporting_epoch, *passed); - }); - number_sampled_epochs += 1; - } - } - number_loops += 1; - reporting_epoch = epoch - 2 - number_loops; - } - - // if mainnet, get list of validators that have been poor reporters on testnet - let poor_testnet_reporters: Option> = if config.cluster == MainnetBeta - { - Some( - EpochClassification::load_previous( - testnet_epoch, - &config.cluster_db_path_for(Testnet), - )? - .map(|(epoch, epoch_classification)| { - let note = format!("Using epoch {:?} for testnet classifications", epoch - 1); - notes.push(note.to_string()); - info!("{}", note); - - epoch_classification - }) - .unwrap() - .into_current() - .validator_classifications - .unwrap() - .iter() - .filter_map(|(pk, vc)| { - vc.self_reported_metrics_summary - .as_ref() - .and_then(|(pass, explanation)| { - if *pass { - None - } else { - // get corresponding mainnet validator pk - match non_rejected_participants - .iter() - .find(|(_pk, participant)| participant.testnet_identity == *pk) - { - Some((_, participant)) => { - let failure_explanation = - format!("Poor reporting on testnet: {:}", explanation); - Some((participant.mainnet_identity, failure_explanation)) - } - None => None, - } - } - }) - }) - .collect(), - ) - } else { - None - }; - - // Map of poor reporters - let mut poor_reporters_last_10_epochs: HashMap = HashMap::new(); - - let performance_reporting: HashMap = reporting_counts - .iter() - .map(|(pk, reports)| { - let mut failed_epochs: Vec<&Epoch> = reports - .iter() - .filter_map(|(epoch, passed)| if !passed { Some(epoch) } else { None }) - .collect::>(); - failed_epochs.sort(); - - let num_passed = reports.len() - failed_epochs.len(); - - let percent_passed = num_passed as f32 / reports.len() as f32; - - if let Some(reason) = poor_testnet_reporters.as_ref().and_then(|ptr| { - ptr.iter() - .find(|(failed_pk, _r)| pk == failed_pk) - .map(|(_pk, reason)| reason.clone()) - }) { - poor_reporters_last_10_epochs.insert(*pk, reason.clone()); - - (*pk, (false, reason)) - } else if percent_passed >= SUCCESS_MIN_PERCENT { - let pass_reason = format!( - "Reported correctly in {:?}/{:?} epochs", - num_passed, - reports.len() - ); - (*pk, (true, pass_reason)) - } else { - let failure_reason = format!( - "Only reported correctly in {:?}/{:?} epochs. Non-reporting epochs: {:?}", - num_passed, - reports.len(), - failed_epochs.iter().map(|v| v.to_string()).join(", ") - ); - poor_reporters_last_10_epochs.insert(*pk, failure_reason.clone()); - (*pk, (false, failure_reason)) - } - }) - .collect(); - - if config.require_performance_metrics_reporting && poor_reporters_last_10_epochs.is_empty() - { - notes.push("Could not fetch reporting metrics (or everyone reported); not applying the require-performance-metrics-reporting requirement".to_string()); - } - - for VoteAccountInfo { - identity, - vote_address, - commission, - active_stake, - epoch_credits, - } in vote_account_info - { - if !validator_list.contains(&identity) { - continue; - } - - let participant = identity_to_participant.get(&identity).cloned(); - - let current_data_center = data_centers - .by_identity - .get(&identity) - .cloned() - .unwrap_or_default(); - - let previous_classification = - previous_epoch_validator_classifications.and_then(|p| p.get(&identity)); - - let commission_at_end_of_epoch = calculate_commission_at_end_of_epoch( - epoch, - commission, - all_commission_changes.get(&identity), - ); - let num_epochs_max_commission_exceeded = previous_classification - .and_then(|vc| vc.num_epochs_max_commission_exceeded) - .unwrap_or(0) - + (if commission_at_end_of_epoch > config.max_commission { - 1 - } else { - 0 - }); - - // if the commission was below max_commission at the beginning of the last epoch, and is - // above max_commission at the beginning of the current epoch - let commission_increased_above_max = commission_at_end_of_epoch > config.max_commission - && previous_classification - .and_then(|pc| pc.commission) - .map_or(false, |commission| commission <= config.max_commission); - - let num_epochs_commission_increased_above_max = previous_classification - .and_then(|vc| vc.num_epochs_commission_increased_above_max) - .unwrap_or(0) - + (if commission_increased_above_max { 1 } else { 0 }); - - let mut previous_data_center_residency = previous_classification - .and_then(|vc| vc.data_center_residency.clone()) - .unwrap_or_default(); - - let previous_stake_state = previous_classification - .map(|vc| vc.stake_state) - .unwrap_or_default(); - - let self_stake = self_stake_by_vote_account - .get(&vote_address) - .cloned() - .unwrap_or_default(); - - let block_producer_classification_reason_msg = block_producer_classification_reason - .get(&identity) - .cloned() - .unwrap_or_default(); - let vote_credits_msg = - format!("{} credits earned in epoch {}", epoch_credits, last_epoch); - - let mut validator_notes = vec![]; - - let new_validator = !previous_data_center_residency.contains_key(¤t_data_center); - - let insufficent_self_stake_msg = - format!("Insufficient self stake: {}", Sol(self_stake)); - if !config.enforce_min_self_stake && self_stake < config.min_self_stake_lamports { - validator_notes.push(insufficent_self_stake_msg.clone()); - } - - let insufficent_testnet_participation: Option = testnet_participation - .as_ref() - .and_then(|testnet_participation| { - let passed = testnet_participation - .get(&identity) - .map_or(false, |found_passed| *found_passed); - - if !passed { - let note = "Insufficient testnet participation".to_string(); - if config.enforce_testnet_participation { - return Some(note); - } else { - validator_notes.push(note); - } - } - None - }); - - let performance_requirements_waived = - if let (Some(performance_waiver_release_version), Some(release_version)) = ( - config.performance_waiver_release_version.clone(), - release_versions.get(&identity), - ) { - if release_version >= &performance_waiver_release_version { - Some(release_version) - } else { - None - } - } else { - None - }; - - let (stake_state, reason) = if num_epochs_commission_increased_above_max > 1 { - ( - ValidatorStakeState::None, - format!( - "Commission increased above max_commission for {} epochs. Permanently destaked.", - num_epochs_commission_increased_above_max - ), - ) - } else if config - .blocklist_datacenter_asns - .as_ref() - .map_or(false, |asns| asns.contains(¤t_data_center.asn)) - { - ( - ValidatorStakeState::None, - format!("Validator in blocked data center: {}", current_data_center), - ) - } else if config.require_performance_metrics_reporting - && !poor_reporters_last_10_epochs.is_empty() // if poor_reporters empty, either everyone is a good reporter, or we did not get any reporting metrics so need to skip this requirement - && poor_reporters_last_10_epochs.contains_key(&identity) - { - ( - ValidatorStakeState::None, - poor_reporters_last_10_epochs - .get(&identity) - .unwrap() - .clone(), - ) - } else if config.enforce_min_self_stake - && self_stake < config.min_self_stake_lamports - && !config.min_self_stake_exceptions.contains(&identity) - { - let insufficent_self_stake_msg = - format!("Insufficient self stake: {}", Sol(self_stake)); - validator_notes.push(insufficent_self_stake_msg.clone()); - (ValidatorStakeState::None, insufficent_self_stake_msg) - } else if active_stake > config.max_active_stake_lamports { - ( - ValidatorStakeState::None, - format!("Active stake is too high: {}", Sol(active_stake)), - ) - } else if commission_at_end_of_epoch > config.max_commission { - ( - ValidatorStakeState::None, - format!( - "Commission is too high: {}% commission", - commission_at_end_of_epoch - ), - ) - } else if let Some(insufficent_testnet_participation) = - insufficent_testnet_participation - { - (ValidatorStakeState::None, insufficent_testnet_participation) - } else if let Some(version) = performance_requirements_waived { - ( - ValidatorStakeState::Bonus, - format!( - "Performance requirements waived for running validator version {:?}", - version.to_string() - ), - ) - } else if poor_voters.contains(&identity) { - ( - ValidatorStakeState::None, - format!("Insufficient vote credits: {}", vote_credits_msg), - ) - } else if cluster_nodes_with_old_version.contains_key(&identity.to_string()) { - ( - ValidatorStakeState::None, - format!( - "Outdated Solana release: {}", - cluster_nodes_with_old_version - .get(&identity.to_string()) - .unwrap() - ), - ) - } else if cluster_nodes_with_too_new_version.contains_key(&identity.to_string()) { - ( - ValidatorStakeState::None, - format!( - "Running Solana release greater than {}: {}", - config.max_release_version.as_ref().unwrap(), - cluster_nodes_with_too_new_version - .get(&identity.to_string()) - .unwrap() - ), - ) - } else if quality_block_producers.contains(&identity) { - ( - ValidatorStakeState::Bonus, - format!( - "Good block production during epoch {}: {}", - last_epoch, block_producer_classification_reason_msg - ), - ) - } else if poor_block_producers.contains(&identity) { - ( - ValidatorStakeState::Baseline, - format!( - "Poor block production during epoch {}: {}", - last_epoch, block_producer_classification_reason_msg - ), - ) - } else { - assert!(!poor_voters.contains(&identity)); - assert!(not_in_leader_schedule.contains(&identity)); - ( - // If the validator is not in the leader schedule but was Bonus previously, - // maintain Bonus. - // - // Destaking due to delinquency will not be reflected in the leader schedule - // until 2 epochs later, which point the validator may have recovered and - // there's no need to punish the validator further by reducing it to the - // Baseline level. - if previous_stake_state == ValidatorStakeState::Bonus { - ValidatorStakeState::Bonus - } else { - ValidatorStakeState::Baseline - }, - format!("No leader slots; {}", vote_credits_msg), - ) - }; - - // Data center seniority increases with Bonus stake and decreases - // otherwise - previous_data_center_residency - .entry(current_data_center.clone()) - .or_default(); - - let data_center_residency = previous_data_center_residency - .into_iter() - .map(|(data_center, seniority)| { - if data_center == current_data_center - && stake_state == ValidatorStakeState::Bonus - { - (data_center, seniority.saturating_add(1)) - } else { - (data_center, seniority.saturating_sub(1)) - } - }) - .filter(|(_, i)| *i > 0) - .collect::>(); - - debug!( - "\nidentity: {} ({:?})\n\ - - vote address: {}\n\ - - stake state: {:?}, data center: {:?} (seniority: {}), self stake: {}, commission: {}\n\ - - {}", - identity, - participant, - vote_address, - stake_state, - current_data_center, - data_center_residency - .get(¤t_data_center) - .cloned() - .unwrap_or_default(), - Sol(self_stake), - commission_at_end_of_epoch, - reason - ); - - let (blocks, slots) = match blocks_and_slots.get(&identity) { - Some((b, s)) => (Some(*b), Some(*s)), - None => (None, None), - }; - - validator_classifications.insert( - identity, - ValidatorClassification { - identity, - vote_address, - stake_state, - stake_states: None, // to be added after data center concentration adjustments have been made - stake_action: None, - stake_state_reason: reason, - notes: validator_notes, - data_center_residency: Some(data_center_residency), - current_data_center: Some(current_data_center.clone()), - participant, - prioritize_funding_in_next_epoch: None, - blocks, - slots, - vote_credits: Some(epoch_credits), - commission: Some(commission_at_end_of_epoch), - self_stake: Some(self_stake), - new_data_center_residency: Some(new_validator), - release_version: release_versions.get(&identity).cloned(), - num_epochs_max_commission_exceeded: Some(num_epochs_max_commission_exceeded), - num_epochs_commission_increased_above_max: Some( - num_epochs_commission_increased_above_max, - ), - self_reported_metrics: performance_metrics_for_this_epoch.as_ref().and_then( - |metrics| metrics.get(&identity).and_then(|v| Option::from(v.clone())), - ), - self_reported_metrics_summary: performance_reporting - .get(&identity) - .and_then(|v| Option::from(v.clone())), - }, - ); - } - notes.push(format!( - "{} validators processed", - validator_classifications.len() - )); - - // Calculating who gets destaked when the InfrastructureConcentrationAffects is DestakeOverflow requires that - // we have the data center seniority scores of _all_ validators calculated first, so we go - // back and adjust the stake states for the infrastructure concentration effects here. - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - config, - ); - - // Now update the stake_states array with the state for the current epoch - validator_classifications.iter_mut().for_each(|(k, vc)| { - let previous_classification = - previous_epoch_validator_classifications.and_then(|p| p.get(k)); - - let mut stake_states = previous_classification - .and_then(|vc| vc.stake_states.clone()) - .unwrap_or_default(); - stake_states.insert(0, (vc.stake_state, vc.stake_state_reason.clone())); - vc.stake_states = Some(stake_states); - }); - - Some(validator_classifications) - }; - notes.push(format!("Active stake: {}", Sol(total_active_stake))); - - let epoch_config = EpochConfig { - require_classification: Some(config.require_classification), - quality_block_producer_percentage: Some(config.quality_block_producer_percentage), - max_poor_block_producer_percentage: Some(config.max_poor_block_producer_percentage), - max_commission: Some(config.max_commission), - min_release_version: config.min_release_version.clone(), - max_release_version: config.max_release_version.clone(), - max_old_release_version_percentage: Some(config.max_old_release_version_percentage), - max_poor_voter_percentage: Some(config.max_poor_voter_percentage), - max_infrastructure_concentration: config.max_infrastructure_concentration, - infrastructure_concentration_affects: Some( - config.infrastructure_concentration_affects.clone(), - ), - bad_cluster_average_skip_rate: Some(config.bad_cluster_average_skip_rate), - min_epoch_credit_percentage_of_average: Some(config.min_epoch_credit_percentage_of_average), - min_self_stake_lamports: Some(config.min_self_stake_lamports), - max_active_stake_lamports: Some(config.max_active_stake_lamports), - enforce_min_self_stake: Some(config.enforce_min_self_stake), - enforce_testnet_participation: Some(config.enforce_testnet_participation), - min_testnet_participation: config.min_testnet_participation, - baseline_stake_amount_lamports: config.baseline_stake_amount_lamports, - require_performance_metrics_reporting: Some(config.require_performance_metrics_reporting), - performance_waiver_release_version: config.performance_waiver_release_version.clone(), - }; - - let epoch_stats = EpochStats { - bonus_stake_amount: 0, - min_epoch_credits, - avg_epoch_credits, - max_skip_rate: (cluster_average_skip_rate + config.quality_block_producer_percentage), - cluster_average_skip_rate, - total_active_stake, - }; - - Ok(EpochClassificationV1 { - data_center_info: data_centers.info, - validator_classifications, - notes, - config: Some(epoch_config), - stats: Some(epoch_stats), - distribution_state: Some(if config.require_dry_run_to_distribute_stake { - DistributionState::Pending - } else { - DistributionState::Distributing - }), - }) -} - -// Adjusts the validator classifications based on the infrastructure concentration affect -fn adjust_validator_classification_for_data_center_concentration( - validator_classifications: &mut HashMap, - data_centers: &DataCenters, - config: &Config, -) { - let infrastructure_concentration_too_high: Vec<&data_center_info::DataCenterInfo> = - match config.max_infrastructure_concentration { - Some(max_infrastructure_concentration) => data_centers - .info - .iter() - .filter(|dci| dci.stake_percent > max_infrastructure_concentration) - .collect(), - _ => { - vec![] - } - }; - - debug!( - "{} data centers over max_infrastructure_concentration", - infrastructure_concentration_too_high.len() - ); - - match &config.infrastructure_concentration_affects { - InfrastructureConcentrationAffects::WarnAll => { - for dci in infrastructure_concentration_too_high { - for validator_id in &dci.validators { - if let Some(vc) = validator_classifications.get_mut(validator_id) { - warn_validator_for_infrastructure_concentration(vc, dci); - } - } - } - } - InfrastructureConcentrationAffects::DestakeListed(list) => { - for dci in infrastructure_concentration_too_high { - for validator_id in &dci.validators { - if let Some(vc) = validator_classifications.get_mut(validator_id) { - if list.contains(validator_id) { - destake_validator_for_infrastructure_concentration(vc, dci); - } else { - warn_validator_for_infrastructure_concentration(vc, dci); - } - } - } - } - } - InfrastructureConcentrationAffects::DestakeAll => { - for dci in infrastructure_concentration_too_high { - for validator_id in &dci.validators { - if let Some(vc) = validator_classifications.get_mut(validator_id) { - destake_validator_for_infrastructure_concentration(vc, dci); - } - } - } - } - InfrastructureConcentrationAffects::DestakeNew => { - for dci in infrastructure_concentration_too_high { - for validator_id in &dci.validators { - if let Some(vc) = validator_classifications.get_mut(validator_id) { - if vc.new_data_center_residency.unwrap_or(false) { - destake_validator_for_infrastructure_concentration(vc, dci); - } - } - } - } - } - InfrastructureConcentrationAffects::DestakeOverflow => { - debug!("Processing InfrastructureConcentrationAffects::DestakeOverflow"); - infrastructure_concentration_too_high.iter().for_each(|&data_center_info| { - // now order by seniority - let validators_by_seniority: Vec = validator_classifications.iter() - .filter_map(|(_k, vc)| { - if let Some(ref current_data_center) = vc.current_data_center { - if current_data_center == &data_center_info.id { - vc.data_center_residency.as_ref().map(|dcr| (vc.identity, dcr.get(current_data_center))) - } else { - None - } - } else { - None - } - }).sorted_by(|(_ac, a), (_bc, b)| { - a.cmp(b) - }).map(|(c, _s)| c) - .collect(); - - let validators_stake = data_center_info.validators_stake.clone().unwrap_or_default(); - - // Figure out total stake from the data center's stake_percent and stake; TODO figure this out outside the loop - let total_stake = 100f64 * (data_center_info.stake as f64) / data_center_info.stake_percent; - // Maximum amount of stake a data center can have without being over max_infrastructure_concentration - let max_stake = config.max_infrastructure_concentration.unwrap() * total_stake / 100f64; - // We will keep destaking validators and removing their stake from this value until it is under max_stake - let mut data_center_stake = data_center_info.stake as f64; - - // destake validators and remove their stake from the total until the sum is below the threshold - for validator_identity in validators_by_seniority { - if let Some(validator_classification) = validator_classifications.get_mut(&validator_identity) { - if validator_classification.stake_state != ValidatorStakeState::None { - debug!("Destake {} for being junior in a high-concentration data center", validator_classification.identity); - destake_validator_for_infrastructure_concentration(validator_classification, data_center_info); - } - data_center_stake -= *validators_stake.get(&validator_classification.identity).unwrap_or(&(0)) as f64; - }; - - if data_center_stake < max_stake { - break; - } - }; - }); - } - }; -} - -// Change ValidatorClassification.stake_state to None and adjust for violation of the infrastructure_concentration constraint -fn destake_validator_for_infrastructure_concentration( - validator_classification: &mut ValidatorClassification, - data_center_info: &DataCenterInfo, -) { - if validator_classification.stake_state == ValidatorStakeState::Bonus { - // If the validator was to receive Bonus, it received a , +1 seniority score bump. - // Validators without Bonus (Baseline or None) recieved a -1 seniority score penalty. - // So subtract 2 from the Validator's seinority score if it was slated to receive Bonus - // but is getting destaked for being in a over-saturated data center. - let dcr = validator_classification - .data_center_residency - .clone() - .unwrap(); - let score = dcr.get(&data_center_info.id.clone()).unwrap_or(&1); - validator_classification - .data_center_residency - .as_mut() - .unwrap() - .insert(data_center_info.id.clone(), score.saturating_sub(2)); - } - - validator_classification.stake_state = ValidatorStakeState::None; - - validator_classification.stake_state_reason = format!( - "infrastructure concentration {:.1}% is too high; find a new data center", - data_center_info.stake_percent - ); -} - -// Change ValidatorClassification.stake_state to warn about violation of the infrastructure_concentration constraint -fn warn_validator_for_infrastructure_concentration( - validator_classification: &mut ValidatorClassification, - data_center_info: &DataCenterInfo, -) { - validator_classification.notes.push(format!( - "infrastructure concentration {:.1}% is too high; consider finding a new data center", - data_center_info.stake_percent - )); -} - -fn main() -> BoxResult<()> { - solana_logger::setup_with_default("solana=info"); - - let GetConfigResult { - config, - mainnet_beta_multi_client, - testnet_multi_client, - mut stake_pool, - } = get_config()?; - - info!("Loading participants..."); - let all_participants = get_participants_with_state(&mainnet_beta_multi_client, None)?; - - let (approved_participants, non_rejected_participants) = all_participants.iter().fold( - (HashMap::new(), HashMap::new()), - |(mut approved_validators, mut not_rejected_validators), (pubkey, participant)| { - if participant.state == ParticipantState::Approved { - approved_validators.insert(*pubkey, participant.clone()); - }; - if participant.state != ParticipantState::Rejected { - not_rejected_validators.insert(*pubkey, participant.clone()); - }; - (approved_validators, not_rejected_validators) - }, - ); - - debug!("{:?} approved participants", approved_participants.len()); - debug!( - "{:?} non-rejected participants", - non_rejected_participants.len() - ); - - let (mainnet_identity_to_participant, testnet_identity_to_participant): ( - IdentityToParticipant, - IdentityToParticipant, - ) = approved_participants - .iter() - .map( - |( - participant_pk, - Participant { - mainnet_identity, - testnet_identity, - .. - }, - )| { - ( - (*mainnet_identity, *participant_pk), - (*testnet_identity, *participant_pk), - ) - }, - ) - .unzip(); - - info!("{} participants loaded", approved_participants.len()); - assert!(approved_participants.len() > 450); // Hard coded sanity check... - - let notifier = if config.dry_run { - Notifier::new("DRYRUN") - } else { - Notifier::default() - }; - - let cluster_multi_client = match config.cluster { - Testnet => &testnet_multi_client, - MainnetBeta => &mainnet_beta_multi_client, - }; - - let epoch = cluster_multi_client.get_epoch_info()?.epoch; - info!("Current epoch: {:?}", epoch); - if epoch == 0 { - return Ok(()); - } - - info!("Data directory: {}", config.cluster_db_path().display()); - - let previous_epoch_classification = - EpochClassification::load_previous(epoch, &config.cluster_db_path())? - .map(|p| p.1) - .unwrap_or_default() - .into_current(); - - let epoch_classification_exists = EpochClassification::exists(epoch, &config.cluster_db_path()); - info!( - "Classification for epoch {} {}", - epoch, - if epoch_classification_exists { - "already exists" - } else { - "does not exist" - } - ); - - if !epoch_classification_exists && config.require_classification { - return Err(format!( - "--require-classification is set, but classification for epoch {} does not exist", - epoch - ) - .into()); - } - - let (mut epoch_classification, new_classification) = if epoch_classification_exists - && !config.ignore_existing_classification - { - ( - EpochClassification::load(epoch, &config.cluster_db_path())?.into_current(), - false, - ) - } else { - let (validator_list, identity_to_participant): (ValidatorList, HashMap) = - match config.cluster { - MainnetBeta => ( - mainnet_identity_to_participant.keys().cloned().collect(), - mainnet_identity_to_participant, - ), - Testnet => { - let approved_for_validator_list = validator_list::testnet_validators(); - - ( - non_rejected_participants - .iter() - .map(|(_k, v)| v.testnet_identity) - .filter(|pk| approved_for_validator_list.contains(pk)) - .collect(), - testnet_identity_to_participant, - ) - } - }; - - ( - classify( - cluster_multi_client, - &testnet_multi_client, - &config, - epoch, - &validator_list, - &identity_to_participant, - previous_epoch_classification - .validator_classifications - .as_ref(), - non_rejected_participants, - )?, - true, - ) - }; - - let mut notifications = epoch_classification.notes.clone(); - - let mut first_time_distributing_stake = false; - - if let Some(ref mut validator_classifications) = epoch_classification.validator_classifications - { - let previous_validator_classifications = previous_epoch_classification - .validator_classifications - .clone() - .unwrap_or_default(); - - let mut min_stake_node_count = 0; - let mut bonus_stake_node_count = 0; - let mut baseline_stake_node_count = 0; - let mut validator_stake_change_notes = vec![]; - let mut validator_notes = vec![]; - let desired_validator_stake: Vec<_> = validator_classifications - .values() - .map(|vc| { - validator_notes.extend( - vc.notes - .iter() - .map(|note| format!("Note: {}: {}", vc.identity, note)), - ); - - let stake_state_changed = match previous_validator_classifications - .get(&vc.identity) - .map(|prev_vc| prev_vc.stake_state) - { - Some(previous_stake_state) => previous_stake_state != vc.stake_state, - None => true, - }; - - if stake_state_changed { - validator_stake_change_notes.push(format!( - "* {:?} stake: {}: {}", - vc.stake_state, vc.identity, vc.stake_state_reason - )); - } - - match vc.stake_state { - ValidatorStakeState::None => min_stake_node_count += 1, - ValidatorStakeState::Bonus => bonus_stake_node_count += 1, - ValidatorStakeState::Baseline => baseline_stake_node_count += 1, - } - - ValidatorStake { - identity: vc.identity, - vote_address: vc.vote_address, - stake_state: vc.stake_state, - priority: previous_validator_classifications - .get(&vc.identity) - .map(|prev_vc| prev_vc.prioritize_funding_in_next_epoch) - .unwrap_or_default() - .unwrap_or_default(), - } - }) - .collect(); - - // if true, we are classifying validators and saving the classifications, but _not_ distributing stake - let pre_run_dry_run = config.require_dry_run_to_distribute_stake && new_classification; - info!("pre_run_dry_run {}", pre_run_dry_run); - if pre_run_dry_run { - info!("Doing a pre-run dry run; validators will be classified, but stake will not be distributed until the next time the bot runs"); - } - - let distribute_stake = match epoch_classification.distribution_state { - None => { - first_time_distributing_stake = !config.dry_run && new_classification; - - !config.dry_run - } - Some(DistributionState::Pending) => { - first_time_distributing_stake = !config.dry_run && !pre_run_dry_run; - if !pre_run_dry_run { - //second time running; start distributing - epoch_classification.distribution_state = Some(DistributionState::Distributing); - } - - first_time_distributing_stake - } - Some(DistributionState::Distributing) => !config.dry_run, - Some(DistributionState::Cancelled) => { - info!("Stake not being distributed: Distributing stake cancelled"); - false - // TODO: exit? - } - }; - - info!("Distributing stake: {}", distribute_stake); - info!( - "First time distributing stake: {}", - first_time_distributing_stake - ); - - let (stake_pool_notes, validator_stake_actions, unfunded_validators, bonus_stake_amount) = - match config.cluster { - Testnet => { - // Don't apply stake pool for Testnet. We only care about None/Baseline/Bonus values - ( - vec!["No stake distribution for Testnet".to_string()], - ValidatorStakeActions::new(), - UnfundedValidators::new(), - 42_000 * LAMPORTS_PER_SOL, - ) - } - MainnetBeta => stake_pool.apply( - cluster_multi_client, - pre_run_dry_run || config.dry_run, - &desired_validator_stake, - if config.cluster == Testnet { - Some(0.85) - } else { - None - }, - )?, - }; - - let mut summary_messages: Vec = vec![format!( - "summary for {:?}/{:?}\n", - config.cluster, - epoch - 1 - )]; - - // Get previous epoch's stats so we can show the change - let mut prev_none_count = 0; - let mut prev_baseline_count = 0; - let mut prev_bonus_count = 0; - previous_epoch_classification - .validator_classifications - .unwrap() - .iter() - .for_each(|(_, classification)| match classification.stake_state { - ValidatorStakeState::None => { - prev_none_count += 1; - } - ValidatorStakeState::Baseline => { - prev_baseline_count += 1; - } - ValidatorStakeState::Bonus => { - prev_bonus_count += 1; - } - }); - - summary_messages.push(format!( - "None: {:?} (prev epoch {:?}; {:?}% change)\n", - min_stake_node_count, - prev_none_count, - (100.0 * ((min_stake_node_count as f32 / prev_none_count as f32) - 1.0)).round() as i8 - )); - summary_messages.push(format!( - "Baseline: {:?} (prev epoch {:?}; {:?}% change)\n", - baseline_stake_node_count, - prev_baseline_count, - (100.0 * ((baseline_stake_node_count as f32 / prev_baseline_count as f32) - 1.0)) - .round() as i8 - )); - summary_messages.push(format!( - "Bonus: {:?} (prev epoch {:?}; {:?}% change)\n", - bonus_stake_node_count, - prev_bonus_count, - (100.0 * ((bonus_stake_node_count as f32 / prev_bonus_count as f32) - 1.0)).round() - as i8 - )); - summary_messages.extend(stake_pool_notes.clone()); - - // Send Slack notification on pre-run dry run or first live run - if env::var("SEND_SLACK_MESSAGES").is_ok() - && (first_time_distributing_stake || pre_run_dry_run) - { - if pre_run_dry_run { - summary_messages.insert(0, "Stake bot DRY run estimates".to_string()); - } else { - // first_time = true - summary_messages.insert(0, "Stake bot LIVE run".to_string()); - } - - if let Err(e) = send_slack_channel_message(&summary_messages.join("\n")) { - info!("Could not send slack message: {:?}", e); - }; - }; - - notifications.extend(stake_pool_notes.clone()); - epoch_classification.notes.extend(stake_pool_notes); - - for identity in unfunded_validators { - validator_classifications - .entry(identity) - .and_modify(|e| e.prioritize_funding_in_next_epoch = Some(true)); - } - - for (identity, stake_action) in validator_stake_actions { - validator_classifications - .entry(identity) - .and_modify(|e| e.stake_action = Some(stake_action)); - } - - validator_notes.sort(); - notifications.extend(validator_notes); - - validator_stake_change_notes.sort(); - notifications.extend(validator_stake_change_notes); - - if let Some(ref mut stats) = epoch_classification.stats { - stats.bonus_stake_amount = bonus_stake_amount; - }; - } - - if config.epoch_classification == OutputMode::Yes - || (first_time_distributing_stake && config.epoch_classification == OutputMode::First) - || (config.require_dry_run_to_distribute_stake - && config.epoch_classification == OutputMode::First) - { - EpochClassification::new(epoch_classification).save(epoch, &config.cluster_db_path())?; - } - - if config.csv_output_mode == OutputMode::Yes - || (first_time_distributing_stake && config.csv_output_mode == OutputMode::First) - { - generate_csv(epoch, &config)?; - } - - for notification in notifications { - info!("notification: {}", notification); - // Only notify the user if this is the first run for this epoch - if first_time_distributing_stake { - notifier.send(¬ification); - } - } - - Ok(()) -} - -fn generate_csv(epoch: Epoch, config: &Config) -> BoxResult<()> { - info!("generate_csv()"); - let mut list = vec![( - epoch, - EpochClassification::load(epoch, &config.cluster_db_path())?.into_current(), - )]; - - while let Some((epoch, epoch_classification)) = - EpochClassification::load_previous(list.last().unwrap().0, &config.cluster_db_path())? - { - list.push((epoch, epoch_classification.into_current())); - } - - let validator_summary_csv = { - let mut validator_summary_csv = vec![]; - - let mut csv = vec!["Identity".to_string()]; - let mut validator_stakes: HashMap> = - HashMap::default(); - let mut validator_epochs = vec![]; - for (epoch, epoch_classification) in list.iter() { - csv.push(format!("Epoch {}", epoch)); - validator_epochs.push(epoch); - if let Some(ref validator_classifications) = - epoch_classification.validator_classifications - { - for (identity, classification) in validator_classifications { - validator_stakes - .entry(*identity) - .or_default() - .insert(*epoch, classification.stake_state); - } - } - } - validator_summary_csv.push(csv.join(",")); - - let mut validator_stakes = validator_stakes.into_iter().collect::>(); - validator_stakes.sort_by(|a, b| a.0.cmp(&b.0)); - for (identity, epoch_stakes) in validator_stakes { - let mut csv = vec![identity.to_string()]; - for epoch in &validator_epochs { - if let Some(stake_state) = epoch_stakes.get(epoch) { - csv.push(format!("{:?}", stake_state)); - } else { - csv.push("-".to_string()); - } - } - validator_summary_csv.push(csv.join(",")); - } - validator_summary_csv.join("\n") - }; - let filename = config.cluster_db_path().join("validator-summary.csv"); - info!("Writing {}", filename.display()); - let mut file = File::create(filename)?; - file.write_all(&validator_summary_csv.into_bytes())?; - - Ok(()) -} - -/// Given a validator's current commission and history of commission changes, returns the validator's commission at the end of `epoch` -/// Only works if the commission change history includes all changes for `epoch` and `epoch + 1`. -fn calculate_commission_at_end_of_epoch( - epoch: u64, - current_commission: u8, - commission_change_history: Option<&Vec>, -) -> u8 { - match commission_change_history { - Some(records) => { - // First check if there is a commission change record in `epoch`. The last one will - // give us the commision at the end of the epoch. - let mut rs: Vec<&CommissionChangeIndexHistoryEntry> = records - .iter() - .filter(|r| r.epoch.is_some() && r.epoch.unwrap() <= epoch) - .collect(); - - if !rs.is_empty() { - rs.sort_by(|a, b| { - a.epoch - .unwrap() - .cmp(&b.epoch.unwrap()) - .then(a.epoch_completion.partial_cmp(&b.epoch_completion).unwrap()) - }); - rs.last().unwrap().commission_after.unwrap() as u8 - } else { - // If we didn't find a commission change in `epoch`, check for commission changes in - // `epoch + 1`. The first one will give us the commission at the end of `epoch`. - let mut rs: Vec<&CommissionChangeIndexHistoryEntry> = records - .iter() - .filter(|r| { - r.commission_before.is_some() - && r.epoch.is_some() - && r.epoch.unwrap() > epoch - }) - .collect(); - if rs.is_empty() { - // no commission changes in epoch `epoch + 1`; commission is the current - // commission. - current_commission - } else { - rs.sort_by(|a, b| { - a.epoch - .cmp(&b.epoch) - .then(a.epoch_completion.partial_cmp(&b.epoch_completion).unwrap()) - }); - rs.first().unwrap().commission_before.unwrap() as u8 - } - } - } - // If there are no commission changes, the commission is the current commission - None => current_commission, - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::data_center_info::{DataCenterId, DataCenterInfo}; - use std::iter::FromIterator; - - #[test] - fn test_quality_producer_with_average_skip_rate() { - solana_logger::setup(); - let config = Config { - quality_block_producer_percentage: 10, - max_poor_block_producer_percentage: 40, - ..Config::default_for_test() - }; - - let confirmed_blocks: HashSet = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 21, 22, 43, 44, 45, 46, 47, 48, - ] - .iter() - .cloned() - .collect(); - let mut leader_schedule = HashMap::default(); - let l1 = Pubkey::new_unique(); - let l2 = Pubkey::new_unique(); - let l3 = Pubkey::new_unique(); - let l4 = Pubkey::new_unique(); - let l5 = Pubkey::new_unique(); - leader_schedule.insert(l1.to_string(), (0..10).collect()); - leader_schedule.insert(l2.to_string(), (10..20).collect()); - leader_schedule.insert(l3.to_string(), (20..30).collect()); - leader_schedule.insert(l4.to_string(), (30..40).collect()); - leader_schedule.insert(l5.to_string(), (40..50).collect()); - let ( - quality, - poor, - _reason_msg, - cluster_average_skip_rate, - too_many_poor_block_producers, - blocks_and_slots, - ) = classify_producers(0, confirmed_blocks, leader_schedule, &config).unwrap(); - - assert_eq!(cluster_average_skip_rate, 58); - assert!(quality.contains(&l1)); - assert!(quality.contains(&l5)); - assert!(quality.contains(&l2)); - assert_eq!(quality.len(), 3); - assert!(poor.contains(&l3)); - assert!(poor.contains(&l4)); - assert_eq!(poor.len(), 2); - assert!(!too_many_poor_block_producers); - - // spot-check that returned slots and blocks are correct - let l1_blocks_and_slots = blocks_and_slots.get(&l1).unwrap(); - assert_eq!(l1_blocks_and_slots.0, 9); - assert_eq!(l1_blocks_and_slots.1, 10); - - let l2_blocks_and_slots = blocks_and_slots.get(&l2).unwrap(); - assert_eq!(l2_blocks_and_slots.0, 4); - assert_eq!(l2_blocks_and_slots.1, 10); - } - - #[test] - fn test_quality_producer_when_all_good() { - solana_logger::setup(); - let config = Config { - quality_block_producer_percentage: 10, - ..Config::default_for_test() - }; - - let confirmed_blocks: HashSet = (0..50).collect(); - let mut leader_schedule = HashMap::new(); - let l1 = Pubkey::new_unique(); - let l2 = Pubkey::new_unique(); - let l3 = Pubkey::new_unique(); - let l4 = Pubkey::new_unique(); - let l5 = Pubkey::new_unique(); - leader_schedule.insert(l1.to_string(), (0..10).collect()); - leader_schedule.insert(l2.to_string(), (10..20).collect()); - leader_schedule.insert(l3.to_string(), (20..30).collect()); - leader_schedule.insert(l4.to_string(), (30..40).collect()); - leader_schedule.insert(l5.to_string(), (40..50).collect()); - let ( - quality, - poor, - _reason_msg, - cluster_average_skip_rate, - too_many_poor_block_producers, - blocks_and_slots, - ) = classify_producers(0, confirmed_blocks, leader_schedule, &config).unwrap(); - assert_eq!(cluster_average_skip_rate, 0); - assert!(poor.is_empty()); - assert_eq!(quality.len(), 5); - assert!(!too_many_poor_block_producers); - - // spot-check that returned slots and blocks are correct - let l1_blocks_and_slots = blocks_and_slots.get(&l1).unwrap(); - assert_eq!(l1_blocks_and_slots.0, 10); - assert_eq!(l1_blocks_and_slots.1, 10); - - let l5_blocks_and_slots = blocks_and_slots.get(&l5).unwrap(); - assert_eq!(l5_blocks_and_slots.0, 10); - assert_eq!(l5_blocks_and_slots.1, 10); - } - - #[test] - fn test_calculate_commission_at_end_of_epoch_no_history() { - let expected_commission = 100; - - // If there is no change history, commission should be the current commission - assert_eq!( - expected_commission, - calculate_commission_at_end_of_epoch(123, expected_commission, None) as u8 - ); - } - - #[test] - fn test_calculate_commission_at_end_of_epoch_recent_change() { - let expected_commission = 100; - let epoch: u64 = 123; - - let history = [ - // If there is a commission change in an epoch > `epoch + 1`, that should also be used - CommissionChangeIndexHistoryEntry { - commission_before: Some(expected_commission as f32), - commission_after: Some(10.0), - epoch: Some(epoch + 2), - epoch_completion: 50.0, - ..Default::default() - }, - ] - .to_vec(); - assert_eq!( - expected_commission, - calculate_commission_at_end_of_epoch(epoch, 10, Some(&history)) as u8 - ); - } - - #[test] - fn test_calculate_commission_at_end_of_epoch_long_history() { - let epoch: u64 = 123; - let expected_commission = 100.0; - - // Changes: - // null -> 10 10% through epoch 120 - // 10 -> 100 90% through epoch 123 - // 100 -> 50 10% through epoch 124 - // 50 -> 40 50% through epoch 124 - // - // records deliberately placed out of chronological order - let history = [ - // fourth - CommissionChangeIndexHistoryEntry { - commission_before: Some(50.0), - commission_after: Some(40.0), - epoch: Some(epoch + 1), - epoch_completion: 50.0, - ..Default::default() - }, - // first - CommissionChangeIndexHistoryEntry { - commission_before: None, - commission_after: Some(10.0), - epoch: Some(120), - epoch_completion: 10.0, - ..Default::default() - }, - // second - CommissionChangeIndexHistoryEntry { - commission_before: Some(10.0), - commission_after: Some(expected_commission), - epoch: Some(epoch), - epoch_completion: 99.0, - ..Default::default() - }, - // third - CommissionChangeIndexHistoryEntry { - commission_before: Some(expected_commission), - commission_after: Some(50.0), - epoch: Some(epoch + 1), - epoch_completion: 10.0, - ..Default::default() - }, - ] - .to_vec(); - - let commission_at_end = calculate_commission_at_end_of_epoch(epoch, 75, Some(&history)); - assert_eq!(commission_at_end, expected_commission as u8); - } - - // Test the case where there is one record of changing a commission immediately after the end of an epoch - #[test] - fn test_calculate_commission_at_end_of_epoch_short_history() { - let epoch: u64 = 123; - let current_commission = 10.0; - let expected_commission = 100.0; - - // Changes: - // 100 -> 10 10% through epoch 124 - let history = [CommissionChangeIndexHistoryEntry { - commission_before: Some(expected_commission), - commission_after: Some(current_commission), - epoch: Some(epoch + 1), - epoch_completion: 50.0, - ..Default::default() - }] - .to_vec(); - - let commission_at_end = - calculate_commission_at_end_of_epoch(epoch, current_commission as u8, Some(&history)); - assert_eq!(commission_at_end, expected_commission as u8); - } - - #[test] - fn test_calculate_commission_at_end_of_epoch_irrelevant_history() { - let epoch: u64 = 123; - let current_commission = 10.0; - let expected_commission = 100.0; - - // Changes: - // 100 -> 10 50% through epoch 124. - // 10 -> 50 60% through epoch 124. Shouldn't matter. - let history = [ - CommissionChangeIndexHistoryEntry { - commission_before: Some(expected_commission), - commission_after: Some(10.0), - epoch: Some(epoch + 1), - epoch_completion: 50.0, - ..Default::default() - }, - CommissionChangeIndexHistoryEntry { - commission_before: Some(10.0), - commission_after: Some(50.0), - epoch: Some(epoch + 1), - epoch_completion: 60.0, - ..Default::default() - }, - ] - .to_vec(); - - let commission_at_end = - calculate_commission_at_end_of_epoch(epoch, current_commission as u8, Some(&history)); - assert_eq!(commission_at_end, expected_commission as u8); - } - - #[test] - fn test_adjust_validator_classification_for_data_center_concentration_warn_all() { - let (mut validator_classifications, data_centers) = - mocks_for_data_center_concentration_tests(); - - let config = Config { - max_infrastructure_concentration: Some(50.0), - infrastructure_concentration_affects: InfrastructureConcentrationAffects::WarnAll, - ..Config::default_for_test() - }; - - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - &config, - ); - - let num_destaked_validators = validator_classifications - .iter() - .map(|(_id, vc)| vc.clone()) - .filter(|vc| vc.stake_state == ValidatorStakeState::None) - .count(); - - assert_eq!(num_destaked_validators, 0); - } - - #[test] - fn test_adjust_validator_classification_for_data_center_concentration_destake_listed() { - let (mut validator_classifications, data_centers) = - mocks_for_data_center_concentration_tests(); - - let max_infrastructure_concentration = 50.0; - - // get five validators from the oversaturated data center and put them in the list to be destaked - let destake_list: ValidatorList = HashSet::from_iter( - data_centers - .info - .iter() - .find(|dci| dci.stake_percent > max_infrastructure_concentration) - .map(|dci| dci.validators.iter().copied().take(5).collect::>()) - .unwrap(), - ); - - let config = Config { - max_infrastructure_concentration: Some(max_infrastructure_concentration), - infrastructure_concentration_affects: InfrastructureConcentrationAffects::DestakeListed( - destake_list, - ), - ..Config::default_for_test() - }; - - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - &config, - ); - - let num_destaked_validators = validator_classifications - .iter() - .map(|(_id, vc)| vc.clone()) - .filter(|vc| vc.stake_state == ValidatorStakeState::None) - .count(); - - assert_eq!(num_destaked_validators, 5); - } - - #[test] - fn test_adjust_validator_classification_for_data_center_concentration_destake_all() { - let (mut validator_classifications, data_centers) = - mocks_for_data_center_concentration_tests(); - - let config = Config { - max_infrastructure_concentration: Some(50.0), - infrastructure_concentration_affects: InfrastructureConcentrationAffects::DestakeAll, - ..Config::default_for_test() - }; - - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - &config, - ); - - let num_destaked_validators = validator_classifications - .iter() - .map(|(_id, vc)| vc.clone()) - .filter(|vc| vc.stake_state == ValidatorStakeState::None) - .count(); - - assert_eq!(num_destaked_validators, 10); - } - - #[test] - fn test_adjust_validator_classification_for_data_center_concentration_destake_new() { - let (mut validator_classifications, data_centers) = - mocks_for_data_center_concentration_tests(); - - let config = Config { - max_infrastructure_concentration: Some(50.0), - infrastructure_concentration_affects: InfrastructureConcentrationAffects::DestakeNew, - ..Config::default_for_test() - }; - - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - &config, - ); - - let destaked_validators: Vec = validator_classifications - .iter() - .map(|(_id, vc)| vc.clone()) - .filter(|vc| vc.stake_state == ValidatorStakeState::None) - .collect(); - - // Only one validator has `new_data_center_residency`==true - assert_eq!(destaked_validators.len(), 1); - assert_eq!( - destaked_validators - .first() - .unwrap() - .new_data_center_residency, - Some(true) - ); - } - - #[test] - fn test_adjust_validator_classification_for_data_center_concentration_destake_overflow() { - let (mut validator_classifications, data_centers) = - mocks_for_data_center_concentration_tests(); - - let config = Config { - max_infrastructure_concentration: Some(50.0), - infrastructure_concentration_affects: - InfrastructureConcentrationAffects::DestakeOverflow, - ..Config::default_for_test() - }; - - adjust_validator_classification_for_data_center_concentration( - &mut validator_classifications, - &data_centers, - &config, - ); - - let destaked_validators: Vec = validator_classifications - .iter() - .map(|(_id, vc)| vc.clone()) - .filter(|vc| vc.stake_state == ValidatorStakeState::None) - .collect(); - - // two validators would need to be removed to get the data center under the max_infrastructure_concentration of 50% - assert_eq!(destaked_validators.len(), 2); - - // verify that the destaked validators were junior, and that their seniority score were reduced. - // Since their initial seniority scores were 1 and 2, they should have been reduced to 0 and 1 - for val in destaked_validators { - let &seniority_score = val - .data_center_residency - .unwrap() - .get(&val.current_data_center.unwrap_or_default()) - .unwrap_or(&(100usize)); - assert!(seniority_score < 2usize); - } - } - - fn mocks_for_data_center_concentration_tests( - ) -> (HashMap, DataCenters) { - // Creates ValidatorClassifications and DataCenters to model a cluster+epoch for the purposes of testing different InfrastructureConcentrationAffects - // Creates two data centers and 11 ValidatorClassifications. - // - // Data Center 1 ("data_center_oversaturated") (will be oversaturated if max_infrastructure_concentration is < 60) - // Total stake: 600 / 60% of total - // 10 validators with 60 stake each - // - one validator has `new_data_center_residency` set to true - // - 60 stake each - // - Seniority scores from 1--10 - // - // Data center 2 ("data_center_not_oversaturated") - // Total stake: 400 / 40% of total - // 1 validator with 600 stake - - let data_center_oversaturated_id = DataCenterId { - asn: 1234, - location: "oversaturated".to_string(), - }; - let data_center_oversaturated_stake = 600; - let data_center_not_oversaturated_id = DataCenterId { - asn: 9876, - location: "not oversaturated".to_string(), - }; - let data_center_not_oversaturated_stake = 400; - - let validator_in_not_oversaturated = ValidatorClassification { - identity: Pubkey::new_unique(), - vote_address: Pubkey::new_unique(), - stake_state: ValidatorStakeState::Bonus, - stake_state_reason: "Test bonus reason".to_string(), - data_center_residency: Some(HashMap::from([( - data_center_not_oversaturated_id.clone(), - 123, - )])), - current_data_center: Some(data_center_not_oversaturated_id.clone()), - ..ValidatorClassification::default() - }; - - let mut validator_classifications = HashMap::new(); - - let num_validators_in_oversaturated_data_center = 10; - // Create 10 validators for the oversaturated data center - for idx in 1..=num_validators_in_oversaturated_data_center { - let identity = Pubkey::new_unique(); - validator_classifications.insert( - identity, - ValidatorClassification { - identity, - vote_address: Pubkey::new_unique(), - new_data_center_residency: Some(idx == 1), - stake_state: ValidatorStakeState::Bonus, - stake_state_reason: "Test bonus reason".to_string(), - data_center_residency: Some(HashMap::from([( - data_center_oversaturated_id.clone(), - idx, - )])), - - current_data_center: Some(data_center_oversaturated_id.clone()), - ..ValidatorClassification::default() - }, - ); - } - - let data_center_oversaturated = DataCenterInfo { - id: data_center_oversaturated_id, - stake: data_center_oversaturated_stake, - stake_percent: 60.0, - validators: validator_classifications - .iter() - .map(|(id, _vc)| *id) - .collect(), - // data_center_oversaturated_stake / num_validators_in_oversaturated_data_center == 60 - validators_stake: Some( - validator_classifications - .iter() - .map(|(id, _vc)| (*id, 60)) - .collect(), - ), - }; - - let data_center_not_oversaturated = DataCenterInfo { - id: data_center_not_oversaturated_id, - stake: data_center_not_oversaturated_stake, - stake_percent: 40.0, - validators: vec![validator_in_not_oversaturated.identity], - validators_stake: Some(HashMap::from([( - validator_in_not_oversaturated.identity, - data_center_not_oversaturated_stake, - )])), - }; - - let data_centers = DataCenters { - info: vec![data_center_oversaturated, data_center_not_oversaturated], - by_identity: validator_classifications - .iter() - .map(|(id, vc)| (*id, vc.current_data_center.as_ref().unwrap().clone())) - .collect(), - }; - - (validator_classifications, data_centers) - } +fn main() { + eprintln!("solana-stake-o-matic is deprecated and should not be used."); + std::process::exit(1); } diff --git a/bot/src/noop_stake_pool.rs b/bot/src/noop_stake_pool.rs deleted file mode 100644 index 4873b898..00000000 --- a/bot/src/noop_stake_pool.rs +++ /dev/null @@ -1,52 +0,0 @@ -use log::info; -use solana_sdk::pubkey::Pubkey; -use { - crate::{generic_stake_pool::*, rpc_client_utils::MultiClient}, - std::{ - collections::{HashMap, HashSet}, - error, - }, -}; - -pub struct NoopStakePool; - -pub fn new() -> NoopStakePool { - NoopStakePool -} - -impl GenericStakePool for NoopStakePool { - fn apply( - &mut self, - _client: &MultiClient, - dry_run: bool, - desired_validator_stake: &[ValidatorStake], - _bonus_multiplier: Option, - ) -> Result< - ( - EpochStakeNotes, - ValidatorStakeActions, - UnfundedValidators, - u64, - ), - Box, - > { - let validator_stake_actions: HashMap = desired_validator_stake - .iter() - .map(|vs| { - ( - vs.identity, - "Test action from NoopStakePool for validator".to_string(), - ) - }) - .collect(); - - info!("NoopStakePool run with dry_run={}", dry_run); - - let notes = vec![ - "This is the noop stake pool. All number are make-believe, and stake never distributed" - .to_string(), - ]; - - Ok((notes, validator_stake_actions, HashSet::new(), 12_345)) - } -} diff --git a/bot/src/performance_db_utils.rs b/bot/src/performance_db_utils.rs deleted file mode 100644 index a412af30..00000000 --- a/bot/src/performance_db_utils.rs +++ /dev/null @@ -1,302 +0,0 @@ -use crate::Cluster::{MainnetBeta, Testnet}; -use crate::{Cluster, Epoch, Pubkey, ValidatorList}; -use chrono::{DateTime, Duration as ChronoDuration, NaiveDateTime, Utc}; -use itertools::Itertools; -use log::{debug, info, trace}; -use solana_client::client_error::ClientErrorKind; -use solana_client::rpc_client::RpcClient; -use solana_foundation_delegation_program_registry::state::Participant; -use solana_sdk::clock::DEFAULT_SLOTS_PER_EPOCH; -use std::collections::HashMap; -use std::str::FromStr; - -/// Validators must have reported within OPTIMISTIC_SLOT_MODE_DEVIATION_AMUONT of the mode optimistic slot in at least NUM_SUCCESSFUL_REPORTING_SAMPLES -/// out of every NUM_REPORTING_SAMPLES samples -pub const NUM_SAMPLED_REPORTING_EPOCHS: f32 = 10.0; -pub const NUM_SUCCESSFUL_REPORTING_SAMPLES: f32 = 8.0; -pub const SUCCESS_MIN_PERCENT: f32 = - NUM_SUCCESSFUL_REPORTING_SAMPLES / NUM_SAMPLED_REPORTING_EPOCHS; -const OPTIMISTIC_SLOT_MODE_DEVIATION_AMUONT: u32 = 128; - -type GetKeyFromParticipant = fn(&Participant) -> Pubkey; - -pub fn get_testnet_pk_from_participant(participant: &Participant) -> Pubkey { - participant.testnet_identity -} - -pub fn get_mainnet_pk_from_participant(participant: &Participant) -> Pubkey { - participant.mainnet_identity -} - -/// Checks if validators have been reporting their optimistic slots regularly and accurately. -/// Returns a map of validator keys -> (passsed, reason) -pub fn get_reported_performance_metrics( - performance_db_url: &String, - performance_db_token: &Option, - cluster: &Cluster, - rpc_client: &RpcClient, - epoch: &Epoch, - all_participants: &HashMap, -) -> Result, Box> { - if !(cluster == &MainnetBeta || cluster == &Testnet) { - return Err( - "get_reported_performance_metrics() only works for clusters Testnet and MainnetBeta" - .into(), - ); - }; - - let (get_pk_from_this_cluster, get_pk_from_other_cluster): ( - GetKeyFromParticipant, - GetKeyFromParticipant, - ) = if cluster == &MainnetBeta { - ( - get_mainnet_pk_from_participant, - get_testnet_pk_from_participant, - ) - } else { - ( - get_testnet_pk_from_participant, - get_mainnet_pk_from_participant, - ) - }; - - let other_cluster_validators: ValidatorList = all_participants - .iter() - .map(|(_k, p)| get_pk_from_other_cluster(p)) - .collect(); - - let reporters = find_reporters_for_epoch( - performance_db_url, - performance_db_token, - cluster, - epoch, - rpc_client, - )?; - - let performance_reports: HashMap = reporters - .iter() - .map(|(pubkey, _v)| { - // if the validator is from the other cluster, destake - if other_cluster_validators.contains(pubkey) { - ( - *pubkey, - ( - false, - format!( - "{:?} validator {:?} reported to {:?}", - if cluster == &MainnetBeta { - Testnet - } else { - MainnetBeta - }, - pubkey, - cluster - ), - ), - ) - } else { - ( - *pubkey, - (true, format!("Reported successfully in epoch {:?}", epoch)), - ) - } - }) - .collect(); - - let all_reports: HashMap = all_participants - .iter() - .map(|(_pk, participant)| { - let validator_key = get_pk_from_this_cluster(participant); - match performance_reports.get(&validator_key) { - Some(report) => (validator_key, report.clone()), - None => ( - validator_key, - ( - false, - format!("No report from validator for epoch {:?}", epoch), - ), - ), - } - }) - .collect(); - - Ok(all_reports) -} - -/// Get a list of validators who reported during the specified epoch -fn find_reporters_for_epoch( - performance_db_url: &String, - performance_db_token: &Option, - cluster: &Cluster, - epoch: &Epoch, - rpc_client: &RpcClient, -) -> Result, Box> { - // List of validators and whether they reported correctly at least once - let mut reporters: HashMap = HashMap::new(); - - // To check if a validator has been reporting during an epoch, we take four samples from the epoch at 0%, 25%, 50%, - // and 75%, and if the validator reported correctly during any one of the sample periodsd, the validator passes. - for n in 0..4 { - let slot_to_try: i64 = match cluster { - MainnetBeta => (DEFAULT_SLOTS_PER_EPOCH as i64) * (*epoch as i64), - // Testnet epoch boundaries aren't on multiples of DEFAULT_SLOTS_PER_EPOCH for some reason - // Epoch 341 starts at slot 141788256; use that as our anchor. - // Testnet => (141_788_256 as u64).wrapping_add( DEFAULT_SLOTS_PER_EPOCH.wrapping_mul((341 as u64).wrapping_sub(*epoch))) - Testnet => 141_788_256 + (DEFAULT_SLOTS_PER_EPOCH as i64) * ((*epoch as i64) - 341), - } + n * (DEFAULT_SLOTS_PER_EPOCH as i64) / 4; - - let slot_time = match get_slot_time(slot_to_try as u64, rpc_client) { - Ok(st) => st, - Err(_e) => { - debug!("Could not find slot time for {:?}", slot_to_try); - continue; - } - }; - - debug!("Found a time: {:?}", slot_time); - - let reported_data = - fetch_data(performance_db_url, performance_db_token, cluster, slot_time)?; - - if reported_data.is_empty() { - info!("No records found for time {:?}", slot_time); - continue; - } - - let optimistic_slot_modes = get_modes(reported_data.values().cloned().collect()); - let min_optimistic_slot = optimistic_slot_modes - .first() - .ok_or("Could not get mode of optimistic slots")? - - OPTIMISTIC_SLOT_MODE_DEVIATION_AMUONT as i32; - let max_optimistic_slot = optimistic_slot_modes - .last() - .ok_or("Could not get mode of optimistic slots")? - + OPTIMISTIC_SLOT_MODE_DEVIATION_AMUONT as i32; - - reported_data.iter().for_each(|(k, v)| { - if v >= &min_optimistic_slot && v <= &max_optimistic_slot { - reporters.insert(*k, true); - } else { - reporters.entry(*k).or_insert(false); - } - }) - } - - if reporters.is_empty() { - Err(format!("Could get no slot times for {:?}/{:?}", cluster, epoch).into()) - } else { - Ok(reporters) - } -} - -/// Fetch self-reported data from the InfluxDB database for the time range (date_time -- date_time + 1 minute) -/// Validators that are reporting tend to report more than once a second, so if there are no reports -/// from a validator in a minute, we can assume they are under-reporting. -fn fetch_data( - performance_db_url: &String, - performance_db_token: &Option, - cluster: &Cluster, - date_time: DateTime, -) -> Result, Box> { - let query = format!( - "from(bucket:\"{}\") - |> range(start: {}, stop: {}) - |> filter(fn: (r) => r[\"_measurement\"] == \"optimistic_slot\" and r[\"_field\"] == \"slot\") - |> group(columns: [\"host_id\"]) - |> max(column: \"_time\") - |> keep(columns: [\"host_id\", \"_value\"]) - |> group()", - cluster, - date_time.timestamp(), - (date_time + ChronoDuration::minutes(1)).timestamp(), - ); - - debug!("QUERY: {:?}", query); - - let mut return_data: HashMap = HashMap::new(); - - let client = reqwest::blocking::Client::new(); - - let mut request_builder = client - .post(performance_db_url) - .header("Accept", "application/csv") - .header("Content-type", "application/vnd.flux"); - - if let Some(token) = performance_db_token { - request_builder = request_builder.header("Authorization", format!("Token {}", token)); - } - - let body = request_builder.body(query).send()?.text()?; - - let mut reader = csv::ReaderBuilder::new().from_reader(body.as_bytes()); - - for result in reader.records() { - let record = result?; - let optimistic_slot: i32 = record - .get(3) - .ok_or("Could not parse CSV record")? - .parse() - .unwrap(); - let pk = Pubkey::from_str(record.get(4).ok_or("Could not parse CSV record")?)?; - return_data.insert(pk, optimistic_slot); - } - - Ok(return_data) -} - -/// Gets the modes for a list of integers, sorted ascending -fn get_modes(values: Vec) -> Vec { - let mut counts: HashMap = HashMap::new(); - - for v in values.iter() { - let counter = counts.entry(*v).or_insert(0); - *counter += 1; - } - - let max_count = *counts.values().max().unwrap(); - - counts - .into_iter() - .filter(|(_k, v)| *v == max_count) - .map(|(k, _v)| k) - .sorted() - .collect() -} - -/// gets the time of the slot in the epoch. If there was no block for the slot, checks the next slot -fn get_slot_time( - slot: u64, - rpc_client: &RpcClient, -) -> Result, Box> { - let mut idx = 0; - loop { - // try 200 times - if idx > 200 { - return Err(format!("Could not get slot time for slot {:?}", slot).into()); - } - let slot_to_try = slot + idx; - - debug!("Trying get_block_time for slot {:?}", slot_to_try); - - let time_stamp = rpc_client.get_block_time(slot_to_try); - - match time_stamp { - Ok(time) => { - return Ok(DateTime::::from_utc( - NaiveDateTime::from_timestamp_opt(time, 0).unwrap(), - Utc, - )); - } - Err(e) => match e.kind() { - ClientErrorKind::RpcError(_) => { - // Not documented, but if the error is RpcError, there was no block for the slot, so we should try another slot - trace!("No time found for slot {}", slot + idx); - idx += 1; - } - _ => { - return Err("Unknown error".into()); - } - }, - } - } -} diff --git a/bot/src/rpc_client_utils.rs b/bot/src/rpc_client_utils.rs deleted file mode 100644 index 4f4fb661..00000000 --- a/bot/src/rpc_client_utils.rs +++ /dev/null @@ -1,865 +0,0 @@ -use { - crate::Config, - indicatif::{ProgressBar, ProgressStyle}, - log::*, - solana_client::{ - client_error::{reqwest, ClientError, ClientErrorKind}, - pubsub_client::PubsubClientError, - rpc_client::RpcClient, - rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig, RpcSendTransactionConfig}, - rpc_filter, - rpc_request::MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS, - rpc_response::{RpcVoteAccountInfo, RpcVoteAccountStatus}, - tpu_client::{TpuClient, TpuClientConfig, TpuSenderError}, - }, - solana_sdk::{ - account::Account, - clock::Epoch, - pubkey::Pubkey, - signature::Keypair, - stake, - transaction::{Transaction, TransactionError}, - }, - std::{ - borrow::Borrow, - collections::{HashMap, HashSet}, - error, - ops::Deref, - str::FromStr, - sync::Arc, - thread::sleep, - time::{Duration, Instant}, - }, -}; - -fn new_spinner_progress_bar() -> ProgressBar { - let progress_bar = ProgressBar::new(42); - progress_bar - .set_style(ProgressStyle::default_spinner().template("{spinner:.green} {wide_msg}")); - progress_bar.enable_steady_tick(100); - progress_bar -} - -pub struct MultiClient { - rpc: Arc, - tpu: TpuClient, - use_rpc_tx_submission: bool, - skip_preflight: bool, -} -impl Deref for MultiClient { - type Target = RpcClient; - fn deref(&self) -> &Self::Target { - &self.rpc - } -} -impl MultiClient { - pub fn new(rpc: Arc, tpu: TpuClient, config: &Config) -> Self { - Self { - rpc, - tpu, - use_rpc_tx_submission: config.use_rpc_tx_submission, - skip_preflight: !config.use_preflight, - } - } - - pub fn send_transaction(&self, transaction: &Transaction) -> &'static str { - if !self.use_rpc_tx_submission && self.tpu.send_transaction(transaction) { - "TPU" - } else { - match self.rpc.send_transaction_with_config( - transaction, - RpcSendTransactionConfig { - skip_preflight: self.skip_preflight, - preflight_commitment: Some(self.rpc.commitment().commitment), - ..RpcSendTransactionConfig::default() - }, - ) { - Ok(_) => {} - Err(error) => { - warn!("Error sending transaction: {:?}", error); - } - }; - "RPC" - } - } -} - -pub fn new_tpu_client_with_retry( - rpc_client: &Arc, - websocket_url: &str, -) -> Result { - let mut retries = 5; - let sleep_seconds = 5; - while retries > 0 { - match TpuClient::new( - rpc_client.clone(), - websocket_url, - TpuClientConfig::default(), - ) { - // only retry on connection error - Err(TpuSenderError::PubsubError(PubsubClientError::ConnectionError(_))) => { - warn!( - "Error creating Tpu Client, retrying in {}s, {} retries remaining", - sleep_seconds, retries - ); - retries -= 1; - sleep(Duration::from_secs(sleep_seconds)); - } - // everything else, Ok or Err, can pass through - result => return result, - } - } - TpuClient::new( - rpc_client.clone(), - websocket_url, - TpuClientConfig::default(), - ) -} - -pub fn send_and_confirm_transactions_with_spinner( - client: &MultiClient, - dry_run: bool, - transactions: Vec, - signer: &Keypair, -) -> Result>, Box> { - if transactions.is_empty() { - return Ok(vec![]); - } - let progress_bar = new_spinner_progress_bar(); - let mut expired_blockhash_retries = 100; - let send_transaction_interval = Duration::from_millis(10); /* Send at ~100 TPS */ - let transaction_resend_interval = Duration::from_secs(4); /* Retry batch send after 4 seconds */ - - progress_bar.set_message("Connecting..."); - - let mut transactions = transactions.into_iter().enumerate().collect::>(); - let num_transactions = transactions.len() as f64; - let mut transaction_errors = vec![None; transactions.len()]; - let set_message = |confirmed_transactions, - block_height: Option, - last_valid_block_height: u64, - status: &str| { - progress_bar.set_message(format!( - "{:>5.1}% | {:<40}{}", - confirmed_transactions as f64 * 100. / num_transactions, - status, - match block_height { - Some(block_height) => format!( - " [block height {}; re-sign in {} blocks]", - block_height, - last_valid_block_height.saturating_sub(block_height), - ), - None => String::new(), - }, - )); - }; - - let mut confirmed_transactions = 0; - let mut block_height = client.get_block_height()?; - while expired_blockhash_retries > 0 { - let blockhash = client.get_latest_blockhash()?; - let last_valid_block_height = client.get_block_height()?; - info!("Sending transactions with blockhash {:?}", blockhash); - - let mut pending_transactions = HashMap::new(); - for (i, mut transaction) in transactions { - transaction.try_sign(&[signer], blockhash)?; - pending_transactions.insert(transaction.signatures[0], (i, transaction)); - } - - let mut last_resend = Instant::now() - transaction_resend_interval; - while block_height <= last_valid_block_height { - let num_transactions = pending_transactions.len(); - - // Periodically re-send all pending transactions - if Instant::now().duration_since(last_resend) > transaction_resend_interval { - for (index, (_i, transaction)) in pending_transactions.values().enumerate() { - let method = if dry_run { - client - .simulate_transaction(transaction) - .map_err(|e| transaction_errors.push(e.get_transaction_error())) - .ok(); - "DRY RUN" - } else { - client.send_transaction(transaction) - }; - set_message( - confirmed_transactions, - None, // Some(block_height), - last_valid_block_height, - &format!( - "Sending {}/{} transactions (via {})", - index + 1, - num_transactions, - method - ), - ); - sleep(send_transaction_interval); - } - last_resend = Instant::now(); - } - - // Wait for the next block before resending transactions - set_message( - confirmed_transactions, - Some(block_height), - last_valid_block_height, - &format!( - "Waiting for next block, {} transactions pending...", - num_transactions - ), - ); - - let mut new_block_height = block_height; - while block_height == new_block_height { - sleep(Duration::from_millis(500)); - new_block_height = client.get_block_height()?; - } - block_height = new_block_height; - if dry_run { - return Ok(transaction_errors); - } - } - - info!("Verifying transactions"); - let mut verify_tries = 0; - // loop through pending transaction ten times, or until no found transactions are in the "Processed" state - loop { - let mut some_pending = false; - verify_tries += 1; - // Collect statuses for the transactions, drop those that are confirmed - let pending_signatures = pending_transactions.keys().cloned().collect::>(); - for pending_signatures_chunk in - pending_signatures.chunks(MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS) - { - if let Ok(result) = client.get_signature_statuses(pending_signatures_chunk) { - let statuses = result.value; - for (signature, status) in - pending_signatures_chunk.iter().zip(statuses.into_iter()) - { - if let Some(status) = status { - if status.satisfies_commitment(client.commitment()) { - if let Some((i, _)) = pending_transactions.remove(signature) { - confirmed_transactions += 1; - if status.err.is_some() { - progress_bar.println(format!( - "Failed transaction {}: {:?}", - signature, status - )); - } - transaction_errors[i] = status.err; - } - } else { - some_pending = true; - debug!( - "Transaction {:?} did not satisfy commitment. Status: {:?}", - signature, status - ); - } - } else { - debug!("Transaction status not found for {:?}", signature); - } - } - } - set_message( - confirmed_transactions, - Some(block_height), - last_valid_block_height, - "Checking transaction status...", - ); - } - - if pending_transactions.is_empty() { - return Ok(transaction_errors); - } - - if !some_pending && verify_tries > 10 { - break; - } - sleep(Duration::from_millis(500)); - } - - transactions = pending_transactions.into_iter().map(|(_k, v)| v).collect(); - progress_bar.println(format!( - "Blockhash expired. {} retries remaining", - expired_blockhash_retries - )); - expired_blockhash_retries -= 1; - } - Err("Max retries exceeded".into()) -} - -pub(crate) fn get_active_and_inactive_stake( - rpc_client: &RpcClient, - stake_address: &Pubkey, -) -> Result<(u64, u64), Box> { - let stake_activation = rpc_client.get_stake_activation(*stake_address, None); - let stake_balance = rpc_client.get_balance(stake_address).map_err(|err| { - format!( - "Unable to get stake account balance: {}: {}", - stake_address, err - ) - })?; - if let Ok(stake_activation) = stake_activation { - Ok(( - stake_activation.active, - stake_balance - stake_activation.active, - )) - } else { - Ok((0, stake_balance)) - } -} - -pub struct VoteAccountInfo { - pub identity: Pubkey, - pub vote_address: Pubkey, - pub commission: u8, - pub active_stake: u64, - - /// Credits earned in the epoch - pub epoch_credits: u64, -} - -pub fn get_vote_account_info( - rpc_client: &RpcClient, - epoch: Epoch, -) -> Result<(Vec, u64), Box> { - let RpcVoteAccountStatus { - current, - delinquent, - } = rpc_client.get_vote_accounts()?; - - let mut latest_vote_account_info = HashMap::::new(); - - let mut total_active_stake = 0; - for vote_account_info in current.into_iter().chain(delinquent.into_iter()) { - total_active_stake += vote_account_info.activated_stake; - - let entry = latest_vote_account_info - .entry(vote_account_info.node_pubkey.clone()) - .or_insert_with(|| vote_account_info.clone()); - - // If the validator has multiple staked vote accounts then select the vote account that - // voted most recently - if entry.last_vote < vote_account_info.last_vote { - *entry = vote_account_info.clone(); - } - } - - Ok(( - latest_vote_account_info - .values() - .filter_map( - |RpcVoteAccountInfo { - commission, - node_pubkey, - vote_pubkey, - epoch_credits, - activated_stake, - .. - }| { - let credits_last_four_epochs: u64 = epoch_credits - .iter() - .filter_map(|(credit_epoch, credits, prev_credits)| { - if credit_epoch > (epoch - 4).borrow() { - Some(credits - prev_credits) - } else { - None - } - }) - .sum(); - - if credits_last_four_epochs > 0 { - let epoch_credits = if let Some((_last_epoch, credits, prev_credits)) = - epoch_credits.iter().find(|ec| ec.0 == epoch) - { - credits.saturating_sub(*prev_credits) - } else { - 0 - }; - let identity = Pubkey::from_str(node_pubkey).unwrap(); - let vote_address = Pubkey::from_str(vote_pubkey).unwrap(); - - Some(VoteAccountInfo { - identity, - vote_address, - active_stake: *activated_stake, - commission: *commission, - epoch_credits, - }) - } else { - None - } - }, - ) - .collect(), - total_active_stake, - )) -} - -pub fn get_all_stake_with_retry( - rpc_client: &RpcClient, - authorized_staker: Option, -) -> Result, Box> { - let filters = authorized_staker.map(|s| { - vec![rpc_filter::RpcFilterType::Memcmp(rpc_filter::Memcmp { - offset: 12, - bytes: rpc_filter::MemcmpEncodedBytes::Base58(s.to_string()), - encoding: Some(rpc_filter::MemcmpEncoding::Binary), - })] - }); - let config = RpcProgramAccountsConfig { - filters, - account_config: RpcAccountInfoConfig { - encoding: Some(solana_account_decoder::UiAccountEncoding::Base64), - commitment: Some(rpc_client.commitment()), - ..RpcAccountInfoConfig::default() - }, - ..RpcProgramAccountsConfig::default() - }; - let mut retries = 5u8; - let retry_delay = Duration::from_secs(10); - loop { - if retries == 0 { - return Err("Exhausted retries; connection to server is unhealthy".into()); - } - let maybe_accounts = - rpc_client.get_program_accounts_with_config(&stake::program::id(), config.clone()); - - match maybe_accounts { - Err(ClientError { - kind: ClientErrorKind::Reqwest(err), - .. - }) if reqwest::Error::is_timeout(&err) => { - retries = retries.saturating_sub(1); - info!( - "get_program_accounts timed out, {} retries remaining, sleeping for {} seconds", - retries, - retry_delay.as_secs() - ); - std::thread::sleep(retry_delay); - } - _ => return maybe_accounts.map_err(|e| e.into()), - }; - } -} - -pub fn get_all_stake_by_staker( - rpc_client: &RpcClient, - authorized_staker: Pubkey, -) -> Result<(HashSet, u64), Box> { - let mut all_stake_addresses = HashSet::new(); - let mut total_stake_balance = 0; - - let all_stake_accounts = get_all_stake_with_retry(rpc_client, Some(authorized_staker))?; - - for (address, account) in all_stake_accounts { - all_stake_addresses.insert(address); - total_stake_balance += account.lamports; - } - - Ok((all_stake_addresses, total_stake_balance)) -} - -pub fn check_rpc_health(rpc_client: &RpcClient) -> Result<(), Box> { - let mut retries = 12u8; - let retry_delay = Duration::from_secs(10); - loop { - match rpc_client.get_health() { - Ok(()) => { - info!("RPC endpoint healthy"); - return Ok(()); - } - Err(err) => { - warn!("RPC endpoint is unhealthy: {:?}", err); - } - }; - if retries == 0 { - return Err("Exhausted retries; connection to server is unhealthy".into()); - } - retries = retries.saturating_sub(1); - info!( - "{} retries remaining, sleeping for {} seconds", - retries, - retry_delay.as_secs() - ); - std::thread::sleep(retry_delay); - } -} - -#[cfg(test)] -pub mod test { - use { - super::*, - borsh::BorshSerialize, - solana_client::client_error, - solana_sdk::{ - borsh::get_packed_len, - clock::Epoch, - native_token, - program_pack::Pack, - pubkey::Pubkey, - signature::Signer, - stake::{ - instruction as stake_instruction, - state::{Authorized, Lockup}, - }, - system_instruction, - }, - solana_vote_program::{vote_instruction, vote_state::VoteInit}, - spl_stake_pool::{ - find_stake_program_address, find_withdraw_authority_program_address, - state::{Fee, StakePool, ValidatorList}, - }, - spl_token::state::{Account, Mint}, - }; - - pub fn wait_for_next_epoch(rpc_client: &RpcClient) -> client_error::Result { - let current_epoch = rpc_client.get_epoch_info()?.epoch; - - let progress_bar = new_spinner_progress_bar(); - loop { - let epoch_info = rpc_client.get_epoch_info()?; - if epoch_info.epoch > current_epoch { - return Ok(epoch_info.epoch); - } - progress_bar.set_message(format!( - "Waiting for epoch {} ({} slots remaining)", - current_epoch + 1, - epoch_info - .slots_in_epoch - .saturating_sub(epoch_info.slot_index), - )); - - sleep(Duration::from_millis(200)); - } - } - - pub fn create_vote_account( - rpc_client: &RpcClient, - payer: &Keypair, - identity_keypair: &Keypair, - vote_keypair: &Keypair, - ) -> client_error::Result<()> { - let mut transaction = Transaction::new_with_payer( - &vote_instruction::create_account( - &payer.pubkey(), - &vote_keypair.pubkey(), - &VoteInit { - node_pubkey: identity_keypair.pubkey(), - authorized_voter: identity_keypair.pubkey(), - authorized_withdrawer: identity_keypair.pubkey(), - commission: 10, - }, - native_token::sol_to_lamports(1.), - ), - Some(&payer.pubkey()), - ); - - transaction.sign( - &[payer, identity_keypair, vote_keypair], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| ()) - } - - pub fn create_stake_account( - rpc_client: &RpcClient, - payer: &Keypair, - authority: &Pubkey, - amount: u64, - ) -> client_error::Result { - let stake_keypair = Keypair::new(); - let mut transaction = Transaction::new_with_payer( - &stake_instruction::create_account( - &payer.pubkey(), - &stake_keypair.pubkey(), - &Authorized::auto(authority), - &Lockup::default(), - amount, - ), - Some(&payer.pubkey()), - ); - - transaction.sign(&[payer, &stake_keypair], rpc_client.get_latest_blockhash()?); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| stake_keypair) - } - - pub fn delegate_stake( - rpc_client: &RpcClient, - authority: &Keypair, - stake_address: &Pubkey, - vote_address: &Pubkey, - ) -> client_error::Result<()> { - let transaction = Transaction::new_signed_with_payer( - &[stake_instruction::delegate_stake( - stake_address, - &authority.pubkey(), - vote_address, - )], - Some(&authority.pubkey()), - &[authority], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| ()) - } - - pub struct ValidatorAddressPair { - pub identity: Pubkey, - pub vote_address: Pubkey, - } - - pub fn create_validators( - rpc_client: &RpcClient, - authorized_staker: &Keypair, - num_validators: u32, - ) -> client_error::Result> { - let mut validators = vec![]; - - for _ in 0..num_validators { - let identity_keypair = Keypair::new(); - let vote_keypair = Keypair::new(); - - create_vote_account( - rpc_client, - authorized_staker, - &identity_keypair, - &vote_keypair, - )?; - - validators.push(ValidatorAddressPair { - identity: identity_keypair.pubkey(), - vote_address: vote_keypair.pubkey(), - }); - } - - Ok(validators) - } - - pub fn create_mint( - rpc_client: &RpcClient, - authorized_staker: &Keypair, - manager: &Pubkey, - ) -> client_error::Result { - let mint_rent = rpc_client.get_minimum_balance_for_rent_exemption(Mint::LEN)?; - let mint_keypair = Keypair::new(); - - let mut transaction = Transaction::new_with_payer( - &[ - system_instruction::create_account( - &authorized_staker.pubkey(), - &mint_keypair.pubkey(), - mint_rent, - Mint::LEN as u64, - &spl_token::id(), - ), - spl_token::instruction::initialize_mint( - &spl_token::id(), - &mint_keypair.pubkey(), - manager, - None, - 0, - ) - .unwrap(), - ], - Some(&authorized_staker.pubkey()), - ); - - transaction.sign( - &[authorized_staker, &mint_keypair], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| mint_keypair.pubkey()) - } - - pub fn create_token_account( - rpc_client: &RpcClient, - authorized_staker: &Keypair, - mint: &Pubkey, - owner: &Pubkey, - ) -> client_error::Result { - let account_rent = rpc_client.get_minimum_balance_for_rent_exemption(Account::LEN)?; - let account_keypair = Keypair::new(); - - let mut transaction = Transaction::new_with_payer( - &[ - system_instruction::create_account( - &authorized_staker.pubkey(), - &account_keypair.pubkey(), - account_rent, - Account::LEN as u64, - &spl_token::id(), - ), - spl_token::instruction::initialize_account( - &spl_token::id(), - &account_keypair.pubkey(), - mint, - owner, - ) - .unwrap(), - ], - Some(&authorized_staker.pubkey()), - ); - - transaction.sign( - &[authorized_staker, &account_keypair], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| account_keypair.pubkey()) - } - - #[allow(clippy::too_many_arguments)] - pub fn create_stake_pool( - rpc_client: &RpcClient, - payer: &Keypair, - stake_pool: &Keypair, - reserve_stake: &Pubkey, - pool_mint: &Pubkey, - pool_token_account: &Pubkey, - manager: &Keypair, - staker: &Pubkey, - max_validators: u32, - stake_pool_withdraw_authority: &Pubkey, - ) -> client_error::Result<()> { - let stake_pool_size = get_packed_len::(); - let stake_pool_rent = rpc_client - .get_minimum_balance_for_rent_exemption(stake_pool_size) - .unwrap(); - let validator_list = ValidatorList::new(max_validators); - let validator_list_size = validator_list.try_to_vec().unwrap().len(); - let validator_list_rent = rpc_client - .get_minimum_balance_for_rent_exemption(validator_list_size) - .unwrap(); - let validator_list = Keypair::new(); - let fee = Fee { - numerator: 10, - denominator: 100, - }; - - let mut transaction = Transaction::new_with_payer( - &[ - system_instruction::create_account( - &payer.pubkey(), - &stake_pool.pubkey(), - stake_pool_rent, - stake_pool_size as u64, - &spl_stake_pool::id(), - ), - system_instruction::create_account( - &payer.pubkey(), - &validator_list.pubkey(), - validator_list_rent, - validator_list_size as u64, - &spl_stake_pool::id(), - ), - spl_stake_pool::instruction::initialize( - &spl_stake_pool::id(), - &stake_pool.pubkey(), - &manager.pubkey(), - staker, - stake_pool_withdraw_authority, - &validator_list.pubkey(), - reserve_stake, - pool_mint, - pool_token_account, - &spl_token::id(), - /* deposit_authority = */ None, - fee, - fee, - fee, - /* referral_fee = */ 10u8, - max_validators, - ), - ], - Some(&payer.pubkey()), - ); - transaction.sign( - &[payer, stake_pool, &validator_list, manager], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| ()) - } - - pub fn deposit_stake_into_stake_pool( - rpc_client: &RpcClient, - authorized_staker: &Keypair, - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - vote_address: &Pubkey, - stake_address: &Pubkey, - pool_token_address: &Pubkey, - ) -> client_error::Result<()> { - let validator_stake_address = - find_stake_program_address(&spl_stake_pool::id(), vote_address, stake_pool_address).0; - let pool_withdraw_authority = - find_withdraw_authority_program_address(&spl_stake_pool::id(), stake_pool_address).0; - let transaction = Transaction::new_signed_with_payer( - &spl_stake_pool::instruction::deposit_stake( - &spl_stake_pool::id(), - stake_pool_address, - &stake_pool.validator_list, - &pool_withdraw_authority, - stake_address, - &authorized_staker.pubkey(), - &validator_stake_address, - &stake_pool.reserve_stake, - pool_token_address, - &stake_pool.manager_fee_account, - pool_token_address, - &stake_pool.pool_mint, - &spl_token::id(), - ), - Some(&authorized_staker.pubkey()), - &[authorized_staker], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| ()) - } - - pub fn deposit_sol_into_stake_pool( - rpc_client: &RpcClient, - authorized_staker: &Keypair, - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - pool_token_address: &Pubkey, - lamports: u64, - ) -> client_error::Result<()> { - let pool_withdraw_authority = - find_withdraw_authority_program_address(&spl_stake_pool::id(), stake_pool_address).0; - let transaction = Transaction::new_signed_with_payer( - &[spl_stake_pool::instruction::deposit_sol( - &spl_stake_pool::id(), - stake_pool_address, - &pool_withdraw_authority, - &stake_pool.reserve_stake, - &authorized_staker.pubkey(), - pool_token_address, - &stake_pool.manager_fee_account, - pool_token_address, - &stake_pool.pool_mint, - &spl_token::id(), - lamports, - )], - Some(&authorized_staker.pubkey()), - &[authorized_staker], - rpc_client.get_latest_blockhash()?, - ); - rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map(|_| ()) - } -} diff --git a/bot/src/slack_utils.rs b/bot/src/slack_utils.rs deleted file mode 100644 index 31522899..00000000 --- a/bot/src/slack_utils.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::BoxResult; -use log::info; -use reqwest::Url; -use std::collections::HashMap; -use std::env; - -const SLACK_API_URL: &str = "https://slack.com/api/"; - -pub fn send_slack_channel_message(message: &str) -> BoxResult<()> { - if env::var("SEND_SLACK_MESSAGES").is_err() { - info!("Slack message that was not sent: {:?}", message); - return Ok(()); - } - - let (token, channel_id) = get_token_and_channel()?; - let client = reqwest::blocking::Client::new(); - - let mut body: HashMap<&str, &str> = HashMap::new(); - body.insert("text", message); - body.insert("channel", &*channel_id); - - client - .post( - Url::parse(SLACK_API_URL) - .unwrap() - .join("chat.postMessage") - .unwrap(), - ) - // .header("Content-type", "application/json") - .header("Authorization", format!("Bearer {}", token)) - .json(&body) - .send()?; - Ok(()) -} - -/// Returns Slack token and channel to post in -fn get_token_and_channel() -> BoxResult<(String, String)> { - let token = env::var("SLACK_API_TOKEN")?; - let channel_id = env::var("SLACK_CHANNEL_ID")?; - - Ok((token, channel_id)) -} diff --git a/bot/src/stake_pool.rs b/bot/src/stake_pool.rs deleted file mode 100644 index b00b438f..00000000 --- a/bot/src/stake_pool.rs +++ /dev/null @@ -1,1332 +0,0 @@ -use { - crate::{ - generic_stake_pool::*, - rpc_client_utils::{ - get_all_stake_by_staker, send_and_confirm_transactions_with_spinner, MultiClient, - }, - }, - log::*, - solana_client::{rpc_client::RpcClient, rpc_response::StakeActivationState}, - solana_sdk::{ - borsh::try_from_slice_unchecked, - native_token::Sol, - pubkey::Pubkey, - signature::{Keypair, Signer}, - stake::{self, instruction as stake_instruction, state::StakeState}, - system_instruction, - transaction::Transaction, - }, - spl_stake_pool::{ - self, - state::{StakePool, StakeStatus, ValidatorList, ValidatorStakeInfo}, - }, - std::{ - collections::{HashMap, HashSet}, - error, mem, - }, -}; - -/// Don't bother adjusting stake if less than this amount of lamports will be affected. -/// If we simply use `MINIMUM_ACTIVE_STAKE`, we run the risk of adding a small -/// amount less than rent exemption, which would be later impossible to decrease. -const MIN_STAKE_CHANGE_AMOUNT: u64 = spl_stake_pool::MINIMUM_ACTIVE_STAKE * 10; - -fn get_minimum_stake_balance_for_rent_exemption( - rpc_client: &RpcClient, -) -> Result> { - rpc_client - .get_minimum_balance_for_rent_exemption(mem::size_of::()) - .map_err(|err| format!("Error fetching rent exemption: {}", err).into()) -} - -/// Seed for the transient stake account used by the staker -fn staker_transient_stake_address_seed(vote_address: Pubkey) -> String { - format!("{}", vote_address)[..32].to_string() -} - -/// Staker's transient stake account -/// -/// When removing a validator from the pool, the staker receives a stake account -/// with the rent-exempt amount + MINIMUM_ACTIVE_STAKE, delegated to the -/// appropriate vote address. Once the stake is inactive, we can withdraw the -/// lamports back to the staker. -fn staker_transient_stake_address(authorized_staker: Pubkey, vote_address: Pubkey) -> Pubkey { - Pubkey::create_with_seed( - &authorized_staker, - &staker_transient_stake_address_seed(vote_address), - &stake::program::id(), - ) - .unwrap() -} - -/// Check if the validator is removable -/// -/// A validator is removable if there's no transient stake and there isn't a -/// dust amount of active stake (active lamports < stake rent exemption) -fn is_removable(validator_stake_info: &ValidatorStakeInfo, stake_rent_exemption: u64) -> bool { - validator_stake_info.transient_stake_lamports == 0 - && (validator_stake_info.active_stake_lamports == 0 - || validator_stake_info.active_stake_lamports > stake_rent_exemption) -} - -#[derive(Debug)] -pub struct StakePoolOMatic { - authorized_staker: Keypair, - baseline_stake_amount: u64, - min_reserve_stake_balance: u64, - stake_pool_address: Pubkey, - stake_pool: StakePool, - validator_list: ValidatorList, -} - -pub fn new( - rpc_client: &RpcClient, - authorized_staker: Keypair, - stake_pool_address: Pubkey, - baseline_stake_amount: u64, - min_reserve_stake_balance: u64, -) -> Result> { - if baseline_stake_amount < MIN_STAKE_CHANGE_AMOUNT { - return Err(format!( - "baseline stake amount too small: {}", - Sol(baseline_stake_amount) - ) - .into()); - } - - let account_data = rpc_client.get_account_data(&stake_pool_address)?; - let stake_pool = try_from_slice_unchecked::(account_data.as_slice()) - .map_err(|err| format!("Invalid stake pool {}: {}", stake_pool_address, err))?; - let account_data = rpc_client.get_account_data(&stake_pool.validator_list)?; - let validator_list = try_from_slice_unchecked::(account_data.as_slice()) - .map_err(|err| { - format!( - "Invalid validator list {}: {}", - stake_pool.validator_list, err - ) - })?; - - Ok(StakePoolOMatic { - authorized_staker, - baseline_stake_amount, - min_reserve_stake_balance, - stake_pool_address, - stake_pool, - validator_list, - }) -} - -impl StakePoolOMatic { - /// Perform the double update, required at the start of an epoch: - /// * call into the stake pool program to update the accounting of lamports - /// * update the StakePool and ValidatorList objects based on the accounting - pub fn epoch_update(&mut self, client: &MultiClient) -> Result<(), Box> { - self.update(client)?; - update_stake_pool( - client, - &self.authorized_staker, - &self.stake_pool_address, - &self.stake_pool, - &self.validator_list, - )?; - self.update(client)?; - Ok(()) - } - - /// Update the StakePoolOMatic instance with the current StakePool and ValidatorList - /// from the network. - pub fn update(&mut self, rpc_client: &RpcClient) -> Result<(), Box> { - let account_data = rpc_client.get_account_data(&self.stake_pool_address)?; - self.stake_pool = try_from_slice_unchecked::(account_data.as_slice()) - .map_err(|err| format!("Invalid stake pool {}: {}", self.stake_pool_address, err))?; - let account_data = rpc_client.get_account_data(&self.stake_pool.validator_list)?; - self.validator_list = try_from_slice_unchecked::(account_data.as_slice()) - .map_err(|err| { - format!( - "Invalid validator list {}: {}", - self.stake_pool.validator_list, err - ) - })?; - Ok(()) - } -} - -impl GenericStakePool for StakePoolOMatic { - fn apply( - &mut self, - client: &MultiClient, - dry_run: bool, - desired_validator_stake: &[ValidatorStake], - _bonus_multiplier: Option, - ) -> Result< - ( - EpochStakeNotes, - ValidatorStakeActions, - UnfundedValidators, - u64, - ), - Box, - > { - let mut validator_stake_actions = HashMap::default(); - let mut no_stake_node_count = 0; - let mut bonus_stake_node_count = 0; - let mut baseline_stake_node_count = 0; - - // used to find any validators that should be removed from the stake pool - let mut inuse_vote_addresses = HashSet::default(); - - for ValidatorStake { - stake_state, - vote_address, - .. - } in desired_validator_stake - { - inuse_vote_addresses.insert(*vote_address); - - match stake_state { - ValidatorStakeState::Bonus => bonus_stake_node_count += 1, - ValidatorStakeState::Baseline => baseline_stake_node_count += 1, - ValidatorStakeState::None => no_stake_node_count += 1, - } - } - - info!("Withdraw inactive transient stake accounts to the staker"); - withdraw_inactive_stakes_to_staker(client, &self.authorized_staker, dry_run)?; - - info!("Update the stake pool, merging transient stakes and orphaned accounts"); - self.epoch_update(client)?; - - let all_vote_addresses: HashSet = self - .validator_list - .validators - .iter() - .map(|x| x.vote_account_address) - .collect(); - info!("Remove validators no longer present in the desired list"); - remove_validators_from_pool( - client, - &self.authorized_staker, - &self.stake_pool_address, - &self.stake_pool, - &self.validator_list, - &all_vote_addresses - &inuse_vote_addresses, - dry_run, - )?; - - info!("Add new validators to pool"); - add_validators_to_pool( - client, - &self.authorized_staker, - desired_validator_stake, - &self.stake_pool_address, - &self.stake_pool, - &self.validator_list, - dry_run, - )?; - self.update(client)?; - - info!("Add unmerged transient stake accounts to the busy set"); - add_unmerged_transient_stake_accounts( - desired_validator_stake, - &self.validator_list, - &mut validator_stake_actions, - )?; - - let total_stake_amount = self - .stake_pool - .total_lamports - .saturating_sub(self.min_reserve_stake_balance); - info!( - "Total stake pool balance minus required reserves: {}", - Sol(total_stake_amount) - ); - - let total_baseline_stake_amount = baseline_stake_node_count * self.baseline_stake_amount; - info!("Baseline node count: {}", baseline_stake_node_count); - info!("Baseline stake amount: {}", Sol(self.baseline_stake_amount)); - info!( - "Total baseline stake amount: {}", - Sol(total_baseline_stake_amount) - ); - - if total_stake_amount < total_baseline_stake_amount { - return Err("Not enough stake to cover the baseline".into()); - } - - info!("Bonus node count: {}", bonus_stake_node_count); - let total_bonus_stake_amount = - total_stake_amount.saturating_sub(total_baseline_stake_amount); - info!( - "Total bonus stake amount: {}", - Sol(total_bonus_stake_amount) - ); - - let stake_rent_exemption = get_minimum_stake_balance_for_rent_exemption(client)?; - - let bonus_stake_amount = if bonus_stake_node_count == 0 { - 0 - } else { - let bonus_stake_estimate = total_bonus_stake_amount / (bonus_stake_node_count as u64); - // each increase requires use of the rent exemption, so we get the number - // of increases that may be required, and be sure to leave that amount - // out of the bonus stake amount - let number_of_increases = desired_validator_stake.iter().fold(0, |mut acc, x| { - if let Some(validator_list_entry) = self.validator_list.find(&x.vote_address) { - if x.stake_state == ValidatorStakeState::Bonus - && validator_list_entry.stake_lamports() < bonus_stake_estimate - { - acc += 1; - } - if x.stake_state == ValidatorStakeState::Baseline - && validator_list_entry.stake_lamports() < self.baseline_stake_amount - { - acc += 1; - } - } - acc - }); - total_bonus_stake_amount.saturating_sub(number_of_increases * stake_rent_exemption) - / (bonus_stake_node_count as u64) - }; - - info!("Bonus stake amount: {}", Sol(bonus_stake_amount)); - - let reserve_stake_balance = get_available_reserve_stake_balance( - client, - self.stake_pool.reserve_stake, - self.min_reserve_stake_balance + stake_rent_exemption, - ) - .map_err(|err| { - format!( - "Unable to get reserve stake account balance: {}: {}", - self.stake_pool.reserve_stake, err - ) - })?; - - info!( - "Reserve stake available balance before updates: {}", - Sol(reserve_stake_balance) - ); - - let notes = vec![ - format!( - "Stake pool size: {} (inactive: {})", - Sol(total_stake_amount), - Sol(reserve_stake_balance) - ), - format!("Baseline stake amount: {}", Sol(self.baseline_stake_amount)), - format!("Bonus stake amount: {}", Sol(bonus_stake_amount)), - format!( - "Validators by stake level: None={}, Baseline={}, Bonus={}", - no_stake_node_count, baseline_stake_node_count, bonus_stake_node_count - ), - ]; - - let busy_validators = validator_stake_actions - .keys() - .cloned() - .collect::>(); - let mut unfunded_validators = HashSet::default(); - distribute_validator_stake( - client, - dry_run, - &self.authorized_staker, - &self.stake_pool_address, - &self.stake_pool, - &self.validator_list, - desired_validator_stake - .iter() - .filter(|vs| !busy_validators.contains(&vs.identity)) - .cloned(), - reserve_stake_balance, - self.baseline_stake_amount, - bonus_stake_amount, - &mut validator_stake_actions, - &mut unfunded_validators, - )?; - Ok(( - notes, - validator_stake_actions, - unfunded_validators, - bonus_stake_amount, - )) - } -} - -fn get_available_reserve_stake_balance( - rpc_client: &RpcClient, - reserve_stake_address: Pubkey, - reserve_stake_balance: u64, -) -> Result> { - let balance = rpc_client - .get_balance(&reserve_stake_address) - .map_err(|err| { - format!( - "Unable to get reserve stake account balance: {}: {}", - reserve_stake_address, err - ) - })?; - if balance < reserve_stake_balance { - warn!( - "reserve stake account {} balance too low, {}. Minimum is {}", - reserve_stake_address, - Sol(balance), - Sol(reserve_stake_balance) - ); - Ok(0) - } else { - Ok(balance.saturating_sub(reserve_stake_balance)) - } -} - -/// Iterates through all possible transient stake accounts on the stake pool, -/// and if any is present, mark the validator as busy. -fn add_unmerged_transient_stake_accounts( - desired_validator_stake: &[ValidatorStake], - validator_list: &ValidatorList, - validator_stake_actions: &mut ValidatorStakeActions, -) -> Result<(), Box> { - for ValidatorStake { - identity, - vote_address, - .. - } in desired_validator_stake - { - if let Some(validator_stake_info) = validator_list.find(vote_address) { - if validator_stake_info.transient_stake_lamports != 0 { - let action = format!( - "busy due to non-zero transient stake lamports {}", - validator_stake_info.transient_stake_lamports - ); - validator_stake_actions.insert(*identity, action); - } - } - } - Ok(()) -} - -/// Withdraw from inactive stake accounts owned by the staker, back to themself -/// -/// The staker has two types of stake accounts to reclaim: -/// -/// * removed validator stake accounts -/// * transient stake accounts created before adding, see `staker_transient_stake_address` -/// for more information -/// -/// Every epoch, this function checks for any of these inactive stake accounts, -/// and withdraws the entirety back to the staker. -fn withdraw_inactive_stakes_to_staker( - client: &MultiClient, - authorized_staker: &Keypair, - dry_run: bool, -) -> Result<(), Box> { - let mut transactions = vec![]; - let (all_stake_addresses, _all_stake_total_amount) = - get_all_stake_by_staker(client, authorized_staker.pubkey())?; - - for stake_address in all_stake_addresses { - let stake_account = client - .get_account_with_commitment(&stake_address, client.commitment())? - .value; - - if let Some(stake_account) = stake_account { - // Check if the stake account is busy - let stake_activation = - client - .get_stake_activation(stake_address, None) - .map_err(|err| { - format!( - "Unable to get activation information for stake account: {}: {}", - stake_address, err - ) - })?; - - if stake_activation.state == StakeActivationState::Inactive { - let stake_lamports = stake_account.lamports; - transactions.push(Transaction::new_with_payer( - &[stake_instruction::withdraw( - &stake_address, - &authorized_staker.pubkey(), - &authorized_staker.pubkey(), - stake_lamports, - None, - )], - Some(&authorized_staker.pubkey()), - )); - } else { - debug!("Staker's stake at {} not inactive, skipping", stake_address); - } - } - } - - if dry_run { - Ok(()) - } else if send_and_confirm_transactions_with_spinner( - client, - false, - transactions, - authorized_staker, - )? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to withdraw inactive stakes to the staker".into()) - } else { - Ok(()) - } -} - -/// Create and send all transactions to update the stake pool balances, required -/// once per epoch to perform any operations on the stake pool. -fn update_stake_pool( - client: &MultiClient, - payer: &Keypair, - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - validator_list: &ValidatorList, -) -> Result<(), Box> { - let epoch_info = client.get_epoch_info()?; - if stake_pool.last_update_epoch == epoch_info.epoch { - println!("Stake pool up to date, no need to update"); - return Ok(()); - } - let (update_list_instructions, final_instructions) = - spl_stake_pool::instruction::update_stake_pool( - &spl_stake_pool::id(), - stake_pool, - validator_list, - stake_pool_address, - false, // no_merge - ); - - let transactions: Vec = update_list_instructions - .into_iter() - .map(|i| Transaction::new_with_payer(&[i], Some(&payer.pubkey()))) - .collect(); - - if send_and_confirm_transactions_with_spinner(client, false, transactions, payer)? - .iter() - .any(|err| err.is_some()) - { - return Err("Failed to update stake pool".into()); - } - - let transactions: Vec = final_instructions - .into_iter() - .map(|i| Transaction::new_with_payer(&[i], Some(&payer.pubkey()))) - .collect(); - - if send_and_confirm_transactions_with_spinner(client, false, transactions, payer)? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to update stake pool".into()) - } else { - Ok(()) - } -} - -/// Remove validators no longer present in the desired validator list -/// -/// In order to properly remove a validator from the stake pool, their stake -/// account must first be reduced down to the minimum of rent-exemption + 0.001 SOL. -/// The staker will take control of a new stake account on removal, so -/// this also deactivates the stake, to be reclaimed in the next epoch. -#[allow(clippy::too_many_arguments)] -fn remove_validators_from_pool( - client: &MultiClient, - authorized_staker: &Keypair, - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - validator_list: &ValidatorList, - remove_vote_addresses: HashSet, - dry_run: bool, -) -> Result<(), Box> { - let mut transactions = vec![]; - let stake_rent_exemption = get_minimum_stake_balance_for_rent_exemption(client)?; - - for vote_address in remove_vote_addresses { - if let Some(validator_list_entry) = validator_list.find(&vote_address) { - if validator_list_entry.status == StakeStatus::Active { - if is_removable(validator_list_entry, stake_rent_exemption) { - info!("Removing {} from stake pool", vote_address); - let destination_stake_address = - staker_transient_stake_address(authorized_staker.pubkey(), vote_address); - let destination_stake_seed = staker_transient_stake_address_seed(vote_address); - let mut instructions = vec![system_instruction::create_account_with_seed( - &authorized_staker.pubkey(), - &destination_stake_address, - &authorized_staker.pubkey(), - &destination_stake_seed, - stake_rent_exemption, - mem::size_of::() as u64, - &stake::program::id(), - )]; - if validator_list_entry.active_stake_lamports > stake_rent_exemption { - instructions.push( - spl_stake_pool::instruction::decrease_validator_stake_with_vote( - &spl_stake_pool::id(), - stake_pool, - stake_pool_address, - &vote_address, - validator_list_entry.active_stake_lamports, - validator_list_entry.transient_seed_suffix_start, - ), - ); - } - - instructions.push( - spl_stake_pool::instruction::remove_validator_from_pool_with_vote( - &spl_stake_pool::id(), - stake_pool, - stake_pool_address, - &vote_address, - &authorized_staker.pubkey(), - validator_list_entry.transient_seed_suffix_start, - &destination_stake_address, - ), - ); - instructions.push(stake_instruction::deactivate_stake( - &destination_stake_address, - &authorized_staker.pubkey(), - )); - transactions.push(Transaction::new_with_payer( - &instructions, - Some(&authorized_staker.pubkey()), - )); - } else { - warn!("Validator {} cannot be removed because of existing transient stake or dust active stake, ignoring", vote_address); - } - } else { - debug!("Validator {} already removed, ignoring", vote_address); - } - } else { - warn!( - "Validator {} not present in stake pool {}, ignoring removal", - vote_address, stake_pool_address - ); - } - } - - if dry_run { - Ok(()) - } else if send_and_confirm_transactions_with_spinner( - client, - false, - transactions, - authorized_staker, - )? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to remove validators from the stake pool".into()) - } else { - Ok(()) - } -} - -/// Add validator stake accounts that have been created and delegated, but not -/// included yet in the stake pool -#[allow(clippy::too_many_arguments)] -fn add_validators_to_pool( - client: &MultiClient, - authorized_staker: &Keypair, - desired_validator_stake: &[ValidatorStake], - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - validator_list: &ValidatorList, - dry_run: bool, -) -> Result<(), Box> { - let mut transactions = vec![]; - for ValidatorStake { - identity, - vote_address, - .. - } in desired_validator_stake - { - if !validator_list.contains(vote_address) { - info!( - "Adding validator identity {}, vote {} to the stake pool", - identity, vote_address - ); - transactions.push(Transaction::new_with_payer( - &[ - spl_stake_pool::instruction::add_validator_to_pool_with_vote( - &spl_stake_pool::id(), - stake_pool, - stake_pool_address, - &authorized_staker.pubkey(), - vote_address, - ), - ], - Some(&authorized_staker.pubkey()), - )); - } - } - - if dry_run { - Ok(()) - } else if send_and_confirm_transactions_with_spinner( - client, - false, - transactions, - authorized_staker, - )? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to add validators to the stake pool".into()) - } else { - Ok(()) - } -} - -#[allow(clippy::too_many_arguments)] -fn distribute_validator_stake( - client: &MultiClient, - dry_run: bool, - authorized_staker: &Keypair, - stake_pool_address: &Pubkey, - stake_pool: &StakePool, - validator_list: &ValidatorList, - desired_validator_stake: V, - mut reserve_stake_balance: u64, - baseline_stake_amount: u64, - bonus_stake_amount: u64, - validator_stake_actions: &mut ValidatorStakeActions, - unfunded_validators: &mut HashSet, -) -> Result> -where - V: IntoIterator, -{ - // Prioritize funding smaller stake accounts to maximize the number of accounts that will be - // funded with the available reserve stake. But validators with the priority flag jump the - // line, since they were missed previous epoch - let mut priority_stake = vec![]; - let mut min_stake = vec![]; - let mut baseline_stake = vec![]; - let mut bonus_stake = vec![]; - - let stake_rent_exemption = get_minimum_stake_balance_for_rent_exemption(client)?; - - for validator_stake in desired_validator_stake { - match validator_list.find(&validator_stake.vote_address) { - None => warn!( - "Vote address {} found in desired validator stake, but not in stake pool", - &validator_stake.vote_address - ), - Some(validator_entry) => { - let list = if validator_stake.priority { - &mut priority_stake - } else { - match validator_stake.stake_state { - ValidatorStakeState::None => &mut min_stake, - ValidatorStakeState::Baseline => &mut baseline_stake, - ValidatorStakeState::Bonus => &mut bonus_stake, - } - }; - - list.push(( - validator_entry.stake_lamports(), - validator_entry.transient_seed_suffix_start, - validator_stake, - )); - } - } - } - - // Sort from lowest to highest balance - priority_stake.sort_by_key(|k| k.0); - min_stake.sort_by_key(|k| k.0); - baseline_stake.sort_by_key(|k| k.0); - bonus_stake.sort_by_key(|k| k.0); - - let mut transactions = vec![]; - for ( - balance, - transient_seed_suffix, - ValidatorStake { - identity, - stake_state, - vote_address, - priority, - }, - ) in priority_stake - .into_iter() - .chain(min_stake) - .chain(baseline_stake) - .chain(bonus_stake) - { - let desired_balance = match stake_state { - ValidatorStakeState::None => 0, - ValidatorStakeState::Baseline => baseline_stake_amount, - ValidatorStakeState::Bonus => bonus_stake_amount, - }; - - #[allow(clippy::comparison_chain)] - let op_msg = if balance > desired_balance { - let amount_to_remove = balance - desired_balance; - if amount_to_remove < stake_rent_exemption { - format!("not removing {} (amount too small)", Sol(amount_to_remove)) - } else { - transactions.push(Transaction::new_with_payer( - &[ - spl_stake_pool::instruction::decrease_validator_stake_with_vote( - &spl_stake_pool::id(), - stake_pool, - stake_pool_address, - &vote_address, - amount_to_remove, - transient_seed_suffix.saturating_add(1), - ), - ], - Some(&authorized_staker.pubkey()), - )); - format!("removing {}", Sol(amount_to_remove)) - } - } else if balance < desired_balance { - let mut amount_to_add = desired_balance - balance; - let mut amount_to_take_from_reserve = amount_to_add + stake_rent_exemption; - - if amount_to_add < MIN_STAKE_CHANGE_AMOUNT { - format!("not adding {} (amount too small)", Sol(amount_to_add)) - } else { - if amount_to_take_from_reserve > reserve_stake_balance { - trace!( - "note: amount_to_take_from_reserve > reserve_stake_balance: {} > {}", - amount_to_take_from_reserve, - reserve_stake_balance - ); - amount_to_take_from_reserve = reserve_stake_balance; - amount_to_add = - amount_to_take_from_reserve.saturating_sub(stake_rent_exemption); - } - - if amount_to_add < MIN_STAKE_CHANGE_AMOUNT { - if priority { - warn!("Failed to fund a priority node"); - } - unfunded_validators.insert(identity); - "reserve depleted".to_string() - } else { - reserve_stake_balance -= amount_to_take_from_reserve; - info!("adding {} stake", Sol(amount_to_add)); - - transactions.push(Transaction::new_with_payer( - &[ - spl_stake_pool::instruction::increase_validator_stake_with_vote( - &spl_stake_pool::id(), - stake_pool, - stake_pool_address, - &vote_address, - amount_to_add, - transient_seed_suffix.saturating_add(1), - ), - ], - Some(&authorized_staker.pubkey()), - )); - format!("adding {}", Sol(amount_to_add)) - } - } - } else { - "no change".to_string() - }; - - let action = format!( - "target stake amount: {}, current stake amount: {} - {}", - Sol(desired_balance), - Sol(balance), - op_msg, - ); - info!( - "{} ({:?},priority={}) | {}", - identity, stake_state, priority, action - ); - validator_stake_actions.insert(identity, action); - } - info!( - "Reserve stake available balance after updates: {}", - Sol(reserve_stake_balance) - ); - - let ok = if dry_run { - true - } else { - !send_and_confirm_transactions_with_spinner(client, false, transactions, authorized_staker)? - .iter() - .any(|err| err.is_some()) - }; - - if !ok { - error!("One or more transactions failed to execute") - } - Ok(ok) -} - -#[cfg(test)] -mod test { - use { - super::*, - crate::{ - rpc_client_utils::{new_tpu_client_with_retry, test::*}, - Config, - }, - solana_sdk::{ - clock::Epoch, - epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH}, - native_token::sol_to_lamports, - signature::{Keypair, Signer}, - }, - solana_validator::test_validator::*, - spl_stake_pool::{find_stake_program_address, find_withdraw_authority_program_address}, - std::sync::Arc, - }; - - fn num_stake_accounts(rpc_client: &RpcClient, authority: Pubkey) -> usize { - get_all_stake_by_staker(rpc_client, authority) - .unwrap() - .0 - .len() - } - - fn validator_stake_balance( - rpc_client: &RpcClient, - stake_pool_address: &Pubkey, - validator: &ValidatorAddressPair, - ) -> u64 { - let stake_rent_exemption = - get_minimum_stake_balance_for_rent_exemption(rpc_client).unwrap(); - let min_stake_account_balance = stake_rent_exemption + spl_stake_pool::MINIMUM_ACTIVE_STAKE; - let stake_address = find_stake_program_address( - &spl_stake_pool::id(), - &validator.vote_address, - stake_pool_address, - ) - .0; - let stake_balance = rpc_client.get_balance(&stake_address).unwrap(); - info!("Stake {} has balance {}", stake_address, stake_balance); - stake_balance - min_stake_account_balance - } - - fn uniform_stake_pool_apply( - stake_o_matic: &mut StakePoolOMatic, - client: &MultiClient, - validators: &[ValidatorAddressPair], - stake_state: ValidatorStakeState, - expected_validator_stake_balance: u64, - expected_reserve_stake_balance: u64, - ) { - let pool_withdraw_authority = find_withdraw_authority_program_address( - &spl_stake_pool::id(), - &stake_o_matic.stake_pool_address, - ) - .0; - - let desired_validator_stake = validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state, - priority: false, - }) - .collect::>(); - - stake_o_matic - .apply(client, false, &desired_validator_stake, None) - .unwrap(); - - assert!(num_stake_accounts(client, pool_withdraw_authority) > 1 + validators.len()); - let _epoch = wait_for_next_epoch(client).unwrap(); - stake_o_matic - .apply(client, false, &desired_validator_stake, None) - .unwrap(); - - assert_eq!( - num_stake_accounts(client, pool_withdraw_authority), - 1 + validators.len() - ); - assert_eq!( - client - .get_balance(&stake_o_matic.stake_pool.reserve_stake) - .unwrap(), - expected_reserve_stake_balance - ); - for validator in validators { - assert_eq!( - validator_stake_balance(client, &stake_o_matic.stake_pool_address, validator), - expected_validator_stake_balance - ); - } - } - - #[test] - #[ignore = "Fails on occasion due to timing issues with short epochs in test framework"] - fn this_test_is_too_big_and_slow() { - solana_logger::setup_with_default("solana_stake_o_matic=info"); - - let mut test_validator_genesis = TestValidatorGenesis::default(); - const TEST_SLOTS_PER_EPOCH: u64 = MINIMUM_SLOTS_PER_EPOCH * 2; // longer than minimum to avoid CI failures - test_validator_genesis - .epoch_schedule(EpochSchedule::custom( - TEST_SLOTS_PER_EPOCH, - TEST_SLOTS_PER_EPOCH, - /* enable_warmup_epochs = */ false, - )) - .add_program("spl_stake_pool", spl_stake_pool::id()); - let (test_validator, authorized_staker) = test_validator_genesis.start(); - - let config = Config::default_for_test(); - let websocket_url = test_validator.rpc_pubsub_url(); - let rpc_client = test_validator.get_rpc_client(); - let rpc_client = Arc::new(rpc_client); - let tpu_client = new_tpu_client_with_retry(&rpc_client, &websocket_url).unwrap(); - let client = MultiClient::new(rpc_client, tpu_client, &config); - - let stake_pool = Keypair::new(); - let pool_withdraw_authority = - find_withdraw_authority_program_address(&spl_stake_pool::id(), &stake_pool.pubkey()).0; - - let assert_validator_stake_activation = - |vap: &ValidatorAddressPair, epoch: Epoch, state: StakeActivationState| { - let stake_address = find_stake_program_address( - &spl_stake_pool::id(), - &vap.vote_address, - &stake_pool.pubkey(), - ) - .0; - assert_eq!( - client - .get_stake_activation(stake_address, Some(epoch)) - .unwrap() - .state, - state, - ); - }; - - // =========================================================== - info!("Create stake pool: mint, fee account, reserve stake, and pool itself"); - let stake_rent_exemption = get_minimum_stake_balance_for_rent_exemption(&client).unwrap(); - let withdraw_authority = - find_withdraw_authority_program_address(&spl_stake_pool::id(), &stake_pool.pubkey()).0; - let pool_mint = create_mint(&client, &authorized_staker, &withdraw_authority).unwrap(); - let pool_fee_account = create_token_account( - &client, - &authorized_staker, - &pool_mint, - &authorized_staker.pubkey(), - ) - .unwrap(); - let num_validators = 3; - let min_reserve_stake_balance = sol_to_lamports(100.); - let pool_reserve_stake = create_stake_account( - &client, - &authorized_staker, - &withdraw_authority, - stake_rent_exemption + min_reserve_stake_balance, - ) - .unwrap() - .pubkey(); - create_stake_pool( - &client, - &authorized_staker, - &stake_pool, - &pool_reserve_stake, - &pool_mint, - &pool_fee_account, - &authorized_staker, - &authorized_staker.pubkey(), - num_validators, - &withdraw_authority, - ) - .unwrap(); - - info!("Create three validators"); - let validators = create_validators(&client, &authorized_staker, num_validators).unwrap(); - - let baseline_stake_amount = sol_to_lamports(10.); - let bonus_stake_amount = sol_to_lamports(100.); - let total_stake_amount = - (baseline_stake_amount + bonus_stake_amount + stake_rent_exemption) - * validators.len() as u64; - let total_stake_amount_plus_min = - total_stake_amount + stake_rent_exemption + min_reserve_stake_balance; - - let assert_reserve_account_only = |current_reserve_amount| { - assert_eq!( - client.get_balance(&pool_reserve_stake).unwrap(), - current_reserve_amount, - ); - { - let (all_stake, all_stake_total_amount) = - get_all_stake_by_staker(&client, withdraw_authority).unwrap(); - assert_eq!(all_stake_total_amount, current_reserve_amount); - assert_eq!(all_stake.len(), 1); - assert!(all_stake.contains(&pool_reserve_stake)); - } - }; - assert_reserve_account_only(min_reserve_stake_balance + stake_rent_exemption); - - let mut stake_o_matic = new( - &client, - authorized_staker, - stake_pool.pubkey(), - baseline_stake_amount, - min_reserve_stake_balance - 1, - // This makes the math work neater for the sake of the test. That - // subtracted lamport represents the minimum 1 lamport that must - // always remain in the reserve stake account. In practice, we don't - // need to be so specific, but it's good to get it right in a test. - ) - .unwrap(); - - // =========================================================== - info!("Start with adding validators and deposit stake, no managed stake yet"); - let epoch = client.get_epoch_info().unwrap().epoch; - stake_o_matic - .apply( - &client, - false, - &validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }) - .collect::>(), - None, - ) - .unwrap(); - - let stake_deposit_amount = total_stake_amount / 2; - let sol_deposit_amount = total_stake_amount - stake_deposit_amount; - let deposit_stake_address = create_stake_account( - &client, - &stake_o_matic.authorized_staker, - &stake_o_matic.authorized_staker.pubkey(), - total_stake_amount / 2, - ) - .unwrap() - .pubkey(); - let deposit_vote_address = validators.first().unwrap().vote_address; - delegate_stake( - &client, - &stake_o_matic.authorized_staker, - &deposit_stake_address, - &deposit_vote_address, - ) - .unwrap(); - - info!("min: wait for stake activation"); - assert_eq!( - client.get_balance(&pool_reserve_stake).unwrap(), - min_reserve_stake_balance + stake_rent_exemption, - ); - - for validator in &validators { - assert_validator_stake_activation(validator, epoch, StakeActivationState::Activating); - assert_eq!( - validator_stake_balance(&client, &stake_pool.pubkey(), validator), - 0, - ); - } - assert_eq!(num_stake_accounts(&client, pool_withdraw_authority), 4); - assert_eq!( - num_stake_accounts(&client, stake_o_matic.authorized_staker.pubkey()), - 1 - ); - let epoch = wait_for_next_epoch(&client).unwrap(); - - for validator in &validators { - assert_validator_stake_activation(validator, epoch, StakeActivationState::Active); - } - - // =========================================================== - info!("Nothing happens to the pool, but added validator stakes are active"); - stake_o_matic - .apply( - &client, - false, - &validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }) - .collect::>(), - None, - ) - .unwrap(); - - info!("Deposit stake"); - let staker_pool_token_address = create_token_account( - &client, - &stake_o_matic.authorized_staker, - &pool_mint, - &stake_o_matic.authorized_staker.pubkey(), - ) - .unwrap(); - deposit_stake_into_stake_pool( - &client, - &stake_o_matic.authorized_staker, - &stake_o_matic.stake_pool_address, - &stake_o_matic.stake_pool, - &deposit_vote_address, - &deposit_stake_address, - &staker_pool_token_address, - ) - .unwrap(); - - info!("Deposit sol directly"); - deposit_sol_into_stake_pool( - &client, - &stake_o_matic.authorized_staker, - &stake_o_matic.stake_pool_address, - &stake_o_matic.stake_pool, - &staker_pool_token_address, - sol_deposit_amount, - ) - .unwrap(); - - info!("All validators to nothing, moving all to reserve"); - stake_o_matic - .apply( - &client, - false, - &validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }) - .collect::>(), - None, - ) - .unwrap(); - - // =========================================================== - info!("All validators to baseline"); - let _epoch = wait_for_next_epoch(&client).unwrap(); - uniform_stake_pool_apply( - &mut stake_o_matic, - &client, - &validators, - ValidatorStakeState::Baseline, - baseline_stake_amount, - total_stake_amount_plus_min - baseline_stake_amount * validators.len() as u64, - ); - - // =========================================================== - info!("All validators to bonus stake level"); - uniform_stake_pool_apply( - &mut stake_o_matic, - &client, - &validators, - ValidatorStakeState::Bonus, - baseline_stake_amount + bonus_stake_amount, - min_reserve_stake_balance + stake_rent_exemption * (1 + validators.len() as u64), - ); - - // =========================================================== - info!("Different stake for each validator"); - let desired_validator_stake = vec![ - ValidatorStake { - identity: validators[0].identity, - vote_address: validators[0].vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }, - ValidatorStake { - identity: validators[1].identity, - vote_address: validators[1].vote_address, - stake_state: ValidatorStakeState::Baseline, - priority: false, - }, - ValidatorStake { - identity: validators[2].identity, - vote_address: validators[2].vote_address, - stake_state: ValidatorStakeState::Bonus, - priority: false, - }, - ]; - - stake_o_matic - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - let _epoch = wait_for_next_epoch(&client).unwrap(); - stake_o_matic - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - - info!("Check after first epoch"); - // after the first epoch, validators 0 and 1 are at their target levels - // but validator 2 needs one more epoch for the additional bonus stake - // to arrive. - for (validator, expected_sol_balance) in validators.iter().zip(&[0., 10., 110.]) { - let expected_sol_balance = sol_to_lamports(*expected_sol_balance); - assert_eq!( - expected_sol_balance, - validator_stake_balance(&client, &stake_pool.pubkey(), validator), - "stake balance mismatch for validator {}, expected {}", - validator.identity, - expected_sol_balance - ); - } - - assert_eq!( - client - .get_balance(&stake_o_matic.stake_pool.reserve_stake) - .unwrap(), - min_reserve_stake_balance + stake_rent_exemption, - ); - - info!("Check after second epoch"); - let _epoch = wait_for_next_epoch(&client).unwrap(); - stake_o_matic - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - - assert_eq!( - client - .get_balance(&stake_o_matic.stake_pool.reserve_stake) - .unwrap(), - min_reserve_stake_balance + stake_rent_exemption * 2, // additional withdrawn stake rent exemption - ); - - // after the second epoch, validator 2 is now has all the bonus stake - for (validator, expected_sol_balance) in validators.iter().zip(&[0., 10., 320.00456576]) { - let expected_sol_balance = sol_to_lamports(*expected_sol_balance); - assert_eq!( - expected_sol_balance, - validator_stake_balance(&client, &stake_pool.pubkey(), validator), - "stake balance mismatch for validator {}, expected {}", - validator.identity, - expected_sol_balance, - ); - } - - // =========================================================== - info!("remove all validators"); - // deactivate all validator stake and remove from pool - stake_o_matic.apply(&client, false, &[], None).unwrap(); - - // withdraw removed validator stake into the staker - let _epoch = wait_for_next_epoch(&client).unwrap(); - stake_o_matic.apply(&client, false, &[], None).unwrap(); - // all stake has been returned to the reserve account - assert_reserve_account_only( - min_reserve_stake_balance + stake_rent_exemption + total_stake_amount, - ); - // staker has recovered all of their SOL from stake accounts - assert_eq!( - num_stake_accounts(&client, stake_o_matic.authorized_staker.pubkey()), - 0 - ); - } -} diff --git a/bot/src/stake_pool_v0.rs b/bot/src/stake_pool_v0.rs deleted file mode 100644 index 872d9369..00000000 --- a/bot/src/stake_pool_v0.rs +++ /dev/null @@ -1,1198 +0,0 @@ -use solana_sdk::instruction::Instruction; -use solana_sdk::system_instruction; -use std::env; -use { - crate::{ - generic_stake_pool::*, - rpc_client_utils::{ - get_active_and_inactive_stake, get_all_stake_by_staker, - send_and_confirm_transactions_with_spinner, MultiClient, - }, - }, - log::*, - num_format::{Locale, ToFormattedString}, - solana_client::{rpc_client::RpcClient, rpc_response::StakeActivationState}, - solana_sdk::{ - native_token::{lamports_to_sol, Sol}, - pubkey::Pubkey, - signature::{Keypair, Signer}, - stake::{self, instruction as stake_instruction}, - transaction::Transaction, - }, - std::{ - collections::{HashMap, HashSet}, - error, - }, -}; - -// Value of RpcClient::get_stake_minimum_delegation(); need to upgrade solana-client to get access to this function -const MIN_STAKE_DELEGATION: u64 = 1000000000; -// Delegation rent amount. Need -const DELEGATION_RENT: u64 = 2282880; - -// Minimum amount of lamports in a stake pool account. Without DELEGATION_RENT, we will be -// below the miniumum delegation amount, and will get InsufficientDelegation errors -pub const MIN_STAKE_ACCOUNT_BALANCE: u64 = MIN_STAKE_DELEGATION + DELEGATION_RENT; - -// Don't bother adjusting stake if less than this amount of lamports will be affected -// (must be >= MIN_STAKE_ACCOUNT_BALANCE) -const MIN_STAKE_CHANGE_AMOUNT: u64 = MIN_STAKE_ACCOUNT_BALANCE; - -#[derive(Debug)] -pub struct StakePool { - authorized_staker: Keypair, - baseline_stake_amount: u64, - reserve_stake_address: Pubkey, - min_reserve_stake_balance: u64, - ignore_stake_distribution_errors: bool, -} - -pub fn new( - _rpc_client: &RpcClient, - authorized_staker: Keypair, - baseline_stake_amount: u64, - reserve_stake_address: Pubkey, - min_reserve_stake_balance: u64, - ignore_stake_distribution_errors: bool, -) -> Result> { - if baseline_stake_amount < MIN_STAKE_CHANGE_AMOUNT { - return Err(format!( - "baseline stake amount too small: {}", - Sol(baseline_stake_amount) - ) - .into()); - } - - if min_reserve_stake_balance < MIN_STAKE_ACCOUNT_BALANCE { - return Err(format!( - "minimum reserve stake balance is too small: {}", - Sol(min_reserve_stake_balance) - ) - .into()); - } - - Ok(StakePool { - authorized_staker, - baseline_stake_amount, - reserve_stake_address, - min_reserve_stake_balance, - ignore_stake_distribution_errors, - }) -} - -fn validator_stake_address_seed(vote_address: Pubkey) -> String { - format!("S{}", vote_address)[..32].to_string() -} - -fn validator_transient_stake_address_seed(vote_address: Pubkey) -> String { - format!("T{}", vote_address)[..32].to_string() -} - -fn validator_stake_address(authorized_staker: Pubkey, vote_address: Pubkey) -> Pubkey { - Pubkey::create_with_seed( - &authorized_staker, - &validator_stake_address_seed(vote_address), - &stake::program::id(), - ) - .unwrap() -} - -fn validator_transient_stake_address(authorized_staker: Pubkey, vote_address: Pubkey) -> Pubkey { - Pubkey::create_with_seed( - &authorized_staker, - &validator_transient_stake_address_seed(vote_address), - &stake::program::id(), - ) - .unwrap() -} - -impl GenericStakePool for StakePool { - fn apply( - &mut self, - client: &MultiClient, - dry_run: bool, - desired_validator_stake: &[ValidatorStake], - bonus_multiplier: Option, - ) -> Result< - ( - EpochStakeNotes, - ValidatorStakeActions, - UnfundedValidators, - u64, - ), - Box, - > { - let mut validator_stake_actions = HashMap::default(); - - let mut inuse_stake_addresses = HashSet::default(); - inuse_stake_addresses.insert(self.reserve_stake_address); - - let mut min_stake_node_count = 0; - let mut bonus_stake_node_count = 0; - let mut baseline_stake_node_count = 0; - - for ValidatorStake { - vote_address, - stake_state, - .. - } in desired_validator_stake - { - let stake_address = - validator_stake_address(self.authorized_staker.pubkey(), *vote_address); - let transient_stake_address = - validator_transient_stake_address(self.authorized_staker.pubkey(), *vote_address); - - inuse_stake_addresses.insert(stake_address); - inuse_stake_addresses.insert(transient_stake_address); - - match stake_state { - ValidatorStakeState::None => min_stake_node_count += 1, - ValidatorStakeState::Bonus => bonus_stake_node_count += 1, - ValidatorStakeState::Baseline => baseline_stake_node_count += 1, - } - } - - let (all_stake_addresses, all_stake_total_amount) = - get_all_stake_by_staker(client, self.authorized_staker.pubkey())?; - - info!("Merge orphaned stake into the reserve"); - let deactivated_merged_stake = merge_orphaned_stake_accounts( - client, - &self.authorized_staker, - &all_stake_addresses - &inuse_stake_addresses, - self.reserve_stake_address, - dry_run, - )?; - - info!("Merge transient stake back into either the reserve or validator stake"); - merge_transient_stake_accounts( - client, - &self.authorized_staker, - desired_validator_stake, - self.reserve_stake_address, - &mut validator_stake_actions, - dry_run, - )?; - - info!("Create validator stake accounts if needed"); - create_validator_stake_accounts( - client, - &self.authorized_staker, - desired_validator_stake, - self.reserve_stake_address, - self.min_reserve_stake_balance, - &mut validator_stake_actions, - dry_run, - )?; - - // `total_stake_amount` excludes the amount that always remains in the reserve account - let total_stake_amount = all_stake_total_amount - self.min_reserve_stake_balance; - - info!("Total stake pool balance: {}", Sol(total_stake_amount)); - - let total_min_stake_amount = min_stake_node_count * MIN_STAKE_ACCOUNT_BALANCE; - info!("Min node count: {}", min_stake_node_count); - info!("Min stake amount: {}", Sol(total_min_stake_amount)); - - let total_baseline_stake_amount = baseline_stake_node_count * self.baseline_stake_amount; - info!("Baseline node count: {}", baseline_stake_node_count); - info!("Baseline stake amount: {}", Sol(self.baseline_stake_amount)); - info!( - "Total baseline stake amount: {}", - Sol(total_baseline_stake_amount) - ); - - if total_stake_amount < total_baseline_stake_amount { - return Err("Not enough stake to cover the baseline".into()); - } - - info!("Bonus node count: {}", bonus_stake_node_count); - let total_bonus_stake_amount = - total_stake_amount.saturating_sub(total_min_stake_amount + total_baseline_stake_amount); - info!( - "Total bonus stake amount: {}", - Sol(total_bonus_stake_amount) - ); - - let bonus_stake_amount: u64 = if bonus_stake_node_count == 0 { - 0 - } else { - (bonus_multiplier.unwrap_or(1.0) - * ((total_bonus_stake_amount / bonus_stake_node_count) as f64)) as u64 - }; - - info!("Bonus stake amount: {}", Sol(bonus_stake_amount)); - - let reserve_stake_balance = get_available_reserve_stake_balance( - client, - self.reserve_stake_address, - self.min_reserve_stake_balance, - ) - .map_err(|err| { - format!( - "Unable to get reserve stake account balance: {}: {}", - self.reserve_stake_address, err - ) - })?; - - info!( - "Reserve stake available balance before updates: {}", - Sol(reserve_stake_balance) - ); - - let mut notes = vec![ - format!( - "Stake pool size: ◎{} (available for delegation: ◎{})", - (lamports_to_sol(total_stake_amount) as u64).to_formatted_string(&Locale::en), - (lamports_to_sol(reserve_stake_balance) as u64).to_formatted_string(&Locale::en) - ), - format!( - "Baseline stake amount: ◎{}", - (lamports_to_sol(self.baseline_stake_amount) as u64) - .to_formatted_string(&Locale::en) - ), - format!( - "Bonus stake amount: ◎{}", - (lamports_to_sol(bonus_stake_amount) as u64).to_formatted_string(&Locale::en) - ), - format!( - "Validators by stake level: None={}, Baseline={}, Bonus={}", - min_stake_node_count, baseline_stake_node_count, bonus_stake_node_count - ), - format!( - "Deactiving stake from orphaned stake accounts: ◎{}", - (lamports_to_sol(deactivated_merged_stake) as u64).to_formatted_string(&Locale::en) - ), - ]; - - let busy_validators = validator_stake_actions - .keys() - .cloned() - .collect::>(); - let mut unfunded_validators = HashSet::default(); - let (activating_stake, deactivating_stake) = distribute_validator_stake( - client, - dry_run, - &self.authorized_staker, - desired_validator_stake - .iter() - .filter(|vs| !busy_validators.contains(&vs.identity)) - .cloned(), - self.reserve_stake_address, - reserve_stake_balance, - self.baseline_stake_amount, - bonus_stake_amount, - &mut validator_stake_actions, - &mut unfunded_validators, - self.ignore_stake_distribution_errors, - )?; - - notes.push(format!( - "Activating stake: ◎{}", - (lamports_to_sol(activating_stake) as u64).to_formatted_string(&Locale::en) - )); - notes.push(format!( - "Deactivating stake: ◎{}", - (lamports_to_sol(deactivating_stake) as u64).to_formatted_string(&Locale::en) - )); - - Ok(( - notes, - validator_stake_actions, - unfunded_validators, - bonus_stake_amount, - )) - } -} - -fn get_available_reserve_stake_balance( - rpc_client: &RpcClient, - reserve_stake_address: Pubkey, - reserve_stake_balance: u64, -) -> Result> { - let balance = rpc_client - .get_balance(&reserve_stake_address) - .map_err(|err| { - format!( - "Unable to get reserve stake account balance: {}: {}", - reserve_stake_address, err - ) - })?; - if balance < reserve_stake_balance { - warn!( - "reserve stake account {} balance too low, {}. Minimum is {}", - reserve_stake_address, - Sol(balance), - Sol(reserve_stake_balance) - ); - Ok(0) - } else { - Ok(balance.saturating_sub(reserve_stake_balance)) - } -} - -fn merge_orphaned_stake_accounts( - client: &MultiClient, - authorized_staker: &Keypair, - source_stake_addresses: HashSet, - reserve_stake_address: Pubkey, - dry_run: bool, -) -> Result> { - let mut transactions = vec![]; - - let mut deactivating_stake_lamports = 0; - - for stake_address in source_stake_addresses { - let stake_activation = client - .get_stake_activation(stake_address, None) - .map_err(|err| { - format!( - "Unable to get stake activation for {}: {}", - stake_address, err - ) - })?; - - match stake_activation.state { - StakeActivationState::Activating | StakeActivationState::Deactivating => {} - StakeActivationState::Active => { - deactivating_stake_lamports += stake_activation.active; - transactions.push(Transaction::new_with_payer( - &[stake_instruction::deactivate_stake( - &stake_address, - &authorized_staker.pubkey(), - )], - Some(&authorized_staker.pubkey()), - )); - debug!("Deactivating stake {}", stake_address); - } - StakeActivationState::Inactive => { - transactions.push(Transaction::new_with_payer( - &stake_instruction::merge( - &reserve_stake_address, - &stake_address, - &authorized_staker.pubkey(), - ), - Some(&authorized_staker.pubkey()), - )); - - debug!( - "Merging orphaned stake, {}, into reserve {}", - stake_address, reserve_stake_address - ); - } - } - } - - if send_and_confirm_transactions_with_spinner(client, dry_run, transactions, authorized_staker)? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to merge orphaned stake accounts".into()) - } else { - Ok(deactivating_stake_lamports) - } -} - -fn merge_transient_stake_accounts( - client: &MultiClient, - authorized_staker: &Keypair, - desired_validator_stake: &[ValidatorStake], - reserve_stake_address: Pubkey, - validator_stake_actions: &mut ValidatorStakeActions, - dry_run: bool, -) -> Result<(), Box> { - let mut transactions = vec![]; - for ValidatorStake { - identity, - vote_address, - .. - } in desired_validator_stake - { - let stake_address = validator_stake_address(authorized_staker.pubkey(), *vote_address); - let transient_stake_address = - validator_transient_stake_address(authorized_staker.pubkey(), *vote_address); - - let transient_stake_activation = client.get_stake_activation(transient_stake_address, None); - - if let Ok(transient_stake_activation) = transient_stake_activation { - match transient_stake_activation.state { - StakeActivationState::Activating => { - let action = format!( - "stake account busy due to transient stake activation: {:?}", - transient_stake_address, - ); - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - StakeActivationState::Deactivating => { - let action = format!( - "stake account busy due to transient stake deactivation: {}", - transient_stake_address, - ); - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - StakeActivationState::Active => { - match client.get_stake_activation(stake_address, None) { - Ok(stake_activation) => { - if stake_activation.state == StakeActivationState::Active { - transactions.push(Transaction::new_with_payer( - &stake_instruction::merge( - &stake_address, - &transient_stake_address, - &authorized_staker.pubkey(), - ), - Some(&authorized_staker.pubkey()), - )); - debug!("Merging active transient stake for {}", identity); - } else { - let action = format!( - "stake account {} busy because not active, while transient account {} is active", - stake_address, - transient_stake_address - ); - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - } - - Err(err) => { - warn!( - "merge_transient_stake_accounts(): Unable to get activation information for stake account: {}; vote address: {:?}; validator identity: {:?} {}", - stake_address, vote_address, identity, err - ); - } - } - } - StakeActivationState::Inactive => { - transactions.push(Transaction::new_with_payer( - &stake_instruction::merge( - &reserve_stake_address, - &transient_stake_address, - &authorized_staker.pubkey(), - ), - Some(&authorized_staker.pubkey()), - )); - debug!("Merging inactive transient stake for {}", identity); - } - } - } - } - - if send_and_confirm_transactions_with_spinner(client, dry_run, transactions, authorized_staker)? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to merge transient stake".into()) - } else { - Ok(()) - } -} - -#[allow(clippy::too_many_arguments)] -fn create_validator_stake_accounts( - client: &MultiClient, - authorized_staker: &Keypair, - desired_validator_stake: &[ValidatorStake], - reserve_stake_address: Pubkey, - min_reserve_stake_balance: u64, - validator_stake_actions: &mut ValidatorStakeActions, - dry_run: bool, -) -> Result<(), Box> { - let mut reserve_stake_balance = get_available_reserve_stake_balance( - client, - reserve_stake_address, - min_reserve_stake_balance, - ) - .map_err(|err| { - format!( - "Unable to get reserve stake account balance: {}: {}", - reserve_stake_address, err - ) - })?; - info!( - "Reserve stake available balance: {}", - Sol(reserve_stake_balance) - ); - - let mut transactions = vec![]; - for ValidatorStake { - identity, - vote_address, - .. - } in desired_validator_stake - { - let stake_address = validator_stake_address(authorized_staker.pubkey(), *vote_address); - let stake_account = client - .get_account_with_commitment(&stake_address, client.commitment())? - .value; - - if stake_account.is_some() { - // Check if the stake account is busy - match client.get_stake_activation(stake_address, None) { - Ok(stake_activation) => match stake_activation.state { - StakeActivationState::Activating => { - let action = format!( - "stake account busy due to stake activation of {}", - stake_address - ); - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - StakeActivationState::Deactivating => { - let action = format!( - "stake account busy due to stake deactivation of {}", - stake_address - ); - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - StakeActivationState::Active => {} - StakeActivationState::Inactive => { - let action = - format!("stake account busy due to inactive stake {}", stake_address); - warn!("Busy validator {}: {}", *identity, action); - - transactions.push(Transaction::new_with_payer( - &[stake_instruction::delegate_stake( - &stake_address, - &authorized_staker.pubkey(), - vote_address, - )], - Some(&authorized_staker.pubkey()), - )); - debug!( - "Activating stake account for validator {} ({})", - identity, stake_address - ); - validator_stake_actions.insert(*identity, action); - } - }, - Err(err) => { - // Just ignore these errors - warn!( - "create_validator_stake_accounts(): Unable to get activation information for stake account: {}; vote address: {:?}; validator identity: {:?} {}", - stake_address, vote_address, identity, err - ); - } - } - } else { - let action = if reserve_stake_balance < MIN_STAKE_ACCOUNT_BALANCE { - // Try again next epoch - warn!( - "Insufficient funds in reserve stake account to create stake account: {} required, {} balance", - Sol(MIN_STAKE_ACCOUNT_BALANCE), Sol(reserve_stake_balance) - ); - - format!( - "insufficient funds in reserve account to create stake account {}", - stake_address - ) - } else { - // Create a stake account for the validator - reserve_stake_balance -= MIN_STAKE_ACCOUNT_BALANCE; - - let mut instructions = stake_instruction::split_with_seed( - &reserve_stake_address, - &authorized_staker.pubkey(), - MIN_STAKE_ACCOUNT_BALANCE, - &stake_address, - &authorized_staker.pubkey(), - &validator_stake_address_seed(*vote_address), - ); - instructions.push(stake_instruction::delegate_stake( - &stake_address, - &authorized_staker.pubkey(), - vote_address, - )); - - transactions.push(Transaction::new_with_payer( - &instructions, - Some(&authorized_staker.pubkey()), - )); - format!("creating new stake account {}", stake_address) - }; - warn!("Busy validator {}: {}", *identity, action); - validator_stake_actions.insert(*identity, action); - } - } - - if send_and_confirm_transactions_with_spinner(client, dry_run, transactions, authorized_staker)? - .iter() - .any(|err| err.is_some()) - { - Err("Failed to create validator stake accounts".into()) - } else { - Ok(()) - } -} - -// returns (activating_stake, deactivating_stake) -#[allow(clippy::too_many_arguments)] -fn distribute_validator_stake( - client: &MultiClient, - dry_run: bool, - authorized_staker: &Keypair, - desired_validator_stake: V, - reserve_stake_address: Pubkey, - mut reserve_stake_balance: u64, - baseline_stake_amount: u64, - bonus_stake_amount: u64, - validator_stake_actions: &mut ValidatorStakeActions, - unfunded_validators: &mut HashSet, - ignore_stake_distribution_errors: bool, -) -> Result<(u64, u64), Box> -where - V: IntoIterator, -{ - // Prioritize funding smaller stake accounts to maximize the number of accounts that will be - // funded with the available reserve stake. But validators with the priority flag jump the - // line, since they were missed previous epoch - let mut priority_stake = vec![]; - let mut min_stake = vec![]; - let mut baseline_stake = vec![]; - let mut bonus_stake = vec![]; - - for validator_stake in desired_validator_stake { - let stake_address = - validator_stake_address(authorized_staker.pubkey(), validator_stake.vote_address); - let transient_stake_address = validator_transient_stake_address( - authorized_staker.pubkey(), - validator_stake.vote_address, - ); - - let (active_balance, inactive_balance) = - get_active_and_inactive_stake(client, &stake_address)?; - let (transient_active_balance, transient_inactive_balance) = - get_active_and_inactive_stake(client, &transient_stake_address)?; - - let list = if validator_stake.priority { - &mut priority_stake - } else { - match validator_stake.stake_state { - ValidatorStakeState::None => &mut min_stake, - ValidatorStakeState::Baseline => &mut baseline_stake, - ValidatorStakeState::Bonus => &mut bonus_stake, - } - }; - list.push(( - active_balance + transient_active_balance, - inactive_balance + transient_inactive_balance, - stake_address, - transient_stake_address, - validator_stake, - )); - } - - // Sort from lowest to highest balance - priority_stake.sort_by_key(|k| k.0); - min_stake.sort_by_key(|k| k.0); - baseline_stake.sort_by_key(|k| k.0); - bonus_stake.sort_by_key(|k| k.0); - - let mut deactivating_total = 0; - let mut activating_total = 0; - - let mut transactions = vec![]; - for ( - active_balance, - inactive_balance, - stake_address, - transient_stake_address, - ValidatorStake { - identity, - stake_state, - vote_address, - priority, - }, - ) in priority_stake - .into_iter() - .chain(min_stake) - .chain(baseline_stake) - .chain(bonus_stake) - { - let balance = active_balance + inactive_balance; - let desired_balance = match stake_state { - // there might be some additional inactive balance due to merges, - // so be sure to leave `MIN_STAKE_DELEGATION` + inactive balance - ValidatorStakeState::None => MIN_STAKE_DELEGATION + inactive_balance, - ValidatorStakeState::Baseline => baseline_stake_amount, - ValidatorStakeState::Bonus => bonus_stake_amount, - }; - let transient_stake_address_seed = validator_transient_stake_address_seed(vote_address); - - #[allow(clippy::comparison_chain)] - let op_msg = if balance > desired_balance { - let amount_to_remove = balance - desired_balance; - if amount_to_remove < MIN_STAKE_CHANGE_AMOUNT { - format!("not removing {} (amount too small)", Sol(amount_to_remove)) - } else { - deactivating_total += amount_to_remove; - - let mut instructions: Vec = vec![]; - - // Testnet now requires that stake accounts have a rent-exempt minimum - if env::var("ADD_RENT_EXEMPT_MINIMUM").is_ok() { - instructions.push(system_instruction::transfer( - &authorized_staker.pubkey(), - &transient_stake_address, - DELEGATION_RENT, - )); - } - - instructions.append(&mut stake_instruction::split_with_seed( - &stake_address, - &authorized_staker.pubkey(), - amount_to_remove, - &transient_stake_address, - &authorized_staker.pubkey(), - &transient_stake_address_seed, - )); - - instructions.push(stake_instruction::deactivate_stake( - &transient_stake_address, - &authorized_staker.pubkey(), - )); - - transactions.push(Transaction::new_with_payer( - &instructions, - Some(&authorized_staker.pubkey()), - )); - format!("removing {}", Sol(amount_to_remove)) - } - } else if balance < desired_balance { - let mut amount_to_add = desired_balance - balance; - - activating_total += amount_to_add; - - if amount_to_add < MIN_STAKE_CHANGE_AMOUNT { - format!("not adding {} (amount too small)", Sol(amount_to_add)) - } else { - if amount_to_add > reserve_stake_balance { - trace!( - "note: amount_to_add > reserve_stake_balance: {} > {}", - amount_to_add, - reserve_stake_balance - ); - amount_to_add = reserve_stake_balance; - } - - if amount_to_add < MIN_STAKE_CHANGE_AMOUNT { - if priority { - warn!("Failed to fund a priority node"); - } - unfunded_validators.insert(identity); - "reserve depleted".to_string() - } else { - reserve_stake_balance -= amount_to_add; - - let mut instructions = stake_instruction::split_with_seed( - &reserve_stake_address, - &authorized_staker.pubkey(), - amount_to_add, - &transient_stake_address, - &authorized_staker.pubkey(), - &transient_stake_address_seed, - ); - instructions.push(stake_instruction::delegate_stake( - &transient_stake_address, - &authorized_staker.pubkey(), - &vote_address, - )); - - transactions.push(Transaction::new_with_payer( - &instructions, - Some(&authorized_staker.pubkey()), - )); - format!("adding {}", Sol(amount_to_add)) - } - } - } else { - "no change".to_string() - }; - - let action = format!( - "target stake amount: {}, current stake amount: {} - {}", - Sol(desired_balance), - Sol(balance), - op_msg, - ); - info!( - "{} ({:?},priority={}) | {}", - identity, stake_state, priority, action - ); - validator_stake_actions.insert(identity, action); - } - info!( - "Reserve stake available balance after updates: {}", - Sol(reserve_stake_balance) - ); - - let num_transaction_errors = match send_and_confirm_transactions_with_spinner( - client, - dry_run, - transactions, - authorized_staker, - ) { - Ok(errors) => errors.iter().filter(|err| err.is_some()).count(), - Err(e) => { - error!("Sending transactions failed: {:?}", e); - if ignore_stake_distribution_errors { - return Ok((activating_total, deactivating_total)); - } else { - return Err("Some transactions failed to land".into()); - } - } - }; - - if num_transaction_errors > 0 { - error!( - "{:?} transactions failed to execute due to errors.", - num_transaction_errors - ); - if ignore_stake_distribution_errors { - error!("Ignoring stake distribution errors"); - Ok((activating_total, deactivating_total)) - } else { - Err("One or more transactions failed to execute".into()) - } - } else { - Ok((activating_total, deactivating_total)) - } -} - -#[cfg(test)] -mod test { - use { - super::*, - crate::{ - rpc_client_utils::{new_tpu_client_with_retry, test::*}, - Config, - }, - solana_sdk::{ - clock::Epoch, - epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH}, - native_token::sol_to_lamports, - signature::{Keypair, Signer}, - }, - solana_validator::test_validator::*, - std::sync::Arc, - }; - - fn num_stake_accounts(rpc_client: &RpcClient, authorized_staker: &Keypair) -> usize { - get_all_stake_by_staker(rpc_client, authorized_staker.pubkey()) - .unwrap() - .0 - .len() - } - - fn validator_stake_balance( - rpc_client: &RpcClient, - authorized_staker: Pubkey, - validator: &ValidatorAddressPair, - ) -> u64 { - let stake_address = validator_stake_address(authorized_staker, validator.vote_address); - rpc_client.get_balance(&stake_address).unwrap() - } - - fn uniform_stake_pool_apply( - stake_pool: &mut StakePool, - client: &MultiClient, - validators: &[ValidatorAddressPair], - stake_state: ValidatorStakeState, - expected_validator_stake_balance: u64, - expected_reserve_stake_balance: u64, - ) { - let desired_validator_stake = validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state, - priority: false, - }) - .collect::>(); - - stake_pool - .apply(client, false, &desired_validator_stake, None) - .unwrap(); - - assert_eq!( - num_stake_accounts(client, &stake_pool.authorized_staker), - 1 + 2 * validators.len() - ); - let _epoch = wait_for_next_epoch(client).unwrap(); - stake_pool - .apply(client, false, &desired_validator_stake, None) - .unwrap(); - - assert_eq!( - num_stake_accounts(client, &stake_pool.authorized_staker), - 1 + validators.len() - ); - assert_eq!( - client - .get_balance(&stake_pool.reserve_stake_address) - .unwrap(), - expected_reserve_stake_balance - ); - for validator in validators { - assert_eq!( - validator_stake_balance(client, stake_pool.authorized_staker.pubkey(), validator,), - expected_validator_stake_balance - ); - } - } - - #[test] - fn this_test_is_too_big_and_slow() { - solana_logger::setup_with_default("solana_stake_o_matic=info"); - - let mut test_validator_genesis = TestValidatorGenesis::default(); - test_validator_genesis.epoch_schedule(EpochSchedule::custom( - MINIMUM_SLOTS_PER_EPOCH, - MINIMUM_SLOTS_PER_EPOCH, - /* enable_warmup_epochs = */ false, - )); - let (test_validator, authorized_staker) = test_validator_genesis.start(); - - let config = Config::default_for_test(); - let websocket_url = test_validator.rpc_pubsub_url(); - let rpc_client = test_validator.get_rpc_client(); - let rpc_client = Arc::new(rpc_client); - let tpu_client = new_tpu_client_with_retry(&rpc_client, &websocket_url).unwrap(); - let client = MultiClient::new(rpc_client, tpu_client, &config); - - let authorized_staker_address = authorized_staker.pubkey(); - - let assert_validator_stake_activation = - |vap: &ValidatorAddressPair, epoch: Epoch, state: StakeActivationState| { - let stake_address = - validator_stake_address(authorized_staker_address, vap.vote_address); - assert_eq!( - client - .get_stake_activation(stake_address, Some(epoch)) - .unwrap() - .state, - state, - ); - }; - - // =========================================================== - info!("Create three validators, the reserve stake account, and a stake pool"); - let validators = create_validators(&client, &authorized_staker, 3).unwrap(); - - let baseline_stake_amount = sol_to_lamports(10.); - let min_reserve_stake_balance = MIN_STAKE_ACCOUNT_BALANCE; - let total_stake_amount = - (baseline_stake_amount + sol_to_lamports(100.)) * validators.len() as u64; - let total_stake_amount_plus_min = total_stake_amount + min_reserve_stake_balance; - - let reserve_stake_address = create_stake_account( - &client, - &authorized_staker, - &authorized_staker.pubkey(), - total_stake_amount_plus_min, - ) - .unwrap() - .pubkey(); - - let assert_reserve_account_only = || { - assert_eq!( - client.get_balance(&reserve_stake_address).unwrap(), - total_stake_amount_plus_min - ); - { - assert_eq!( - get_available_reserve_stake_balance( - &client, - reserve_stake_address, - min_reserve_stake_balance, - ) - .unwrap(), - total_stake_amount - ); - - let (all_stake, all_stake_total_amount) = - get_all_stake_by_staker(&client, authorized_staker_address).unwrap(); - assert_eq!(all_stake_total_amount, total_stake_amount_plus_min); - assert_eq!(all_stake.len(), 1); - assert!(all_stake.contains(&reserve_stake_address)); - } - }; - assert_reserve_account_only(); - - let mut stake_pool = new( - &client, - authorized_staker, - baseline_stake_amount, - reserve_stake_address, - min_reserve_stake_balance, - false, - ) - .unwrap(); - - // =========================================================== - info!("Start with no stake in the validators"); - let epoch = client.get_epoch_info().unwrap().epoch; - stake_pool - .apply( - &client, - false, - &validators - .iter() - .map(|vap| ValidatorStake { - identity: vap.identity, - vote_address: vap.vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }) - .collect::>(), - None, - ) - .unwrap(); - - info!("min: wait for stake activation"); - assert_eq!( - client - .get_balance(&stake_pool.reserve_stake_address) - .unwrap(), - total_stake_amount_plus_min - MIN_STAKE_ACCOUNT_BALANCE * validators.len() as u64, - ); - - for validator in &validators { - assert_validator_stake_activation(validator, epoch, StakeActivationState::Activating); - assert_eq!( - validator_stake_balance(&client, stake_pool.authorized_staker.pubkey(), validator,), - MIN_STAKE_ACCOUNT_BALANCE - ); - } - assert_eq!( - num_stake_accounts(&client, &stake_pool.authorized_staker), - 1 + validators.len() - ); - let epoch = wait_for_next_epoch(&client).unwrap(); - for validator in &validators { - assert_validator_stake_activation(validator, epoch, StakeActivationState::Active); - } - - // =========================================================== - info!("All validators to baseline stake level"); - uniform_stake_pool_apply( - &mut stake_pool, - &client, - &validators, - ValidatorStakeState::Baseline, - baseline_stake_amount, - total_stake_amount_plus_min - baseline_stake_amount * validators.len() as u64, - ); - - // =========================================================== - info!("All the validators to bonus stake level"); - uniform_stake_pool_apply( - &mut stake_pool, - &client, - &validators, - ValidatorStakeState::Bonus, - total_stake_amount / validators.len() as u64, - MIN_STAKE_ACCOUNT_BALANCE, - ); - - // =========================================================== - info!("Different stake for each validator"); - let desired_validator_stake = vec![ - ValidatorStake { - identity: validators[0].identity, - vote_address: validators[0].vote_address, - stake_state: ValidatorStakeState::None, - priority: false, - }, - ValidatorStake { - identity: validators[1].identity, - vote_address: validators[1].vote_address, - stake_state: ValidatorStakeState::Baseline, - priority: false, - }, - ValidatorStake { - identity: validators[2].identity, - vote_address: validators[2].vote_address, - stake_state: ValidatorStakeState::Bonus, - priority: false, - }, - ]; - - stake_pool - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - let _epoch = wait_for_next_epoch(&client).unwrap(); - stake_pool - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - - // after the first epoch, validators 0 and 1 are at their target levels but validator 2 - // needs one more epoch for the additional bonus stake to arrive - for (validator, expected_sol_balance) in validators.iter().zip(&[ - // this one needs to maintain a bit more, since it has the extra rents - MIN_STAKE_ACCOUNT_BALANCE + DELEGATION_RENT * 2, - sol_to_lamports(10.), - sol_to_lamports(110.), - ]) { - assert_eq!( - // since two movements have been done, expect two extra stake - // rent-exemption amounts in the account - *expected_sol_balance, - validator_stake_balance(&client, stake_pool.authorized_staker.pubkey(), validator,), - "stake balance mismatch for validator {}, expected {}", - validator.identity, - expected_sol_balance - ); - } - - assert_eq!( - client - .get_balance(&stake_pool.reserve_stake_address) - .unwrap(), - MIN_STAKE_ACCOUNT_BALANCE, - ); - - let _epoch = wait_for_next_epoch(&client).unwrap(); - stake_pool - .apply(&client, false, &desired_validator_stake, None) - .unwrap(); - - assert_eq!( - client - .get_balance(&stake_pool.reserve_stake_address) - .unwrap(), - MIN_STAKE_ACCOUNT_BALANCE, - ); - - // after the second epoch, validator 2 is now has all the bonus stake - for (validator, expected_sol_balance) in validators.iter().zip(&[ - // this account needs to maintain the extra rent-exempt amounts - MIN_STAKE_ACCOUNT_BALANCE + DELEGATION_RENT * 2, - // no change here still - sol_to_lamports(10.), - // this account doesn't get the extra rent-exempt amounts - sol_to_lamports(320.) - MIN_STAKE_ACCOUNT_BALANCE - DELEGATION_RENT * 2, - ]) { - assert_eq!( - *expected_sol_balance, - validator_stake_balance(&client, stake_pool.authorized_staker.pubkey(), validator,), - "stake balance mismatch for validator {}", - validator.identity - ); - } - - // =========================================================== - info!("remove all validators"); - - // deactivate all validator stake - stake_pool.apply(&client, false, &[], None).unwrap(); - let _epoch = wait_for_next_epoch(&client).unwrap(); - // merge deactivated validator stake back into the reserve - stake_pool.apply(&client, false, &[], None).unwrap(); - // all stake has returned to the reserve account - assert_reserve_account_only(); - } -} diff --git a/bot/src/validator_list.rs b/bot/src/validator_list.rs deleted file mode 100644 index c6c5b5fc..00000000 --- a/bot/src/validator_list.rs +++ /dev/null @@ -1,8110 +0,0 @@ -// TODO: Remove this list once all testnet participants are registered on-chain... -solana_sdk::pubkeys!( - testnet_validators, - [ - "11NXtry7uHPwe9pCCkHsQRWHyskaJDYwcjMD97MVfiq", - "121cur1YFVPZSoKQGNyjNr9sZZRa3eX2bSuYjXHtKD6", - "121yNU6VfUUZNCBBs5rVQnTVU8wQZVEW39dCyhY4LhMS", - "1234P7bD4QwSd3Le1duiG4JfWqneB559jW3SAPwoyYf5", - "123vij84ecQEKUvQ7gYMKxKwKF6PbYSzCzzURYA4xULY", - "12AK78FkeVN94khN9RVZvJYz3o2Pk6iQWm76JSrBd811", - "12aZWvxp2wgi6JpWAPZyfqgj1YZh7appiREaDhSgQL1d", - "12EZWhixiUKXGUCrPQZQDvsZNHJvbduYwbxZ1cMu6t8N", - "12fRbRpjEyv2yJ3ZGWMoZNdQZ7EMREFc9aWnLKcBtVXP", - "12iuXtDTajSPgMjibFFyruVJU7ksHvoUqDxqMzLjEM8L", - "12M8ya9tBRLnsMW4r2DAto243u4WBPtSy6pxwzj84rqj", - "12mstuQ3goWuoVr1uvJWnaaLysfLvMeYU6pzKkiKepeY", - "12NG4Y7LGq8VQgtDZxn82ok4eGUEqmhzKh3wZtsakjLN", - "12nXMbN81P3kFqggFq9ekh2wnoyMu8Dm2MT2yeWKgUqj", - "12nYfagYszpD4ojfyJdV3WCBKZP8rg5PcU9SceLTrrkU", - "12QYHqRxPuTPfkBVLetEuGkLGHD9GhqM5coP67xK7wfG", - "12uDsSSWyPRGNK3HqcLBRNZiNFJWXCcHvHD7V4RYsKMr", - "12Y25eHzGPaK5R5DjQ1kgJWuVd7zrtQ7cmaMPfmacsJV", - "12YwQsSRxhd88SmSyTpx77zcp4jfRkTu2vPzpvLrusAi", - "132GXL3pzAjyEKoYLBS3QDTWDLqPnLJdZNcK4cWNDrmb", - "138GbDZP2YFcQiv59xk7w7km8GHN6sNm6vUbXfhQivqf", - "13FN7ZUtWtvjAGUYv3E7xd5rv2iDdAQsmG9eD3vVFp6T", - "13JnVur48UUzQLNuQ6cRmNejUAWmkCPbqJ74x77kK7yo", - "13LvK6Xi6dn7CgY2KR8sEppArKLP2cfTWLnzntspL5Ci", - "13mLjjALbXAHCYPTx1zAXJap1nKXigJQNGQn5cQbrRGc", - "13nbrL1VjkfTZuaz7rNriYw6fWDFggqEf2g1C4mPETkr", - "141haj6kDUshYfNTxbDYYUrsd6hYy2Pbeg4LEfVsJrtU", - "14fU9BTBGd1M26Zj8HH73t7tQBiMVd18euqh51CiNtpZ", - "14MwcVHCZAMRRQRKHi9uVhub9ZiRvNaeQRaxpbHwZVGt", - "14TrUKNXijUgGcByv7rnPEa3D4tDVaL9bzWLMPLhF2Vp", - "14Z57kkY62p2UZyqeQyoGsXfkKbguAF1G8g2kZdV7Vae", - "197RiJfrzAbucRbfgPRCxRftmNxwFiLHisnrPfNbayw", - "1B4UocjePKwr58Jw4sLBsBHFt9nXGWxi1QDv9g73mrs", - "1d8EfsfZ1yJGtdWYS3Lr6hZPLEcvdDhYnMXYCWaz697", - "1eUWB8t9bGzt8R6KRyJ2LRvbGSf4T5wyK5SXH64MLFd", - "1ihcaYPztZTuPuH2MjgwtjJFYc5f39AZS7EV1TWL7kV", - "1KXoPzQADSNxM8tQvqisQrA8TikDWJs68zYM2HK2Ubh", - "1LaSv1VE79ABHcHhVtXpfJVcwuCN2ZzEpT83aC597Xn", - "1pGYWJUK8MEZb3V4PLJ2ASgsJzzEWSkdz1sREDAMXKu", - "1pxLegZ72JhrVDDtG7r7ziwT9ZbXsZRs7B2j9HQ5m9c", - "1UFok26GBht5K9K4TDZz8vp8KnvV3HYXJsFq8mUcqvB", - "1uyhWD7UjgmpqF75UkaeX21KmJPymyNRAu6vBJ4meec", - "1x9xj9JP472QtsApW3EpZva1cLWmGrHkJV1S9XYC2Sf", - "1Yakyx2AmhmXiKgEoqp5efA2t4Q6nbHcg8E7he8WSPJ", - "21aPpjbfK35wcsMBHBXx1T8eSm7tVgGDYSJVd8aaNpuP", - "21Ew2QbeiXprspa96d76RgueZ6HvrQMDTFAHpa71hpoR", - "21PvK22abKDL9RaojhMNm4E8Uyy15ZTH8ukP1GGxTpiA", - "21QSsH8TGkcfZJb92fAvo9SvsspBdLZxnpNGbjxEhMxP", - "21vkGb3AZY7YxTcnGuxmysKyHZhDg8SSymAJy8s9a7au", - "21ZQ4ssshjLV1ggknQzg8QCFZAGCwkbSrXJooFLGUG3G", - "22dt17vtr97cWtqDysGBSUpbijXGaWD3ANpU8fabWF9d", - "22WPSeCzU7wKsWPWpvcx9uyrhoqFuEm7DxaLxkE51quc", - "22xE9TpuAT7s9PvRFbsM1x9mfhchjTUwRGALEphfkSvq", - "234u57PuEif5LkTBwS7rHzu1XF5VWg79ddLLDkYBh44Q", - "237SwSABoxJLxAHJXBFp9nSGGwPXbASJCDJhk4fsdfVH", - "238Fmy2TwU26Fo8XFRu2PzDWNbcn3bitywEPYG6tpztu", - "23DHpmZdX3WxxAGmwC3NzNBGtUYG174didZye2ZHbP6b", - "23DYY3Yk5hhvm4N8Avg6C8oVWYMmei1UuyW6jiTPduPa", - "23eke7qW4tibp13JfiHKLErVsdmLDTwVsqg52bVQwBCZ", - "23QU9fGehcVSWQ5BLRMS4YJx3ZJVALnWuWNxjxJksvzT", - "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er", - "23vHFSzVQAqbUQkTMaogVbPuyWM3RbKowC9jnEXQVFm6", - "23WHhd6kbKmLd2UBKmjDnCurUeCoLKLe5dzXsAZQusWH", - "24FtPCLkEiW4yTuC8Z1ptdn7MuhiqAShtbxLAWWvjvoA", - "24hPfUvw6cUd6WRKrVhkWiNSeX3as4iyA2V6iUiAnb6V", - "24myLwmAyETBE8hAu8KyzDf7Pg8xe92gTitFcdWXsoMJ", - "24nNT4ee6wUZeBPuW9mT6rUKQ18Yeqc2DVnN78dmZUxW", - "253jhzyDPZv1APqDGGkLmTePEdBg4g9UBUc7PYPqUodC", - "253raJ8dKPkbJH1fyEMxwv53UUfob7Y4FP2LVG4txTDd", - "25CbXrYSJn9BNmfKgm2fvcFfsoA7uKavr85HXmrZfHAM", - "25dDdmjZQLdgDDLr3eJtd4HQiC7hckP6HHHvY5kMTqRn", - "25fcEbNBzibkgNd8doscnC5w4CS1DJpdpKTVEXEmznUE", - "25gBCXqpnvk2agNZ1QL3b8Z2Z9k3ZKXjnmVT6jbe94Cv", - "25GPKSDYoVk7NtdojXm1ZrdaF1uaxw7NAP6nT1usQwwU", - "25JFYmzRS72CnMj4mgHyRz46cdUCx8WARJu6v93w1tmX", - "25NWPH67PpqbrskgSVypn8vyg1rvUJ7siqFNaz1harRj", - "25Puac5mt4rZSehB38BQZXy16bFEBVrPtVWqn7Y9AFLy", - "25UM59KCvciYwhjCq7t1rC8ZuvsxQBC2QRcaRNfq7xML", - "25XCmnqRVnifN7kqTppd4KSXvqBiQSrzN7XGZe6wHc8Z", - "25Z2jqV7R9tBLtoR9fKUPtE4tF5p7UqR8NQfY7kXqaJF", - "262e82dxxGg6d9wgeKwcqWxJENLQ3B8bLeRAGMtJk5fL", - "267j2296BvJAS2R2tdcUwFrYzbLWtkR2WEZf8ij4e6Mf", - "26bK3pnRE4mD14qfokmipzm8UmcEeStBEnAqDFaBR1Fc", - "26FU5PH3KfBLAXZJqgxoZtYfFVQfyrES6F93vrThoxqk", - "26zFxA81v7FgQKpy8VKW5CNYg1VrhgjEppNHHfCdcPtz", - "27CzWdgC8VAWerAa4H2kV9yCiGnJi1uEHVYmQMaKMvWg", - "27D48VFoHox4c9Xzgsc31hG4TvBPneG6DaNmdPjod2ZL", - "27L6peXZCaEjva1e4MNaFb6d16pCTFDWCCMZ9kz9cdfj", - "27LA3Z2DpwbrEckMq4Y2sDwoLew87jMXEHg4h1RKfd9z", - "27SB7d27xvtBJjgsAV8JBDjQroySmZepiNSepeRbRhe9", - "2848vZ7CHV76xdYHGx6WRNfdAErSDFaPoGKABRVude1N", - "28aB6dFf5TPKz3ghnYnu7nNaLsinoAE4xNyid1sy9j9e", - "28HojCrbm7cdEAdL8YjLs6jvLhpWbEVw6kaF2gygR7qA", - "28LgQ7MeEZVgNJfYRc6UnoAz2SnSjKbyCKM6sntCRotb", - "28pYZ1NVFAL5JTSd6fjnFGXQEGmpKgsPFpAg96a2cVz6", - "28QZrCsWP9f4c3p2waszEjeVFGcu4VGQNHaDtbS1q4V7", - "28v7L6sDHJeEno93ixmEYmV5E8cYjfV3gZPQdBJH4cG1", - "28xiqcMfjPQRwiroAMJH2KCA8zMNqav31YUqvw7fAVs9", - "28xU4vgf7o27nx1sXK6QT2MH8FUVbomwhfhKboD6smnU", - "295DP6WSsiJ3oLNPhZ3oSZUA6gwbGe7KDoHWRnRBZAHu", - "29HoR4JK9SGjxuLH5sgVFWmR8CiXgXDWgAvb28TY1k3S", - "29mA6zhspyms8m17FX8ztzz5UU9Fdqbumk1vxEGUkC7H", - "29tKySPToSiuAE9noaPFpnThn1Gxu13rc1pBqK1k3sdE", - "29tXWWzvGNvE5j8i6FLfHpmanPC9treZsCo1uA4ik1kL", - "29Xwdi4HpBr1u9EAqDz3tBbMuwqBuczLPuVe2gGkg7ZF", - "2A8SEJudxerVvEbX3aHHKQ9Vb5z8wh1edmg5EAD8tPVR", - "2ABzK62TWtKbz98j9EG5qF6UhrAy9Y8cj6hacBxrxnTD", - "2AGxPErmGvi376Dkr2hv1rhHx5ujDgRvchXQ77ZyrVDu", - "2anGa2owPRuQyHyEaWSbrrWws6NiyoakByaXEufuU3hH", - "2aQYmFwQho3ZJtrXVZKNQnFU5f3NHdeQAkA1c3XXZsSb", - "2AY3bKHAMkdj4cCn1UcWCjewrg3ccDnhVmvJ3WrmmkAL", - "2b8BuzUoiUGjPF95gBP4VS8JL2Lufio7wjpU3vBk9YA7", - "2bc8w7Mf3NzSjAwFtgG5kJAUNimNSNum2k3pecJJe4EB", - "2BjjySYSj6pMFwXHyVmUuaMYY6YBb3kSEPu3HhFnsmRF", - "2bn25a64ajqULsXENdDNwzWnT9FATjPQAB1W5Una3mGk", - "2bPxV5Q6Po8DQQfgzrWCC3UxzYLWxS1kGXeM93wgf46u", - "2bQyrSEPaQ9BMbu7Ftv7ye1fxtSLW3oZRj4d2U64AJmc", - "2BT25HZHpyzYmTbqyqzxBK7YjjH4a6aZ783TEgTTGYo5", - "2BT2vVLrK7nz3S64bQdcPBuQhMWWX3KRrtDuFFhxvjyj", - "2bvUqyatpaDLn9ch9BxNYRwg5SFpq3rDfWJKfohC9iD4", - "2BZTy1mS4hhYYwt4jdQvZ5LCxk5ou4M2prEEbxjHftTy", - "2C26iHJcU5dqJJQ6NME3Lq583RT1Js9QDtgfmzknRajc", - "2C4mypCfhzokWQiwtjdLTpHFUGyWaa8TA62ZzEsoda6v", - "2C5axgvcX6FTc9ssKqs5R93UufZUMyvzMECZJLQTavrh", - "2C9pDcbRQJxbUHivgDdg4LGuMwm5oeVCnHS9w5JktNTo", - "2CALB5Hmu8trgUCrEgVFmF3PTjMrwuLLUVAgW2kPWq7H", - "2Ceu5z672tACCDB6cmB3n4tih7B8dikv6k6kfYr3Li1e", - "2CGskjnksG9YwAFMJkPDwsKx1iRAXJSzfpAxyoWzGj6M", - "2cgXfdfA4EcJjouu5jxruaCMPyc5q3oe4qRMB14EGWyL", - "2CjEU72sCTy1D6GyvpAjtKVGz94jdz8geN2JNWJCzZ6q", - "2CJnVLz7tMWQDHHRkyXQpnaFF95i5FZsGU9NZcUdWJ2h", - "2cK8FbTDKTkYr81uJpe8ediHsR3eciB6w1aBkutvMG7T", - "2cpj9D74i7fnE8M3pRvBp4Jge4FgoiLjoEXubtTSBr4M", - "2CUvxpfrys8W99yzTcPtdkUUgGDvHgZQaTLTX8c9zM6e", - "2Cwjqk1msuVS7fQcoZZm9v3ufq9b5fNBBhnmr8Z3xj7D", - "2Cxe7vbBifdi8ze3C4vcJVbVCcyHKjYETegdJUjPT9t9", - "2cxgydEWqiVTookrgPWucNuQqmwThyoNAYPX3GqeDdvh", - "2CxyAsxqB6p7mmFGcc298hXcehoYnuQrDR2tmQAEUqt9", - "2d1gM9KJsV62F7N3WpVVfhWAfXznxaQjieJ2ypQAowre", - "2D1oCLRK6geGhV5RyZ52JD9Qzqt311AEH1XrTjZdzbRh", - "2d1t7pZUqZocejeymTzbFvVjnAsxBC1FDP7wr9ChFvsU", - "2d369Ajb27H1GKyddW98cz8d1dQC8ftcmf7f6o2V1tw7", - "2D4oSCqHqi7iaQUdm58rfaK5VDKHJHGb4g47tPbRaXco", - "2D8fm48W3UwMdCN8mop8j5vVzUauhCcQRaTcBdaK3uci", - "2DBfz2AV8Jfuy2Y3S3DEvp3hEhmv4QiwQqcpsRtqZH2M", - "2dg2NiZC1LyC5LbUsv3sJYU1LhAqkJrK23J6hssoLJAA", - "2DgztksCQnByhb8Gvoxjv9UTaLaSKW1qKF4uB6iEhAsi", - "2dh4YUnkkAuXzY4uRebzBK32sxFMCo7ttE3GEZcXCBSQ", - "2dLE9morids9y2jcoYVDnJ63Za8nTQt25xW1DUcbMMB1", - "2dm9YbgXtR5yimmgsLkfaMLcNZxhjywW4bLnvChms3tb", - "2DrQTBtZCCw8nXq1pJSX3fQEKqH5mE9y9fjEYDm2JHBY", - "2dV152cnXqmXL3QKCZXkmPkoikVSawbvqAXmnQTHZvsA", - "2DvsPbbKrBaJm7SbdVvRjZL1NGCU3MwciGCoCw42fTMu", - "2dxM31HCv1z7hWp1DwJfA6THtdpJSGYgV7t8LEbKS8ri", - "2dYoJ9T45W6N8bCaccesfJ3i2diazR7YkyeLMX4okKth", - "2e4jt7uasuNUqZBLza4ZfQCYZyYhdCL5jTSrwfidtXTv", - "2e9jsrdCmyAeJCJNmdD9u33f9kCgCFvzjwn58J2rNau6", - "2eA3YU5GVKRdFKREMMNmaLjptjvBLrQQZtuRDM8hZWde", - "2Ebt7yP857s1WfdoqNm9FsGeahCvjdXcqhvsVjzNgUfx", - "2eCFEjWKkhjJR7o5XPtU8yHHXaC9SHWacFUWBguT2i8R", - "2ECQwqiJGxR5R7pVvTFpEtp98S4WsZSKSWGhsLvcxzNi", - "2eDDjJSKdxf8qwojH1E2SoZFHqst56GXxtmAnoZtGdtu", - "2ee3nZyLcwpKzSJoDEaYWGMwwEn8K7zdeE8gPFXGEFnz", - "2ELPd9nWGEGsspVPkbsNGCha4tUG75P6BEJXoCtUZaq8", - "2eMBYWcGRwjJ6H5GUd4wEKTX6x47YzG2orcszZzvCoWL", - "2emY9bZFtSXr3ZWgr6vTFfN4QrsKjnndAgttVdv197MV", - "2eN9Y1DZv2ruXAeUBbJszEvhavQ2acK1ZxtrN8mbTuYz", - "2eNxPmJLhy66prbxwMBdTAg1nvygUu6uQLReGQtYdLxH", - "2eoKP1tzZkkXWexUY7XHLSNbo9DbuFGBssfhp8zCcdwH", - "2EpsjEf4MauhqmownqGxQf6xTP7mW4BHFypVfXYQwtHe", - "2EQekczAd7QmnWhmPpbhCCsWeFooqZmQqHNz8qo8S8RA", - "2eUcRVW9XGJoWb31qJYt8hyCfUjibqyBP6dpt6f8XRXo", - "2EwC3mv7mS78vbQ3J6qrc2De8ohwCDGzDFw5gvxRsuCa", - "2EywWN14MRg9oFnkdb39ZLiEd5oFFgpCwPeS4xpT82DZ", - "2F5vGa1L5f1kKKwfcQvWGQCkJ7aoAxDRg4mZmxq9Ti3i", - "2f6okF35sK3rCiHfdK2xN93zxF5KPy2RANHHYqjtjCuK", - "2F7vrQXRvatW5TEBBXpyjmkooEm4euShsTo32FYe5NtV", - "2FAWQZkT7sEsuQ2HfxFuZvChG3mxKsVZ3Mjt8KvDxnKs", - "2fbMYRHnbtuHGVXprpgDRDXCPe2uit7BhvfVmVzWAkKd", - "2fcQcTe4KzS6tSV4adnN58tD1oZLzNw6PobcXkU4YDeR", - "2fCrJDUrArXita8dQDruPjBLMXTWKuMdbQVnVRGZYUtb", - "2FCxeG7mBYy2kpYgvgTZLCYXnaqDc4hGwYunhzHmEUD1", - "2Fh84UfdVDzhskPPjJ3Xsw8Rq7LtRus2QvhUkSbkP68A", - "2fHLZa9PMGfDihayK3NPo3aqAFWZvKG69tKURFBjT7QT", - "2FqR8Dnou1qChnkqcAJWu3VtHps6GaHpGyx9MnUydeu7", - "2FsrP8697AXviNCFUSMsQ9gKYSm9sXK76dzpk5YgQQ8M", - "2FXhdQTDoUK2wvjGTbJxU3apXBHyYghLnRozC3RNFCok", - "2fXSK6KwRyovsHXKPWdgdsZPKafMnbJFTfiqNVzbYBXB", - "2fyUpwDj14qvDyxcWWrfZEGS4syfatNYmgTGkVkG2XUP", - "2g7QJnorKQRUmBRz8wcFKAMSNUuWbK7LJ3eQUA5eE9hq", - "2GAdxV8QafdRnkTwy9AuX8HvVcNME6JqK2yANaDunhXp", - "2GAtWPFNhEfj6nmXJp2YqPhSY55TvLeZpLRq9t3hqi1F", - "2giLzG2wKmHEXGqe1ApCW3SQTx6apxQoEUpZVkBYxTa7", - "2giwoLNgsFkdpcGATY7SRPVgAyb93Pp8NmBjWgh8TDvP", - "2GoM1rVqxDQugzUNnYk5kPJVutQquzkQ4nE7AeNoyHWb", - "2gtZRkQKmzDcLjbybKfoJJGcSadpi8azV4yb6zqJSdfz", - "2gV5onEfn8KmtZ3Lck39GrNEZyTxJ1RiNV5s7fRdC3gc", - "2gWFNFgHYPRPrcUfwZ2T9sosSHe9tjwnNkREJHUM694r", - "2GWnc8kZBaSNdW56awyiWasCqnpCYvkfb3QXHXymA1cL", - "2gx4am78NPRPxEW1CKg6yZ3viFob4bHnz6AUDSCMnmp4", - "2GXGzcQARwGWRwfdbo9xvFFYpX6w7XaDoMGYppw9vpL3", - "2gZH2NRREwNUjb9dnqW8jhmGwquktirgnuWhVUnZs7sE", - "2H6AvmuhZ2yWSN8K8CQTPcAfVaGM63cr3oUeVSw6pUhT", - "2hdRxw8WN9PbQEThXMzJrcapfj8LLZP2w57CnpRw9Pr1", - "2hEb28X4uckNX5qEVHy5sDqfUDXFWKbWGVe97TxUU9q8", - "2HfHSrWvJGq25JtHsfrGDoogiVizbAuuhvnVdxNd6Chn", - "2HgKCW5dRLSSQJZYd1Z5zLujLCkxecjeboEtjqgaVaGW", - "2HGwYwdiFe6Pc1fh1eWFxiWMDg4UgKWqBDxPsVGgaCam", - "2hJpiwrWXbpRaxFdQWnhYHR19bbWfUd5VqNk7hhjALCx", - "2i4SUAEpKoY6qwC9WP4FKcbCnyzHF2o2RouPWM1rUcy9", - "2i5Ms2WfHHWz4P9Bdn2x8ZtUQ3fUoR7GL8d6UjhZodCe", - "2i5S6zMJ4Gtcc7wTwLbXDc7TUZkzDJEyCB5wHa2ono1u", - "2i5vGJ4RQKFJM8vxbvFaCmPKLprMuKrhVcJZaYXoTmHg", - "2iAP1WMsKJVje22cgPJNGC7Jgv5DQj37QZwcDNUDd9F3", - "2ibbdJtxwzzzhK3zc7FR3cfea2ATHwCJ8ybcG7WzKtBd", - "2iBLV1VdH36XNHyaQZz256hkJRnhnS2D8kjo27EPfxqD", - "2iczkZceGZQqimksY8uk6NLrQXoMFZGK1mTWos4QnZ3a", - "2iHxz9QrE6DBkHTdDwe18NHEaij8t7Zq5fbB46hJKuYU", - "2iRXwFcQDUaGSy3c2coqMkebeVMLGSxqvafmoHYAifCa", - "2iwUdnDfwdEzJyBFwpKrRyi5VC7EdGeAi9EBUMgQo8kS", - "2j4DdDvQxfnbA7fnxLrwvUjqzFMbJ2164cf2VmL3P25N", - "2JaNvAP9qeTQamwXU3eSJgLGntHXqir6chN8dLo4H9MM", - "2JEy4Sw57xcvFasytaGcCWVSbZZsozb9MFJRvtXgzteP", - "2jfY9jsDpaZcgJf4nNCGoGeFQKfUgngAbxB5GN8Mh6Z9", - "2jhUNgjGziGn6mySNHKvW8CCU31k8m8vLcuSXqvzqqh4", - "2jQSNX3tGogUKCiDaQJWEt4Yx9ESwG9yLU5xFDXVh3PW", - "2jrM8c8ZhpX9CovseJ2sRsrU9yzsFrP7d3gCi5ESU5Rs", - "2JT1SRSm61vvHKErY2PCnHUtMsumoh69jrC7bojd9f1x", - "2jThjNqSzsjdWDZogGVWFv6cufPRqhAD8dqdC3ybc9e5", - "2jypS1SoX6MLEfuNvUH23K7UU3BsRu3vBphcd7BVkEpj", - "2jYzt9Ly7dNzNpMV9sbHBNuwMEvVdSi9L8yJCTJT21ki", - "2K2UhSoUNNi7Q78F5QCpcutRaifTjckGYKLpsw7i9noa", - "2K5DkJybHnSPZ8b4Qd9QaCtKu9xQnWryLKWGuG5sRS3A", - "2k7aC3SpPGsHAJ1FqAf5d1vRxMQKQZ3g8oqXDeGEVd1D", - "2kbV5zAnNKDZJqZdWQosKv3nTkCfu2qLXdV9YyEkqoek", - "2KcaW4eMy9tbUeYLyYadNdXigjqfLPUyXgXY91zEjw7o", - "2KchhctQGek5eEKWbmLNfPKkZn5Bu6oX7Fq5kJ1khUat", - "2KCo4n2nFpAAVec2NS46XHWpWRKcDLu6sR9fPSbCb3nS", - "2KdRE2mZDyo9AKJXB66xGW6BR3S1jk2ERTYxzwsY2kYq", - "2KFrkqEeSBKEHiMjUugPxTkBJ2jXepgFBqHu5ZFxtaFg", - "2kG3jy1EmFkUhn6qhE9gsXqMapCV35XRByEr8YFH8yS5", - "2kh3MeEyJzx54TKzSPYJLQKAw8m7BJ465Tq3SVcq5Fvp", - "2khFqurxeMKKfhFJ9dfas1L9LsHwt2qHGW8Ztinzoeob", - "2KNLEkkabVPqu482i8MZYNxQRStXLv5C2P5AFYtm3hLZ", - "2kVSrirw3MrVHu9yiPSHBEhVMiccX3T1RUBSJLmnHfJy", - "2kysii85ZdnY3e1AeqYVcMrCf2jWPhMAksiYqL9sssku", - "2L21HP9EQhDr9gBxfCT4zxq4RwKgTE15csrkESd8S872", - "2L7vqdp5yPXXCqfZKJZK7m5pv71apG5fN7GZ8CArchs4", - "2L9gkeuyrHCm8rRn7YzKBNJd6jmBxGZNX1Q9J3BhP3oZ", - "2LcavHUjihEYSAiHKmaGpnueZfY1t8kAZ7M9uSSpTpXw", - "2LD2wa5ZWA2ehQtidDAmQYHcTwzsRuqsCVkyvakDf6WK", - "2LhrXhHpzqq9rsVfrYnm2MpGTGqVchpwnS5CK69rPgeb", - "2Lkv8kz9x2QXGRsKK58t9wL2muVQqNRvbZUy6LANMktt", - "2LLDHcQPRMSefxnggngAMe5GuYakbfCqkvzh7pbbHJMp", - "2LsRRgttA1PKXXeKTZP2QhetgM94Dj5uecmTzyQkTvXK", - "2LXQj3z1D4Uv5nfLGjsMfCRCpBMWVRakE6F6VcmmmFn6", - "2m3iabRorHAWKk4jJQuas1pYxNnWtQp82ngRoyT97cjD", - "2m6u5GuThX4mjoJT5FYEokHpkvZPo53XXJvtU3JpWxAx", - "2m78N33kiEcUSboAF1CYmpjJRZZC5baUWvtSa1SqFFS9", - "2MauEKQWriPazKDnp2Gwj8TmFNZkVDxH98fsDVddA8z8", - "2meLESYKEvExPZqHXcPuUMoEFowrwCMamrqfy9kCMLQV", - "2mEvgikTj9SRL59MXogmYfyAR9ze51HV5dCgPUEj6V5t", - "2MH8dkqsk7GQfcDZzFo5orG2H7cyQnxFNf3WZo7WSuho", - "2miREFgpc7Ze69hJWdwZAi6NJpLUqaYMukrqAv9Ym5zJ", - "2mJT4M4Hmz1Vk94GPa5c8hjciKgxHD2pfyYEZxzR8ow5", - "2MKDS92VhMDnjYpuyYCupM9MfGFTcRQsAUvRmGd5eFvn", - "2MKNRRH59tZXPUas1UcozqZtAHmXJBzpvNHUGySQUaw4", - "2Mp77RQE2oqUs5qdZTs6UugFwFLZBnUHQbB8mQJber9R", - "2mYUbBkYdd7KXheQBJQhcLyKqNxZZ9vY6RrXFXPUXVYc", - "2MYV5GyazBVyXvfN6GQNoBD5BN58umuU9cmUjQqHp5MS", - "2N63qwU7mp8E2jawHGbYogja9VkGAA4CPZhMgU9pvwZQ", - "2n7YqT5DUFSj6AvA41EjE39W5vkEmAefctYDcc7VcaLp", - "2nFQwkPts1yQ6ANWK79NqqGQYUkVcqyfFPEVCsuhUnQt", - "2NJokha437mb1HHLwYguJBVT8kSv1cA8RPFbkYBbJRop", - "2NX9QwQ56DoCxLzMXDkcnv25nGkJx73iwZn3cz9Lr2Vq", - "2o43FJV8vb4GufiY8cbj9DX6Uz5bSRZeQutwpa4BxjHZ", - "2ofEZBxkiZoBpxXcXT68RTHfuQQFChSYVXVPGbFfvMTP", - "2oLehZkobfsSBuWW3rMZuGRhA5oiSFSuU4x9KncLrRxj", - "2oncBy7X5eQ34axfzRZKL7AnhjiJm6HyBFo7M5bYtxVF", - "2oSTsVSZ3nEvygMJXZ7nA7R8X8PXfM3saynxGjh41sDB", - "2oXdj9vHXw5EwEAEPbSb193GXzSXKFLQ8dDzUErQMNnw", - "2oy3GFexso9rmvBnxWMsmSZ39eGmRS2Pc2SYXtG6cNHN", - "2p3NwCUYK2bVcPszzC738PL8knrFgL73yuJ34fRxktyf", - "2P3YH9psWAAM6QQgA8NaQnKHQ973cKNqTSFFCNYE4gjk", - "2p4i1rEEaT2yyrsaR4JgTtZVLVa4DqCA6DzAcSAMLrYv", - "2p64GWwGEWtHdwjdeXCMHU5LBstm5BenLdGsJZzDrKHH", - "2p67maanC8EDhTSwEeuq7DtsvbQenuKtsyrsheP2VmwV", - "2p9LUwfAkPJA87oUZp6Cy5Eqo5G2rPsLST1DRW2FPUzR", - "2Pa7w7tqyKceVNC3y4Q18TLk1mJ5oCyVgdTyZUpFKsU7", - "2paQccike4Kh6TM51beLguwq9YxGarv6GX8yL2WCoDUx", - "2pbZxXe5HiwmWvkHtmN1UC9kyVNLKS9DpGo7iez54Zvt", - "2pc7t5a3DP53aUrbA97goea9nwYEeGSgHmKXz48Svq8n", - "2PDvmDx6HeKv3wtdwmGQGmz9pGXXDKNFVvGizGGaAqxL", - "2pe2y1mepRYxWF5deCit8xyjyZ7kB9BSjYuEHs5Bx6Jf", - "2pE8xCvokQ9yASS9os3pLSXRUSj4EhcXGPLcPyYzu9Ya", - "2Pf2zHGe8hPuRnHhSvJSHtNYF1mPwGuRvjyshEic1nwT", - "2PfcMBwwv2Nhq6tn2TdXVuNWrixaTp6mYvEsLrLYkMqL", - "2pg65Q6ZQAsn6HMKMk1mhu8fLz7i6JdttS6vSceuZCtC", - "2Pik6jn6yLQVi8jmwvZCibTygPWvhh3pXoGJrGT3eVGf", - "2PjMcTsdMGthXpEwz6bXKJjHbD1rdt7utpgc9FfNHF9w", - "2PN3Fbt7EDYpARwJBAFn59XVo9JopyaX1QdwbNY9e2yk", - "2Ppw2Uf7wZXRGNhW5AezrrGphR2y8mhs9qtKDyk1srfZ", - "2PSBMBFVykqSc4MFQ3krJVRosjmixSbNeNJfGMmL1DFp", - "2PvsR9DM2GZavFQGDsdJwXJvPWsyneyT9Gpu7wXGDkSr", - "2Pvzm7bGYjCpfjj8iyF724eesh12PejtKgxzv53ctgXk", - "2Q6PStqZCgB71Cd141mM3tBR6KQAF4cg9rYPYAimYjts", - "2q8YQuJZhoAZkQNaZgQiP58tvr5HE3sfQp5beG9BzerR", - "2Q9Cc2138riwf8brMCvu7pA2LuBWChPw3nuQ9As17Lpf", - "2qcfDTvKHzp2RM8ZsAqogZinajULNnDa5a7yQFd3FrPs", - "2QgfEB97AHfVxJrmMxhugGF2DTtTevrFnLWAetu3BQb4", - "2qH3Pxg9Bw6fsJ3MRgzytbtJJSdEUfA2MQnT2gZaoHLz", - "2QHDgmDUQSpYiEiE5J3SsSt1v1m8W2Hm4iTM2H1KwVvH", - "2QhiUo9mGrmEd55VpNLKkKffFBVxKJKgt9SAMcjR5zkk", - "2qjuqqxWQ55i4gANgf6b1dmGLGfXwxB9atov9EfxkvFG", - "2QkfUnXzPHuxogb9ymYL3bFgv2tkEAde4vFUqcJZTRsx", - "2qMY2a3xQAhi94m9r2uv7tUCSAXn9YZ6vSAkH5n9baKp", - "2qPG6fvujosVnMekpKw7buSdq6Pn5nssjiaz5XdjtzAg", - "2qRkFXBL3Ej7vzPCTnygaKVA8mNMPe66w762oHLYWrDH", - "2qRW64dzev83iAWcjndZ8woWoZggbhmyDR9u5YwS8cTQ", - "2QSrSCT2fD5jx8CJPB9m3GUguHK827ALmtLSR9deAfCj", - "2qT4mLJhguMBGNCzXu69rcrzBbDFXthoJbK3Zf6EPwUo", - "2quoRkD5pTmYsrR3nrtWDiWpftXUSsRjBjkikHbUZZBu", - "2qwrtSQaQ19tgJooJnyNFGxUpXzCCzQB9Zask68FEFqj", - "2qYB7wEBJ1UstVNZLbWyvTXNfocSsWEh7cFaTLkqsvfR", - "2R1k48j7SNGLnw5bjdNACGen3rHtMQ4xtQ8JeU2J6SLW", - "2R1vcvn5XL1PNGk4sAEx9dqiw4zSf4K4SAi345rZ2oZP", - "2RawHJ7zgk96yaSLmj3h4xoUeiT3M9sormAacH1uatwc", - "2rbT71kr7QJxowfVrLZcLgPC9od9bLSJnjYLn5AbDQJY", - "2RCF36vpkxf5nyUMJJdVMzXBMocuE8PWWFDTwFVV1oGX", - "2RciaV3Zs29P2Zpqy5Vi8NghoVqA1vPRqdqxzmpz6UAx", - "2rd3czf1553s1X18m5JpoyjdYTA4JNUHzXNiwrGaCT87", - "2rED2VTcBgrike1CcYGrH9Hic5HUBAwQUCqT79aWvsZP", - "2RFAccrL7wmp6EMSKnmuoczWwbA2DMMQk6gtsskEiQp2", - "2Rg63Jk9yykyeD6QFHVhosc23SSx6D8LaxMtKWW1vH2x", - "2rGquwgXuy6V6H6M18nrxt6MBGBeztqpbvGmZH6NTcDx", - "2RLf3RSy1ScBFL5UzVDw3jYKCAuGA9vHpr9dnbQzJt8V", - "2rNR3HA6BJrYeXYphKryAqXaHVHpAnGUfNpUW3Dw9e7p", - "2RNRyvqUJHLbkGR1wo43hMqXSANb5Mh1U5naSipbemSu", - "2rpd2nCeVs81grMez4P4jhYxWxpwv5mRMYyB9hvujBF8", - "2RpZdDc9ss5VsVUgHox2e6u6yV1SKUrQV6iuzvggdLKK", - "2RRQFKWH6eJCn5bsaTM9dnQF7GqALg3cBVexR6r79m9A", - "2RrWsvNNYLBEpALADdyLogz52s2Zs2zRE1ELrjmqGR6T", - "2rs4gQra5Qa4CGiAhTorg4XxAJQjFQzGsarJsj5NmXyx", - "2rsXVaKikXHsCuFyYEkoReVZEv4LZBoBBWG3wkNCSWK2", - "2Ru4prCUoi98X8n1uFUGE5tjCRaoqLTQmdE5hN9k2WQD", - "2rWG3emZeiE9oeBvVCRHs7XE9oZRwFNbnWRaX2GpnJqV", - "2rX8pD58nh9PUvuxmRHANA98w1DTn3fP6XGq384pB7WY", - "2ryEov5c84JLWwt5Ub1xGYWux1LF63j7kaNRc6jiv4As", - "2RYnM1C5XuzWzZu4sD7TyJTgxQTKzFVHG6jNtbK65q2y", - "2S3wbFNxAcmX2AuZzPVkunqJ5cGCgSLZiKZDgTUZNtaB", - "2sAvsH3WPrHJ79P2cbM1RBwuNea9aL8z1Q3u9buFw99g", - "2sBsdFT58SPfd5LQyE8MhEgJWpaoHUCoN4QFCVqNZpnj", - "2sBztucxz2TDN2NJxqrd8Ddb2MNNWKnF8x84eVs7YZhG", - "2Sd3GfDQHaPcSaza2vB2AqVhL48kS122y75iRKsRbhS1", - "2sEQYJKRbFtvxe9M6SRZ79v6tdeNXkbBdHKh7buLxxvq", - "2sg6swAGaUShFgSu2v9Ky4P2yE5D1HkXoQyj92c8wquG", - "2Si3XavrEefHQA7hBSbxfBMVQ7s45L2cU8wTaj6a5tZ6", - "2SK6YGvHZvNkj2rw3YkkMPv1uqsJvmqr411qQKo3rkB2", - "2SM2BLiZW9ehRh4xbeD9dwSkMa4fBC44ydGrP4dzQ1gR", - "2SmVajA1e79TJZQRdDaM4u4xadatWYJsdy5y7Qu8MjGP", - "2so7eKE2jXoUVSmCvmCY2ma8fnJqzeBX8fPh1FqL3S8F", - "2SuuLWdrmfCMJEwKzmQ9dguMC3Ux8mfqpHXdvqCR8s4Q", - "2SYT9UxnrvnaYSXWM5YrAuce8m2pm87uL1Ara2NLNqqM", - "2t4ED5vy44LXqRRPsesVdTUE4ScVGL3vamBUx1hi53dQ", - "2t7k1BK67zm5pBaaNeJDhKxsRHHShBKpoaaWcsorMxLC", - "2T9oHQHXe8rqqc58sbeRSXJGntxzbs3oCgDyDt2cofiB", - "2TcLzmdcpQqbNEBjU2Hxp1MiETSww1HJeWW84F61Z13k", - "2tcspXQLoU18XfDrhrjLvu9mhXX9sLMRT3hCe3MTVTsf", - "2TEGxhx2CgHw5fpkrvJWBsRKbJNAT3y6Fco4Lj5DsJjk", - "2TEHSQ7qHnLBpEv1sBVFBDq6uxEskiDNPwxGcZpHRER1", - "2tFxKv7U44Z7cznDVpiMZnxEVr9yHS9kVQfymyzpGfTy", - "2TGWTnUbjfZqvFYTgwUTdA3rXLHshRbeDgVMEMg7icZy", - "2tjfEp1WfgX6n85U9e17aBifn1vNyLNr7jmwPf7SAiSy", - "2TLi43MtLdz1FFYasMTF9unJYCFsoYjX5SRN6H9TZd7x", - "2Tni1o3he75JU6uh8uwssXTkCMChWJTQbPKdepKFW8Ws", - "2TozwMUuRfUx7HHZotc85TVrPeESkTnFBjgAMMadu8pz", - "2TPqv96SdJmTta1cyZBc9ZoYYN6uh4Ujigd3RsbQ4unE", - "2tStw7K6ApvwkgGzZxkLQ263UL76wpeNYgYadTvZe8Vc", - "2tvTYUajoBgeAd66Zhd5Nc2BgKGCgdmasR94fpBokzop", - "2TX2AwnUMv8LrtvwGtEQqjztdvzSp3R9wRep1z37Mr9U", - "2tZoLFgcbeW8Howq8QMRnExvuwHFUeEnx9ZhHq2qX77E", - "2u1rSh1SFbBbch2So7Lp3wzcq1g28oxdqhZvamco2G6T", - "2u5m47KqDPtUY32LLwjDAJEE18WLe4LWdA9icteNA5Rm", - "2U979p4ZgBJ8kYnYrZG5pexnqmXnJVTtACBt85m9iber", - "2ubeA8BvSazcxfBt3YhZtXt6Asc18dKjBy1no6uacTPA", - "2UCNzcnSVGtkgzpm1guxR6hEDQ5A8gVDkwVTWfZ31bPg", - "2ufaW8aHxUYqzAZTUdCyhjrm7gJkRQEvB71m8kGwMtbH", - "2ugcVMRgGAbpAamHaLTmQgxDMxLCNVeNhNnJ9nU8hjkC", - "2UmMiDLdxPANWgpAeiYGjHMBgC7yE5YHEg9W7P2JQHSN", - "2uNgKySwxidvcyZcdfUpTa5kNvBKg5S2zGjGAkeCw2Nu", - "2uPXQkLvWaS7fGQ6bt22x8aHq53nbyeyPeJ4DZQgJMXT", - "2UQj54TPkbjReTgxdf9zfnZkHGXqeWri8B7W55QKuTJf", - "2UR55dMrZ2CYcnJV8wot2QDaQAwqgvT6FZPivVyRJxWQ", - "2URaCX9G2dKKrtwygpZemfTpDivpSNT31T25vX4YGR4R", - "2USuCtSJEzwUTHeggEVnW1jokpaMwJZN5Lw17sndV87V", - "2UtuAtNcwsX5xGqejZaHr7J4RzLu81Vdn8z5U4tJF24x", - "2UudiATbss2JCN3KCv3qDtQotsZLnvQN7v8x45ayUswv", - "2Uv6KbG9Smt8PVMiPVGcRzt2GMvUvnvydSsgVRUZZZdS", - "2uvqsGWrpdnZAy184LTmYTzymiDRy1Xc6vGaLoVRQM9G", - "2UwJYs26Ek9Thk8FwhveXA1CspmQDs75wzRfHVPJpSNf", - "2UxTFHu8fHxPZYQdmP8jrNTmRBEzJamvW1MKmqanM8nG", - "2uyMGFNvMwC9tjjKXRZcGFSztnzxxkk2Gbkki1V46L76", - "2uzuT8dgVVLLgG57n5W9vxMTaNAaLavnt8gtiF7V1FVV", - "2v1wnHXJdbtrkrWuVjk2hqaimEuut9kzYfF2pohsGmjU", - "2V2epDULszgLmSaecioVKW2yq4MHZyBiHGHWkbyjeQB9", - "2V82d3TbBg4e69A5YGQoAq4ZEUozwWVtzzHq2UtuKUCC", - "2VctW83VANoE94bcqHXq3Ur1gQ8PWWZLHcv58TpjfK5w", - "2VEnBfmR1LW44oemZK29MtBHxTuprLizjPcLycNyGkTt", - "2vFkbp95paCRfy9QYbgx7dwgavLbt1id1jrPAxiBRb7e", - "2VL9dMnHPJG6sD9CuB1BkPCpB6S5EMnvXBECHHnKqz3z", - "2vmDBr2tGhn4jjPBL1LV8toQQdEo8Zz8rYT23cPeboM7", - "2vobGAfskQtdSCFHhrmMCK9PFojyGPhSxYtjDP8irkqE", - "2Vr5Wj42vRkvCRunoqCfTJCH58S6o64hr99sgypvyYag", - "2VTDo5zjzs48bpJXXiHWkeDFmDi9iJvBnq3mrSL9gD6z", - "2vwYqACqV25ZgvuWmj4aiPs3n8aNfa5FKfufnkWV9n1E", - "2VzCLy98rzmvKGo23e1eM4LANCt9JFrtVTBBMZzGT4FW", - "2wAbzXXERjCoRrgEH3sdYfgAaJArrrraXkDzEnDPsuMi", - "2WAy97tjGHZeB6B3NaXi6Afhv7jq4ZgR2cwxHfkiArXk", - "2wCjJ7xai9Ar4YNDprMvdmWByQpjMpVb2CbiE5TLTRRD", - "2WErj8GFLxFF38BHEf5VrDzyUMPS3NWSJBR1Vyj7rfKX", - "2wG6RpjrBkY2J3t1VHTMxnh2WfKghsjew84M6gc6bBUZ", - "2whMR6QGBE2FqQw8oDMSDTPm2UeUp6bFeGdgpULEM8m6", - "2wkL8JHb7jCXKeJoYAnpgUyhJ5BvzCqi8s6KwgA1Miyy", - "2wQ3W5fnvpzcPPkcuRmEWYwwv5nP9pS2moiXkGigV47p", - "2wqeRoCVwNoDqjXuZJ5iDnP5NR5HsqfU3Jf3DR5oPYMt", - "2WVk9dbD7ptv3tSV86vQ6dxvYfzrtey9GQS9yxhSDqXY", - "2WWEA6pa5t5Yt7Huynz2i1JH3qm43caCvyeTZxh84Ynv", - "2X2APoUmQcbyVfVNCmivzYRkydxZkfVdXXaSCHQTa8mC", - "2X5JSTLN9m2wm3ejCxfWRNMieuC2VMtaMWSoqLPbC4Pq", - "2XaeB7gfHpZ8bsEU2GexTWGjSFjgSYdK7GWWhXJLqXhk", - "2XAHomUvH3LFjYSxzSfcbwS73JgynpQHfapMNMJ8isL9", - "2xBQB7SGEdB3z4kHPgB7DtVTtpjGmbhfQkx7mqjP1pBz", - "2xFjhfxTKGVvGDXLwroqGiKNEF3KCSFaCRVLHfpsiPgd", - "2xftdcV2kwMpuSGfEwexDCJQQAwW6eEQVWoFQMpQQMGb", - "2XMikKNCXTgKjacDRStMfsgJBjnEzt884oyd2AtxB9M2", - "2xoWe7LGX8Kmnwoc27VF2iYkxfKESjb3b9rU1iM9wHJT", - "2XP9MfzWQnX3DiAJQFSKXKyqBr4M7GKhHnKc9P7z519H", - "2xQ9VEZsFDomPnrCdudqSgDeh7peRSyPXuYHizyJH5ZL", - "2XrigFudfhjDKdgHsmKSs6RGdJrvtAyugLbAChvP4p9j", - "2xrMSYcpBsb8qpz4NJiAepjBijUGBdppSMK7NHAkfkLw", - "2xVuKe1i4NxiSk1bfhf7xnJX3Pv6ZqQrP4i25jC2QYEZ", - "2Xzh8by46XhAwMJrReEgLQVtooibhW7jq9CCBQTZ9Lzy", - "2y3v2inX69FsCedP1NhrNLMzTfyuonCMhi4HgoM2Wev2", - "2Y6N9mtzX4rUWTYiSKhdSujT9dgV1f5WcHn3KnqRU7Xm", - "2y857Ss2GgyL9WooNqt6sAgxDVwr9pE6i4BiJ2wrC4g3", - "2ybx2uK93pMSb9DsuEydtPm8EF1BS6M8BXSkNwP7e6Ev", - "2yDwZer11v2TTj86WeHzRDpE4HJVbyJ3fJ8H4AkUtWTc", - "2YeoCYp1KT5W6S8MEVbu1omSrHVtZPEVcpFFKRdXwfAK", - "2YgmXjy9zjGLvE4mg1veNZF9VwmV7QyzedbS4uv2Z98X", - "2YgttBBx9Ax6WhF9xu8CSWw5usKFWxaxzJtg8zPajadx", - "2YhQPcbz1NYuu1B7Kpxi2NGrpZ8Jdv9azw8Jf6E9FC71", - "2yja4UkcCJAGPxpEhbMWdMf7G4Dfb5DyCkqET8eGhaHy", - "2YLPihCDxqztR5be69jhoNDPMxV6KeTJ2X2LtVBXDgp4", - "2yLVWajWK99EZyxMquyJfnMTdUyNG62nfVipVY27ELun", - "2ymS3KwHSVQtyQ7dMNY9TDe6DS9vj9ZLhcpgtiYJcEXr", - "2Ype4HKdyceW56Tc79rDaSyZ9hKYy5W8FC6bp2EFyuun", - "2YpoL8mA6hsaa24itBQSfmteby3JzkWHG3oG6gCXjSqT", - "2yrWZcbRsEm3zVA1MRDJeaH1jTm6HHWxbAryPqzqE688", - "2YtaVYd8fZHXpPezG5gRp9nudXGBEPcqFtJe8ikN1DZ7", - "2yue5fWVBoHACbiab4tMFKxLpJZ4NLesQ4KJ819m4xcz", - "2YV6RKMVa8LDNeW7UJZ9MeL7GrmHzhDbdFcQcQnsmP6D", - "2YXi22Dwgm1pQeyGcXvL26Wv9rcBHiGuh5XhjGwCkmCE", - "2yYZjzdjhhGCgJAMDvDbGn4hXM6fz9RGFQx77ah6FQZu", - "2Z1R6ZX9uYJGJTyGeKR2Nh4TnM5KqigTXNXg7rfVMSUS", - "2Z6hoaXhRKn33xS2RJGWbbYaQeqndPMtFhsdLQhifDfx", - "2z8xBDYxMhstCQ34ZEALnWZQGtoshdGpmyrPhVWwMExA", - "2ZAbrjtpiBxM6TYmoPWGvkLgcbjzQ7WZq9i5gPQZibTy", - "2zCqzAodmre9S7sXpqZR1iazwMUMqUhGJUMy4KJKbLRU", - "2ZeChc7Res7fUVdcGCDTJfRd9N8R21hiBPLAuJsqHHwh", - "2ZETk6Sy3wdrbTRRCFa6u1gzNjg59B5yFJwjiACC6Evc", - "2zF9q2xyKpsu9CSGJDj81j3N9ryvrhPRcjCkzafCezsg", - "2zHkPFBSxWF4Bc6P7XHaZMJLfBqtSgfDCBqTZ7STXE1a", - "2ZhvZtRa88fUiSuh4k3AA7kJYVz4cNxmuFcjtGiEDgWG", - "2ZNssUa26FZd32bbL6L51nwcbEFbgBYQbiPMEFnxrLt9", - "2znWADab1CgsaKVx7xCK1JAvZie27anPKP5rsfeMjqp1", - "2ZqaTLm1TZfpYdR7d8XhRntPjmrF6q69YZVLb6j4GcWz", - "2zQSe8o4xws8q3tMFU5AoPxMzu1JZoufR3tsZ1zknHiK", - "2ZuLSKq6t5nqRLp3GqtRSttu7FE9if2nrMegHLnp5skK", - "2zupPzv8JHunb7sMx7gohMhtpNjePexUSRQnJ5KGn21A", - "2ZW14eV8kC6XrWtVNBsDqWmvZef3qzPUXjGGLzMGsCMn", - "2zWe5eVp3oXvvBN4mSX2id2nn119Svv9eEmHcLTbSyjy", - "2ZZkgKcBfp4tW8qCLj2yjxRYh9CuvEVJWb6e2KKS91Mj", - "315fFpsS151jcF2fVG6EoVwyWRypjzPgSQrdnU4MQ1mm", - "31638ZtNB6hM9K4GX8Q4ZimX5gyRJsHB1TE3dzt82jqC", - "317bD579dNbgqFv8H7Ef5hQkt3kZyBAETdhQfCPdhHQL", - "318DDhLYZSWRhC7Efj4injJETsX4TeoZ5bgCJYBtnkQo", - "31cud34DHkL5zM4ZiHXgsrkAu13Jeck7ahvkPU9i4Jze", - "31keonuHdru9BPWkhzaM2aM1W58dArR3Ky2t8Zayy3hn", - "31nsZ7zfPjs1JJhbCxRFAk2eCk28ri7p5cQ2mackLYSB", - "31qccisBAWbVrRqzkeckTU9GzEeUtNhdX82hKRF37GYA", - "31qq72goV67noPcSf2taGoMYSL2DiJ1YgdoTRTjZsdNk", - "31qqZ27YGeHo77LYfvqqsxq9xJxgPEC4eom9D59hr8kj", - "31s74SWrQjy7XwwVedSCNjCBPeRMvfj2jWsE3J2hshCN", - "31TDmbMQUVYWsA4R4UB86UCaztxXDN4T6DDpXT3cCQoX", - "31txa5e6jpPx2KoAukoCtTKo1uxG7fWDwiDPW5d1DbsV", - "3244nWWMCzGy3LawbnDZZ1HNM8Y4NJTV3VkLsr4T6A3X", - "326V1rTP6NCiMi4sgRA8xRD2N7MLBM6o8NuJx9KPAKbd", - "327CEyP4zsr4NxaqFe5RZQQ6LoQcvADyePn8PxUMSkx9", - "32977MQZrxHkLkKYPR6t8X2CtY2H8bPsJKn1JAuFzywE", - "32EzG4oCYk9Fd885YCnR2zM1JvXXUfzvktfLR97Zbbqs", - "32JnkdgMiMLawbZ9EC2DDvs19AegiL3aqDWoL75U1Y7P", - "32rMFRdXXiGTjRPDJAwe5pafTGbm5kAiCr1GV92yKLM8", - "339VFxUb5ESpc4jubPwiDgXTqtHeoVcL78GW27aZMHmN", - "33FtaV5DrLUPYYQK7QAiD3LBDXD2VoCv6BuCQVoRdq57", - "33g4axWCptVzv5sdmRBaXtorkYtrk834YFvoB7izxFp2", - "33kmrfcRXVtWZxmVJ1GTsPNKpBXWTj1tv65wTVTiifyw", - "33LfdA2yKS6m7E8pSanrKTKYMhpYHEGaSWtNNB5s7xnm", - "33npJDEcEcnv9vUqMmNHuXtsT3b4fDZqcwuC6993J95C", - "33RD5LLnfpFSsYebk1aZ8MFMCA5w92oAcEfDVxhVnjLZ", - "33U9uzqBxN2MSDLr5y8jVbfVRhB47xHdWmyLEL87QLwX", - "33vUAmMNz9Dj8zxRTLJ1juipTkMEZHBhcJDkPXP5HUNv", - "33wCBtd9a7cVJeGqVYSzrpwiqBDUyxiBATrjEhingd55", - "33WStcUFh8kboGRCW2ZiFhhNi9AcSTzeasNsUV1Wqgut", - "3451aYdWi5QpAQU494RwrtVodWZSU1yfLNHL4Tn53W47", - "348crS45nzpBWqxxJvUNjQdUwEngMgPZe7qW3K9uKN4a", - "349TBCpXo3QQ5sMSNFtHvjeoWLFnJQRcfWT71M5Tjuex", - "34D4nS1eywoA1wiwcgrBP8Ewj9NXyaZ3dP9DJKfkvpGn", - "34LCAey55xhLw4o7jPDAyHBXG76BjK3btrS6maG6W8R6", - "34LYHVXsbLWwbxKjAvkcRRTgDKWQiv26jWKdtTYFprEK", - "34UPRVzUHasc8xgrQjFrN1DtV5AqtowGEYUPwQcoRfHe", - "34vBEa4Q6ZJ7mrdJZ5HEfBA4kf3iPHvJah4UxyteTod9", - "351BoZZndbBbj4VeVKoHXRVgXitau8ZjybW9c1GYaUj2", - "355RqCfzEoA92U5ntxuuS3X6jVqjcPti8eu2YA36EVr6", - "35A7K7f9Nk3YJLLoPvqxLW5ngRvX8fRBJSHhmowWmaSu", - "35FdizoSUbjCybXeogAZWoXKbnCzvWFx9pgMLohUCRh8", - "35JSchpXQVtZH6GLbXgoRoAqZqEhDuRPHeKqspYGXRPV", - "35KWYi1kw8LE3fo2e1ji7Hi3exEhqAVR6AeJb7RZQ4GS", - "366WTmLwXNUsTAokRPDB8Nb1dG4PJ5aZH4D68MqRz7KL", - "368KipD4nBzVs4AizHj1iU4TErSSqmZaNGVyzHx8TVXM", - "368NSfeGs7RN27fVqRchbVGqDbTf7jzUM6DiMT1SE133", - "369rutqQ7y2xnCgopcRAz72Y4YZrys6cSV6GfsSikjph", - "36DXTa3iDVtArsppA9NFFgBjbpYzi3kDWDyALrkh6A9w", - "36fCwUMjqncZZevHxnGsZRXn3qHshGzjjm9Y7crY4QjT", - "36gARMU4V3D6hu5EJi7wYFW6cC1tNym9DkjZfAGFQTbk", - "36GQk6L2UmRhy7T3Vjb75HySi7226SK4eHn9WpycmZst", - "36GzimUeoiBaapYaC1yriTJ9moQK1QvJfexppcZv3PaN", - "36K9T3eYGMta8AgQJjQjrZPhRcucuyuPwCgRQ6aenwJM", - "36oGRmYf83jBuHAQX25vhCsTQvaDyMZQHy4SNicTdXMn", - "36psJmtVcMBkdPSUbVah8hiTtnYJgEoHqXBGKQ9n15Az", - "36rRZGy5nLPAi6UmfcL3f7hJBS44JGkTGpKJQL1PyFht", - "36UkVHPN89MszKNYA7ywFQqyQ4FGKGkpWLZjiBZiDdLr", - "36UQ97bCKz5wEm2i3B6ghzi2JBTTpx2BzXSkku437GMo", - "36uWyLA9Yhy4w8zT5JusvcZ9cjK1iHjxR7ViocXzHdiw", - "36Z9urJrReiFeU9k7YrpBMaFkNwQfa5M94rsS9KVzn4s", - "376e8QLx9qSkjFn7mK2kp3wBwvziKuMqiB3iAbK5Payx", - "379zNVDHkBtBRN6bfhy5kSCxfUAwrvTNeNx44HAob3pY", - "37GbgqLNc7HvLyHEQcc4HwNB4dZP6fqdocWsJKbZSryc", - "37Gr1zVPr79E3AdPFj8EMyKZYt7Bnz3VWKjdFctQC8fL", - "37JiPSY8zxzeuhPo3D8h9WYJhTAjrtviTg6KMLypUXFL", - "37n11TJqVtX1jeew5VZaCkhBGwWenj1dDRVHLgNT9xFD", - "37PWrAzWfgn2yptyHBZQ4HDBJu1V4BvhiK4vs81MQzo4", - "37svrckxPVRo2wWqmxpRZjbyksnJNedyAmVKWXTpuHxz", - "383CX582368Zao48isK6qp33xBphCvhfgdEowfiXeG1k", - "387V2q2BPJRYXC9LEBCTmGokWbpAA8wiRFMQQCs2ynUW", - "389UtZkyvUzHzQUt2eSEzeTiC32GF5PwsBq4uNZz3cpY", - "38ePpvvjs3CX8Y78uGPDjgQwDQyVYHrc2aYxuvkqhf3c", - "38hgERMK335yrDsyPkc4wbW2FUiXgmuWRght9n7RVAtz", - "38zXVD94Hp71ftxT5JqeTYzTGECk1BmiSJVoXzbS7jsR", - "399CoQ6RtRcPpaaG7qMXJCLswes3R9HvEo5tuUQjV6uc", - "39Cm6GwjxpQaUhxKhcvArMSuTT7dpktqZLF1G2NdfUPc", - "39FH4cnkSawRtr9N2VbUVST4o6ZiixW2K4QCzLqW8tMg", - "39moskfERPLyaspZAZNsbrXgiUxWGGgyjPWu1ZaN2dJv", - "39P1iWvX4DGdebBwK5pkR2sD8njrmLMFR1cEjaA1F5Za", - "39vpWde1FCGhfUvq2d6NAhJg3EXNrYK3rmJpGMXRPe6K", - "39YNBWspNtWZ5cBjQmLHNsNoHGBfSFryT6XpvZUWzKAB", - "3A3YM5d5FRkcArf8tozqj7hxLFTi4Do1beAdJHfX9sgW", - "3acvr5GwZE2JxZSv4c7eohpjXTUL9LV4f68jZPvDKuyC", - "3adqz1JN9sbsjHGxQizz2ibJmyCHtUpP9aPnZYxixB4c", - "3agyfLdXhUW3YhHzdr2epBBBGpd3JUngu53bG8cWowTZ", - "3ahWKjkhF2zjYNabKPjburHHhuM1mLwxhJGPyhMG9juD", - "3ammkXFEj1n6UXfCeR6AcsPzWPv4N3798mDzyoUBxNYT", - "3aMPUXZytBZ5wcPdzhJMsHKA48dCrkR1nrHuvumiQZCC", - "3aN4DVNJFGcHsKHrueVNogCnYFcGQQXe979zXvBLxDhe", - "3ANJb42D3pkVtntgT6VtW2cD3icGVyoHi2NGwtXYHQAs", - "3ANPNyqkizAsboob5ynJDQKH7tXyzYt7RSv3FSuZ8Wkr", - "3aSjivWpfjcSyqLTf3fAuJfB2R1vkYxDsnNDmByaXQp9", - "3aU1LxNAUQNPbZUALX3xaLah28764iPg14NN7kzUte1n", - "3AwNjE1Lwc14wT5quCLWzhfukhPwjtwYwJmLP69BdzBA", - "3Ax8WYVrp7prVWixBzNcKzwQPXFZABnaupna1diZQfMK", - "3B1p7G7vN4hFbXC6PT4SCD9jHz1K7853UC315TZgCCEE", - "3bcAoEkLDKNuFg77wzCx2dbPNSgeZVF5AYHDet1rPyd8", - "3bcgtcTisTmaGqVfAJZeY5naoUheoQb6q6LQgs15J4oY", - "3BCokPfahX9rLYMh6E6uYTEFuchiKd9wZcXUvwDHFYiH", - "3bdNi33it9URAF924sN3xhP7zSRdYYVSunjXnDXeBwjf", - "3bE92k7mtKESjrJFY5EQKg5KUHQYncE4z3E5q9w71WV4", - "3bEnQj6QKqE8zLqq3mzbzQc74jTWViafmpGZR5ADXyM6", - "3BkNGdd52XHpZV9GwAX4qcMAkFEnwbaQ5TrAxVSJCw8c", - "3BL2p4qbHraAmqwkfFxn9QMF9mY1SMRkNuXmpL7sVpu1", - "3BMBjTH8n9fva4jZSGSMCixm1gh86YMzz56AozsArkSG", - "3bNykJQKhZx91RsXXn3mzxvzxLg7z5cRb6KXPPzZRw4H", - "3BPfgkxAsjgBdPNovRqYncf2KrvaCn1apXnjY6hksR3b", - "3bQ4s7ynWKjEPrkTfDx1aT2sXejXXYjbfYumBHc5LA83", - "3briRFoZB5dxmXZcEhKeD31EWkhmm59p3gwAAbzXPEGm", - "3buceBPN14NBf99ih4mFvM6wfeNUMgFmYpHt1tipVhJ9", - "3bVNS8awYarPkVfYKUsGVkT3AB1A4BiG7e8xHPfSyMsB", - "3bxfbyFSQmdXrcBqMrc94EnqCqAytgxiHsj3tmV16kPj", - "3c8pXEH2u9qrBGZvjHTnS2y2qNJWBPSHHWcjPSR3VVGG", - "3cDLTSne6vhw3LkZjQKbkDMyQ4nDwwVeyhAVFmSRJ5bA", - "3cDZHQmSH1u4d4oofVDakG5Fd1upEfHQNA3YZ8kxU4HQ", - "3ceXozYihzbGZRVZS3MgBEgUULMeq2RQnKtANYaRgJbb", - "3CGne5dLBnjJ1g29EixqKd6JHon9rxViv7z4t1JzdGnb", - "3cH1cVeEfUCkZGNw8mchZaoFL2UVUtNt6CuvtEJEF2sH", - "3chesQCCDxCnQecNQz5mMGuUxznYqAwYLTz9r6S7xPCx", - "3ChsT3K5Wmut5fC7kiYPF18x6QF2uDLBPhpZRzumPRNQ", - "3cibiSifCVBTqdgMCAaAZboGvL1ndrV2TG21t1rrsfxv", - "3cJeH1TCZcNf5gCZnSbfZne9DQCiexkzuH6gwQEeBjqA", - "3ckQZncmgmS1aZCC7Eot659hoBQ8k85ExddD7fu9qJ2c", - "3CKSDpRYmu1CFiRwXtTcP4u6pR1vXeB2HvoZxBRtwkbj", - "3CpzeaQT32VWJejyBgXooNRmi75n8QRNAD7SHwgv6Hrg", - "3cr7Gos3rzMR1TjvTvXRgXXPHVV5aZdYFKphvdTRsc4p", - "3CrL6cjkFi8fWxMQT9ACEdKcET3byQ4tKxMGAcsSXDEX", - "3Cs71fpRRtdHDZRNnda6FPXmNDWUFs9y1i75q8F9gP3R", - "3cSSak2ciYfei5STa8B5VGWD5MpSrubEpe6yHp46HDf7", - "3D5ubMYjXVGKpGrwZeaemWah7waSA8FautPdsea7n5GM", - "3D5W8dNvA52JRPvWn6FsiUCWVp3ZNVmZHcj2FoxzuAYW", - "3d8F4eCR9YwvXdmvVzLQ7hHLTBcHAaWpC7jQxcdoBHkk", - "3daw8n6Xg8a9N3XSS1KhHCYDn82erEviR9rRKQBcNeUo", - "3deEvB8MrLpSXmSc5gBP6rWiGftWPtLdfxVdpnfAoDF1", - "3DeoXyzWHzc1puYcNZ8khMRFAXwL7JKEbvkXuUWdNsea", - "3Df9iVRoSkX3YZ6GmMexeLSX8vyt8BADpHn571KfQSWa", - "3dfAnx6LxgYHenLh8fXXbLKZkd6jiAo5R44eXqibDyaA", - "3dFGZmTgBwsBfYqvJqKdwEQGa7HUdPsSbHmTkm4RjJef", - "3dfHt9mXEGMrxeiVGqcjXCVjPUak5Psr5Xpngjcnnhqw", - "3DiGQHBqBXEd3jZTVFQH1hzHUAUUGtZXzeGSzypNyvhe", - "3Dr2kJ9W97XEQeiX3gAocj92hz3PnEFdruUJJC8VYv1c", - "3dTkxwAidEBPYdtc3XjwKDS2q2nnzc6razXLQuHLjkh9", - "3dVEmuYaJxLdLNGnNxCuLtELp38VKMxJPY6gUJScu6Jc", - "3DvJzp5UBzuVaF892Y3ZfAXRSDqX4JNvtVoqbvzYhSq9", - "3Dxg1ReWz97k8wjXV79m8sdikRu5eKvRNVxWU9kUVtAL", - "3DYMXn1LtpPYChqUQFq27oMqnSidjcYzJQAt85jDUowr", - "3E5f7ERGr3eYpxL6oZVstiKFnyBFteUjBz2MPg3wF69M", - "3E7ihWq7iFztdB7dTymeVrhMsDNWcrkLm2Q4FaRDPAHQ", - "3Ec77ECtTyLg1PkyoJXjH3FrMv6Ut4Gt9hC4LkfTNA8H", - "3EEtAThkC3ppDTWGezTP3tCZejP7b4HztbJc87YGK3Zb", - "3ekztv7oubm1WwarxxVpPzcMeN6PeiWDetYgBYYjygVx", - "3eLGe4vyZoNK3FvY6C4oxQ3cJMzmUerdVaaTsfN14Ngf", - "3epAsfBHzH28LPbyVwfy4i4e8v47pwHSZ27kkjhDyKiR", - "3epgjTFmQhroGEUdV4FFetybmmdxY1jrqAt85CUGSdLi", - "3erfNXKZP8vmLoc5mXzdwhXa8UhjSigAiiL7CczdP2LU", - "3ERnTzCxzc8p7rcvKbhQTD7rbYZT79GnNX61anQuVu73", - "3eTL3MTHRUx6D7sL1zhC4TovJEemFtZpDaQaJuCZYQvM", - "3evPJ7JVUZycc7q4xG8nGm5VUMnmZnKVaQ1NiHUgmfpG", - "3eZFDizZdu3CbkDvRreujnMsAtw3MPDcxpMjrUiBctJ1", - "3ezMzaa4PVRNgo6hGBGqk3K6Gr9aWJvEaczrukFTNddK", - "3ezU7qjft4mKweRKyrhspcsPMzyupfz3hVztT1GMSJh9", - "3F6wMGB5C5fB7xtTMmJ8NAfkwmWSaQgxPsBUBgveZvrQ", - "3faa6HrgNga8y3W6txfggCArAVkPobgx1vHu9MtvkUex", - "3FDRLuYj1dHoxiVQNbj8Dk16gGv4gmB1fmdVmu66WqPw", - "3fEciCDu3FT8uPaWiaATn6ezDrgEsHS3dKb79fHY7DdP", - "3Ff7iwTfcSp5r7qgUKWnPEdmJ89HB66mUTqwRF44EnVY", - "3FhfNWGiqDsy4xAXiS74WUb5GLfK7FVnn6kxt3CYLgvr", - "3Fiu2KFBf3BoT9REvsFbpb7L1vTSs7jnmuDrk4vZ9DNE", - "3fj36AXfhhYDrRcyBQGzWdz9nP88o8Zwa6nNX481ckfT", - "3FmtW5i6LcFc8RuKyCjHhUjzMu2DPzDR1rXKsYZ3LMbQ", - "3FPrVtocvZpXoPGyhrzoh4MiRMmK4CK4sW9LgxMqFxDR", - "3fPSY8VynfZBPErTJ2xjfYqKDTHNmekeAwVTbw44EtBR", - "3FSMZT6urWQ7XKD9LhtL5qow66kM49jJsvt3NCFLCe7y", - "3fUskVg7LeK7VGTWmMdK4qCcR5VAqVKS3Hu9qpctjSTM", - "3FvuzGchu9GLS1TMHukvTxDQ5CPb1epWLZfCX5RREDXF", - "3fX9cJtaswExFZUVmXEFjK9L4233GftaLe5SF7AHmCym", - "3G28QoWmsRYikwWaZ2LZSSk8UxZXxCQY2NBYcbTR4gNL", - "3g7c1Mufk7Bi8Kk4wKTGQ3eLwfHYqc7ySpP46fqEMsEC", - "3GbYj8WBiouHZPGmUeKCEGZ6T9dQGXZVnNFwxwn1M4hs", - "3GctwRAZHTAwxx78mU5unwtxSEiDNsF5MgoY1oXXHm6w", - "3gEaREHMBHTafrMHrFgibZeDq73GUeiiZt8U1KGwDVGE", - "3gmNSSQVewvEiBY9Vh4hmekPmtGTiKPvooBW7MSkUXPc", - "3gnRETF8Tnto3ZCh9yCw5sbqrq8zqgx32zH4y3dzEN7i", - "3gP9wT97jQVQha4LfCRQnjWx53v8CEeL1C1tH4oj7ACb", - "3GqnATSuyXESXtaRHKBknQ16qbrMwbtmg3A2s5q7gmBJ", - "3GtYizLVdJNTuyZDXaWDrPg8VEgxitPveTRBHctggNXv", - "3guoimiqJH6qfKNtcM3FnKH9qTdqHSpkkPbb2PWcApUd", - "3gZ1X5BH4C8Kr8xwR3DZPd52qGqpAw1kqaG4QdtsEVDr", - "3gz7QzD9nL2zXYrpVpBi1PBMF6SeggHwGWdPVzwxqi6c", - "3h2a5Y3Ne1esYRmGy98xDGAAP2KaPL4xbzmVf6frpadF", - "3H4HUsXCjysRdKHdbsyT7p8td3qjdXMSA7UpExu5ZnCt", - "3H4wmWCcoazCWeeYkaKMBXLoVmLqHpi8Lkg7jNVLQe1T", - "3H7BtRE7iGC9Kzxq5eb3Hx3hChNptepF1KRrEufKjNMD", - "3H9Y6fNxuMAMAgYxNDnD2JuFdh45nJ5p5cbSYH5auZzw", - "3hcdjAmggZJxjaRgMfxqhyCe3Uu2yshLRZPZ3mXAkst3", - "3hDPWDebZhaMdB7kTMKqS9Ly5rWTKyJVs3wHpHzBV1ij", - "3hFLW5AaD35MLk6Pzxyd3GWZRPgJgdXvSKyCGoSCeY6e", - "3hH4ARBZcpzLF1BgheBoiddjVDPJ6TMwEVMTERkMEMZA", - "3HitRjngqhAgVuNdFwtR1Lp5tQavbJri8MvKUq5Jpw1N", - "3HM7uGuE3AD9smYFL8uKinAHo4GGtX2PErn66FhGp5mc", - "3hN6XEJie2bnmgCaQEDdeK6qN8ZbanN6whJHrDAeUAEg", - "3hoCn6UMJbxoYY5nV3pbvkaGcTcQMZgmjNyg4NMUCppL", - "3hPHGAeSZ6EqKgMNDc3ngPSaK4Lzb2LBt6iWJkaH8AHh", - "3hsSstL6yNycobcuTXT746D1Rs8okryTPufuJBzYEkzv", - "3ht1z7tMieDiLkukray7AauF214xtsWFFG1E4A1oeAXU", - "3hv1jR4wxY1D25Rcfk5jP9pasZ7Cud3Ngqbk9pFMLPY8", - "3hvu36W7N5LB1T6GpxmJPPy3LLZ7RJd4F1r5ey9rMfES", - "3i7sS5McrJ7EzU8nbdA5rcXT9kNiSxLxhwyfuxbsDvBj", - "3i8XpbXHeXpiDHVnMp6JsMNX1ktNTWvbCV3spQvoQ6R5", - "3iduBgrdsy5YPKhpspnAQM3xtaQsKNHiw3RiDHpFNLGL", - "3ifX783RKRRkZ4TB5wU691PMCyDW7wCwUZcRNTxew7NF", - "3iPu9xQ3mCFmqME9ZajuZbFHjwagAxhgfTxnc4pWbEBC", - "3iR6N1SCp6Nh7qGWLMd4HXCU5GULkKdrwYNPVkt7q6KE", - "3ivsGunHMtJWkSAC6d4ntPp4eUMfXdTmg7FZoi59ZP3f", - "3J1AUKMQ5ZavobdzJ8yzRBcUpN9XzV3VfR5d1iVev3i9", - "3J96Y2nWD1sby3zhXeE7j177XxZTpAehNdgUTPML9Bsz", - "3J9HAX7WC29zWyKiFPNRBg8pGaxExdq6fRCwe41sShjp", - "3JcQQ8yqAKSEUATWfW2FZ9MtpQDURuEYqR6FeJ3bRCdJ", - "3jddze9ZFYxTfVkV7xr78TSSkLahj6Zf1G3TUrhnWQuw", - "3JeLfM9V7CkK1D8W8LFirU65AZsWRo127PumwNc3dFQi", - "3JfoYf6wmQxhpry1L61dnDWYJbL7GYi4yt7mybehuhne", - "3JHHpFMEU7D8LJmw4gbcvsBBpH5vwqNeVsMdpXmxQ9NY", - "3jkdxjQrbvEPhfwnbyWRdFQgistTvF5rCoTHwdpC49uo", - "3jKxNkMk2dSyGiSv5Sic6k7fgBqqKXAzDYgZC9V8brzi", - "3jN79k96dxtLt5YJTERFpe5BRD3odsr1zvK1begPZj1t", - "3joKoj7dyQsyipmbxcrmBp8w97XAcmMFDUSMe2bcKerX", - "3jprcdbXDxTtkuTVQamF1D4aU5NxDeAJPu6voSrum4iL", - "3jPRn2kBseA6CJdkTZY6u39LJDB5WaECLTmN1RBMaxry", - "3js25yzgUwUkk4b61NYSuw4SfMbmStoPXMy8ZUp3hkf7", - "3jvfB69LB3G8v3rJu3WkokMLQZQKLbpnLNF3a5d4PV7a", - "3JzwvYNBKBsqLNDk7cR6TCYZJF5SLHcsxp2hQ6UiHA7S", - "3k2aTEBX8dkEr6n7wJN2xxXrq1q1BQqqBnQWUoTrwCRf", - "3k41QVbXzTY4HeTVK4NN2qAkfuZtyyGemdnGaqkxsjJb", - "3K4gbqdDUtPk6CGzoAjbzZeUkWHCBytJKeLfGAefWkq1", - "3k4zwMaTXH88kT5uEHEAaHaBC8146nVAp78A26DKqjMy", - "3K8BYGTPD9AxqYQDPdU8PPy6AfiSwf4hDmFy1xXGB8Ns", - "3kavSXPxoUYQcXAYxNgVbrrmyVL2G7xqYrT1BCAe7wCW", - "3kbLg8Q6UJS7ogVZPNis67b1RhrUcMZdpbYMNfMCFYa9", - "3kcjg9J1d47mgZkGuqitHd7K6Bz7XBVMpZRB1Sg5dKdN", - "3KHzsyGQyFBh4Pn9VHDmku2NtvoPp9krHFvr6qyfndim", - "3kiAniQf6y9ZT3SdE8X7Rq5jM3MX6BUZy5KDT3wt6zAk", - "3kJ5wquZnR5gnRhYPJi9UXqYmYatMVKKxyrpppAnGA2M", - "3kJkuARDykRj6Df3xvxAJxgayCqfBN5u3D4jmbnxjnY6", - "3kJXRWHjqvpd2QHTh8NxPdCP93NwtL6oXt2QQoox5Yk5", - "3kkVsVzrxiJdYzrFuGwM4PvuHSmVtVFjzEMBKbgjMWvp", - "3kNsisGDWb3LCrbxPE81sunLSNCwAM6KN3Hx8HbEqrk7", - "3Ks4gZL6Qpy7oFc2UqBD8xVhsyRvxvugkYgi1aeps7Ay", - "3ktnsZLHjYECxgdArgSG3EYswGngAqwRJXg58ZGFotJL", - "3KVuW6mGLD9Kv1Gjj1A5q685JZLp9hqE29Kbvnrii8gM", - "3KwdHFx7yezYh857Wiyy9gzXfVsEjLQX5sQMXd55pSCL", - "3KwrCp6xMACGLXDisAUM3PgPoB6cv2ZW5TDaTBNbiQiY", - "3kWT2K2HfxrspLFoJhKUAio3QF85EuTemJKTUcPEjm7m", - "3kWuwjFx2dc8xrWy9w2Uf9zXqB9QgQTXyoruh9nf6tHJ", - "3KyCDLXRcT1vqQn6BDvbdGqJmZaNmVvJjjg7osUfrqZ9", - "3L2ujSoyw4rSr4car59JVMBmbiZYEW67kqaxwxHsDVCm", - "3L7sCCBDG3ZYEC2pyvQ2ZeZL5CvNd41W5rCKsyq3GrMG", - "3LGg8VmfLtZqSJKL8uBSYqkA5djV8WUBE1sJuog9FnP5", - "3Lhxu9KNFMWYF6QTpmCWY15Js3B97mHtu4CFggAaJr1N", - "3LmD6Z2FrSzKeVm5x56xevcyPPmMGMQeVVJgVsnSqtM6", - "3LsQLm1hy8Rcxw2neKgFqcJzyXNugJtRxXRpMvSvzWCU", - "3LtAt3iqmeTgJ3GD8DtCcjkRkJdDKAF42nJytn28syeP", - "3LTRg6E4thLjNCubu1NYMgZmPdZU9rsaxhgoj2Q8hf5r", - "3LWv8RrdEyMtePAMCmohBzWAz7fmN7Cf2ctSUxJKEQnS", - "3mBnUSgbW5W3jTPh5oUqDWNrSTYPcUfy6inUC5B8nvPW", - "3mDhRnsnQdmRyLKx61i3gy2PeNGM2zQxgofPFSDdDLZo", - "3MdUXXiLWeXQauVSiuGwPjakCv8J5CX5v1fu8eutJ7v1", - "3MgHGC5jDaLVzw1UJvUJvuELBFXc2bJE8FDf4kYWHmiD", - "3mh6CtCpTDXSkJBjBUB1AGCEk3zptWauLks7o95Gjia6", - "3MHaZ17suABTCi9vE6HQCCqR6s3FDVfLbqGyKhuK4nL6", - "3MMFQCuMHVPw2J7rzVY6Y7aRcAtiLsf2wg5hdp6MAMVy", - "3MnPC49eDVWtP9R9yv6CYT55sT3sXB2Ejo6CjybaTwfm", - "3MP5Pf9hYE7NcxE2sUVBFUeV29TiJxB644JMzdNZMaTU", - "3MTc2uTypaX1ooZZTRn1bhYa3jYb3PhHXDhs914NiPXL", - "3Mtj4qw6WNcesnyxuMSwCFzRuNS3UYRTPX2GMyErhFej", - "3MtKP7pz5ADf4JBH4hnJM5nv3M1TgfLm2scmd9WhBPoX", - "3mx22d1aJLazEutJyHVszdwyLJcrRo26EKB4AWDbRxRc", - "3n6n4fa6x5vX3gSqUbNGagzhcAdj97N5agmSWiSCe3Up", - "3n7abp3TjqfhPj3PzEcgdLswkP9Cg5eBy87CkLExAh4e", - "3NchsxHzVUAv6MTGEuAVt8QRdi93uHGNRmS9AEiZkMVh", - "3NdgfZXaj83dKoskxY2LPyQmrjtF3ikCmfCJeKTdFqaB", - "3ndqwmmqTEFaydt6bgTDohL35WJCjv2cezUcYezcHHcJ", - "3NgKD5Qpc1WkYbaedaiqVPdwe1EqFN1ei7Gf3ucPJfep", - "3njgS2t95W18aWL393LPT6FK73ESPk9vzUJRhgn3KWjv", - "3nL1oAkcW4M88VG4D78dNxHrqaNdKyJqKW3wbhhBjhig", - "3NMFamQ5RtVEs5N6KeUnGnwkaoukkp4hduzUPKJr5Y8t", - "3NQKfw1SvKjd2DompsUnkFUbEVSWEMYM123V4mRD1EJk", - "3NR44gyJbS9U7VrHGnqng6ehaYZCmtp82nDssDRowej9", - "3NR4ZzybzwkcWBop91VpfTStmC987o17Ja7xqKjMvy3q", - "3NtGCPqA5dTucxitLz5KTxERZ7XdVSZ8c2m97TGupV3S", - "3nvAV4PVG2w1F9GDh3YMnhYNvEEzV3LRMJ5e6bMYcULk", - "3NVutKAt3sqh6DEC2etWqtorzfssref2YtP2YPa3tjtf", - "3NwUQFwu2VDnCUsMHkAHvDZLxAAiUazN9PuNjJeMsdtT", - "3NyhrTWkxdLmi1nuW7Xo7tfqSKrsM6dxQkZzhs7Z1JWx", - "3NZ21NDqkVtUHqHoiu8wSLznECYwryn4K8xC9ZLyACnR", - "3o3GJr9iAdJ2v2sZhRqiX5nGFJyrpdG7t1jePatMfFkn", - "3oaf5Y78LHEt38Bcb8bBtabCBySWyyEor7LN8hGwHLLU", - "3oDrXPRDKkmnnpKdMzTAvndtTegVgDQgswzHE7zjbop4", - "3oDXM61MAdMuXKi9UDbrmSaUEoTrkmeQfJjuhzqSX5ZF", - "3oeba4XteBU196zjabTnTt4vsabdDP3UP2QEeraKzu4v", - "3oQopGS2PJqQEYfG6vQEE7ygCD8h1tV7acukQFXuYeBp", - "3osDKQmZH3QKBjXf2GmnZup8AxugVU1LS2zzu2a9FiWu", - "3oSpYov4ngdWKcZBnxxSPTe2KmeC5s3iKTi518KP9exz", - "3owsGCjZPMffqbQTaM1MavjpbebbRU13j8onvFMZAJLs", - "3p7U8kSY5JysMe9Z9LTX5ujVY2xF8m8s8DHozz1SCgT3", - "3pBydjKMuvXavGqrfKJ411hfbDgUGPnpxqnEbR4TwxAk", - "3PhdLBcBxvEUhYgKostdX9h9bXNpRfUNwTDpELZmjH4L", - "3phoP8hwnRWeGwjEGby1FRoKSsE9Bfa6B1AARWe63gCC", - "3pkLqg3Q661TTeQENpH7rbWFi8CEu9doifpXGgcyCsbG", - "3pm4kodxdtrBDpyMHWuwZ8XB8f7qCg16E7CeuHv8ePvK", - "3pMNR4wReUQdR597AyNkQNjKf1GbMJiGdVmw5CDqdeus", - "3Pog3tY91JZRv8irJf9sE4JKPn1pWBj9bLB9NHxHgehu", - "3Ppapnd4xd8WhBWHwGP28Qy8DFpmzrQFPxfsG6b7pH6m", - "3pqniPoVa85STVdvSDpKiaAqvWrMWLgsbJaNos5mvnYk", - "3prga7PkzgufaFSfoTruh8FcThr4xrS7EiouvWc7u35k", - "3pthBsXh1nTC4zd3ofvDqwKXQoJGLGAQMezAEMAXd5Ji", - "3ptUvx9tz6ukvj5Gx6uPAdcHhijZ1W2ypwnPkipKxYPp", - "3PVz8crz85wgqgudf6mxws2psgKc4kr51MhfmU6VekEG", - "3pw9dVQaYVQUMEZRnrF3nHc7knLG9LLC5sx5Ba4ENzjL", - "3pWEZ4PMzrGUBA8Ld77Wb8wcA2HrF8ynK8Htb6BJbyob", - "3pzCyG5x386r1T5FEqhQ5GZgsdozhbDSvVpaPqqhAoeP", - "3pzTi41c6NAbZyTiyPEAQtmi2K5MyWZJMxx6nDvWPgnQ", - "3q2XLzWj8tULE844kYmoKfro2e4j7tvAWJRkWnjQf6mm", - "3q5u4i1toV5XsgCsvUC3QEMzpiVUT8oRFrg9Ajv6BPuE", - "3q7nHZ8rCGjqN6dS2QKz3D3WbJRn2C2acjcKZtRByhe6", - "3q9mCr6gW65HGtccVe2uJHDbKPusvgVwJsDCzQSX4Cp9", - "3qaaXFYh389e1Ncboc7qbCWxSQdbaiYuTFrJVYuh7jo2", - "3qCDkdtKchaZhC7rBahUgJz8odoXqAqoUTfNe52NVQAh", - "3QeQ52opi54zBf56XMJ5hmbD6pyhcKyMMXamhRMayWoS", - "3QFdDBXnjrfFcZZuK37AspzKoTAG3NUrxSYnD83ivPLa", - "3qh7ZYfJpSEXGJA9EtphPMyFfsRFhamqHwniJ7nGDDTv", - "3Qj4rFsMRMsXnYescUVi53kDY4KjNnNy2QE4tc4WpQET", - "3QK8tbsVSwU6xRzLWhVFJCcnqm9WPxSUdaa7cXzBQZZh", - "3QruvtA8mkdjYK2cKvxZTCqHQy97tyDajMDNxBNvWt2V", - "3QuBhrNbo47ywuK2TmAbvKp331kNDr1up5HM4J6KKYwC", - "3QUJqkV56G9MG3CNABknPrfQWbAoiN8AZ7wbh7RZDWSu", - "3R82jDjQsrzZgQKiEJbKfdCA9ngYQrjZehYuEFmhhfCP", - "3r9FX5aEixsEjSiQ8FBBe1yvbzJycnvx6aZJ8VuxFTQH", - "3RapH4N93wiQNDrCNx23Cy2z7qSsBxARpgFMNsvitPyZ", - "3RC1fQraBVj64GRdMmCvAy9Xa2u6ocRwekseL2Qe2kY5", - "3rFxX6D68YhDpF7c6vDt2yhfp8CXXcjNNga43cCJ8Ww9", - "3RkAB6pFSgxGachtnyX9nhyKT3Dvi2MFc5yUAEZqXjLZ", - "3RPaHe1JAy18c6iGuQnQY4WgYGpLZYVCQZWt1NatfcV1", - "3rtKqktrb9c19i5rKFTKvuJYkcoFPNpAycHQzKrGcg8f", - "3rx28WGn2CCvWr4ZwmJWNtWyPyg6di2njXFNx6Xi5SHs", - "3s1qXNpTP7NQyzv5dKz2JzVzmCEWE9Wbq3xag8dBvjLx", - "3Sar37X9YJLTTpXA487k5rJ38g3tk8PSkDnEF5HSMoRf", - "3sewPmMSbpGRf1g36mBSJbWVqkXA2Wwhkjj4rKcHYu27", - "3si1tYjwb32Mj43LWw87Zy4acgtnxXMYeZuKHmKEYB8B", - "3si45SHHXsP8C6PVo1Zcpcry7DuivvogscAA63D8AKmR", - "3sLvfP6QcKBBHgYU966KYo5gh6stRgG59XNF5KFDDXzY", - "3SsEBZE8LTScnnko2yfPWVFmQnUkk4bQyeihMusVcPzc", - "3sSwAd7fwHhLkH66ZMoxvRDuTrz1WfCCbCuaduqGtJjc", - "3SThwrTpszKR2QRqQLtcW96Ukp5naAuxctMpwuoG1y28", - "3Sub79BNtrd2jJuyciWUS5iRgFaMQVMXRRUCWxiHpMn5", - "3suDW4S1T9wdhBsDwnEoYW2XW36xcydUiD84xBpHPfQK", - "3sWB3AMv6Rd96cKTgtZBPCKoxDW74eGWcqKPkhHEzF1K", - "3sXmQiY1MPfNDnFj1npvTsY7ArYxnn45NTWYDkBwfmX5", - "3sxNcHfzE1ygfrYB9xpjyuQ5nBnc1pwJdVCDhZ8eK7LW", - "3SYNAWbZuuWMYKHwL73Gpeo1ySqRSshf5WDoW9vYVz9V", - "3T1q9SprZScShEvKhGjCxuggmikqygbS3xt8wdwRLbJA", - "3TEDd1ZnCxvJa5ccrpPp95bBrnsfzi8N7GEehLxSCJve", - "3tEqZrbb7xwaRwri19Z5TAznrewnM2m2SCkvSmLztWcE", - "3Teu85ACyEKeqaoFt7ZTfGw256kdYGCcJXkMA5AbMfp4", - "3tEymiCkVKFKH1YrbW6g68vzMB18KTo1YdWHjYLKJGzd", - "3tgm3dD7uv3j6oRrFqSQa7e5g1gdkagyQkWVtXwSxCJa", - "3tHeSnJt7dMSxyFGg2LW7GBXCWMg8KxYQQCKfnx7cFs4", - "3THpRetJXB5mnyojCVYicH4ZTxUxjdtRPV4RqMkZbCfZ", - "3tjCLs5cMKiTgArVujb3S5LhQbBhDppCu5yXd5eysSs7", - "3TJfwb19nfxjYWrhAgmjiXoapZyXpjDw3yt51ZoUijd2", - "3TKj8E4kjQkcyqGr7oWTsrTyzibhKsDkLaUMicDMpq7t", - "3TQbBx85TDi5uQFLDzjZmecs1esSen2Lh1ybHvdUPkEu", - "3tSsxpkuuZjTBG9whoPU37kS3NFK48Morvm8ui2vBJLm", - "3tZ1JdmK8eP2pahHUUjheSsNSCTnYsRzSo9MZrRvqffF", - "3tZC3nXhy3dwcWFByQrD5CibczosVPohyNHW9Wd5xtR9", - "3U365ofgDRsPSoBr5K7QXqJjGsoGw5dJbwyXbCQnU9QW", - "3u8x2qVn2zotrezEMhEL1mwLyxBjvheRc6KPEfHvqiLK", - "3uF82ATbSzKFpAZKQ9LV4BziPsKycMeUZCzaWfL6rSbU", - "3UhCR6DRdTdYDfkwPkCh6FYWqer3U6fDVf3RDdQpjZCT", - "3unDgZgm32QMbX35jWy12erfq4hvzkkWmCWiS1EcHDUy", - "3UpgeaGMz9vkErbvrWKc3Ppb6y6AZuKyEn4kFs9vPUUW", - "3UtHK2ZWwmDKxd6QzrKmh9Pey1gWS2SW1MoaZuGZbc7E", - "3UTUQvxwN3zpE2Uah5vdW9GevvF8Cq34rdGRQte2ZNQB", - "3uyAGuLyVHNeF2yyrZya6UAYmkAwkNjKTsAjSt9LspiQ", - "3uyK4wuu25PVW2ENkr5s7rG78tXCQrDG631ZDXJbAEZS", - "3UzjAchmEVhcFSoPLTaVyuSemAENdM8CZ3tG89SimCW5", - "3V1cpkuKhJhQuKB3BJvTeezGEDKR78krcJT2esG9Wte6", - "3v3KN1rtwURN3NVbLJceVSY5zjb7SX9PSXDU8Qgwf9XJ", - "3V6521h6g6ek3awgUjRckwAazS4F3Se19JfpnsQP7mDd", - "3vcvaLhspd123h6GfN9ZZZGqxmrN18YkeQ8rSj58gvqH", - "3VgNMrjpqFmKL3krt19p7aDT1UtJcj1yEJ2NPnLiY7hB", - "3VhbVKtK6xKvPRyQ6FEDhMgxBEWUdng3o3hKQnA1wYaA", - "3viEMMqkPRBiAKXB3Y7yH5GbzqtRn3NmnLPi8JsZmLQw", - "3VjM5FebG8NMNuNuM2qb22e2NxJBKhyzukwW3anfqbCN", - "3vkFbUsjMqkkgNvywvxTPbsGF18NMkwBX5cBeBsrhTRk", - "3vkog7Kaki74rn7JFWxKyrWfTEUnp4cLpJyvgs233MyM", - "3vqLe2U4ia3jnQ93zAW1auqt6ncV4cE4Kk9sHNkZu8Bj", - "3vtGhkt5Jp7qrGHer3sZMQLcWe8LsDq5gSfLgziBnV7e", - "3vvpFWvBcqpYFS5S1K1S4BiYsv2TbQK7D5T5uCFxCA5Z", - "3VxzPozHwjuQmc1ceg7k67wadxUiErMSTZeEtBPgWuwV", - "3vyoRbVAjqt7ot5b33kj2S7oW5K4FbhZ7nAe984go8ZR", - "3VzrXMnCXWGznFVaU42jWKgq5sT5vxDMjTu5Pj243NuM", - "3w13pQKxeamK9MpCNV5HCAieU3djoMKpLxesPHAmS4BL", - "3W4fe5WTAS4iPzBhjGP8a1LHBTx8vbscqThXT1THqEGC", - "3w6hQh7Ndx93eqbaEMLyR3BwqtRxT2XVumavvU93mcRk", - "3wao1rTFLniFiX6vofFyEdyKPuo7coZETkfEQxf1s7mS", - "3waQBzygiHgdykgJ3kAHvot6RzMptxTMHuGawjq5Yb3r", - "3wCc1c4b1QZHcmZqFZJp4TLtGRpMYEdzPRZfvwQgYhfi", - "3wczjkGgWAvK8SqmBxJ6x1NNTct4FiK1H8ryiab1NeYx", - "3WFGcaMD4adBrKy1FHnzVKM8qnN68GZkaGMCwoRP9Bhh", - "3WFjSGF7Zej3wXE7AzRkFW5zwt2BHX3kWBcKJVd45FtQ", - "3whdpQvKTocBczXueKjRrEzVa364AggNUWWSDd2qcagK", - "3wuRysbmNixyHvQkHcv3GwZv2uQyBLhr4yhucX8hmUD1", - "3WUy2MNoe3f1iUkUtBF2iuga6FuGdkAUWAoXk1TMoKt6", - "3wwYJDVkY1rK5emynSYgbwUy9X3eFcNQiyYxc4Jsd9iL", - "3Wyqj2cgKYK2sSSb3wVv3wJ5yD3yigV8iLLttkZfKn8d", - "3wz211BhQAE2n5fjDQSStM2iSizhNRyJDNRkDEc1YwMF", - "3wZB4hqoLXqBuzFun2sBstu72RgYnR37RWk8YnqzEBLa", - "3X1VWPZFykiS4q3PxhwLTuFeWbC87C4UUkovQfBUuXwA", - "3x5Dno6JUadTpxfpNkWs3kK4coftww8fu1YCYR2pGzLx", - "3X5fSxjnJ3Y626cGNosRokUW3nYdTpvZeheGpSjD5uEb", - "3X6FsQ8awkcU4iXTF82T4RtnTJx9LTY5D3dHK6zDE1Tp", - "3xa3EcPFvnSwyTNZ9qKAHgXjpksdmtYkLpHMKb6y4bzz", - "3xbRazXQjdqesNEdbg4tm2M8iVanNN1ZsinrfPNtdDAJ", - "3XBSRCtq8529poT86LUwZzAhtw72UAw4ehhZ9X9Pc12z", - "3xcuNiSY2VxKxwLmohAcuznx4wLcRWjQeZ9FgeC1o7Fh", - "3XE9NQAN6yiKvNedR5msnvdLN6HEdUfqyn4yWoEYYEcW", - "3XeDMpzQc5SmrSE6w9nYBXkdk8AzX7q5XohzxmwMmExG", - "3xEf92DqEQz1WbQytjqtEUyjbRwP8QqvUTxr1pcLS7DP", - "3xgtKbSXjtZe7hqxHbK2WLYJGPJw1hfvZKzHrTkygiZX", - "3xKsqGgLMNVazzNBsKa9TPG2Vo5fGLr1xkKrTMVXVVkT", - "3xMJNjHW2Wn6LKXq4xQDfaftjFYpBrM7B8x6cmWCTffZ", - "3XMLk9BQun36RDehbjniorb6v4PnztP1K7feDdsaFzaA", - "3xR76sugGM8VYJj5fh3QXGZ1CTtsSkZPDzJevkSRUG42", - "3Xr8KfDa2XEt1xEZbQDeozAQNP57J3T47SHMzoMGZG3q", - "3xUTkgPKNJZ3dkpDMV8zWV34BkmvKanguKipv6M9x2Mt", - "3xXKHAc6nCfZcbPTyxGuGq8RJAX9cYdvPQZ8yqCUJvkg", - "3xy6KW5GJW8Kb8idRXaYcmAqSmN1XgAfwYnQYuL1BKLP", - "3XztXCsmJHLQCCEbZ1oxEumxQg2DEfC43b25vRoHEHqT", - "3Ye1g9E65wj9wtbTLetQbjsQ6SFj4s7RdTJaxjq6duDq", - "3yEpFZ8Vq3vbbfvLu4r6vkRnV7P2QS6FSqGNuMUXro8J", - "3yfz5SJmPtAdx8VXmy7RYsrk1Dw9yT916KisLkbTthob", - "3YHrycPTT13Yha7cfbsvRfohokWWFMQ4D6GZXpLvNg1D", - "3yPNiywBzPuaHsrAaaUFNBTsrQVQjHnbAc7fDjLi8TTt", - "3Ypo4PFfUipSd6vskHfFnc4pXQbPqYa8eR1hNMuSKjE5", - "3YSQiy7dFXtqvL1yvopSfLbbvoiMAcJeNujcnBgqFxqf", - "3YsxT16NqCGye8d4KhnpuLnRsUGrT5CaEnL359ywzMMk", - "3yx5bpQ5tCfUVGUCvsWXwg5hRVWnyDfzqyemX5Kt163u", - "3Z3PAXEcKZSDSJxErLcVdsaMhCBVyFtwQ7T9mTpkXhdB", - "3zAa3TC1Z8KZUmi5TDcQLbXDCETNEdDkcBfKEBchTuCm", - "3Zc4vNePwpwp7jr8jj7wQoUxUUpjD379snUq2X4RoKbq", - "3zFNnVNTEbPGwzSCp9wzbrrYWmhCALYbJVkGf3TrkaPR", - "3Zgr5RmSKkvFZjqPU9vH7w6hhPf1uZVr2SAFBMXEcCPu", - "3zk25rQg3JXW6zprTBvkhVZJFntvNo7mc8Td3EAznxkB", - "3ZPffTqFZkFMnfqe3zvS3R7pxKsoy2ae46w3zdykosPB", - "3zPHhqJE3AR2S7WxJf8YHoVZ6mxPNhvvdjfddRiNY99g", - "3zPTGXdCxTDeGnyXn7D89FeH47zNopUgiFsuwvATwWDy", - "3zqCX3LGE4bUz5VdkiwgAP1uFDaQ2HvjnFViVEYJuEVU", - "3ZQdnZd74qDfbtRp19WQ6g6EsXBHYUuGzU5LzGGoTzQM", - "3zQeAZpvgzhffeSyoZLJUrbkAk6ZjV9H1SBEtCmm8HyL", - "3ZQpyMu14PSq6Cgk4bkhy9Kd3gkkPDx6KmU3MDjo9w5c", - "3ZqYA5cJ5x4CQBTjMcSeeucMVVewhbML4MZZBGnPsh69", - "3ztHmgc9cBehYdcWvEKCJ4EfsUYq9751E1N4S8PH5pn7", - "3ZwnSWgQBpphsSzZNA2A2uFMuXZyJKDHi1EHKjbd4ikw", - "41h31zJraPYbsK1DoVruUHFaSF8bEKhoszJd84Lq6F2n", - "41H554Dg8F7hTSet6uR9Dx6Q8JANwm3Es4WE52HUGgAv", - "41kZ9SiZvKc7bnxXwbXdZnpLpYhgJTKzBT1xxtkyeykQ", - "41MbFyDPgfZfht9iDHHTBkW1fhqwGYXhvvt7e1dnULGK", - "41NQTqFPCwdiiGMibSExCNJ95ALFBkcxJtvQw2S41oLc", - "41nRdNqtbMp6xGQYucjjydvRQKjiRyxiqzDHjdaqMxCQ", - "4216Zn41G4yQby8DDt9T8fvXRJ1D4DCAmPwCv9nG4MFM", - "423bf9HVz9YnTTcfuysjYFFmKSo8gYBUPgg5tzgjRgP6", - "428ufu9T4Qmgbfrz6n2aQCyyx3LQ73pVNoyZao7ppi7h", - "42DeSPAaef333ZsSzBGADHhAeWTY68t8CTMzJ89Z6s2r", - "42EZpygMnbheRvNTnVt6bVr66Bb5dF63iAZ3VHX178j9", - "42Fj3vU3xtHg3jSr94QKuDGLBFscdfkr8N5SFZufJv28", - "42kzbUxUrtA9XXmSD1oYTMNgXac9qxLjXQrYorveJSMU", - "42oRgGrFtPHPdw28dw9HiJEKTc7WVJh1ND3dDc2m2UWm", - "431NtoNDSiAtYExxjvW8r6jxYGv11HTLCNTHvQyK1e1o", - "432CCz9sCsDhH3tXkkDYRWEsz9dYCfgwTAxHBxWbkQrs", - "438cBhwXgnUg4oyzAErkWQiCKEXnkPpTgXjS7eVZ2twp", - "43Aji985mCcTJUTpUDQXvvCQAiaqkHvFAnWXPHSgK4d9", - "43h2uYRTSVhMNXKuxY4Kn6T558u436qy59cV6Sz6rdRi", - "43keDi8G2H8euPqfmG3C1V3vxDdGno6emJmCFAEf6fvG", - "43PoRE2MDZg5QccxtorfP1dTrnnAcgJKpmibhDNSndHM", - "43SmLhRKvPQgG6EZhXmQ1UjePerif4vhT8AvdVNgM4et", - "43TBryshuHKFn7Fn6sSs9oz8QwSny932eJFBHNVARTE7", - "43ZCLRdQgcajUq4WTxtTqkqGtpNnJTmLUs4ef4qGKtAc", - "44h8aymiJcd2Ay1XncosM1T39HRdFivdgkhp2qAFQcPF", - "44iRuewPMKBfBGgFm91jg5zueDdeQ689JiNXFpB5KnaH", - "44J72PpPim1PJHge3TwJWAMnuPhwE7DMLaZmCerYEC61", - "44k5MkojayzhPTbKtyZUvCLHiKQ3QWHLgKsCLfUfMrNn", - "44Kuawvm2ngsSyvqsMLCTeWXUYxoedthgKAEL3BxCdXP", - "44NNmGhGdvArh6JRqhcJji8QrZK2vCfMj6dBmQ6x51iq", - "44TjxSs8W974cnHwGz1Ti9UHPPrhCBS9tUBTYNdbvPac", - "44yQJPhbBRV6povRiXDc3KkE7SPXUohF9ipqBvCjokhc", - "459bXz5UgKnAuYqMKE8VW1NqDQshuWkRucKxGKF45jyJ", - "45aGtJWVx9xbhp11diPithdQS1E9Hzjm5b5HEpAM68Ax", - "45CBdUHeqh7MkguTdGmwX4grX4mwgK5UYezjP9a1JieM", - "45FaQrmGU2pqSoZAUkiaC7Su2ngMvMzx2ktdv9Y2tBiq", - "45GUeWqqRzSCuYtpkcp7Dvf1bcKmML7Yvvgx3MGia6zk", - "45M6om8quE2DnLh3cYnty8kx1D4AYbMUzZMpytku6Gff", - "45Sn9tAZMMRh1Tq7LcTetgfR6dC3TdzztDt5EqHd3EkK", - "45tyReiehTPZ7rYq35khyF1bnanHPHavNrRj5QH8HnAc", - "45V9XGGALmSkKBJZtgxpGdJwG8H1d8UQRVr1xLZJWCQB", - "45YDFXgHCEbeDs17Amrd851M4gxCSJH3uofCsvdKLhRJ", - "45YrcNnJ28q3HoBjFE8BQjRvJoF9sG3RKx6HpGG8ZNUo", - "45YX59GFAJyoLaLeszvCHZbUrt3gUKak241kkQSmBU5b", - "462x4mp5aZ29SetJR3oka3d2ARXVKUcs9f9hZsapf7ML", - "46DKboLELjp3jSg9tetcsYeLh9wzSEU3dHmudrUBAqLX", - "46GijDorcsduUvWFNWKAV1yB6XwPG699wS2gR4no4zGU", - "46uT7tSZ1US9bJ93ByBxSBCmZhQogn15Pwuxp4fhWXqc", - "46vcURdFsFW2YsRy7Pofo3N7ofSJzqcKaVftbEG3Q2iS", - "46WCeEExQaEJfatG53qgxMzgPqubbrAvVBeYSyUQt317", - "46z3X3szXYqvj2FyfAyK82iVe2YFPTJBERfTciZDwHHh", - "471Lk6uy55QaDN1X6zTk2mDPoy1ETQAr5XvoBCNUeRU6", - "473ToSs8wTyGd2DTmwb1zNkr7TweNC1Wfui2FzKNB1JE", - "475KBm77Uuj4AA7qyXaoUMyEbqn8C5NmmQmekfA3qXfX", - "47f3T9454KRBbHUg9znunMkdP7dfTSDfHric3iV411VR", - "47JuXYUK2UvwBPxq8p4ePvDggkpz49xmw93N3VNGbDm9", - "47qmq7tBedjcH2vt8TkANNcPwARqHr5Xh2fJxCkTSV9y", - "47t48WDNzn9pqWKhtefkmo9WMWFrfT3De3NjgJVWF2AU", - "47wdGN8ZYsHKmeS8o6tAaeYS7JXCAr9mffRgFjPnBzzk", - "47WVGcfhz5RUJJHNCTbsVVH21B5Dd9FMALWH4h5sYJqB", - "486kJEz1XJ95nULg2Ccj9Av9yi1inexzHRVW9UjfR2B6", - "487FUzUFjUSCQ4z9saNQJSXT79dfHF2k1sbA59TfKKZw", - "487KXRaALcxkJbQmiGhF4SwSpwJ59Rp1k3pEHCpEMoNh", - "48DaWXjyQ8uXQj1zq3WnBjijf1a5xMWAHhk3J9JEVFJU", - "48F5vgnLDj6nyuyEF4J2NLQacG4MfbsaMrRz94hrxP9V", - "4914ChZKaosRkqSu8BhZBVLrDFyBJ9HJeBa4Hi3JAcHk", - "4958nAd4Gp1MZQEg97b7prdDKAgC5Ab3iQtNzAWyHqEV", - "49gM7gXEJEokKHEoUCNve3uCRMAoRwKUpEiqK2nku6C2", - "49JYKwBGHPsL5ji9LSzDS6WNNvs2AW2seC2qZDiMWkPk", - "49NYcJbApj7FXgN4FCuZ6mpLA1aSRSqgoRFSpJSPxYPn", - "49oW1EjrYFvWJLUK82mhcDqN3hWir2LT8H2Sectvfmr6", - "49Q14TEnx7XTHsFtRs9xhQ12wXRHwaWJ5YSpGhVNhSgy", - "49Y4UYWPmysU31nuiFaLDfLo4gGgo9tMpfhiSA3KQUm2", - "49YDWPPRQRatsNgUHLbPytGtKgEetBFsq58uGobM8sDz", - "4A159wnN7WYK187eHkgeYycphNkDLPUgjbFGTfMGjWJr", - "4a2sY5pmRSWTUvGde486DtD5u9eYAwFcGYkt9RhwEEMs", - "4A4JkW3ZRj5DtZbB3ZAoLkKVbHvF8EqFNCkNq8m96sCd", - "4A7XYUpU2Cvj84fBhkcUQPQMJsZywqgjvD65zSRZmquP", - "4ACzNRxLXVRbgFxqqZmVUG9xrFbg4FvRhfU9mRAQ4Zuv", - "4ahdYTD827CGNKfhw8urnfQVq8YWXDqM8bT6EDtkFBeV", - "4ajWybNN1XqaapKEEiz4MPMyCP7Ppuw7FMQwQ57o7gFZ", - "4AQGwmJBn1AX1GnL5WWqvfz1ouxLxg2viGPgguSTPzLu", - "4AQLWennbsPNLk6c4gwumAq8oqNL8aKeuAtGngoEQioj", - "4Avna3DTgH53GQYc2noJAySNAe2AhWBuFK12a9Nh9Mdw", - "4AYWAYndF6EsfgwVTrsHLMviNsvuqh9dAMcJynpJk6YB", - "4AZNBZYtjpbJAtFi8cYqy79EcP2qHp4fkLBagfdpvMrY", - "4B7cFoyaC8eC7GWeDqjSdgw6wRzy1RYMRTAEZWueMj3j", - "4ba2dRU1jFqvGR2ndk2gGPQPQYM62i7fEK5X42gvm3cS", - "4baXhu594FEQtZsAmHNjNM8K3NxmPNsYCxyPUZnhwHLm", - "4bhYSsm7w9FPbRfooGGSwfUCDqZVkdPcAfKtCeUv73UE", - "4BJ2D5R91Wgj1YBAYwZFo9Nmr5JgcHf5nZGLVLC6ZBRT", - "4bLyjRauEjdJGb86g9V9p2ysveMFZTJiDZZmg8Bj29ss", - "4BnN5KaBHW2j53XNdngeJv7Tv5NshVEq4msq39fCNysC", - "4bnqGCM2a14j1CiJ31gjJUf9B3kHZXzz3cFB1X1tSGft", - "4BnwCLH12dCwYv1Zk8DDYZtNfioyP4AWKT9mMmPLFW17", - "4bpkzvzxJkhXCQNufEcybrXsT5vNW5xUiG7mcnxfGRGy", - "4BsCh3FhXy3iYwUJDbYK3jXaxXhknGMnnPJgovBHFHj6", - "4BSX3HDiTAm2mXDGKoPzBhAzktQZ1gGC8Ri6FDhHFriH", - "4btiYdMhgheUYnAnBR4pv4dZvxMekHscSGTvWRp8Hm6C", - "4BVYRKYnwWbUYRtxHSNnue8xydUhexegZKohbbtkT7nv", - "4BWRooHWbpeBRmjb8y3HgtkMcK5MWVAKce2dSXnTP5Tr", - "4Bx5bzjmPrU1g74AHfYpTMXvspBt8GnvZVQW3ba9z4Af", - "4bYYMh5rFhQTWwCSGwDtsDDSzMCaxGoEHbJmzF8W2M7n", - "4Bzp9fzcdjctbdo23SCwCEkPeQzCeyTb3WtwiK3KNVRc", - "4c3j4FmS24o8BdM2cq4scKhwwtAxKwZNNXqJoUUK2yzM", - "4CA7s71us9ZyWof97tCVKBiyih2fcypEk6WXBvF5pdyN", - "4caqQcfJP4WV5iEBddiwqTjdT5mYNFgEG3QxCg7ReubU", - "4cCe2kv1KS63KLk9SrH2msKakTZUb7ymrLmmuZTH34hH", - "4cDG4caeUNBz1Kx754vNvZKa54NwDv5ph19xuNk1zsvB", - "4cET6LqgNtTMazrQMBjvTUutcbn8ps9nxY4TjQLga3Pf", - "4CiK7GwkyVjNq9efPAdhzX9E6cdfXV9Dj6TmnczANMx8", - "4ckS4cPADqvCB5JEZzRjp2mCZVDL9ghPpw1dbcZXDe1P", - "4cLAaNQ9XoqedYuW9dqEfr1ixeDFxMQcB8kyjjuWNsJV", - "4cLRyEVzhvt1MKqEeVeVfsxfJzZyUwpJGQADBW9qgwks", - "4CNaiX4KwTC2N8qSoXvykWZnHSPRLaqViiMoakHJ9BJh", - "4CPCqav7jrHcqqgweLiJqKv347gnPZbyWL8jjtddBdvE", - "4cqbeVTCm6j1pxSYau39cg9tdDLoXxMjgaP3vofCbp1d", - "4CvdrNHmoWmq3BhywJD5g52CCjLkmCMBpTWD2VgVwbcw", - "4CVJ8FMombpnrE7C1a4mdwMMbhJDroAzjG51BuifPmcF", - "4Cvq4GbYn7jWPpUmdcMSL2tPBV5E6GqAHfFV3u1iG9Zv", - "4cwEvWh6bLG3KxjTkzvwcgs8WgmcBB7VfEqsd2tx4oqN", - "4cxKnptRvBHYMqUX5hsbEBcj2GmoAxmJGYoqN5YgfUQp", - "4cxQqmAMLP4s23uLGFxdsLLZtG1EuXp9CVrB4HpMav9L", - "4dd19K7UmrUk4aScsqYaXEGcabRVh8opRhLo8uSJAKbZ", - "4dfSUGYJZ6Yg3Th8g1Y2EG3rHDQSkPVfSCWt1yWtGj81", - "4DPoKwdKKWCYMcjSfWVeo3G9dVvcVgc487HRNdAVNMfQ", - "4dT3ySaMTMyG7wssPNYUixRBxfkbWTbnsoaWLzfwUinU", - "4Duyuh9vfGC9ZqXpLhwuSeWTdPUJwSTmh42zLjpnMT9x", - "4dWYFeMhh2Q6bqXdV7CCd4mJC81im2k6CXCBKVPShXjT", - "4DY166Qbzbv4DPaVZ3FAz8XV2gRZAWKb41zDYP11pren", - "4DyVnT2veXrQkpZwJsCCXVfTUv4QwihY6s7XiVyzK8hq", - "4e7U16vhr41xMajAJRuyFCsqZxFbYGhJdGzYK5isEGQD", - "4eAb5T5z3S2miDdZ2tJReCErnXtKW6MzSKWiSDmhkQTg", - "4EACGRv7miQa6wSw5ymGiV3dnHVZwrsKQoe3aMDbjdEn", - "4eC3HmSE2DJ9Wms7HXa7xXEyXVZuUuY5Y3fGuVB1APYp", - "4ECwQYdgfcDfFT2Qkboe591xJKTMBeXt5dAizzuSWzVr", - "4EDD1L4K6NJRkS5UxWWJ4irS4UMEPUeXnPXfae7F5tQw", - "4Efdqh6SnwMiAcu8fPb7gDo7Eu4vrxMQgMdFb2JtwNLq", - "4ehe2UvZr9gktPfwhczm4Vfv3gmdhFbYk4aFtQWaj3NA", - "4eHto3JFvyETeNH8RTcMuiDhMDZAqCHtvwqT1rdiSG6s", - "4EKP8dVi4Fuzy4ZHTFPkm68XDD1Tp8NkZwZWKXsQEK5Q", - "4Et3REh6SoWGW2RnCQvmRLj2SDzZPSnwEbHsjorwR7Rj", - "4eyn57baA11sgvkQafTcrwJ9qVs6QptXBahf43Li1jKc", - "4ez4rPJGKcDrVafcrH91XRnBs5FF5zUJZnERH9KmwBHS", - "4ezaP3BTVR73Yd1pRHaFpq4EewsnkXSkiDqaAjuYQn7V", - "4F1CHdARZsRZFD9EiffngMmgx1BzczupJNVhchw6Nxr3", - "4f3hxFvinBCKnXxFzx29fsFSivVPqY6Bk7hmTYxXUAda", - "4f81EnAmGryE9RVajxfTAHrgExychk4jf1nGkJjk4ZMv", - "4fA2MXsEG1mJfxTouJuFWQoBzsK7jQVXbd5UAfhMZHXk", - "4fBQr617DmhjekLFckh2JkGWNboKQbpRchNrXwDQdjSv", - "4fBYbNxJaQKcrrermn4h59ZSfh3qbCVMHLorfMs9sEe9", - "4fDcgMqrhFDQn3E9RPoYzr9SjX9eDhbMDqWnnkR8RHaU", - "4fFhfoSezZmrvK5EeFRtMsMhHn3Vfno5iJY3JPXs7F78", - "4fJpCZ7vxgCVs8xPii2qqJy8Mr5GBLvpNfw3YMqS1baY", - "4fkHiqZVjKcBCnY7psTLRtyBRFCNBJv6uxtUNBguWVas", - "4fQGENVeYy5v7dXhA86q1pww4y6RwXmn7zNFECE27iTw", - "4FYRbyBKszDnfRbefTfbifMkqEF6NrD1MzU8zoHTVuEr", - "4FYzxng9e5whxw8Zr3YDg94SmJ2iyB9A3puJnvuCX9ci", - "4FZSiJpGgprsVxkzc2F8v3bgnRpk8Ez1Dq7ohXwY1q9V", - "4g3drFRc66HHir3bnmkgzeCNFrobP2NuDpKrpho69sx1", - "4g5gX1mmFGGragqYQ1AsRpB8ZJvwCoUKVT5LtKTDrNSp", - "4g9e5ZTCk7ZZTTPFCGcsJyYyvaKUvpkMzJNQMiP5Shdv", - "4GafK1Np2zgEsWssLfVt5D7LYLWwzgCAhixbNmmtkZK9", - "4GBSypESidsbB6ACFRUTkwDwcv1G5anashx6UvSypqCF", - "4Ge8T8WeH1fnv5SijRzPfC38jWnuBhiKe8iE9fsXbqLi", - "4gEKnFpiJ8XC6DdFw4D65uYQeMF8x7KDqMrBPrDVjMPb", - "4geW99Urhq8jqAectKQURpCSziHsKLwoAS5kW8xTNter", - "4GFicguUX8WDqFL84XWpvKyqm7NXNUg1T3GTiKUu7MkA", - "4GfQdbgPK1TXT4sbW7tA1QE78qWmbNiZp1X3MkRFHDe6", - "4GhLBaxr1oEHWpoGnWh3mcRXUkBU5EEQZv3L27c7ohoq", - "4gj7E2qn7fAAo5Xu7ZQyxNmhXM1iC5n9PqB8TPNcBmD2", - "4gMboaRFTTxQ6iPoH3NmxLw6Ux3SEAGkQjfrBT1suDZd", - "4GmF1PREbzWDxngn88X2v2V28F7GsGKfofwEPbtUQ9PW", - "4GNaSZz1L6g9Wp2KWPd7SJBWgfoL2LkfTWngJVrHqzeE", - "4GRJoqkQmYomBWoMKMYoFSbStCHRAYmzbHeKfAtP4cZc", - "4GsnFvSfNWzTbeXAPMCfbUPjYmHU73a8wyiX3zrds44W", - "4gSrHktLPwq9SVVS21MpNwKB61phUyCgYxALkCsFCPyQ", - "4GuRZCrg6oChXATfMWTDJ9GNjjc4qKyxzow3UYjvhuqq", - "4gWYUqkX1cvWvaw1jjU3zp9wyAmkzeLwgrC9a3niFpCa", - "4GZcgkGEsiCRFLRSwkMsNP3pvwnEgjmWkHTHHo6pygCr", - "4GzmbxmepoggVLYzyXyM2GzYVaisJSuutsxrydoErSeu", - "4HBnT62RaM9mXFL1a6wpjaXxbmFYtbqVXTaZ8nctSBwK", - "4hDEtsHXAf6TMBNJHogmN5noitFzxGxKAs5YwsKZzrDd", - "4HDoAU2RZjKUNP7xeesVqqjw7J9srcaVYHyF7CrAg9bR", - "4hezV6pE9Bwfp3tUXMvCH8ThyCQgx3xoXcdPeeBy7Eu7", - "4hfs3h2p3NLLYGvoaYZTtzoN5G5Z9QqvFHb3niBSbVD9", - "4HHAwDxnzNk2QScFUkbEWhQhjeUP3GK2R7TR3HNgKNS4", - "4HjA5dBRcMajmaYfwYxqdJBzYbuFxPqjoVjnsTk6Xjqv", - "4Hk3LAsCmvd9UEnyTW6irAUVYJXUVxSBWVMaBG1yUuxH", - "4hnLYPq1JSQ1i7AumkFJavgLg8vFtkLCCGCUzXfuKWRa", - "4HP7LFXzpVaSYGa7D8jZzmFTrbECmoFAiQ7svJtR57fg", - "4HTiKWS4BNXZ6VBXWcCqoN3voUVqcHcMaJEtZWCtqfhA", - "4hvPbb2nsj6FQnzn7rzys5b9DUWJry78gkd5st3B7dtV", - "4hzveRgj6ast6zY6NXFisMLVKfXMZj2NBP7bcJMybMv6", - "4iAETAkF8Rb2QKEZPfDjTJVzwUqcsvujATW1JyrEGu9w", - "4imbBQgQvg447bVmyodJYjyM5y6NH865h97bswNM3cXk", - "4ipoqrp6AYzDeq9tLUt1X5U2KmrAdqEhGegwkRnhQWd9", - "4isGUMUEEUHnvFKVr5rSvSme5yonmwWRdoJ8vSw5PUkB", - "4iX2nVtqWD2Rc3375YW8oGPkJWqVSDetMA7YWbdrChBu", - "4iy4VBuNNLbLKnpgq91WNeFZQFXu1kbK5jnJ59Q9daEs", - "4iymuejNWQCECHXXq73NecuzU82zDwbs9C63b5GaFquV", - "4J6vnoMn93Q96Lhuma2KpmJzdH2btdT3H7PpF7DjduG1", - "4Jb1YfUUN1xxdYb28wPLT6A52j459uLNBJaetpk3vAKE", - "4jErBCQYFBkWo8MPy1HBJRcUazKyK23swTScGRjP88CA", - "4jgzfEWjBD2BcfFigqBsAh7699A4BMPUPHmQ1F6av5du", - "4jhyvbBHbsRDF6och7pDQ7ahYTUr7wNkAYJTLLuMUtku", - "4jiUYSWyWJZoVCUdgWc921wqqvH2zfVrS4JfYwuqiEbL", - "4jmTyHRfM9CRpoEuZYUJeytmRgaVuNPKtTwLarW8FJkz", - "4JoAXknH6zc6RFd4mawkig2GYKXptd1LQNwmtPGEu8Cj", - "4JPnDAjvQPYB8bJVw2E2Wvi1sZZd5VHAMeBncqqt8U8J", - "4JscoYccPp6MZ8xx3basAiV5hAkQ7S4hrGLh45byPxJx", - "4JtNuhPAMzWbpMEwjqp3WTmNSUZfDyjDBcRwK5cB6Vy5", - "4jZMrzWGfMHDRkEBqwnx1cPR6uP3i8v2EaKALzi7bYbc", - "4JZsGW4WUSjAjH4joCaAAVnNi5ERfHr93YUDxmHZpDM7", - "4K127KdktRKaVG1uDvMYPHgGGXSWX5qAxBXViUvTimDT", - "4K1ShPZ5ECAPbi6tWRtRztTNyi9jtohXZ4Ae2hsxQiwT", - "4k7N9gtmQeDDYJxbT5NSDkARghkQzEbgvE9mm8gSFicj", - "4KbmoKN2wfRRAQEUw2YYJCwv1kbFdBsgM1dzgSY1ksjA", - "4kDHNwzGYFMbfWWynCZur1aRVhQ4pPrjBDNckmYs9sxk", - "4keeN1kQVHQFKBJvZNKjmLHpLvZMEM3rtrVhwM23Sbgr", - "4kFf3GZoW25XHNwHedpMBxWN3Fzy7wmpExhoKrFPZ9So", - "4KniAvpDLzhhBjeVvGDfqGb8fn4BrgPyXk8ncFmuwqp5", - "4Kp5D4rFWxgVragUm4ftagkmBDkNzGBGrJXhX27Qu26m", - "4kpW8nCzDWjDZ99Eth6SbGRMzzYoKyYwqqNRT5omj6ts", - "4kxQoxuH2rsPZpatLYyUGJeVacV1xXFpYDYShpBXDFYC", - "4kyHdHNTceS6Qdx6cWpYDPRZQ3LHxWbfXfTXFRQsG8PY", - "4L5ruMSAYMAGReGc5uvv9UqxUoo6BP48DkE8AZq6oitn", - "4L8fHW84B9SDj1jtEhYDgjKB58XtFCPLhoD72omhZ7BE", - "4LE6bcaKfvdRik5ZTQAhXKyFXpyguJeDafU4ypv6JkPY", - "4LEb11sDqh7b4EpSLAp7xuSQoFSZrvW8FEMKoAdGsP91", - "4Lfi4hM3nQHW2e7mdJ6hK2e5WVeqJ6Gf65QGzJeApt2B", - "4LGmdNmyzYtkrZvj94jea1rkGNjm973z43H11dhCiGqs", - "4Lh1vbjnARRervgttD9ipb9wDyNrrdhEmko1F3QR656u", - "4LKx5Rz4NsxnpamAuD3xVcCdt6A5aoN89qaUuFsfBNdW", - "4LtCoYtSerVzLSFwmrWyFgDMFvM2mwspCYP16vQ9L6JT", - "4LyxkXdt9cwze6MkBY71pKdV2S3SxzNBYoUvNkDH9hBR", - "4M12eKmzkMJkv3jyX1p52c8rqbbQKY5dcGY4WEii1qzM", - "4m1FyCy2kLFoNKL7XY7ErpFuBC3sw187ZMGKaPhX3ESa", - "4M7xstvRWz4LVMZ93dA1rhsV5S5VF8uutYRf7dAGicLQ", - "4mchug1TCvHV7jzaTAoAMjXNq54NEK3AT7KZj1j329WA", - "4mCp1G9zmqRH53wX7j17wmZimHbn6ep1NvLmsMUwHjDj", - "4mDa9rGjGikDLV42HJx75hRHyhGKv93JKtryh5iaZhDu", - "4mDwAPgoJ5UDsFao6v5iMgREnJU6Qy4sQxzBV8PUUPCu", - "4mdxZgQQdkVJvPK8Z8T55sbUXU25ZzjTNs1ydvrzVnYs", - "4mFhvL61odNBngFBfDFtfJqgGLLedZxdX2GAuMy8tuSY", - "4mH8k178gAyjivo4Xad18XPwrfNXsNMrCbTQJMm6FEaj", - "4mLix7G5YbBSPewZ6B9H79nxmJ4tqM248AVfDu1Tinpw", - "4MNtUgysSfjwfpgYBJFJQA2Kn5LXPQzgRLnJoCAseKrx", - "4MPv8VGSPVJ7vyBUuWRoEzZvbc7MJ9LfViVvqnCNtCcA", - "4MpwMktf8d4Y6XYBN1Tks88h22yPbFZtG3ApST5sZAyL", - "4mRQW1txuSjupgwzGmkutpgrsAZnuxEkg3iUhApZsj52", - "4ms9hQHVYmZ1nUfZaiUZaPUS3zf4RvALayxZopHysaqc", - "4mUcpTuuwoFGdxpnJcqTVYszHXdsZ4Kbf2jMSMusySZN", - "4muNt5Fn6js1UmJVuHo2WSkGip12jiuxVCk9yWbjZN4U", - "4N8tZu9Yn9AkkpJCYVSH2o7jCHMThkeG8SRNc3ThnrFL", - "4NdhGUvhouWoewEruP9X5u2tEB6xheVLZXke6z8efotW", - "4neDeXWWSoZ9GVwTFvXdkf9zgEiYG4J97CSCBYZNhfJK", - "4nFPJVwzQ8Y56djPS3nLSk1DcP93tk6VQNgvUzdSemGm", - "4Nh8T1d4YBZHEuQNRmFbLXPT5HbWicqPxGeKZ5SdAr4i", - "4NKRcNv3BGZAqHnehxFFPpWdKLtmJ4WWidoPk4hK3UXY", - "4nKuNB7KsFPzfPURvXxpyBZu4Pmm1y9w6jdbHpaAEfTH", - "4NN5S153eKYLGRNGGrHMb4rSEs9b2jtYvF2fyGd1YuyM", - "4NPTMoHqetXbAhUEftvykGE222NAQfY1pzBXJBLuvD2M", - "4NtyMiwNUo5PstCbzjDvezFMxbz8TcPwAArt2F8tY1iA", - "4nu5rdaXjhXHniTtVG5ZEZbU3NBZsnbTL6Ug1zcTAfop", - "4nw9knLrjB893wVF1PwpPofZz19ko5vWcq7dKmriiSdH", - "4nwN5TEUWJEZHjFh7EYfXbt1yeeJkAGJzMyB9xDZBrCA", - "4o81Qks8hmNfQXwRBVmEWi4kEbAKbdv4Ym38R7QWF1bu", - "4o8VRbGZcmiWm4Zc79LsBgDcqXmmVte3kvCroq2zwLG9", - "4oAxuJgzEbHZnE4B66xTJsCMwRW1ABXQs4e4QBLg1yCZ", - "4oJuAMQjsVoQdHybK5JsoKYUoR4akAZHNRa4Qjs83Dgq", - "4oNUWNoSNnwghHBCGsuAaQEuaB6oZEXE2w4VNhRxoaQc", - "4onYqDFZXTfLacQ2zjpZFYMbRtyLgYX9ZTnfLijZebdn", - "4oRsVpbjGU17ndfQVQSFNYRzuj3uETiBT3e1Hz3GHLLi", - "4oZdmsp2vBFVtS9si7z627jtcjNJNWAgrsP2U4RAzr2G", - "4p2ZqhHkRDTqBwCiBYnL11LgWvLoByMkfWkAqKYJbQPN", - "4P5UxtvVBXBmYRGMV1GM6xVf5soMsYaPo5JDMwcWhLVU", - "4P8diDfWD1ra7bF8BXDPUExMg2QAhTxVLTq3tU4QcH8p", - "4PcgUTkZ2dhxFyfJvSKMDZs55JvtDL9o4mWzqoLK7QJS", - "4peBr87hx7rbFTAJu17MPs6DbVZzx8KKa7EMG73Ae6iS", - "4PEdeTyoP4j6MvYHFGLhEyZLkwBDZEWNrd1c8ScsoAJY", - "4Pjoyc4KTWcxEBwsvnZdiPrCKBMq9oTkCpwCLVikPY29", - "4PmSZvJsmCnxQ4Dt3VrZ4nKTH45dStAKb3i4C17rajXn", - "4pmuUUdLqwd2AFmeRJz5tmsGyunfhhvh83PnoKmgJyjL", - "4pPGVLfcDmvP5tfooSGXMp1nK94ZMGvpsrFmQso2SVJo", - "4pPs4by9CFN3YS6ZLSAuWTGuyErwehDdMSuDsREEjpeR", - "4PPTupvmc2jgWWfNBqCtTwLwKE3nm6rZKjBv7EwVbqQn", - "4PVf8hUmukCp5i5RempNVYnzzfh2NtTnPkoFDonpZyVb", - "4pye5ZJkts6QuKTVdtUQVPgASkiFeuqoqmu84pMeJMnK", - "4Pz5TJfr2mxjYhBomdk1d29NPVLfarjtDEWAkbDQPCNx", - "4pZjWxF6277CRncZjggHdiDN96juPucZHg537d2km4f9", - "4q1KX2Epud4kS7tYuyndLaon1FskmDqcwh5ubxHiSzdP", - "4Q37gmHRkPo2TCRhddzG1ucvhdkUBBdY9oN2B3n9dtcM", - "4Q5Zvj4rgrtFTCgY1uu23prxvMKfdMBrn1Pz3xX4qwsm", - "4QD9nhvq1H4XrroR5pYbiyXg86GpiGkZPAa79Nkk5Lfa", - "4qg65znPfwVWngGDxGhJ9xDjBtw9njfWU3byJjTXPAxg", - "4qGCA2H7HeLahdP2NhRvXaXcsum2ezAjmUGh6tEiYzQa", - "4QhXckCXodXEGUptXoK3ZfNhrenjbPN2pQE14Dgiqdeg", - "4QJK5HzNjVG8dusWtpU3io35HFT5mpdAQTimkrHMPzEF", - "4QNekaDqrLmUENqkVhGCJrgHziPxkX9kridbKwunx9su", - "4QNHwqbdDZhoAvA6zuB3wLfXjpjoQxCVz8wb3D9TtCee", - "4qrtRWHiJm4YCTsGmdWThngntekKZXrF9nGHJCEoRTrC", - "4QSLEqZdaSHFdEYVPMBnShW8ZDM56Mn6wg5B8snhsdsT", - "4QuGHVzQLkzK2ta9w1mfFNCee1UH6tMFs8GNUFSU8Jaj", - "4QVu7BnBgYBEkyq9zc6mu9V7HbNUX9dK4EfVo4SMvBwT", - "4QWSoapLqLC15Hi87tYh5t7gtPccbGxskpfJShebLLWm", - "4QX4RUbWRofbXk74xsnGXumB4RTmc8Y985kCUaJPMGXC", - "4QY21MyFAtXbagGymZuBLu3a6wUkFg5qaUDRwYj4Pnuy", - "4r9Aw9DDxEf4YeAVE4JAUwmQwHvnpNqWj93McNU2xkJW", - "4rA9NntcDNCyZBSsurt8zwL1J4vwabanpmLKAWRGPndF", - "4rcNh1e9WNfNHcXMmWPFfF8yuKMA4n11VjtAMCx5TyyL", - "4rCvPuAwQip8rZNdJnpA5swfVZpPphmxTyTwiKDTBFeR", - "4rGW4pdnjvMi22PnCdDBGxX5ChTrMcyFSF3T2xHUEQvC", - "4RLdFFxTemPEL8tyvN87zEvmWMiwthvtuKUnwFNFjWpw", - "4rLYpqQEMqtrjaNJ4BZHDEEgTuZj3hpFxkDhJQ4FuYL9", - "4rqiq96AtM3V3me5aGKXnSycaVZgoNq8jYD6LwtryNuc", - "4rR896eo6Rx8DBU2q5Jsv9ijfJ6iXScaCcEBUvvTNYQC", - "4rss1LxbeNLMPaMx5vj7hJ2ZuTo9WPPxqH2fBf4t1oRv", - "4rVaXrd7BLSFZMSm4Lq63nxkVyezGxsQVpUhc9LqbxVk", - "4Rwh7hMyutNtRkbHXFB34DRjDaJ85JojGi1UrUbUShvb", - "4RwV6detEgRyvVcvhBv8gmjriEHrVmKegeYy1FqRZK6Z", - "4rzHBnEeChtTeM4hLdkXyUCUCz3PMEUn18DM9PnmxUmW", - "4RzKdWoz63F9buHVFpa3hrmtn6BTXkJidJN7Q5mZUoC7", - "4s1HSfRgXcYuxWAQw6hyBzxSAJA8NeM9oBgJAxCaDJQd", - "4S1WNrrRH2QbfEZk5EH6AjVPYpzLN21siTdMpV5qWc7c", - "4sce2P22jUeMDCRhYq3eF4f7XcdAWybSHkPVvGTU7R9a", - "4seZoiYrJxJnA4pTxvvjgsv9oQmSirH9r4qjn3Dr1tar", - "4SGG3cHVPXeLQkWQGx4vRxR8BkBXNzduKmC3Q4FrMMiT", - "4Spde8qNhAyZZhvre1Sco7u6Rp2dkrfMyPuaXV9TTsgn", - "4SqdkosjugZVRdX2kRptUng487Uece5toWHZXVh6cpQV", - "4sRKUyYwqmc38TpPGmkbLfjKkyNBGEBaiYJaMCYfkUBh", - "4srQbPBjcymT6XYk4nDLkues7s3zjo5CJ3CjEw7PaUeY", - "4sRsz3JNoZ9HarbrrAeJ7dgWukZDK32uKRCQrWxJpvgW", - "4Ss9zGAghLwJe1tAJsAzy54s4sPjYHbXykAJSkzWhfR4", - "4sSihca8PLdP9Q4NBo2LXXBE9o4KUqpp4hSEyXQCS7Qq", - "4STBf6muaBxEx8e3wcUT1DwVq5UuXxXYjWPcNXecpdE5", - "4sv15JRxQQXwbTZpxCLWQiNkB8UsD6iusQeWiBGT3y1t", - "4sXh8SSakQegGGqeXAebhgBsxj6i2wvkS8j9emXCts6k", - "4SykXpKfFGdy7Yxx1wToYuBhhnTTXMhzewWBMp65wgnP", - "4SzZWnves7GV9BYHWxP8Cov1RD65euFo1UNqkc1Vyt8R", - "4TBmBKBkXMqMJrMx3ffuybRg4U9bCQj83GTCZfuzJw7h", - "4tipJgG4qhwh4nUr1kuUGN1ELKxPP7MmH1hWDyxPtxyT", - "4TKNgkyaRXNPMo9zsQ98mokE22z3qiUyeYL3WSMLDvXt", - "4TLyw4i4MjkhHAKMGBsYm2ssVgEzAT7257dw5zX5LpW2", - "4Tq9LzTf9TxpkNqnYRRWm25QmsLNEd8jeCjLPsnr5dvv", - "4TrCUdauedJSQrUVaZmvJvvyEw6dCLkjb2beVjy4hhke", - "4tRx2w9GVzBweZVxofV1Q1hfUR4oEMB2vf1opQSdhL45", - "4Tx2JAXKcqnJ7B27uowhJSCAnn9f31wZMxzFmpSVUkqo", - "4u2qTnf4QVC8PcgNFPBwY2PwdkiMa4jb3KnNZo4zZbtV", - "4u5EFwfcHuMRBJad8n4vUYu7HQzKHHkw4VoUPyqykUtn", - "4U7KuubEDSPR3YY1YjmVjz7CcxVgrdz7sz1svUM4Vx3i", - "4uERagALHEAGx2uwndDoYn9WpJ9D1uia7Z6vuMpvWxuQ", - "4uEVfScSwhSkp9C8B8zqWNKJQMJ8Vy6YfxfL4fuYxUo3", - "4UFZyYVmsWiSQtNEkXh2NannKFEgtSsAFuEg9WbsMSh9", - "4UggjPNkSEMbGV4eBfB817DaYFoYZ1HKgSB6c8fQ7qAz", - "4uhw9Do5iqRDC5dnjeDcqBjzcQBY3qGcS66UDKzBQron", - "4Un8pHPkosqAkRabaxhA48YFbji5sk46ntFAxQxyc4Lf", - "4UNbqkwAHKVP4kPKHBWFkc8YwDYZAV3WszKUMqFeV2TW", - "4UNcH9sxWUo6bfZY93gmPiGZNssEgmG9Ho7C9ecjMv5N", - "4uRLbXGfaQCQPf1LE5byYZoAWc5PQqKdWpMxxJLU91JR", - "4uTFyUuUYnn5yCheuBGVwKHVo5Adcy7z5H5rejdSgaHR", - "4uVzFAT5ZpJ6cPo9ff7igWCT4MjcTVwETqf6y29YBzgE", - "4uXyHNPLMpdjs38aorfRUCLarbh5ydhbv2FkZwErBM5j", - "4uykzcDWW8wnVWMXXgh2RqXaddSVsx8TNvpJV7eACXbz", - "4v5dEHTVmWTRzP1L2PijNr5B5nDVUk3wNy6eJ7V8qQKQ", - "4VApjnfLyxA9WGY7XLP57LkvMbYGP3b8UVE6YmdwuLyK", - "4vAu8eDW1YGVSQPMgZqAVjYDVFXJQPtVYQaryCH26yam", - "4vBzeKdLY6dG8t8wF1rvQni3vtsB41buyWxnNZ4pQU2o", - "4vDoJgjaTyQ9uRLyCfVwb9pyhAZQRcvGNosvYaJS4eux", - "4veSBAABaESW2WpnJzcdNcduopX7X1f63KziC24FhQee", - "4vgoKb76Z2vj9V9z7hoQpZkkwJrkL1z35LWNd9EXSi2o", - "4vjh7yQwHr9b9kXjiVXtGogTDJWB7juVtKRAMv4z5RU", - "4vk4LaVDQdZyTvBib5aYpYMMak5VG3YDK1fWJZX8Pjsm", - "4VKagE49b9cFLte4ae3J3CpypwhSa9PAMxo9232Y8fe9", - "4VkhGErT43QMDxoUmhQKDdazN3kYrDPUrFaiV9mawqAE", - "4vm39es25BnUpDDdRvsqm6e2Q9PjfkapdVTL7wXgKGe4", - "4vXPjSaZfydRqhnM85uFqDWqYcFyA744R2tjZQN8Nff4", - "4w2bJTcwW1bCd9yf5buUiTXUvqppkWX66mzwpp29gybv", - "4W4FvpD5KWWE2ouAz6GpFbK5DDokQm1xFzxZ7HgyRyLD", - "4wCQnuWNLhpw2w1MWxH6Tut5CsRB3FHVnSM6sPhhwwcK", - "4wDtRXo7spJPMeUG6QpnodE1kDYzHVc9hP1fiygf9TgT", - "4wdxydtiamf8kstwMhypL1SaoWPb2YPk4QEzjNN9dQUE", - "4WH3oCaDTvGJAWPFbW5aYGLeZRmZVujygF9tFGR4mLXi", - "4wibT3LW6gVrRGjNDk1iqRh5ketvtHsQohDTcJXDHSx5", - "4wjZmBoiwQ2s3fEL1og4gUcgWNtJoEkXNdG1yMW44nzr", - "4WkMVnmyoWuAGifnmqdWNtD3nudHp4hPPqvnyUHLkGWC", - "4WmqSxqXTvPyV4GoV6tEesSyKJ1vQtSeNCLVA11dhzqP", - "4WPa1hkBxCBnHmWWgM3yt8TAgA7Rtfow6SHPy4v6yG4z", - "4wpWduGYkqgZLrUYFvjqBRhrWT5GTNYakBn1pfCYb2yu", - "4Wq3Y4GUzsJDYBeWAoF4qS859iEsgF7JwYKHvMsxgRbJ", - "4wqCkwoTyzx6vXdneFCs1qVQnRweLP9MztivD5kaWa3N", - "4WqJRSWsZ8hqsECAZtuCfKanQcouW5P4J69Bd5NcDCU4", - "4Wu6Y1x4kRQEVNNSA2cQ9qenLZyM7krN8sW5zvq6iuv7", - "4WufhXsUhPc7cdHXYxxDrYZVVLKa9jCDGC4ccfmuBvu2", - "4wXEmwaky1Wx3rAREdNrMYeKcdSPEbxXTT2nc8tB7iUb", - "4wy9Mdk7nrSgB8c8iZk7BXKSHju2TgrQ8yVnGCzz471J", - "4wZ5BRLgktssyauuZcvrjqTqWxee2snuKBPLYxLahdU8", - "4wzMRMkkcj8G2ek8NWaF2xkRyt69yuryKh1EAEA4RTvp", - "4X1qvzrv95EfE6x3i13iokffWBLQGT3t2ZkGaKmERX7r", - "4x7HEA12XAiqjsM5FbWkyNnwKfqzSDHWA1XA79uFpzGJ", - "4xcmpo8TwGXEPMYYUBkuXewtNgHKGd9oSSP7H8YVP1ez", - "4xDC995HpjyWDSs7QVduSwiyjxfeN5G3iKQ8NteCJVoU", - "4xhNm3JCK8ie21VcUBh5ZQ76THnP8tmC99JWa5KUWMEU", - "4xiUYST6iL2NY2xbLTviX1ddoNeRR1gWmJMDTy4SbSRK", - "4xixg1DgfZEHxvN5Aw3SsrVRTaM9ydZ7pShzJaEmmFzV", - "4xjQ5EkzW3EjN4f9Eb6Cyd3ViC3fCoxT15TfJ3x5bHeb", - "4xmcfmNu3THqPPx5LkWqbdxB8TqGPGmWFG3pSRY3osVw", - "4xn9oRzBeLeA7B5cZeQyMmSA86qom1V6hHu1Nb66oNUa", - "4Xqmh7JpjaFj5wJ6tNGbEY8eoY8U3fPMUKzfQXcGWiDR", - "4xriVtaCftbV2esmuVbuHQz5vMoy1Zs2UCAjuivsRiWL", - "4XrvJc7XWmUyDbw5uruFkg5YY7hCxxvkyqHRbNvQFPGv", - "4XsRZ7poc5SEeNJx7d5C6WgAafMsgdns6EpsyPcXubBg", - "4xv6aEhBpGsnXStV5GoxEdX22p5uDzVNFKEmHaQUhPnM", - "4XWxphAh1Ji9p3dYMNRNtW3sbmr5Z1cvsGyJXJx5Jvfy", - "4xXLdtcn77zLUu5Aicaztmt7fYswvPjwVHQGszGe3Eez", - "4XzsswVygYbd7LwR3YumDxgMxmvA74fx7EqaUJj2dUAJ", - "4y1yxP8S3k3xAUGd9wLqZyPZvUfFj59GJxAXLHQKbkcY", - "4YE3JtkR4T2zuapPvRCYTQ8oxPTyviL8aDRmutQwJj95", - "4Yfs3N2q2GvEidgCAycibtCbXQduZ7Csq6SNCnJicinN", - "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X", - "4YgMr916Kir5EchATu2ExDonCx9LQqPYEGavitfumWcf", - "4yhcJi5zWuYr3Xpjo5S7Z58wNrQy6jnPqxrHZyYFVi9r", - "4YnyyyBedfH1bJzT1GAPTgVACh2AkYgoDzAnTXWrZYFi", - "4YQg5iV69BhvgNCfJyJ7ZU9Jt8oZaroHa8iuQBZD64W6", - "4YwggABFMQAryFJ57R5mH5RpBtHHpQy93jRKMSbEJGvG", - "4Z1H7YHsgf66YyPvBBEw2BatUQnTiJQXJWkAEtsu7Jp3", - "4z1JgGsZAowHd5xoPfHe1iP28g7fpsgkjR4H6SwSMB9X", - "4z3zVorKFWWD3ULZ9X1XVcz8rYtxKiNE5AQtSpEuYd84", - "4z755TDizaUVyRRKw7y8DnTnnon8ksQYsZyU3feF6yFc", - "4ZbygbNLCxdMa3EZLYBuQHF4zzfCtX5V6xJAVSZncnjS", - "4ZD3xAHfPcYacfZEYmAxS7D72UdVFhUUe5XLhEnQfSCD", - "4zE9u54ZvrdkbBFS6rWVEx31abdH7GFoRCZQd8mDiiak", - "4zGn8juGaucRTNKdBCxjHifduJqMEDE1bypNuUYhz9d9", - "4ZhMkezDZ9ondy7J4QrHYgUo1YbCdQuAJCFArbzLBxA7", - "4ZQVetwMkvHcvqfwWKSutV8G564xpSJ1GfSCdi3zGmmH", - "4zqWCVqW5Z1db3oWvSk3bg1ENWaYHCH2D8ptyUuG63Rv", - "4zRm55j5uv3r3PULcaT7f3GpHURfw24KEjf3ZvfXY8qB", - "4ZrtLrxqtpQE4juoSAsSmQKgeZLkEdiwi7gXZ8hWsVF2", - "4ZtE2XX6oQThPpdjwKXVMphTTZctbWwYxmcCV6xR11RT", - "4Zto93KdBuynSnyyQct6ecMVxGNrjvVHe4CbWJTtvLSq", - "4ZW7XSxQSDsginZa1frHib4vAHZvUrEo5bP3dFRpBUex", - "511pMfd4oivn6uE7MrcJ21hTvcaCtwPGTLgnQAfopir7", - "512wm7UysDB8PNwWpjMBmRgYHdQAoj7o6EDJ9CUyK2kb", - "518q2YT5TjpwZM3sLSTk58VVmdYkF86abh7GGyoUaHZ", - "51bzJFuktFcdNRQ35ZfSjJupHpLj9nVZmNWpQ6JNbmr5", - "51CzZXzKKF46X2xxmWHyJdNk8cQ23FraifhkGN1KNvx9", - "51LAS7DLKsdyHnbcehvEASioaMadD5PqcVaeVhKJZRRD", - "51NK6qnuLUCRCVtbzF8egSkdkKd2PsKxGAzMPd2ntUkV", - "51o8Q1jvoYQQdSitRz4KEjKAKUzr7h2rEhGubiCUAASA", - "51tQJUb76g83KRD1GBdtYq9NCZdrgRrJ2Nva8gdLS41N", - "51uBMjsaHrjZdHRGvGStA8aQL4wBohmBpU5hJDzn67LK", - "51zC6tLyVRPvHE1p561QAynQLW98rcQ5YnuKhDtNvJx9", - "51ZNQzVp3TnYtFXYUDSQb8mtHfENogTje8yEpdBVy3sd", - "52BRUPTkXdB1rQ9jsZEZpFZMaNHHiq1LmvjzMYHF2vBL", - "52GEvaeCcEyAUKrfoPcey6vdyw6th588nYPuCkn3Kxes", - "52gX6aMESU8visvPwFVZBCxrPSkA86fvV43KkLUK56xR", - "52JQ5kmWuUN5ZVbWMJjJVpd3raNEtWRJMgxWp8J9mdv9", - "52MERCkzgb4icyneihfLaeaqhWZYPxYH8fyJLEddnYXY", - "52mVLoWhemu1y5vAZoTSSCk7M4BAxroER2M9H1TiTGPR", - "52rpdXBbJG4ChidZc1BiMU5JucsJQQa98zZUEUaP8Rwy", - "52UrQgPQZn9e4kHAGQY9fApEUEUVaUQPFPPHDj98gXNs", - "52xSR6Fw2bDqWwLQq2ENGjnLBUTSbVKJqydVteeMet5f", - "535U3W6QPVwL988BzzHedsD4ZSsMV8Ey1m9GWJ4SVm5o", - "539qUknZH9CCR1JXzeTq1Z7W9skuzy5FJ98WXrqRGhoj", - "53iZGy6DokKNU5FHE3vfFD5WeHBUJ9GWEwR3yidwRnT7", - "53nsRuA4VSjsfJLZJLArReTMhgnPQ3hfKKp1eRCkpsia", - "53qqt9qMGxoPUHsJPjdiqPRVKzeX7bZy5gqyFhk8o6xA", - "53qTt3wgqZWUnQW6gnBBsR2qCkGty5u9jotJVbMS8MJ1", - "53RoxcM5h44gq62q3gJ3Hx5ah1RySN13MktnPiZeETQJ", - "53tyvtNErznMfEMAuEtT7EkApitDtvWsgyKCpJvAuQ8e", - "53XX4gHmYMzYuqcmcyB4kTaqb6paMpaWyABzjqc1Apn", - "541FFS711MDwNfMz5k5pWAd3VhFYYvCuDPQqxLEsyuEL", - "545iqMXeXkr73LXcpWnjBGax99fTKHdWGzXy55hVN68e", - "54a8nyFs2i7bopqRi89jEmtmTepbzs3c572cdSXnyuWY", - "54FYiC1mqNuXYtoSAHTyTTS9rNG9wVuGbZHy5yBagdYp", - "54guYex5SHJJPa9KTYyPGe5bG3L7eV5ANHfpXLR7cdjw", - "54Laq5sUEr23R7LFRcuzVz5Z5EX51YLzoMB3Dd4FDA3i", - "54TmEC1FFPJtTC1e3LRm4WNYWdNvzjcz8s76YbKh3hMG", - "54zWvpgqxUaehfxHjUJzPduDJyDKk3mu65J7YAadXop4", - "559yQGEDDMpNZpXi1RYw5Sm6vUGgeGkBDMGs9Mryp2vn", - "55i1GqJmvhUen6mJzDakKutQJpoJ2fChcR35UKG8FtFg", - "55JeJyDreJBB4mA4shRCiZjB3qrgKcrQTeQKuhXK5UbH", - "55JNdm1xuVSBZFkpc46qCrhb1zWekc7dxhUqzaA9cgay", - "55Lg6UHaBASPG1AM6aFpi4JZizPdEVcHL1fwCypVWQap", - "55nmQ8gdWpNW5tLPoBPsqDkLm1W24cmY5DbMMXZKSP8U", - "55nPuJzmpyrMQCZciL3LYhCVjnA66r5hjMu6QjjmzgB2", - "55ofKaF1xdfgC9mB4zUhrffdx7CVoxTbNo7GeQLyj3YL", - "55tZynRDphTaxtH17x87FjcyJjCHCch3SrVxuanUJZmd", - "56J7p7ko1XZSAkXJNqpR4gMJADYNfzGQ7JHY1hvcPSee", - "56QxLGzCDGmDj7YbkSJMSM64frS1vCDzktiJGr4JEgz4", - "56ukeBzKJGg52WX6Nty2V6aEYddxxd8ikfXdw6PXWidn", - "56Zc7i6DHP7BKWAy4onLkg2sDqV8U9TtJnWkNx5yQhBW", - "575Ga67zRbZawnHKascsLxHnx2BN7uooP9mygrr3HNvN", - "57DPUrAncC4BUY7KBqRMCQUt4eQeMaJWpmLQwsL35ojZ", - "57j2NRM7CoLfEh1TcyCpRb76SrrUDHfjhRVhd1qSiR2r", - "57Nqrmi7wnUsvBdrkSpyfJHWic9dJqw1KpfgYtmx7XzR", - "57ts7F5pe1iA6i5YJ459896KzTGchQALzreHfo8YKaTZ", - "57ZLDBj6fwDJLEP25Jydqz2Vaa1PVY8ZpWcBuiccnEwT", - "586jjL8bHmqtNTFaXpajEJxY5mLnQ26e3QTHcx1Z8i5c", - "58DB3s31xbebRkyW7cWeiyw5Fwfe9J4h7Cu5TCDZjKAK", - "58J9ucd9Qc6gMD8QHh2sHTyJyD8kdjHRQZkEAyAZ72YA", - "58ktQdWmK3D3VxX1smCXhHGKdNNEJ93PGpXtX8RLdLHL", - "58LZCrAp98h2tebZq2Zpzs8zQJ7gFqyJMsBUb2J2CVM2", - "58M2W8tybgWy6pJVqk7tT7YF7C3rmUxVM4MWN7LG6m7D", - "58TCKmcpy6Uz2fDBKgnu38nThLUUuQ61RtTdhqTxRYwp", - "58tdgtC645qCrwLd4hoa6C23Ey2VzQqM2VuB3Q7GFMeG", - "58W2ZGogyUxfRqisBHJKTVS3AfAzy3MndqYDQXnxakfx", - "58yuDmoE6A9aeY6c93AGN7JMHxTFiAW9UayRonzGyuMf", - "59dX9cuUHMmmJDye7t884rZ4KwmkbHDWcLevcdvxCytm", - "59gDmx4qepA3wvyfjcSSMb66XSCtttCqGzwvLuiseRmf", - "59q8mSG8Zd6VG3eTeBtTUJuYqJuT4EB8DKrXf1uaLcbE", - "59TSbYfnbb4zx4xf54ApjE8fJRhwzTiSjh9vdHfgyg1U", - "59WHuha1QunWmupWhFA4vr3WMUe8BLN7dc8HUsJ4YC86", - "59Z4z1kQBZCLzXwdmcDx63H1gx5cw572uZndHTffyTjx", - "5AARPx172T3bpoGyTn3pT5c1fqfvmg6iXRFEkd7Khk6n", - "5Adaryyuxs39jqDsoke1VgUh3R79nQR53JRKBahuJSA4", - "5aDXGHTMrKNumDYitCtL6NgoEMDXjj4c7qKgDMpqEbus", - "5afxmEZedsr9yZPkP8QFQwCGyTYrJ3YZ5oaLLbfqgGVk", - "5aGEHgWCyHNxCcNMHP5TDddUkT5uXGpuwBfonE13jnMB", - "5AGFPAidurZA45DFXc6cERHsvkdMKohXdug7bBFoCsd8", - "5ahS9MsHjoExS6sLDgweinHVAASpSR2CVqN4CMD8fwPh", - "5AJ4p9mGWX11DiwwNXhq8T4LKBwLGMYhbdFPQzVQvPt1", - "5aMayQwEmWD5J1anZgavXF7G6ZczrWG1h6UC6GJ11YeV", - "5AoBhuRhPEXeRgQSx2BHSG7L7Mj7iJEAfADkSpBPUU7F", - "5APtJpidysCuKZCQQ49D2ba86NPNr1UNkGiDaehmSLSL", - "5AR96kgfAqDiwMGw5oypoZHNgEuCTDFfCd8cPBY8uAZ4", - "5Ax3fc7tMx2ZevU18JcqFaCqUef8J3oxoLYksW4THQJ3", - "5ayToo8nsRKzFUARjZ4Vcnwjwn4qaEJBjZX1fKaU2pNi", - "5AZv58Cya4MuZjVRrKbtiVeHJtLMf7L93g6e1a5E7Hzt", - "5B5zutCiy12JLoi6urb7uX9rZzwUhYH4VmiDobMB42dU", - "5B8dRstrVg4NXw39yswMdr6ETHCsbKaSbWCAxCH6gofs", - "5B8WUcZnUL2A7ap4T8HrpNkt8rsxwfyRwBy9YHGTWNjL", - "5b9SxRkai1kMV2BNccqdGPNWEYiioqi1UZRTgyfQytam", - "5BE9p1o4bS5zRNYnL6wCtmKBBTYeSQ8zFG4dsd5td83J", - "5bfFCNN7PEMuhj6e4QNy2VraoiY3Qvo4vejsdXVo5nXf", - "5BFP2FY7kdV3ogDrKf9UtKphrRSd3kNGC7p3q17i5rSR", - "5BgjKeU8bSLJ5hrTGZXD8NrqY1DYYJFz5dLnD2EQRuEA", - "5BkBF7PFqevn3u3qiasRDWikmxTK27D8DCdg198G5vFi", - "5BoHz4b6FCTg527a2ufjkkRWTNLujRsH7wm9DEehBegr", - "5Brx6TNjAkzQ4JjToEdL9sZjcFbNpGQRBgpbNFzXPatk", - "5buj3kmwRSZSmGPCbPrfbFmYZ3fHX1cjNe7KZSJPR8s5", - "5c7YoYxtKLC4EyiXBiREB8obfMyVME9zRHVtuMd6KhfV", - "5cE4fm2jvE9JVMyMWtKTAEgBuazbDkCMnLKqLQQYTJtZ", - "5CeNzKDBoiSuBSU9CmweJGPTFxZcofeGYfFWDjviwDCr", - "5Cf18uw63TPsS8XZ2gHiQKzxPh7i5axu6knFfAXFDEUe", - "5CFJAvLxMZ1G2dNh99iidBRM5L5W4Po3Rzg8qnXxmPP1", - "5cFZJST5tGLL8Viudh7YGQKR7o79A3cMeQhp6tHtJ7Qf", - "5ciLz4FfhhGZnoGX5hgjnKzL5xdc1iNqmczt4moFTQu1", - "5cK8WPnW9Q7rfTynaHTGHXHNRyZxHHT1iDH5LyPeaSQe", - "5cNCJuzzWPmSXyqDEhJL2rD74Xaf649mujFEPm4UzaJp", - "5cNEV9dx5Puuwp2GSZsUwUchCGfxchcxS6rNuD6yNGEh", - "5CnsHfYDmZg7ge2Eo4dgqcxZXXkDxyks9uzZ6wZa3ura", - "5CsDHayRT2XTt8dorK33Qim8AZg9LGDRsPYa518VYPJG", - "5CSLZeDZc1ghLSAG8LSXYtrcWCHLGLfp7i3ug4tczaMB", - "5cvDF7D1YfMQsPwUM9s2Az6oyXPFkZ5zvSN4tHu5PiBB", - "5Cyf4ZdGqqwpiaL1qzdytWVzrrzWApcoXwSRLLbzG8sq", - "5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on", - "5D9gMCYBsXi6FLc1AVo4e4wru6WCTpRx9JkjvacW5Xnt", - "5dB4Ygb8Sf3Sssdxxrpbb4NFX9bMrYnieiz11Vr5xJkJ", - "5DEi8u2aLkWda69nWFursQnE1MYfz6uGXJWoo63ckfUX", - "5DLC1TkZXLTfUKGvo6XBaNAop6unVWs3LwjBrXHn4F2i", - "5dLMRyPWx6rdPGZpZ7uuZiqry96dUT5yz48u62Gzugi6", - "5dNHiHgRGEDo5hgoKGvskRoDLR7ojEU19apLzbTV6NFx", - "5dr5yfrJQP8JGgtUAFvvcKK1d3E3V4nsQ1zNT3tG3YgJ", - "5DsrdX4xPok2YNHUEtQsRuyAkDcdSBPXM74ezfRgy8Vm", - "5dy9rxdXKBwYke7mAUG347YoGB2xmbFVpPaKA3tur4vj", - "5EamRRDR1j78iE2Q1TUmoDQRw59m2GTs8QJWtnTZsKf8", - "5eAogagfWFAgD3GAibb5J2kdsiqfhTQk1SCu7u9rr1bS", - "5ecciNwB5ELe57wKsdHnpbGDsDcbP3cTbxv7efiVKspJ", - "5eDoqvce7CCs9Rjnck43MGhvtGq4RwwNCBn9HBiAjoHi", - "5EgBAoCdu6r5BcrntpAW2rm5j77nSxJeD7oMDS927hxq", - "5egKDM3Sjwf9A5tztW8gTZiwNW2cfZm8EQmHQTUYPkmR", - "5eiHbh7oTMByatSxoxtgpNfu9hQj8kf1Ltyr83bFsSd9", - "5eK177B74DazJHxUAT9A1HXNV72qhZkd7LyNmRiStJnE", - "5eK55P2nxeXvnaYv1j3KF6HSD8rtwSgKEXhCEJNB2taT", - "5eL1CFA3wgfY8BY3e6ZYvQ6JrLomTPXYo2bHiyZciq9B", - "5eL6EuBi3bjRJMmqqxLYxxJ53FjwtX75zkA5MiC64poj", - "5ELd1LtksBqRM9BLVsSpnzGQN2e7mTmndYnxrYe6wasE", - "5EmbiY3eQG9jisHSSY7ke7eWwgmq1z79EZB72Bs4hwrh", - "5emhKzGCgE7xjU6AVbnwSAcgXVJihyGkEE5W9QMugAHZ", - "5EmmZ7afGJU9jxLJonPfnsin5GA9JyWrB6W8x3TafPX7", - "5eN3d7DCLNyXCGjn3tL7Q8CRcx5NUijyo7eewez5JbTB", - "5engzVmhztB5PY4gnJCSZ28XSPZ1M6PuY63v5jiXwQyR", - "5epxMvQKEHYAaZPYVxFU199YMty2HAk3XpAimNoqo6qv", - "5eRhKBEPo6JWkuUfxcxAXHCmDeNpZGWc2Fj2CtGoAgxm", - "5ES3gXBWNRzoWZhWwTWwW1Em5i4j89B6ZK49PmNoXJXS", - "5EScUmZS2wU7QTXFy36YzPH6hv6Y4nZsTJkaCpzGUEcg", - "5eTMp5isazSErFMTU9V1QQBeaYAVVm9oXyLoKRxh4Mrw", - "5evLgbdZJG6RrZzeW5UqRLEUPjziqpPXmMKPNqdEmxWi", - "5EWsCsKQFaR2nQP8D7ktUWz3MSfKR7H2f8zmRBi7EkuH", - "5EXY7jKDuJPYJYRE6Vo4UZfSfMW7XWaRf4R6j5BXunMF", - "5eYYMGFzw3xXX8pMgbuLiU3hRMSFcLMtufhBBatpVyQ8", - "5F66zrxy7yMms3XJ5KesefaUpHtXc8YBGj95vE19GKKv", - "5Fa9zxgMJV23ShcXDYnGiUstjzeTNgeDaGDAYWBmEK3R", - "5fcmYHLur87RDZDmdXi6jDEuWKVeg9KcNHBu1UNqPjHU", - "5fFFYMWWZEjHYCpNmjqgpxbMiT3DxC4jskDchytoeYLY", - "5fiTFisMBmd1ykZMNPp459VRc7LXueCgAprvs9Xo2Chy", - "5fJLCFaKYx3zAYETeWZK5vMRhQuTK79gpVJK6RYyRuen", - "5FLt2q4cZYcU5tK1zKggbGV6379hhZFKaRWMh5q9Xpc6", - "5fmEz3roE8M3ac3w7XZNJpcinPPwqGyCWiCy3PGvHWFF", - "5fnyGEnVu3nyMrUysGQLXz38QH51VNtmYGSA99197xCX", - "5fNzsJQxTQ93RJUgnGjvCQ8qjtYDGXjVMM8ERJs29YcG", - "5FonmVo9RrhU8PP3i9PXtU2tJh4fcvBfz1nEusRraVKi", - "5FPQXMJxXKJmuShQCiTRYPzXL9LBfgphprhXR54pr2eu", - "5fPxg7kEtebFi8ZKvUT7TYwE2WYN6EX5aifeJN4omAKP", - "5FqGqNk8em6Pu5gYeR7fSTeo3LHxhiXTw4nn2t5J3djT", - "5fvzu3w9kogHHVPAq1DKYoTnnVeT9dDEiEdGi8J7zev9", - "5fwPyb73WHqi1rFtoXcKogZY6pgXf8Y9SmpfwzW7gugx", - "5Fx4Zid8QWaXZHi5zy7pzmYSdMAn6JTwNPcZTvW2gZcf", - "5gaASWLJbeYVk2Kd6shQu7JMVfkXHnLNwiSje6XrazyN", - "5GftYPpZU6r76FCJ7cn9BNGM3gmB38CRC4bfVHNmArA6", - "5GfWiBPZRm4PTDbJ4G3PHBtsFUfNqJyQvgT6ARmVytWi", - "5ggCWV7peFNg8pUzG1BCrYvA9uK2KhcsfWS8oR9UXUvy", - "5GiX7EzEaooty8he3EJdNsLc5sqbT4iMe388cZfCgqwR", - "5GkNpbXuCdQmCzE2Bten6UohHNybhCUsFybcvRNJGQLP", - "5gpRDdBffGa9quGE7hTPVCg9zVnHTS26qvbd12G5kSS2", - "5GpRTdiaYNBQqqW4g9jXXG82xkzoo1ZeLDuTZczy9u4b", - "5GpuoxTd4xPSHJKY815G8bXwGqS5sLud9YK4BF2Ts9HW", - "5GrycfarfnDuiKSfrw7XwWFKpfJekANP1RwrfQtmVX5R", - "5gYY8gRdTyLP3TyLgfaGBP7x3phoCjUrRRz5JaxCeGEF", - "5H3sMCaSJdN2k1hyuFTzq2BrZHUq7CinTa82hJS6EDTf", - "5h8Wyje8MvxnHvuWfSxe7mHt72J5Rrk5KCiKiyGiSsVb", - "5HesTtwcPEEuydEKSDemdnNvdWWGZZd3gKjDsPcXvY5q", - "5hf579ogPr7S9rZU5oydhY8PdH9x9toeyJfEb1tUqM2o", - "5hH8M9u6wqETtDiD8qF19s8qFs1ZFZQA1h2pbNTUZoYz", - "5hL4N9qwXwTgiEndmXSmMdGPiXUQAfSGyZ1BdTcWikDP", - "5hMFHiiw5jose8uf5WETVme6Wp2fRBt313wZMAAadMwV", - "5Hmni9BrQHpuTgvGp4FV3URnDKxpfaCri3wfeLwFUJ4Y", - "5HmxuLdZUEm9kAxtRFcFgfB5Fb2h2zoyVwxdpcWKXgE9", - "5hpMWM3FP4F9A2WcwZWHWzBTvcAmXraQWyvUy9oM2L8X", - "5hrRqKXNkRvrNgYxWNf3612UVqKjSsoowB9Z31cEEmWr", - "5hUYRWHLLTuCTiEiZ5AsGAZj3pMMTzShmsZV83NJNuBv", - "5hvJ19nRgtzAkosb5bcx9bqeN2QA1Qwxq4M349Q2L6s2", - "5HvK5bZenxKmw4GyEWeEqbDgNdUasG5nc9rgqQUNEAUm", - "5hwtqBGMzoat2a7dzaPXMLKNPZUcsFm2jAko8Kx6tJLk", - "5HzgBj4PJ5YGabPq8Ltv3X4vomeFzamyRASxDnNT11nm", - "5HZqgHHKBe5Tf9o8hfmmGGkxymYcbCwLmEtU6ZkLG9sw", - "5i5jCwS3eEr1BNCPrbshichNo2nK6prBtZNZg7CtihZ1", - "5i5jMV1yanYq99FLWag9FNf1TqQd52uUmcao7HfEnRqL", - "5i8qiqZHy2nZzY1Ks9tNqDco1UWgMCAeDp8jcemtWQfG", - "5idH3j6ugKTqSx6WHZax9LmVyu3MQ3sy1zsNqPv9mEgh", - "5iG9LioyqQpRGRLoVEPjasysA7AWoPvtQxvrGipo4A1c", - "5iGamM7jS29c32paSuNnBWANXcd8naqTWPp7kCcWg6Uv", - "5iH9q1Es6AnK8mg5iw2ZXNHSfMpnmkBD4dXL9Ud55UUJ", - "5isoKqxB8G3CVngTkrHddmvjHhuKBiYZwLfWDufWZtwU", - "5itpzV3TMBTxdau3TNVMSjiApFj1GdjjarD2ioJTevrc", - "5iTWoXxGBYPkwjBjgtVg8Joo5nVzdG4Mt5F3c36fpNpf", - "5iwLdKs1d8yBiKeGDRWWcn4TipNKSo2H4hHLAsYDqh3s", - "5iXZxEffuCXaEv5566c1SBfYT5KsS6Gu1BkcZ5zjzijT", - "5j3oQxD5qKZoEn1RoVizZbMLgttN3iAyBhtEKnDePDCu", - "5jAKgxnCLVrb5zdDxjnRotwNirVG26Set4ZZ6BWC6Sx", - "5JEE2MaWy1TMY8Xh7HLK7h4xJQZuAGgTCPTv5Fg6mkUw", - "5JG67y7fFfDBkHHiqMgV2byMQnF5hzMF1V9igHuejeL9", - "5Jg8XRMaQ1FJbyy4YN3t3oCJeXUprHgQTqjysuUMQvbU", - "5jLVeSB8hepuqgReNhcNypntbcD2wi54JZ3pYY3PGrtC", - "5jLw8DGMmjwaCJWbkT3dksXVEdWrXzQtiBd2TfsF1J1H", - "5jpR3GCLYu3YrLuXFuzyxTARHHGRRYLggoU5LBqCi7u6", - "5jQqKbCAeYLiKK4WqppHhKBxe4DzDZMRLLaDhDQJ19F9", - "5jryRN1UWBUUFTkpLdchPE1sArgv5fAsFbXUmWEbp4KK", - "5jS9cmmgFnJCbsB2SkqWYgkWwTmek6pMrd8zTLQyjHn", - "5JuBtU8QeCFj9SxMFi5oivjpCDiPzPGt3HPERF7N7H8L", - "5JVhTYK6zP1D9cC97cHfuZGJFydpUzCAee65cM7tEqoL", - "5k1ooGz9ZPjGk8PbmA7Czgk4nS1Ns5CAKXSeJgeWqo2W", - "5kbpQzj1FEqqbeU2XrmEbC8gX125XQkdt9ZwYdBh2iK", - "5KdWs2Jogj1f6EmWsS86i9mhLBnJXM4rG51oGpgeNNWp", - "5Kev1Y8njZLiybgnqTpTnjZ2H6NMtCeSK6J9TeqhyZnL", - "5kfpZfMwrY9uKSpNzL6Fgwp1x4dwmwt4K8TLFU4ArnWa", - "5KFXF9DS2ETQVfUTAfMygw6LNbqiXWXYr4y2k1kYr9bA", - "5KG9uYHFKSmJVgvXys4dKkZ1iVzmsHxDJWP1SsAw9ahj", - "5kgyxDwA3pcVJ2fj5XRyyQRhPCa2L4PwFtRnkQUj13tF", - "5KjwhvyQZMbDKfQCSa7L222vxWqJna2sfRKLXTPEyEwg", - "5kJzfuCr3pSmqtbfHDGwKhHXKFy7wEuxjWy6gc3GkWqW", - "5KK7GDAws7uYezSUcugdVrWNrKNA9ooP4t57Jq5W1mTa", - "5kngWrWkUqrb3awS7MeYNk89UjdRra3nwHoP8KxVTeAc", - "5Kp7sqnh33ijQtdZaaswzTsjYBk7dHTW2ZiDYqzkmFbH", - "5KsbTKyn6pffaT498vTHUcpKcUD2uboAfCi2PYS1MZpJ", - "5kuVXwCj84keiRMVzLFkw98twB3quHMudHZ6WLmvjDuD", - "5KvEukvCt1iyVMqvu4DJXnfxq9qAr46vemoT55uWcd6", - "5KVWcidYpAYk2JMi3UoVifQNEuVpuDYp9iuHjB3Eej24", - "5KZRD6hDCZd1dgM9rJLweFFRkHu3qAgBhHgQ96Wz1VSn", - "5L8cn8DJbhec1WWsUzRHBwQUmTDh4BSNL5BNHtywK2XF", - "5LDDtScUA4wPZjCTLkXrKrpgpdP9XCLdqiSuWQh2cyGp", - "5LF5MEkfKo74aX9zSz8sqLoKv61rv6bu7YgoLLkwrqJY", - "5LQEnu9Y6859hC9LYcm3kxEn6TtHEZkKx3K2dNRYiebh", - "5LrcjVo1dDfexYSL3UDCdiGKrgSvF5F4YWfY5bwp3WKk", - "5LX4d8mpKxfM28WXPQ516hkg1dKQNgV5xKyvGm1hnZYV", - "5m28zJcp7CsTrH2szyNQhygvDis3dPwbgrtYsWi3J4jN", - "5maAtxiQXxS81kpDAdGvZGPetP9TvYZUxSTBJjAD46P1", - "5Mbpdczvb4nSC33AWXmh6wmDxSZpGRANNcZypdPSGv9y", - "5meXR1HkPZ8J3rvr7Zy3BYdjv8eTvYBoQ9Q6xi9N8QyA", - "5MGfrpdVsyifhn2x62j6PnBWQk2c5xTUK1o8KFrwPLWG", - "5MJU7ekXcjCf2sQq8BHUo99wxnPC2w96AizSUMhWZZeP", - "5MMzYzgm6FHZHr57JsvugZ7v8CSf3YNfKaHn8ywBJv4L", - "5MNLjn4p1bNUMRc7YP3rEWB5BQbzNsHYaqmQLwshAndB", - "5MQxg6SmZwAqH8rxQVP7fgtEhSHujKKjFEEvNyuFETm9", - "5mWoERLwhFoQdzUvn3sERexkutiiUvU25akekrD6KtXZ", - "5mwyVeNzQx6CGnNSN6jPMFdui9LDvmFQBHcpHNNvDrMc", - "5mzK8YrasVr4ZAzx4ooSGNEmkif89gU3t3XcSumwFzgV", - "5n19EKWctakYfrGKj1VUwX1h4AD1mzt2xfwXhikcLNTz", - "5NcDmfD53pKz5yw4Lr6JESeo3FkjwnSgG2Va3LkwbPMX", - "5nCpNcPuBRUpSXztV4kNbHEKaHTBbczaLx3bfuTyMgHh", - "5nDw7g1w6tu6AS2n3kjRQcUEKCauN78S2ySKgRJbAr4C", - "5Nf2PG2ApbsuHHTbwXU4DkbXDMybGLDtMe9EhSsGFYHU", - "5NfhZn76B2nizWj1LQwiNAdhVjANsLL386EkXR1UqYRA", - "5NGDyBtipSQSpzUp8xR1Z6mPuWjWAgiewEXb3UqyCGAX", - "5NgoyUfDLEjCzQ5Zd8bN5hvifoDckWvosotookru19CS", - "5NH47Zk9NAzfbtqNpUtn8CQgNZeZE88aa2NRpfe7DyTD", - "5nhMhHKgz9P7eegfUC8KcNhmocCZqvc4keWtM7PgRY7C", - "5nK9W7h3YWGiyTmLx9j1NvL6b99vso4yCFnP9f1DhVEG", - "5nKT1JznKMKyXFmG1KRgSiDbpDrDe6Qf2HTa2FRCj4RL", - "5NLjk9HANo3C9kRfxu63h2vZUD1cER2LacWD7idoJtKF", - "5NorYZBbtgbouD3toX3761ZGbaYTWrNSDNci4G4zV8eo", - "5nPTXYtrF8WUvH4RyzgLnkJHFBPCQFx3YZAYudN84uHK", - "5nR5ktqmZufaVuK8N8nNoqVrQqopL6qAnf7YNvsjynhz", - "5nrHESR5NsBE8zwT1MThieCR92ccMC5LmcczTetgH6Gt", - "5nrMoH3aQn9jkd2jKDUrMi1RJoGZyX9ENBfrdBG3RXDp", - "5nsfnUFNWkwr19YrSj2BddVYgsktCyNucFDnndk5qGzG", - "5NskpcupmjjAvit2of6G5XFcvTwsZdViscdCgLeDdAYA", - "5nsT4g9x7e2dXQz8bcaKgQz7ERP6XCCyNVm9vBXFQvQs", - "5nUy4R3g53WdtS226FdVWaVgXhJkQyaitSn1Duu15mXP", - "5nVDe1R4QW8XcaWrDUo88tG1V8CgAV2BqWpCX4mF49TE", - "5nvj4tHGRCRFmTaJfpjx3RUcNPtHv7dDkxMbc3yF8UGP", - "5NwfLh23vQKvumdsVuhADbNsv8LYybmXB6Fs2QsQChcb", - "5NwYJ83brnYDwQC8Hn9hYXhCiq6HQ4jZNGLZKdZeQHPS", - "5NY69Bgoaahz6gRVgG4Ub2PBzgscsARgAekLx34Mtcv", - "5nYs85wWMtkxdjpUKRCi3oVezLjZ59SAssc6zrLCrRyv", - "5nYzq8aVumz1eHkhPseuPMNGR2YKVTuoDP5NuUPqDkKA", - "5o2kjsEZDYnWGfTqBJdrBnRYKvRy7wjrniivKwFqyTsB", - "5o7YdtNhhyCg1sAQfbEpRWwHUHnHgFSPJozkHc2SbXXp", - "5obAGjGjJ9n4XXJheZBgs5av9Z3pUcWFN83F7im6awMb", - "5oBPhPGrCTHta55o8XybDBNTk4KAdAKgaSZmTDdPFpMH", - "5of3H6ikRzFtU3pxa4kSWj3hCPbf9LCyprJ1Ef4EZAGH", - "5ogMBk74DTpRaEahTtBrrsFN5mcZ2cfmZfPsJMhJm31t", - "5oHWyQwDW2gfrry8iqyxYsiSrNt3PsREeVyY9RZZg3r", - "5oiseF1H3VMtTPN6qT1ud8qVFcQkhmeSd2a6GyRrdkvK", - "5onapHVTMWNPVxyFfSDhU1jDnAj69HRCAfSFN1Pq6ZAw", - "5oR5dh1WTi7ACiq8bdYmQN84kDG4HDQuX6cjyJErgGz4", - "5ordQiCRsG1sMWtnedoJsCBWVvEAUcRfLfCRGqbSvvmN", - "5ospKBPVaLbFah9MiWQ8LGzSa47Xd4B6esxbUH4G6cLh", - "5oSqmTVaVDeAHctp3KiHoxRViP8sPo6rTNDtNfZ3fnMm", - "5otwS9TTwTRdvxU9iPgve7UYPsL5H66GhXkmweJ5s3HM", - "5ou1iPypjG2YoRhXnNv34yxbALVs2zDK3njaM2XkkRp7", - "5ouXk4g1KhSnhyovhNq1nr6a2k7jDCZne1MWKGSgv1mW", - "5oVky3o3pNbZfWndUBJbxH82ZDqaUx7k1CorxfisKWZt", - "5P13gLVsppzmDfjKwfg4TPgoeUeRV5aRXHmjEFRaGas3", - "5p3Y7UV2oZrSTTSLJzJknEzqQpetmk2NB2hQEKPc43dC", - "5PkhwmbJ2ap2SegbTa2qmQgUFiMQYXBbQXoMWD3NQqDP", - "5PkLbxrjFfF13DtMwqTGF7Le1pivE3uAq38r6AVL2goA", - "5PLcLnfnCzHt5eqktcNp7q8M4R1PhAAwPmd4Aq91EhDd", - "5PLDu8auwqtMkHW9zdPsfUcvyESZ45umFc4r8cWUw3Zp", - "5PNwvVdAMhJ6LoZu5eZT2SpATMmUf3BjrKyAANPDBsJT", - "5PS5gMByQfGhmYcE1tHgVqaCFQgS1CD5Pbr9oNHuJB1K", - "5pzJe9dfwsjdSmaeYAg43xyTsQHVP7zpLefhLsFxaktq", - "5pzqyoXaZT6ADEGbiziPL3qTfvSA1XuP9ZLXpYijp82K", - "5q1RCEHzrdyJLnWh91F93fqGGpb2d2Mkv7NnRSzkXN4h", - "5Q7NSHp6dnEfMXLfDSy1SaMTyBdFwB9JVQPgKf3iAj55", - "5Q9kG9Z7YMMjW5Q8k6XSwinLtQPLVojr5o4iT4djSeZg", - "5QAa4WEyAtEi7br4soyHSCHZQmxwrTbBy2JkWJdRPJc", - "5qc2fh5Fq1V8bK2wnghWhHaLZMvDPv3fnkqJAGNAUKG5", - "5QhhX9AD3PSKP6eZHLYdFGaWuyXMM3b61vF949edSrRE", - "5qsT9h2TuTMPLtX6gcD2DG6mcZwechxmWhKRFHbCt6Pu", - "5qsTBZQPAPYsCBw9aPC6wCLpyPua7VmK9yFWk8gLQaUP", - "5qTHP9wFD3AHnfnFVTbAq2RtEBFFpK1uo6oBUCPZiszz", - "5QVbytAAbtgRXTEm1LWV9jGi3gxXEVQraQToVuM1TYJZ", - "5QzC4mzVXVhjvDxWCs7DKHK9jhvYogXPd1ZM3dMQkuX8", - "5qzfWjGM3SLmbuEQVfiS9J3scxzPK6PdxXtxTVHKX85B", - "5r2wUp2VfobML2GSeWfVwCqxPVbrPPBs7mMSFA5Jt9ef", - "5rAgikfaE46jPduKrHDPMfcNGELD6UUyv5DmBXbizCqC", - "5RAXf8adjQVkjF8bdTed36rRbvCTLzTKZ2aRPhZkuR9T", - "5rBQtcXrfTo44RtxasGcYYvah8XYiVeyb3c6GRNVdwJV", - "5RH9w8khFN6duEkDeCujbQfGy6gQk9rzVvyPAoLvKfVJ", - "5RhzK7uqjFqE765DXt2RSM3ddbcpY7zsZAeR9DPdQhvC", - "5RjNtRvahP1EffnWBAneSkCn13sjstBaFTqb1KSJvyvx", - "5Rjq51GbTVY871gHZsLSknG7a2rqkukBxuanAJYDLVMY", - "5RNpL1xpppPDKhfHkahUAJQQkcXFihYc21LknL5u9UAV", - "5RRueMMAXxXKKYPvSYixSXou3HXvjH4UjkJzHa8ecfPX", - "5rS7Z5hQKEwuWWE5ZrGTUmjbG4ggbabNcvAwijz1SkcF", - "5rxRt2GVpSUFJTqQ5E4urqJCDbcBPakb46t6URyxQ5Za", - "5s8CNkSRpbpKBbBDKQ7eToXXjrqRxj1qGJsXrET3mt5q", - "5saC4V5Kk7Xr5zUUbQZHfXCrzFWyW9Lvjq97N9ydX5nj", - "5SaJrRTaLs7McM6kYW84oduwf4Z2bzU7vQQAjAyvdSXg", - "5SAMpCcejTXQMnbrtkNv6nSxqaYgjRbk733QNzc4teJC", - "5sb7bsXV8MqzLryd6GwkckLtufu4kocwVCNu8jgQVpkG", - "5sBNJpPdpbYrs7bqJ8DzbfJH5o6J1BHyjGHwUYD2j32f", - "5sC8hmqtKeSRXqbfAPruZuva89qmGR4ecAZeyuagr9LV", - "5Sd1ZKeeLp1mzuCAKUBmNa2b1TGP9fvqrwxVxuxB2eyV", - "5secgauFAumNgBgZRryr5EU2RujP34MqGokSdtrmDmpQ", - "5SfbibY864GSEPXddYihzg2uCYYMwvMVNjYiiyxwBGfn", - "5SfdF3pyqCxw4Qrx2Gc5bRqr7XKeSYZCvqevpEukPoWw", - "5SG59oc984B6VVunCV4ePF4Xm9R8baK6yCswWE6hhcRo", - "5SgFLV6bjhSXouQX7YhKSb5DHy2NxhHVeEL8iSTCWcNU", - "5siKzvwmcFpAZgG5WdzfDcb8ksdo7utSoQ3MhxcFj71n", - "5sjVVuHD9wgBgXDEWsPajQrJvdTPh9ed9MydCgmUVsec", - "5sjXEuFCerACmhdyhSmxGLD7TfvmXcg2XnPQP2o25kYT", - "5sLRnoek1tvdnJU4qjEGRwUmVNnMRUD3eiJVxPZ4zddD", - "5sneAcM1VeQRYz6c51KhLhUy9oU88zjjsfdorNw4cZP6", - "5sNVdzXEhxR2AQiHEKfhA8rt7NCRG2F7cb1ctQJT7z79", - "5SQETVbfWrdf8kXbMsxh8huRUnEMCLEnR2BRoM6a5yqi", - "5SsRqtR2uKVe9gMD5xWo7CX9kENc7ekwC7VJ8DK2gkak", - "5SuoUW1Gp572GTtCfobycqwjtPU5zqDXoD4SVt6D3bgp", - "5sup6mHFQaYAuV7AivXuPr9RXCLCns5rq1ThRrykpYba", - "5sYgdHRq16Gb67QnLppKRbD52UVCQLYBKPcMSi6CJh98", - "5t5yxCvtHxCkDJCCrChBQ2hdcUrK61tr8L2QRHtbnpCY", - "5tD4DwJG3F29gP7sAZWssw7k7sFZqxheGMmPjCqfCqSS", - "5tETGjtFiTuy4KRn5nxXLeyr8MD98PSySabra38M6f6m", - "5tg8erxzqYNPahFz8g3LpFHdB45gdEDXV7ETGmt86ymj", - "5TGsXVt4RuTHnoYkwz1CLMAztMoLsWb13xUDDAT4YZsa", - "5tK61n27n7csPw2Wo7oqNQ5Kcf8utHvT1oWTpWUHupFv", - "5TkQK1n2YSne514xt31MTCvKkDGjvt6N8gpwGu2Kd5LJ", - "5TkrtJfHoX85sti8xSVvfggVV9SDvhjYjiXe9PqMJVN9", - "5TLhtuxkDdN4Mp2iHeSEZrDzpZ2xZRiEdFxcA9ipbPJV", - "5TLrfzh1tXa4dPu13mYfaX1dB87Md1tzCCofes3VMNYx", - "5tR48Ewee96cx6MNBXZb3jNtTBWmMimYxqZkj6QYHgdt", - "5TVxsP9nduAZ9JbFNtaVg8JXkiaWv8nSpaJoZ8ZnQAvb", - "5TXhb2YpsXfcRY2X2XEmy9AH6zmAkosH7QBSvMSeKPZv", - "5TxopjoQStjo9uweyM2Ff37EFZwAWNmdMcsZZKWfzwsa", - "5tZ1cf1nymKrQ6oko6R9LQSGG2uJyMhgchbxXjdxumYa", - "5TZbMUkDaxxbyhkpgMQHZQCyvHAmsg9ZyDHf4R26qrap", - "5UBdwqhphJ54qRFg6G9iRZzuaSmbFmwy2KyE28JMLbYU", - "5UBF1VXbNCTYyuUJfeUVP8YBs6hjrPnH7RJhQRMNSapx", - "5UCh3FzaGJuX2tBmHvPD6LXNchiGretWwnB9LqVif3iE", - "5ueaf3XmwPAqk92VvUvQfFvwY1XycV4ZFoznxffUz3Hh", - "5uEkGVLEsWSYqg4p9s5YVNN5VtbW1cTZDJ2f9enMcKgm", - "5UiPd4U76RCBRqNrySintMS8TRx9gMgE1vVA7aGhhn4P", - "5UKd2nZ6pptgHWDi93HeGWQHcEwWnx6azStsXaaoZnKP", - "5ULHpStmbJSLYhke2WKwWRS2n5dVeqisWZJT4gjkNTec", - "5ULiDf5fbGCR4xPshEkQrCPZzuqWdadxVJAro6DxX4eg", - "5unroM4ZHe4ysnprhGrsHBUMsCbkfAHU1Z4rMtosbL26", - "5uPnSzja9xEXKhmAz6s9rpgKCBA4UBBVpPuBEPV39dbq", - "5upoVAPkDFVpXLbF8eZVyU9LmsJSbNPA1JM5DY1gCn69", - "5UQS4VAXpsUD98D2FH92NCNoAGJCFp3rk8aPE31jREjr", - "5uTcsQSrUffYo6RYSWj75SuGMkJ4v9x5RYuQoTc5aWGR", - "5utJy9AzRV9VKFHqmccvaAxdPEPKEeTrMBwEmkWka9d6", - "5uXauvNEZgYaQvFMTbGm5TYpz3WuhtRw3LvprjuQPyTd", - "5uy7h23zmpVvG4QnFV91ATJzW7PziYu13i2BNev2n1dL", - "5UzfX5eEaaErprkQzMo8GevgtseB48BtBwGrKarxLP1T", - "5V27wzmhpt22pZJnsp7YPCPBra399aoKZnwwAWwVpK8Z", - "5v73WvtsjSsgkctbH7dFZXs2imsxcCm8We1xcDxZv4CW", - "5vA7fod581F9YKFoDWspYbsBCu3C5kEy8qCL7z9Nfy7y", - "5vaCfp7UEpW5qdJYyVH4m93oMzzyzTqXdbr7xLGobY8q", - "5vcZ2tAziqSyZdJJgknngPW1ngnZ3R8bjSqdeb5mpCzh", - "5vdpdDS5vvUrPTpGq8zDWmirYheKHq8RWrQfUrbarN29", - "5vDqkEXcgNgZjpoL3FnGdA7vC3a8iNVBGDQKSiyZafxL", - "5vfvM4qv8UERxSU4qjKhcyJYgfvBwxM3zotkbyXg5z4z", - "5vGp1Beo9QsLtJa6YNjkXJh5Y5Kb5AR8AERBw3CPJrPJ", - "5vJ3E7UQ5xaCCjwJnF27dK2tr9vQjogzjqbhSUUYsmTa", - "5VKUeV35rKfckH3NaEvpVdRrZ5jgTcd8c4Wdu9HaxKVn", - "5vKzPeQeveU8qnvgaECkdVdBks6MxTWPWe48ZMeC6fdg", - "5VnVvdiKV17NdH8jzpZiEqcUNMWbixyWsyDM6E9vWnsk", - "5VpaKz1NAwHxb8yV6qnYEz1QZAJBLkwxHPjDC4go6azE", - "5vQmNwKqvWXh3aVcKZBryx2sqY7zZXjPCD8SC6b46f7q", - "5vsgvqZxDzDwrcA7dbm1gga2GQrnXfSCPJhSRszoghBL", - "5vtNLiiVi7N3WDPeHtaJu4CA1zyXBrdmC41XZktxDZ5d", - "5vtsQVERvpW7z8qtPrGFanMbeTYzvgEMwarHyMK1XPZt", - "5vxoRv2P12q4K4cWPCJkvPjg6jYnuCYxzF3juJZJiwba", - "5w4ciUF1sP15yxF5t8pWgUY1L5QxUsjcvFdRLgpM2Mz8", - "5wB72T7sRKr9jTYoBXiNU3PNrq2c2crPn7sjSaXUXae2", - "5WDeVjmNxectaRGw7Cp6Ri2gvy8uvQsQz5u4vQVzRsvw", - "5WdxyXnJfLhJMHGQEvPuyTErgPjxF3UYi9GweVnErxWa", - "5wf29x6Ws3NJRLxrE27cB5xi5ia8DAo3vNyKpX5Yj4dK", - "5WHkZe366fNEeNRAHb4njdwmqgLeyDHKznveYWiNftAU", - "5wHqtNZ15ZWMuDCMphL98ujWgudJ1cwFYu3h6J2p8dYD", - "5WhrU6gqgCwNBW7tkGsAZTB5bno3ymHVrmQb5yyxexBP", - "5wKA8fbHKdqZU16VSdgw6L32eFeVdKcbwfvvMTGFtBE6", - "5WpLja328MepVDuDR6NsvgGPnu1YMAfSW3GUn56i75z8", - "5wsN9Q4XLXvxjefK2tszV1z8DRKSXyGo2NxvzrftnDQZ", - "5Wsoefh27GUrYdNmWU6wFNZCSjXrTDopZ2aPWemRNzdf", - "5WzjWgxs7qT3fDKZVXYoZuTanhF78iqrrgjxCHadYpaF", - "5WzxMJDwAwaMPwc9Te8TZJrFu2QmavL1S5SCcPn4VbgB", - "5x5uu5BFZbNYjGUyRPEoR3bnErQ5HS3SC7TeohKtJjCD", - "5xaC2aY1gjmB45ftoN18PvfZwcz84jLAv4iQAHVXmQ8H", - "5xg7SrB7umjGBhBuNAZM4hc6yosPUYCUwcxmTz3gXm5A", - "5xjnsTJwtYXWNFPwV3DsXmbsi3oz4bZbdSukuEwoYdbT", - "5XmVdpaMy8kZo9uXK7dFQXcX5wXGH3kgjT4KTNgSJUTw", - "5XrnkDT3aqbCQexp9vZbjxNn75xp1wKpqP1vR3T5L6Zz", - "5xVTCAt58jH6i3Zkr3b3EDyxSP5CanqY2tRGT1MStVUr", - "5xZQfrpAyGzGKWoYDwGK2euK3T8xe2xSk51PPgFyL66x", - "5y4ZQCAkRHcBYMR27Pnnr6rtq1gUELAjM3n8Y8gA173d", - "5y7nx5znLoGLdaNeFhUuucAvLRFM3iEoe5yCF6HVNfG6", - "5Y7Rq8DBLwmDGgAUPKXyqJ57mRC33krMyH9dzMpuwTxF", - "5yA4iiDeBVo4sNtp8hPaFwYwux1nzrH4U39xNuzeSQ83", - "5YHzV1yFdkij3H8Exmx7AFGqK4Yt2fCRhbaPLGY3kdS3", - "5yLHrW8vKgZwdi4GTw3FvG2FboFxGGZynJFFc72JKXSu", - "5YMK74U3T8UTXe9rwkrJcMQaj9KNyy7Ge8LfU9r4Vupn", - "5ymorpdieFRBArMaA4pq622ekfbyFtP1Qs2i4hzWizpK", - "5yNu6CsXikmNGudTyac3W4Qm5n4ChFS35ozD4MF4M9ax", - "5yQJo8zuj1cQjLopo7E1ewY4Cv8yawb8zjo9fLhcKrbR", - "5yqmdjMVX9F64YuE97neemY6Q1s4MgVaBbJiz9g5qGiC", - "5YTKnU9AnAsGaY4uvSJTwWNZQVEqtVtr1KcETD1TqqDC", - "5Yue4iKDndQ3cKmbxxx1SfULRf7g85kuviXx8Denh2z3", - "5YUrum9HN7zkV4Gwm4mzv9hocBEyej5PpPuGZxikuzhr", - "5yxDaWGDAkYejY5ukhBRw8GqYkdGz7XUzPRfn782Sfw1", - "5yzDbBaEotX8ymphCJjq5w8PPbv5zuWgmcw9DAbvVkXk", - "5Z7ZfdaW98su8bfHpT4oETK4T8KY8sFUheHJnBjqcQQv", - "5z9kpN7JLo7HkmSYLA3dV1yTuwx67WWFg8FiDEk8kJ9o", - "5z9V4NMmHUC5P7pkLtUiDokbH1AK8TkLRXmbcKaghxta", - "5Za8eDus559NMWtNxwpWFqW4cNBuuVN6JRSCiRqdXhSn", - "5zELkZ6RECLDg4gi8sPvnGPAQbfNKUdSPunPh8HMNn5V", - "5zfkkRPpYJMdQG7EZoWSXHdVwFhZ6vtuXmqe9VcRYDWS", - "5ZGvzAT3sidrGqxfeFnkYkhDa2thu3Ui2p28ndJQHNn7", - "5ZimkW45n4mWVCqXsqEEJuJWvhoqZFX7iRBz9jtHW3PQ", - "5ZJxTQVTHcn6J64VwQjugDyGosCtsxEisvXfTsUSLXEF", - "5zRUbp1Dtu3qQaRVf36oMDaeH91D2ePnc5DEgnh1ivFg", - "5ZunsE7AHskadyr4DX2gYXoMsXjnRwRyiDp4JtWaSxKJ", - "5zXMLQRTPbDzAP3iNUpP94cNiCYNdfVvpViK8eBKfthP", - "61GNsPWMbBarQbHNeHLSGvmnuAARJe7qkDy8C34RU2QQ", - "61RjBenpvwGaqwQHMtMRW9GV8xaCfXjwcnpNqqn1TMqA", - "622EwbLrGj1zfuBWNtdQ8n8NkdiDnvS2vQthbT5o4F4o", - "623xHhARmxw2wa167ZhR4AGevhKJk79DfwzRAudLZErJ", - "627PWX4gSArNEYic2TCokrA5uohMcoAKziWBZYBcANhe", - "62efasPDNQvt1tmrRYoMLuW9gztk5njPBWonLRfYfvGt", - "62QEwdwaiem81k8jWvGBdoH1EiQP6TSt4VzYVTqPqwkd", - "62qGG53ki1JXnw2ANAngXZYpyTBSKd1wbKyjKmbmrs3E", - "62RDaC4ARQMyZhdya46zuvYs9L7TrR43KsochCnrMVm2", - "62SMPqGJCmdXJGScVAijTGpkrgv11vSXFF1cwo4iBbCX", - "62W5kQWnyibC4gQQu57p1se6r7i5jXoi25uaUomfXqgy", - "636aV6AEhpSiTZqC6uqqdzVYgxmmT1xJzqRQ4qVVb5jk", - "636LepbxdwpdKNpzuxc9vJhYLkhBQgBJE9yiwrbo4nrc", - "63gyLqhrBqy3Ldrgvq2e71Rb6frpy4XTGiwf4oLkADo", - "63ke5mcAep8x3pvtHcgnxuQocRkA6BBQSXv5fa6ifERF", - "63KsHFi8cZ8mYPAa3dRycoDBV1cds3UNGTEijLyf23VA", - "63Q43B6XzvrfbRzvvSxzos754H5f8i6bcxTDrmNfRqby", - "64BLJNVMFiiWjSaL7mRcWXYyyVw7tfcCaua7Ype7wJuP", - "64TmBCNgzNp9StawrEncNyz1TQWuPmGiGuDeL6fqkAvq", - "64TuvLWJZ5Urq4PEHnnToyGvsFwrCoyN8VCKzvng8Adk", - "64vN9NTyfwP6J4iTVgQcJKjXmJ4jh5xp1NB61xugEtmm", - "64WBLv7aftfPoqvGNQQQKC9sFwUkL7fdAi5drW58S1eE", - "653WPuEL9coTsDAcG79QU9eFrBjQomqg2P9o7C2ozHQh", - "657Tpmj8yRfJuj4Dd1oqdKA1Lo1aTruGeSkNTaSabHAJ", - "65L9FUcnmYoSrvJGYVoQ4JC3B3HEuWn53KrovHLhjn3M", - "65nFWn8xtSENkAsmowzGbpyQaZ9GcxAeGXXGgjtniwoQ", - "65okPpG5WtWt9mKcM4wqoY2sNXuTQbKUgqKBAMTUcddC", - "65wk6pzc3Svq8eosJWBPZNcy2VuT12yiHQD1EfgT41gT", - "65ZBUAk24sNniDb7ZCya18EH5cWpioyeA7Mh6Fn3PBUY", - "669oWJuzK43ePwWiUG6ASvMJRZYKPZqwUt79aE32kqmG", - "66dX6ZwV4W9etrDRkBvTrgiz2BWxogjELH2T6Pkf35bz", - "66puVpH5uFvjAHAnAQma4xzmUAUuNCi6nRkWhtRwKY9s", - "66xsjypBWpMVtFXwYiswbUi2ysNToSfFVbaLTyGGgugd", - "677edJ85TYEdvBu9h8B6g5Kme8VBw9fp7VHFdh1BYKEv", - "67aumLstntDmKiogPQKNVqF3FpQQBaL89Xw13caqB7vC", - "67eFkgCPknvQtPRajk6yL8DmZf7n7NVx9sf1UrXmnHun", - "67jmiPi83EmFDsLo2eEz4AmBQpEP6wLPaVk17yTgcy5z", - "67KUm8AAC2dxgU83XdmqxPzXSD77YYadZyVr9jM6xQMU", - "67VDb2iEdx6XjCfBLXhUgKQQjTuLe9X2eLqTq5nBjUTy", - "688vLxT7Gsb4YX9YotViUauLC5aYbnjm1SQtaEQUKitf", - "68c2WE9FdfrBnWcvugN9wtiRKSMP61PH5fgeVsVverwx", - "68fMuLRmedUz2ut97iMDDWDvufyngXAZAXHS776hrrra", - "68PnDN4XLFnziH72tEXBcP2VSKkHa39jMfMJHzqnMyhW", - "68QFaGGRz21VuhfmZrv6LS4bmr593fu68GwfpkS6YWWg", - "68qujN79HiknCPBbGESncjUDeC8V42DigCGjQjpaVher", - "68rq2UW6GsE4wxR9nRAeTMFVH9Zerb1LFZ18N7heXfnG", - "68Wqf8UZB1WawbF16cAdpnNwY8tNs3mgYVdpqZkqbKAo", - "68Z26CSFt2PpETp26ZYfrQzCmpVsC8NoZSBH5bbkLDPB", - "68ZxNmvRkaLLeNdqkKWKKSCmFiF28Zcy4xVHN5QZuzY3", - "693EoNZ8ZvEdA6tdNtwmhG7rGNiFhet9yuGppDVfEk2w", - "696mZGRLiSvLhMCSTHRrmmgUvxPEjvBBdETDL4a3PGLx", - "69cqqq1emG3HAPm8678WHG2TDj7KVBCZt87FvtA11RkH", - "69hcG4YpKb9BaxppKujfr6sYG42n9yzL9wui7q1kD99e", - "69k73WLdHRge7E3vCUiDx7Dkm1DQSBBGAu9FqNj4AeJD", - "69NBeNF5dDJJmE9aBAeGXvpBttz2MZn3mgsy2rTFP8x5", - "69NtE7PD3Ui51kKQVdAmStVNLC9Cv9E2by2TiCEWkfXb", - "69SHUke3phQy5bEEKSVaSp3ytmEJF8h4Yh8FssZDHNjE", - "69y24KUYmXFY2N6BMfzL8TfiKjQtBNCCjtnju7bxh4zG", - "69ye3ZvDkfTcWm7r8VtzrrUrPHCe1G99F8y3ioSLrBBy", - "6A2t1aNmY4c9DsQuZgjMBwnigUpCu8vihugqgyAhGrC1", - "6a3tKs1GfMDxNM82uuPTVS1YVAfkvsVJjGu7ipix22uB", - "6A6BmAexbjbGZPKnwPeVyJ2w684mYRe3wsERDZqvaYce", - "6A7vAYUkn5wKnUqnf2CJxg2kmbtDidhvF3nf1DNhyqfj", - "6A8kVsTw85XCm88279AedrFU7A7zJaJgZY3ViquRDQrN", - "6aA3B2Yr8o3dy2dSDUbrMjLXstWCoY3KosbCzxmNWAXg", - "6AaA8HJGpYK9RDN5NQjDJfHPcqX63hnw3NXEa9rTXbEs", - "6acrh2d5D4gtftVmcKomR1MGAnRKfE3Vj9THAZ8TFx2u", - "6acxns7qQGEWQS8CxQ9EfLEmt7r5EHey1tcZxZsHUxaN", - "6AG7Wrx7rLHsFpX3cAJTwGAPzorm4WXY6ZqN2eTTM1a4", - "6ANao2SsdvuSiXBsKQteVSyGZu5HE2z7qDvTktKDSycm", - "6AQ7Dmqk3rXEGeSVeTuHpUSJDRntYR8RLMxmnMKxk5Lj", - "6AsFiC2nani6FjHJ6UBGbqhhQc5iFrjHGcbUUHHXrVk2", - "6au2pU33RmTdpoZ9WcYrHnTmTByMJbMMPmZPC7Z454hP", - "6AUKAdtoJGCKz1w3Cs38uE2J1vb6XPkNzvcxaQFZzDUV", - "6av43LskQZy1VMAb6kC6mxtpoJv951kR4ddnV9sHNYXN", - "6aVS1dvAUnd73wqZaUT3Ky6dS5ogmdxFgTNUmycNQeCq", - "6aYP9Q8oBhMd5gxyks4P6VQRUYeMKbXT8Fj5rtdrpXoy", - "6AzAaGnhw5E9Nbkk4e7uhRFEtTVKPYwxWsLhVL8wPDuU", - "6B1CjaPXynn9NV67nuxhBGxxd9XQXMSiVCze8cfFHfgP", - "6b6Rhb4FQJwVXSnLmR3TMYeRm8GECWgYijsP6KVfQUQz", - "6BdawAEJvEbgs7UB3VsKSc1WL45ydCR1xqi9pyr9JS4q", - "6BeAn53Zti3ke5zRm92YzwaaZU5SzMpCmTgkSR7vE1mC", - "6BeLuz5xd7ZAuwioVrWKx5T32UFZi1AHwuzWcBUv5Mdf", - "6BJocLL3EC8bPFcdV63B4Ewx9i5EtzYVzcJUASMJjzU8", - "6bKbyW3biLbUbShytTknSvRt4MUAVkmaK1mubdYxV7Sm", - "6bkTEGxMJf18WBT7QDjs39aEEmN39mQFFQfihyQ2yJkU", - "6bPRuTKPBUnLtQrfRB51Y8RMnFUdQBoodXavrwUbD2ac", - "6Bqjw7w7ZSCjVeDVzRLZ7w31BaDassZs2CtEEyLx2paZ", - "6BqqiM4zguy3ib5YmerVPeencPQadJmb5iXj35WdaCBC", - "6bQrD49GQxf3YpRT4YLArwNwNjZXLRKdbynieVwVWXZ", - "6BTMazh527s3uGxsNf6jqFxktSZf1EbRE93mKJkFvJ5V", - "6bWnvt85tpmmjK8cjfx5YGHhN5qq9yKTXDoZqZ6EwPak", - "6bXaLPbr7SUQzvaL7HvDAF77ARK47qbGcyMJsrfD9Yqg", - "6bXDiUFDUMrneGdNSArBaTFLmwfdEneM9p9fVUbWiXHz", - "6C1mHAPxQACd8NNS1D9KpGxqSRUz5s6itsaJx1uteofx", - "6C2zZ5hac7V9KzdwoGeRFjVpAgPPbXvxGrcRtq2Pf2CG", - "6c4q2mNs1tf6FPJCrQ5RzBWWVPaY1DbnTHUR3U4WPRYu", - "6C7aCvcfexHEEVS2quyThsrKNc5qazwwv7D7Pbnpi5pJ", - "6C9a94HU5FfibBMC3NjggTp4FYPbyk6RG3N6nAwTi65Z", - "6CAPecS949N2FXr8Yvsv4Ket14eoxgrPMAsTTrKxFSfB", - "6cbkU5eSmvbsDaupLiQxDNSB8YbXfrkzrtqRMLRr9ZLP", - "6CDjMLnsqh7ZhRPJZ71RsGGvPGos6iCXkAhcNZhNRvm5", - "6Cdu5SmR5QELDtw1w9CecimF9ckHoczQSFedJqhwRsDF", - "6CGhaBaLL6CqwxpbGtBap8Fgqq7azmzP6FnaEAWE6zB3", - "6cHe9Pjhf233hcYfAH95UUax1hHjtBNhBks2EPYN7tea", - "6cmq97bJ7nXuHG58Hdaf7XcvMC5Jf1exjP47SeCDr9TE", - "6cpJGvuEdi5UsAR4eoHkoZHMnTivrc1TCvP8yfrqcvo5", - "6cR7A15Kk8HmGQWKyTwBAZiFtET3xkoZ4f9G6QzUF5Ge", - "6cTfMpn8zWzmNiE8xFG6tfmzQtDUoxrH75W8ZqPKoyEx", - "6CvdMFRikWCbTV935ZjPHjJ5ueaAejKKvY9YwKhdVoH6", - "6CVKz4cqnQ4jWDviv2pBLDVC3KanNpQympde8ysYfXNi", - "6cyTNwrj9cAQ4YLZZbesFhxXGajdugQhyvRqo6gPcCGb", - "6cyzQXNcvWYxiVkfhxfNj56wMPiA4h3Bs54eoXNZzEEr", - "6D6oRzvSE6cdpKpWgojgHhrc5ef2jqQhRQywtzp5GreP", - "6D6puBzRwMwVNZUuEipFycFL7xZgL9sPEnj5p68Tn8iP", - "6ddz8mNRxZ1e4SxF2MYzaCECsfVEN1rECDzXWeap99q4", - "6dEdxH3rDhVgcWjZE3kq1U1N6rHeTPRywzsYmfe6UwyX", - "6diyG7bpE79VDr9Z6CUW2fBuQDQzPPyP8ksFqHCGYGcZ", - "6DJsnMikpDweVJFNSgdGWVuBSkToSc5UpfKZJxLgwhdP", - "6dKWEMU4TsSLUgkd5ov2kVJDeQJAh33byEE3dpqc2UZH", - "6dkwFagHY4gDmkzFUGUsVaaf828PyAUzH2ah2H9eyw4a", - "6DmskQV9ricrKpuGuHzyWmdsJcHPauvbPALdbsJxM9GB", - "6dPkRgyetYyfo4vB52RaMPmyCNHXkVze7NbdmP75VoUp", - "6DPvDDPZZSKLHZfcDvMDqhHztoSgiVC87QwPjZLwgM8C", - "6Dr57RWT2ctMt2XiQxj9Nec5mBrfjucfAyh8hWQE9cp9", - "6dr7c5k6SsFRFfmoNqADxZQsvPjPjg4meeEHVX8cn6HU", - "6DrFc9AuBwCe9VUSArhP1bfYQRSYie66pkH6C7wyw5uv", - "6DsfCoxfuxJuay6H45iLwvCjrxc4sGEt3JpWERhhJ69J", - "6dsRe3Y2V9bRP9vEqtmebVDDGXpd9ejKkkF6xif9NADV", - "6dWGBFQeGgcEmEz8oeeQHB337VVssWAGkP1Yt426REyk", - "6dZWVMb2v8Vejpm9dg9qeJy2gUd2K6XTd5a2XeqiCxHS", - "6E235cA4GgCXUePbvWJCjHwy9bSKbsoGaNpvZiGo3NxG", - "6E3pcavKjx4MSiB91eML2fCy3cHFAmZxjU4agDoFUGC1", - "6e4BdfrD42d5FHVbsHrKEqxj5zzn1Fq5bC9e3UwFr4DY", - "6E5NygCNcfyPHkLbHMckzF25cgQoxN3DfMqH9bwyQRpf", - "6Eb8c5zQ6crSmQAQMU24Y6Fnf9dXoruiATxoUxyecKko", - "6EeqmCsGrJCSQZF7MaGnZQEkcd6bWMinxSbfsz5sU1D1", - "6EfiVm1bAo8yWgZppb5irTqciv5VC2eoNTFToST5c6Mg", - "6EkMmtJ9Nj4qu2WpNFMfqmPWUYbGA1CQLzTpC3yTxbb8", - "6eMmnU19xYJAhwyrssutbcpqNGnX5zvz8vM2rX7LBPUy", - "6En53HMLJjuqkk54LgiqdEoSDXfNzqwWVLiF7sBWWFsF", - "6EP7zvUGosmndnVuaT4iV32c4mFbYswek7kJ48zRFPNR", - "6EPcBVHgAaP1x6rYkcpuufSMoP2jhRYi3N43PUqosTDj", - "6ePcfM28rDS6SBHbQwtrTij3kmuSMFA1kyse935ZHJL7", - "6Eph5j55RgzMx5ogbpMg27hDW6yoxE2Tr1EMc4SqpKXp", - "6etKMxriRkcz5r7ScHm5Lx1nGREHS942dJ61SCXFbp21", - "6EUC3zE6AZw6wTxuMcVK2mkL4u8Q1eXhJXS19zDS2eLM", - "6EUeqdXAgd21FDokVAvTN9s1giTjoM9duwjWBad1oMKP", - "6EvJJLGecRwUqukLdWvqWPDRBenuaWobj34WoBAsBk9S", - "6eWn5SJ9jLbGtFiK7XXb5hrYSNLnqq53vWshp9jdyZ4b", - "6eWWU6wZ4LA2q25v11VkVtD311MruJRzzp6cc8szqW4E", - "6EX1JASWqUuaHRw42uxFcTdtVH9e4CfseVsopZ7QMPoe", - "6F16m2H44H4LHseHDuk67k2zdEXCWQdGnA2BQ4yMQFMX", - "6Fa9v56un4baKeN7QNxbKd5a7igHZuqwczzXGyg8ZDR3", - "6fdimp8ks17wBAEiX7MuF9CrmJZ7vLGtThXdFsrv7Msj", - "6fdTLDrLcpxJbAfbj5fwGit71cMAPc97pHhh3pFF8mBd", - "6fF1R8nnNvyZyH72FVykJ9vVVNtm61na1j9usd3hKYyf", - "6fPBcp84yGmcAbdZnQRViGSuDrwX9kePyewmzhhcXZEr", - "6fr7ptNzTzzgcqmBDT1PJt3RTnuTnM4v7jfFS3zaaopa", - "6Fs85ojCqgHbPvtnnsW3QiiWkPUFo5gwNkTy26ZzZFGA", - "6FTLATh7CDdqkFyYJuTR7oFyvhVK6UHUK92fELg2mRno", - "6fVe7xib1jYxiv9nH1YW1WzYakFWZM9XHjDbG8np1azN", - "6FWhS2CHjtCf81GMsqHRXQqDUh3UKyyWGF15QGCWWb7Q", - "6fxDMARzR9x8BATufrCo6ntGL76b58dGnjivwVMtgQJP", - "6Fy5A3xRneZqirByL81zF8k1hQFLW6pK8MWkJmUBUScA", - "6FzFfiqjmoWaWt9XRjoGyN5rA7GCfNoyn267pfZT4my1", - "6g34wUC438JGUrysJnvGbAGqQLFLJytPUKBXpUrfFD8U", - "6g7urUx43pwjUZ9CBD9c76oLQtpHCgCxp9hQhv6RUMB", - "6G8fyvas9ibijjkqnivCb7jU3FvSiX12D1wP5QHdYSHM", - "6G8HPwLJVaWzx5krk4cSQbnheBkfqHaNRQgBLRzvz8Qm", - "6GA16fyWGrr78QWGUBnH469A1dWNv8yTjuVMuDcxjxmg", - "6giEzjcXWwiodVL48LtoFexax73cBorvq4NM8a2xUkd8", - "6gKUPkzKXyF7PrzxuTsRPKrTxBvJy9Xs7YeHxhtaKgNh", - "6gkw74Vi8A6DSHikq5X4ynTyNeaiqU3u3tLAgipmmQFJ", - "6gNgeydqa5ti3xtSWwLxiuxsw1CgdnQRgRCDfbzuvHPR", - "6gPFU17pZ7rSHCs7Uqr2WC5LqZDEVQd9mDXVkHezcVkn", - "6Gt5vnj4xzMV4Mqj2BHwDp8mQVHb3eT2gh9ASTE6fkPg", - "6gt8HLpov7mZxBM4gXyCC8cCLxc9C8JjKRK3mdQTV5QD", - "6gwJ7axRpkEE3zB4UwegxFXrkdrUwMMKoN5pYxdiaM4H", - "6GyajR8Nryn9R2HcGXn3pFBr9FZjA1DLESUNtnLARUWT", - "6h8yUT7yhqm2oDvVBpQ3R3ix7AjqX5oVGVAKLepp5AkH", - "6H9aeo7woPe5QabarbwHtkrziJii8x6RT72Eroga6o4Z", - "6HaWK8WHhq2AVUuPupYrD5h5z11LzjAdFNzT59aicdLf", - "6hcoeM9dVx6x3QMppHAZwsiXYRsRECxWQJELZ8pYv79n", - "6hDgYS4y9KX9modFNEaaC3BUw9BP93aNE8m8JfKXQvQ4", - "6hDNQwQN1unKmdu2NbgYvakymJPbrNMGikMxviPV8MfQ", - "6Hg4otoeuAK61JuJZ3NVZWk95Qmofcr7UPcQk4peKPz5", - "6hm8ibyevjjXLCEmwS3ffiCMKa5b4eCq6mJmG19JF6Uv", - "6hmk9bFBLE9iiFTn7uXc64BHujcHZqLdNEz2jHCuD8ZK", - "6hNzKhZHSGhQGRKEt1J1NFyySMx2SSv469XbfTELyWSV", - "6HoXNUJucbN4JFYRypP9UA6t3aKu3b3FhVS1mnEADtGq", - "6hS8hZmb9KEoAuF1pXPPdpJBQgsuepYyAhghhAVb8zdE", - "6HtPhr81VwVaMKwFFzML3RrF6PMcjipbCpPT7JbdsPvE", - "6HuwR9etJqZY2ZAMSFcyZepgwNJZeeDcjev26njTJgMf", - "6hVh5Azg9Xwzn1ozMBcN2bUDJS1iirjFb6rWKLtsz6Po", - "6hvLbQ32BYawSQobBJ1Sjspb7BBkQ5ueUbh6H7eSexYi", - "6i68PLW2kDUpXcEphbkyDVepDpjPEEBBNGsLSfzLDZSY", - "6icMZx6c3wm9jWgrkvLgnmjNg4BcY7zEXvRjTLVC6heY", - "6iFXrPJa7yVmvs3cmG6MQm1ZNvMVT1Q8mhpF6FGVKLe1", - "6iJKqnX5ivXNqcJRAqT2hwu9d8iAqoyMcSayS5aXvH9Z", - "6imFR5ac8amV2gvYfYkdmXVB18CBECCMCLBsquHMUXDs", - "6iuCnizcPYCvgguycQEdpCP566Vc1DriokUMktfZN79", - "6iVmhPpQQBk9EMP1Nv7K2Ghxq6KBotA4KWa1UBeYr9AM", - "6iyKr4h9tbGMvBDuuua45vrJhEjE36h7psdVJsTgqYnA", - "6j3gxLipka5PLaZhgNvohwkpwyTjdYxjVEbXi3MhQCuv", - "6j3hyq5EahvCgxZJdW65AXdu6uQqbqG1SWWSJ4jggCrp", - "6j7DvYDyFTdrK99apFuuT8w2WaeaezfwLDLk8Em8sB2m", - "6JaKmYstgSj55SwwQDihDq1Q251FrL5ev8XNiqFSP2qe", - "6JBG9f7QkyR9gJARnMuy2eQ33JDBBkyk5quoEUdcmNMA", - "6JbQPCoFCtEUdMjyDxGFfdkHtSwgjn6PKrCUGXmHEVkg", - "6JEdfdEXvAh1AzxDfo2YcrrBN29joKfYxb3kicjx7eYf", - "6jEfw3SbQ4rqbky9WJwnthJ4Sge25NtmpbXZKFkmpe15", - "6JFTqXdSUo36QwteiPjs65X2MWuHCBv3An5VA1JGZ9o4", - "6jhfZV63yGmPM4djkHYNZ5eTxmuMxmi55UkJBDeMjUqL", - "6jJV9r5n3D2oZxa2poRKNSzE9sFr6VgoSRxvPogPa3xj", - "6jNHcuM5wSjydTUPa1zq2KTfB4ts52zJfPiG7xDaCnBJ", - "6JpPtEzxtMPiYCs57KV2amMVJ6WmQbgsb87yBGhWRmD7", - "6jpRoMeVAQDS7iybhtNnstUPRyQcqzTRpEbRvrF9wshw", - "6jPS2T6n6y7d6g2qtSuc4V9jxguYjbtN913N7F4U2VSJ", - "6jsrtXdrpMJcUDmBRYASGF21QB3p2xUb9DTWj2373GCN", - "6JUvAc4NV51SfX8G9zwoRptU6hw1eC3fYz443Mh3Qj7w", - "6jUwGE3ehr7BULf7ZSDiKkL1BKKAaSjYvF21XFW7zy9y", - "6jWgPvH1U6Miu85ow45tHyvEXfjmPuNDFAjovCHRCLid", - "6jYfBBZderjvyXiqxVWNP46GSkDZmsL12m7D5A9tfaND", - "6jyL6ryCogEEuCShs7XgEnvhjyJhieVjSbzciLqMN3eP", - "6k2nDZYtk8YrtXgNaceeXwrPPnMqRcejDyPScnrnGvzA", - "6K6uMzqy2sEk1H4U6bp6CfnNNmLxxEZRY8KEt87Kg5xm", - "6K8aowYciZqQwFo3B9GM7y6EvezSHL1JLsEcJnbcZowD", - "6kCRppFT5zDZ8P8L2ex9m6yagTAm9e7682F51ADnZQ7A", - "6KgaEHyMKhbbEekcCCvKszWznFMbHBrEJaNzbu9UUJQW", - "6kgd8UJ4bjdP39vjSvAmsGb6JeoWE4QAvMtfuY2ugZU5", - "6KGDh5hSNAeDmtF4tD72Rw5WtZk2efYxqgbVryXmis1J", - "6KgpdEshqun18ZqVjh7SHsfwRAHrDsZpXQv7Tw3aqdsC", - "6KgrtrDWtz81qNjKi1vUmWCD6NnWAEgedZvcWWNqvgrL", - "6KmkN3b2iTxGknDnGn8RodLEwznQLBoyEj3XD6NvSZF5", - "6knY26EjAurrc4JkaDTS2KVLQMza5gxMCs85vbdcwhXr", - "6KnzXAhpE6ki8GuNQBqpHsVdHhsyg5csChPGLdkTHRvW", - "6kQGi1Z41F1Kq8Jqn7AT5fUUw5NQQshx8sDwCSznRkpv", - "6KQQhqzUXpcBmT5ndNDpHQ3ywtbX6AJwJxwxpK2NfWg2", - "6ktST2UVE8JcV9wDyycRzXRVxNTowzZbz8W3LM97AZrF", - "6Ku6Cj3Y3FETU6JEuwjpLLu65CnKhi5YGtKdUTRGud7i", - "6KuG7VAaXx5yPda8WTQwMvQhPUesxu1FbZ1cy7dYSgNd", - "6KV8kLM4iitWURFpBSTdbnkTxnypZzj4JRPexG13Jczm", - "6Kwr8fUZPmSFNWaXfRL7e7v38itt276DFVu7RiYn8oW5", - "6L5tDXeGgnihrr5ptC7YAAJRAY6zuaRT8SE88njWjrEo", - "6L747454cSS7ULoA8hY9UByLviYiaYWNvyp8P1mmkJ7Z", - "6LjTPk8pATJHGkpk31o3x4RcdvpbJLBTu9meUKgXeDCu", - "6LPUHkheSWhwtobK7QTkmF4NGEvfxFZLvsxwgwzFcGWZ", - "6LTfraHJ42sdDQxQtE8Mhd7pT3N2vDqd4bM2VZ1wzjuy", - "6LUJ4bVhvmwMGXsM1X1zcufFfeRzzUgEdRnfEMt1T5bx", - "6LZ9ZY9mXAMQALFMZbAh8NE4M76XTGEw6WLLdWaszzNm", - "6m37tDzMfy8tBWtnS5u8drtT4Ft5oDRM5ZC5Z82V14hT", - "6m3vRKWs51uLELTUqv7MHArBdsJYjsvVqryvFNcSGetJ", - "6M56P7gBsb8JwoE5oaEZRnCAM2ZL2cHskyqrX9qu9xzk", - "6m8LGKXMT5QrRQdQsQAd2VHpYwJZebbrc48WgkPWeRYc", - "6m8NNtRcrBPvHXfyMQqSYPBpYBNq5Wn8K8VrW6qDv2fB", - "6mAuJ3xKzgo4zSxoi3s4uhaSLh9qqtyZQBhfhJbSaPQJ", - "6MCsSTuNwBEkd2DJZivdU6GjjQNdsZg3zMK27cdyrTBv", - "6Md3cSMgJHj5jfRY3rroC9RaVtrb5421M2oGaSt83LnX", - "6MEyD2RCk74jqYDrmuoDqor7KQca8B3pyRDw91ynmgki", - "6mgxHj4iySXmRX58yZEZuHjkCNjb2Q8AgKMwNwR7TSbm", - "6MHG2eZi5KiAZSDcxKjaqXX4GvA9GXZT4gkawHPNdiAG", - "6mHW7MCVB3cLwYEt9KJNiiDDe2vuattdhj896RoR7ej7", - "6Mi3Q2eNUCess79xZJwGMhYYwzNo5Tr24Xbw3QhEWyFt", - "6mkTw1ZTgHMvPhrEKtxg4zHqJwsHmius5kyzFB12fAZi", - "6mmoWubonUyKB6W8eh1jdNw5hpQvmZ3mqCoMvzM5HUCa", - "6mpFbHCVYxcjN8Ak2mjidFB3n9bU4iUfQtm7v4jF9gPZ", - "6MR5XNoUUWGxQ3amqVPgqBweGV82qNeXScoAnbd5un2z", - "6mTjzdsSVCGxsNLuyQessckXoJrCwoheVid3NoLbog6w", - "6MTmtiRzn7evEWei8MqLL9PUN1vKTNwx7sfT3f4fooMm", - "6MUxYD7SEUkf7GrBtwbU4mrcpEYCtyHqpwyZH72b2PQP", - "6MxdVQKTdiptE5AT4Wnu8LYnDzjxeCJyMrTYE3qZ7CcL", - "6mzv9VNWwSJBrQ5bhdZHYqK9R4pgBzmVWm17AD1dyPqY", - "6NDU8PkeQhH8DF5Yw1Cn1AexQoQLnqr13GhNuQL1gfuT", - "6NGq4LarG1qMZazaHnqCVueTBpB97Z6PtgRuGx9AwAAx", - "6niT1VQDC1SN1GiyenvitbYAohcCtXsmTerYMCs17jWH", - "6nKn6DHrPvX1yAdED1KLRwKBT1GsmAnMjpBVXRPyPu2t", - "6nrkRvzUpTst8teZJawMFFHrmixJ2sxAUxPKrqoGwCB8", - "6nvZvWS5NprSBn8e7ofzqygeiWaYQ2Ky2TfMhC5GsuQC", - "6Nyic1tPVdio7VGR2yQ6emMXUQpUSvvmEGTqFDR6depS", - "6oay6j3VHR9bRQRFrXuH3fx4X2ewkp67mvLbRYCS4Hia", - "6oB8HATu5ApWMWhFpE4Ms5XMNcKmjk83VpcND5U1vHof", - "6ojxNwhK6LvMCgqaRoMJXzGkPCF5kknhg4ts7t4snuor", - "6oQhFYAntYVm7xUZP5XpUypZjpSMMgqQkENFGSRPSBHx", - "6P4hRSNuioukrjjPDiJ2rQTBMHKptCfTbwMmaHwKk1pY", - "6P5gaqPG7gKMwBZMEZ87mCNw14hXPzWnp5J7tbtAFsm4", - "6p9f4oyPCR3iyAW69DjndFuggRt6KFp22RVaywthff9W", - "6padcv1em6AzRFRoZ1UVzHEYo4pZ1Quu2UQqxecvZjVM", - "6paJdGybERSGdQTkL5PWXfgbsUpYpucB9tazDgApdAV8", - "6PCnc9vuYXj8KniwZAmabPiHvsr5pMfKdNUkF1SmrXYQ", - "6PdBqw4p1iaNd3CYg18THHpzDBuophRUk3qSFy3KNTuD", - "6PhiUvvtt6yDEprWkzy7r7MXfpGyHzv2UVFyhCZmRFTd", - "6pJAzQhw3MJBbR4BPzhWJk2Hf5p7idivRrepCuh1BrEu", - "6pjd2Dfsv7FNkNDCGhzb8vn1DEmvPSVicdQxvGKLVQwQ", - "6PJM6PekomqscNuqazFYsqxZaDpt24wycC2Xx4fLS1GQ", - "6PkC4ZVx524PdBT7JjwytouBbTLnNH51R69T9s4AYgWT", - "6PkpXpQeLMp45TC1PTPUhCpywcCxMcmUXvH3dNPMXQvo", - "6pnCgj8CnsqTjJENj2wz8pzGgAMdU1S41DvsUo2rVL4f", - "6PNzxiw9BtENYKbECwJHSeJorq53U7FDXwdP8KJZot1H", - "6PojfJo3DkFNHsybGRQr3E7DmtUPvnnUdeFFgN2MBkKE", - "6poMBjei3rTC6oqidPDDkyEMjrUPTL3LEorFrtFmet39", - "6ppJP4c9bjc2ZzkJtMkkXmn8Ffn6rvnPkKDSPUkmwNq7", - "6PS5Mits4Yfm4vNEboh36GyULur6cds5P8fqiFDr25iJ", - "6pSwQbHVVEmAXXXjucBWiMEFanbiNtc5c67fnnJ3b7J7", - "6pU8UoMLbohFiSAoHeNtpRPkifHZpvSVUQngkTuMkdZU", - "6pUayMw7LVx31eA86LAxomnzqktGX4rTLvDzznRHDuNh", - "6PwxMMGLFnAf9sjMHfVr15z9fntjYTNPxJ7gFhkFxkXi", - "6Px2aCsDSE64P19gwnVupwBsgQyrAhhG1qJQghd9STPL", - "6PYMaoJf89uNKjUPyf1eUh6KQ8vGAHt9Fb8EK5SqctKK", - "6q4crDPH7SFp2kxAFNmRg16phDRpjtsW7QDk83EFwrLg", - "6Q62YX8UpQKABG1FANUsTjJJdrfYZNEAbZyceuaVbx79", - "6qaxpAK1NG12AjawHpiwKVCo5SRdbJ2AcWsFqVwXgsFa", - "6QDkNWb8knS1ubXSxKhgHFVgEGj7SfXn11bnEHCuDrag", - "6QeqYx6xxUa4vjuLrtkfCRggVkaMxoZ4E5Z65aF73dty", - "6QFxWWuhpH3vzHukLiEnbU9tq4NwiefxQUKPQoCQGZ3H", - "6qgT6DRxjruAEyEYXWh7Ej5hD8hAdoxznU82agPggqwY", - "6qH22p6RDZFeqszT5fAh4LZEzrp4oiLdNRfHPuetHu6A", - "6qJPxxgZHCQKBvbGC9zCsuuPtHMMLszVCoiCvEhVULyJ", - "6qjYfZ5LjEwE9L2BNMV48XzHZNv7uz1ks4rpCocDpYfY", - "6qKaRXTRk5xjs54vMZgmZCDZEoUFX38W3Xe1dJ771Snv", - "6QNmLuuiXQF5iip7WNkYMroe2q1LQj3CxydZzeA7AxKj", - "6QNZAJexzyegewyn4eE6ybKZrPS1K1yUXv1pQdrY3Q9C", - "6qPPKb2zC6U9g8pwAGrYJxy9B9noYiKxwS7NnuRPqpUx", - "6qvMu4zC3injEjajeimdgiEkNTcgGAxzDNLrC6PKStKr", - "6QwXNttRFYT7qx32fpZ5L53j5SYGYQUG54fGYuRSXj9n", - "6QyznogeoYxn9VLZgijxfkFeEusTu8ip7FWHXwGnH1Bt", - "6R1745AskhXmKugSRxBPsJPDNggk1nhJZU1fW6beefBQ", - "6R2SsTxEK89a9m84Z666c7M7wGcmbwNmTCyPFcAcftyX", - "6r51uDXPZf24KrxGU6SnWCXfdickihjQjnTtUeQdRh4A", - "6R6w8GMm9jpDgMeqmY4DdPn8oAQCKfRwV6KfZXGiqkXc", - "6r6xZE1C5dP4SXduTc81S1t3CUn374ijh2GxomWVEuiV", - "6r9JWPy3LiMx4qGARt1MfEHvMqK2idxJvsK3Sgub3tAd", - "6RA9AhSEPEVmq5c6PDRQMFthYrxXoRzrud9fDq5vYGHZ", - "6rBEm4eWXATTETo1ncXYiAJBLwh1VtMBiRwMLRY75yR7", - "6rCJup6A2NYNQUvtcgnoJ9bYM5Yfzs1f13rmTLRQjZwL", - "6rDzQVov7rYNcHSGsVcbQny7VYCinkn4U86Cfz8xYQdC", - "6ReY6PvuUgCxFPJnJ3PaPQ1Wsa5BciWbVVZPPostFEST", - "6RF6SECyBMT8AY3QQfWrVpkRNtHK2xAnWJVTgfX1Xwwh", - "6rfA3aPykfJ59D2uuWrusPGXHdDXrqN3auYrVgvRkiDh", - "6RFMd7izwT64XAxyWx5bBwQVdY44ECyH1pqpaB1UJ5E6", - "6rHfXT79Eas4V1RUakqMt69aPWDVdXaobh5YZWH4EdjM", - "6RHrPybu6rpxNUHmm5q9bQfxLo2Aq2AWj8nH8Hx1VB6s", - "6RL9NSDsqwd7tBDSkvGqPew7KwffettSVg9FPzkB17YY", - "6RqfwryKNoQDR751TZfD9XaXjxffVPuMTaHkVrpS7Joi", - "6RrkU5FVs1dRXvpCMcoQSe1Esng7HdoT4eZSGGvtuRwe", - "6RwXjMKnyszYmZ6STFd3hfesZug7eCPajZvkQM4MbVBQ", - "6rzig1zwMfgC5drRYV83pXcrYkjXrTxyAzGzhwvTExdZ", - "6ScJsTR3pqGRi9jPJ5W3UDRCavXvRkyZxwiJuQTBzwpi", - "6sdAxKvsiFDSeWuuCfZnntZMU6LyJp1L2MyKq6o73Dpa", - "6sdHZFLmPYqqoQiZmPDQZsDtmsaAZLewpZ7ZpfDMWTNv", - "6sDRthvuna4nbq7hbbZTBGeGjXBhZoa82mcvzK9CpYhX", - "6SH7BYZzyvRKBVRTdhJRZ1xhAsqVZccq8EGcDXYEY1TV", - "6SKzCZ2duYHPgDgXKx4ZG8pix59q6WG8gXgyYvgDaNR5", - "6SLoAiomU7Vkj1nBo9HbQ9GkYpZr7S5vXLVoL5hQzJJr", - "6smeNG6M7Aers4Ju1drfZPYBS4WFK89EwWphQjKTMQSj", - "6sMF848rB5GqkxEA7E6YrGuV2VHpsR3UFTs86GSif2Hk", - "6sMtZs114UsqAabDyJYjtgD5j92HGVvx2pyA6QnkidWM", - "6sNPpnWsZz4QoT8k3VqcKkdoTP8aqdkAVPmrLSvR66Eg", - "6SR5TDVRQbaDn1XTRxy6G39bJVRLyZJeRyqzr918Qyik", - "6SrSKwfLaaP5ibNZFCwoWBVetExuMttiWhoUcuKD6tYx", - "6sSBHSuyRRphvkH4GAwccGRB8HdZLWC9VENN3c6S39sd", - "6SvQFdk3iVNRRwRNW2LVb3JgWnncsJrKjf7aQ1dJGjr3", - "6t8hzJokvu6BV6t21WE9BUbvTr7YdzAHaCkKcEqcKFtG", - "6t8zWy766tsHBVNxhMwsTGiEYkGtjaZncRU3vcSEYtHU", - "6tcAwDbPU7HqQpVqGeAQDGkN88Kv7uRn5t4fEkT5S8G9", - "6TdMPa8raXEeqPKJBoMAS2D84RiW34yrLCBAp2oZSuME", - "6TdQ6uQ4fN9miu3JWMRQLUU41T7yVTAeZi6fPspvYz9d", - "6tJ6ET76Rqa1K2PPmLPPaoiasqQRwNH8PcBsPE5v4ozf", - "6TkKqq15wXjqEjNg9zqTKADwuVATR9dW3rkNnsYme1ea", - "6tknFLCJiEwuYemEmjCSEz6oB5fmQUtH199Q4uuqcTY4", - "6TKTg1Hb7skEvYnT2txXPTqErH6Y7GQAD7h1Mj19przD", - "6TmAXbJZXRGEoQxFGK1ZDddaxUmcmgskNgLgTcJkb1sZ", - "6toK4pymj63KtG5Hco4T4QFxsURYLLCG2p2vPT7bTKdu", - "6toYpqwwhZtdZXkutACPrzZZ3rtTpLiC3MGFUaHJsZVk", - "6tp27jGhESLk9Pcnh5ozdJciTDpfTZkV8Na7NkMx6Tjs", - "6TPsWSD9m8SQ6coEMhaNkjzHe8a4BmzKvM5kuRQnw27G", - "6tptWLfq3o2Q5M74ZJLpGGpA9jCAScHSaun5aQVTtp1h", - "6tr27Z7WhFGkFFFNBmaf8bHypvajZU8WDJPR7Aji5stF", - "6tRHx9c2pmqis3khqbhqzwTB2Umczc1JSFd9cwvzSnzj", - "6tTnCFFyAvqL4FgERkozrm1AwFPQSsLThFC9JqmZJmVT", - "6tunUzbDSpvSttoVAPLJzshjihdFULCMvpyUhgJiV7R8", - "6TvrzhgGrjqRpCmsn7frJ5WZoHKNNtNAs8nwYtf6KByt", - "6TWyQ2sGZSxwjtBMZeTTznF4cf3xEMi1TQMoSzuxZ31R", - "6TxS2SvBtJDVvGADrjYzeTczsCezuknS3gvMH18hpDPF", - "6U6befpkTqT1gV18TaM3Lzuai3XQypHcAamK463DYXm4", - "6UAGYHQY1grv8HNgRgVr8sYpkKbjdapcLEz5u8v7N39Q", - "6UARCM27LJbhyMtak1nZ7mML8mtPrwMttbME6x2J2B1o", - "6UfQVpJKcGT3Cmo5DvUkrDEu9ucHbR3Y3XCs8R1wyNnM", - "6UKBXH2UrbxVfHWN1ogR64xp6RCFjXJtzEHsfAVoBmk", - "6Un2uhrFfW1q4a4vhQfTxT8tn8xjpi2CF4kXhfaWKHSK", - "6UNg56mU9BP1KghPDDgF6v82iJHyLaPW8BEQb5xpFY5c", - "6Uo8EzvYwMs21f79X73ZQSh1fzVo7ucr5wkuMvNhPSNv", - "6UrGCcP3H5REdZrPx9X22s8Pj7q2RzUWVT5LFCLBevZ9", - "6uRQLNnq2SJuYpk2XPgATGRWS8f23aDFhsPJuiikGhD1", - "6URvc7u4EtUHp4AoSXr7MkhQa2Sm9UmVLGe35BSsaD6a", - "6Ut5miF4Notp3pvWSHrrB6UmJBvrCydPYbDje3H6VdQ7", - "6uWmZTo6Jf9edcyYPmo8DGtYWYjsHxpQxzFCTymveWqM", - "6uxATKpHmactZ3szhqRRnpwzw3tbieR8nXKreBtSLdWY", - "6UynSxu2fiY5qU6Ae8cPLxq4jyWVpnr7o4fUyWLxCpcp", - "6V1LMdvDv7Uf4mK3qZS4v5v3YjFnuZfj7W191xdLQyQR", - "6v6cBD5gEoxB29NvtcLr8S8ivZ3MWKwgz3av3N563ZGL", - "6V9ymEmZyvpJFpTzMAaSxs45QpoSvNUQRczhBF8mWKXt", - "6VCCgXSYCCQjnFBW8U4LyoobhGktjKrNVb75uDsnVdWN", - "6VDbcmgLSbdgvEK5sqNbiTqiR3dt7bnbmSvsDsUDQBs8", - "6vdd5SWjcnDmTX7zWbUWJC44PT4UnFoQrYXtiWR9yRM8", - "6VfhBRxBMBFAGzBYLFbP6x45svXvu7ZqXkTBsWBJ5PXy", - "6vFoCo6Zubw2Zzg65ExZ1XZZx7m8RMVD3VQxWYAZD8ig", - "6vk5egPsN6L4KQMyVmunSokSbUt8NdrTxg9UpdNKRJsd", - "6vMTzyzXBztMW3Cj2j4SbpR5cLmiG58Nrku4FDmNP7FG", - "6vt6cWDzofR1gKecH2XzYuyzDDx7tCqTzCGswdLopq8U", - "6VtG31G5Mt3JfqpiJq8y28YdEFkyMc5sSs57J3qz4YzB", - "6VvA4gr87WVVFSDKN85f5WVJsrWzzky96pruLoixyYBg", - "6vvKPQoKgQd3iBVP62QrkjwGHfG3ekJmFwf6eXEhsejV", - "6vwgA9hgSz8hbsJ3LGEwjHfqvNLesuTUKAcmint1etWH", - "6vx5vGgqAa9dRaJpbViCNDjzxp6EyGV38YMYbNDqTzLr", - "6VYv6YqEDKAMEVwhn7zrNr9JmpYXmrpREw2U39awA9xV", - "6vzrfdChuGdtpaghK9sKpDMcZsrTP6s98JfZXxoPJEXM", - "6vZuaLY4n4GP9DVroymfZ4D1oP6xpgF1ExLMqHQbt32L", - "6w1f5DGJgsRshtLd9uS3iEnDyQxcmCxHCMK4yNCbmgYu", - "6w1jYS7vrmprS1u9cQd9uFo58AZYvJ9JtzihmkRPgSz7", - "6W2xi4iCGU8eTMCGtG3DQXgMGurXFnd5iVXCY5Sq7AbF", - "6W3xBXKnq4vGHvBjMNSgVviQ6vqDeWiL4LwnSFjvr8Yo", - "6W7NuUvFjV84MPpb4HeQ6X1YKY84okwQjQcqyePE7RSz", - "6W7ypD86XBo55SuB3qL5pssBWABZBXktGREhthnmpVt8", - "6w8Gxzq1AusnWxrnBH49wkWVemp7MPxXftfyUQy67yJZ", - "6WaqPXcQVYZmzsaGGGsCp5SL91hzn9G1BmKX4kBJbPrx", - "6wcMgZSsuxrSp6xBkREvvowHFVw9mJhmRS6rgkKvBs4k", - "6WCsaYDDBWikrAf56669gSaep3xnbCdv4TPzUG4rT1Hz", - "6WdTY7xj851sJsPsYkNSmu68rYRbvcRwK3dYfRPcGtnx", - "6weMttv8ibKqYFUitBX62AvW8zGTr8cUP3pn1F6WiePv", - "6WEzDhBiyr6aDnghbksPaXhGozmbGQJ1NMKP9vSWE9zc", - "6WgbvHvsBkWoUf11RjnStUh13Z2WCcyzs4kTyCooLA8e", - "6wgMAZ3Q3u4kvYzRwVZK256fbr7D62ZTs62sMXgvTsfy", - "6WHCTDvSa47muoyi5zHoKKPcodkftixsauEfDNB9YSjL", - "6wj9vahDQsBWYVFveuftxYbvMxdQEgkhdnVoQHhtXKWw", - "6WJGoPfSX1VNqfiYfRZ9RP6KUm8nLtar9zJxAntdzEWh", - "6Wjmt9gHJrXVKD1n8YUUS91jZhy5mKC1CvFF8GsD4mCp", - "6WNMTicNmPuU1KAnykrf1VqmmhekvoLGVA9ZmHzQCCqR", - "6WQnys7W4m7PoYjFActbERoWeTo5jRee2Wttso4VFTsc", - "6WUqrvEihQeybPV2PMYy2e6hH2K9KDzuSBWUMyMCoCkR", - "6WwCWBHYvNXnDswu6qrHbKoXMqtB1ZwRCD2U3oqWbZmB", - "6WwZVeoozcJBK6qJF5Cs3PU8pikyJZATD47H52FHDDte", - "6X9imY1tafmJHgniz8QxQpjZi2x4WEDPavpL4kJyZV77", - "6x9ovFRmSzERYZbJNJ1EwVywSihRzLWnP3CHpC9eRQkA", - "6XASEv4VzAyPHmzJEc1wTMZsYLB2ov4ggdzjVY8Q3Uuh", - "6xFG6NiyjixZW4y5B8K4tmWEWaVa2kxt6W3NycjFEgcU", - "6XFp4i78xhweDcet3VnWgya8HNFQAW3yKwWtwfBW9nHV", - "6XGS3SrpFoVbvzYuYjifpqTBDjiLqvNUnADrtoauHGM7", - "6xgtvmxXEpCXxJzcSEXMhqS1Zu129Z4d7FcFBwNGo4gM", - "6XjUyrr7fscEiNoQiVFRSoyzzwE4rMYsvQWkZBfrpdH4", - "6Xn3ZAY2X4139BJktFQ9gu5hK7d9dMpo3bohr3Q7PfRe", - "6xoFwSFpaPLzK7E7cyyYM65srLCpcAom3CfRAzs7trfT", - "6xsC3qjBbYT4V3GQrbMSG78p4GA8x9mDeSqch4L7fhe6", - "6XSXMyUJnjTR5Az6jQyX4o9bjMXnyt94u5MvAtmrH3dZ", - "6XSxUazT6ph6CWFRV4MHwPBwkS4gNFMzfad4dFLLESxq", - "6XTrZXkQGfwsW6ydndpdiffxyJbCLT26MeaSyQfDButL", - "6XxsVPLXb22pmYrVWe4GaVntUcwpqQiFPWLw61H9rJ8n", - "6xXw2Sca9LW2gXJhyn87Ty3PbCWFQMG9dXMFPXGvqpPV", - "6xZdjG4ciFX9vfWZmMt7nNMaH8icnhaVPFu1x2Ho5hVu", - "6y4x8ZXVmQCtzkjBF3EgM23ApaMuuoTyMyzvFg2iMQnz", - "6YCRJFeMhPkmpYFaThBktkrWp6qAopiwqHCaj9x6feHs", - "6YKA63RXo9WDZjKtM86ckh4rJ2YC2AL9vKbdvJM4Xedb", - "6YpwLjgXcMWAj29govWQr87kaAGKS7CnoqWsEDJE4h8P", - "6Yr8DJrFFSoqzNQBqiub1U5oCJ6kKGUQWCjm2WgNTuHD", - "6Yx68aQ9XAv5swTxvf5vkgMY7tKyK9TsPVBLubuzNZn4", - "6Yz84UJNjiobQWpDJzdiA2jFvgybJdRJyhqKDVWRQh2a", - "6z1sMbhiR9UjnHfUQEEv1rZ8Xrap2dqbZmuySCkyLu7", - "6z22rWE5B14iiDhLS1hzNuM2be1iHSmnPur2TvP6UEUr", - "6Z57ttee4BSAbPUoX25T7XqvN12YxfiYnpDEPkBaa5Gu", - "6z5vLtFS6vaV2tY6a6Z29fkw5X84rEqVrtAVhNq4HN7w", - "6z87YgNqwGGf8N6CUs8FR5pcb4mfjwMRWYWesJL7gcYt", - "6zAzMSbPLvQh6WNxN6nRDNcDZRQHN4YTdquFftqQYL2L", - "6zbcVEc86jJQ9PAMA79BRHGEDwgD5SCWSmqy2bA3kRLm", - "6Zcon2S13M2Kw6q9DXnB7Ts81cra6kTuaTorYMyYpatw", - "6zCt5z72rfN9sRk2hTgc1LeFDbEBfXYmW6xtSNmgyama", - "6zdz3xCHLqu9uruKskX24eztqWUchf4P8YjY3pMnwCY9", - "6ZEbKFxTjEKGC9HUqzy9z4ccJ8Aq3ktPKEzHGDosQJo4", - "6ZGwooZQdrHZNjGP7Lrye4JuStqeLJf7wwSgLcZFNciA", - "6ZhhBf7fsH8rPvQ3NHfBea4Dun9b82goRWLK7dMfvx4o", - "6ZhjWQ1q4fFAgzhc3dRd88xiVV7Y5N4DnUCevs8VSyvT", - "6ZHmHdYmKXyyCYNrbsx2d233H59ZL34Yryxqk5QvkKKX", - "6zHXa7byz4FVWk7USQaWVaqrVz4hTJjXoiyU8ERFkv18", - "6ZjEnCRuc3jD6tMGVChTHhrkbFzFNBKc86gvp45YStXf", - "6ZJLwDZiZx8NwGpY8UH5UxTmvWPfEcdrpDeij6mwWcEL", - "6ZJRVk8mq9DN1tLgKDBdDgZJEDeELGDVLNGVRfecCzzM", - "6ZN8CDrGRFUNgmcafk73BYgSGSJXG5kzVQEeeQ6eQhFA", - "6ZR2mZ3r5oKHCghjMK7J4b61QEHy2b4vqW7k2viGXKLr", - "6ZWLxhm9jdZZqS2Gu4zf3NQjtmdRTizT8XYvpctKawW5", - "6ZxRGU1FXuWqcD92QCTogBmJXNU5f8EVfYF9FTpYep9i", - "713gSvwogk9Gie2frfWyZnidXWrH9FKh2qzQgsorgEUN", - "71bhKKL89U3dNHzuZVZ7KarqV6XtHEgjXjvJTsguD11B", - "71eeLytEU4rT4cVtgM8vtxUxTdo8sVhZZs4fnc6MVwhT", - "71MwRogVp3Mwp5BWy8g5k1qD2Y4ZQH1ntanqdZvGPhxm", - "71oaoWL7wPUoFSZ69jN1NptPgoHHq7b37REaah1khbir", - "71ombxjLVfhDUC74hC8oACFcn4BQ5uL86q2Vm7P53DNw", - "71qTe28XqQksuvxyB8DCLtdNYdGQusHKdT7U3R2RTooe", - "71RoTdezwJ3k2bna2CBvvmWtYGJyxKMcA3zTiYypoin6", - "71uGqYF3cNuN7ZjaQASdq639vAymi48GAGwKjQbvt9zP", - "721wicnref9s6HiU1ZWmYTWp3ZRonzHWRxAPSc2Ceu9K", - "72cvXb85PSTZanxUjbWWFrPczmyrirXdxL7j4UojknDQ", - "72fP4ZFQysCZphCPdFbTRU39yhukb3WjSPvfkrJ28uxW", - "72pRAPTqj2Ry7hiMFhCfK5Ba3F8zjLNSJ3CEforxUsHy", - "72PWBjjv3nHK2E5wVkt5qnErHnRmXVZKfX5xKuGYHjz8", - "72QbkwniQnS3rZ7h7ysSFuHHkCfsRPRZj2gL9oxLstoL", - "72TrJR5U4ajFxijBCD2ueaAH1urSPFQ7aMV1GLTkpUom", - "72x5oNiTMHBw6sFF1Cp57iyKg3FoMVStpFdncCRNieLX", - "731Lnc3mbXpquV8FmFnTL8EE36uoZRiDMUKXehwZq8x2", - "733SNGFdjYu9cBtyQGZzPDJXisr8JqxHyq78M3ppCcYS", - "73FtzAYdLiordQKdmvFqaCfkGPaxPGHD1tJzuxLZn11M", - "73h84MdQszFeu1g9wxY1vQLbHCD3U9DxxNo9gV7ahj7A", - "73J29d9tV6wTrVBo79r2CPRYBFqVAEnHB2yv2uSck71D", - "73MN6CEjnyj7ezFchpr7u4SEuypRNYL3KMLDZD8dDyQZ", - "73RY49dg4dfYPakhFyK281uMfU5o1miDe5KdRY73JYFQ", - "73UhoyXcXS1WLfR6281A9tjh2SwCb7mi8xwmFor6fgZk", - "73YGZpfTSBv7PBLvmgcAwa7K2fAaBoGe2Z9YNWz7J4rB", - "73YWnZRRabUNGR9NcrEKYdQTonMGWdXHegvo3yphzS23", - "742oUCUkgy3hvdnu3Mq4xxcakXNUESWJviVdZdTsKypu", - "749xCCSfFUwAtdVyAJuLXxjNM7rg8i5HLPYP7zd7Ddu1", - "74HsHh5HmvwPCQEnJ1otGrUshmmKAftGFv9DrMNNM1BD", - "74mF1zsgZMRBoW6izWsNdLY2fBnMLyEgJJyZNWUamWyk", - "74TbcQoVmGdmdZdUZTEpMaLonAtKTK29GsZpfn1LWxoo", - "74U9LiSPv2gb8bBZSh5uVNf89W4wZ8zs9B8EvRVVwr87", - "75A6FVv8hAZn3n4KsTkURtQP7GDU4SDiZxcTzkTHZM3b", - "75ApR5PzaMtcx2DhzZvkj3MDRQWsDCjcuEzWsygboVix", - "75bBdeNT5uf9MiK4RrYzqzC6H7k6uqf51wiijgpRvGHr", - "75hHmKRCgHotxPB7BFfWFCPqH7bMDZ1PDpBngjVTwVCV", - "75it2KaYhC2CtJr2HwmMYEM5ghZPCEBDVtidpZQdDGBr", - "75tzG78bSmAorw6ExL1eHzCBqsEht9tZHWiYdm3XAXqT", - "75XevPrx1CNx5zkkyEyXEPApvThoNs5uhksuKMrSnE9K", - "75y6KmVVPv3TpEcXedLNsVssnEPNpM24NL9hH1NkGZ3", - "75yzn7njq32yY1ieCZxFNVFZQWtEbQHpaaG6dSZFfmX5", - "75zHxx1T6rHS9CqPELWRufJG3iooaah6SJAsyZPbKYDS", - "76feMuBTzNSbJTggQzQLp3LrmcAwoRX9KMQVaa5ofHLr", - "76G2F5YYUzFTsGRH1ZEY8rjoKvmezWUJLvNrQHbGLFnb", - "76GQTwyqPRFnJwc7sEX9KzcJdk3qKsnTcgWibqdxN3mB", - "76MtAqLu1yz46ekeh9KkdkkAbgymYebBCgETAEKCRQNr", - "76r5QyoEyxCBEi7xt5zABjNM4wres8S2Gdwev6yb3twE", - "76vg1ob2F4UQk4MgP29EH1ERxsgtSYpTrfAZymr5gLtv", - "76xXkT7wA1JoJhKAFhqnC8zK1NEurATsS7hQBfoZT86X", - "774eDV1qkCZcHpU48bx5kRsPiviJrNGkrks3i4wo3dkR", - "779hnWTRpb2wSdqFjduzxeyPk41hqSaassmwPjQDGMnd", - "77AuYD2xXy7p8WciYogr5EE85RG8Wpnb1aE67vY1LFqp", - "77EG6gKnCagpmVNvi7453tb8AADRJ1BCHi8K8MeNDahx", - "77egigqjrqL42piit4hxas7sgrBFPBGyP765AEjPCRQH", - "77Hrd93KHgnFNkTQrwk9T91pudTHAuz5zaTLEkHV4Qow", - "77jA3m2a1T92hG5XYiSRtHkauBXhd8dj1ytDLvYpRR6x", - "77s5a893M4MNWxGepG2GympAjBk9abGkEHZbeGR4pc3V", - "77srMVcBZRVXLk53VyLtgTAQaaPrgm5hBgWiM2RjPmXx", - "77uXenX1Y9T2D1pcnHnYsYiwTTHbnzkyrKX5fQFMGVCR", - "77VrLXNcVnpPHcMCcfkNU8SpuPzoCbGfp3Kqc2iV1dgu", - "787PK2WaCUZCyYEmuYQSGmoxu7MyqK1usn43FfiVwhcB", - "78fgggvga7GyLhKexeWJCx9hJ2RDPB2kfSTL136Ge8RY", - "78jKRJjnPPDkpMK8bv9CZuDxHWai8hS8HWo7rkXvFzmZ", - "78QcjcDqBqvxrjLZVH3Y7vmyCmNdu7VSVnHGMiH4CpcR", - "78rbUTiDgWVaS81SMTay9LvyccEFHXiRaE5KQwMz58yE", - "78vA6rzeSkF2tdUnsy87GaT5FCuKuJNKCd2g3sm6pmtk", - "78x2rLzgmkv4WaJK7YJNqoAfvk8Xy99xCxYVbpxg7zwD", - "79CXWd2hsTmy3ViZKAbVNvHeH6QAHGh6xGk4sJBVT1cF", - "79deTJCsgvqwNZWwXPYxAL1eYE9z8NArP6rkhsVjbM5z", - "79SdgYawG2AHZWRTkvSzTn2DLEznQ2WrBxvi68JMFup7", - "79Th9ndDKenWL8doXDMiGDLL6dKwekppff2DAaPgzv4n", - "79u2h3dDBUA5xNZwP6GF2cbtzHotobTWuZxZE8DjEUGJ", - "79VUA68hwB2XuK654vDgjVP6YU57diuhHiiZrrH5PuCZ", - "79xi3wVGpDCExzvC45WoD5D4DiyKP8WWcHt75krkabFh", - "7a3b2gV9UdXbjvapEhDA8XbBp2PXzKyjevP4ttrs1S6k", - "7A4WJBegWKXVMhVoKshm4GzjW3Pb9od9ECWxF5DbrSZu", - "7AbNcvhBBHeL3LFhULonjidYSKKaZzyoiM6dDv8zQpjo", - "7AChWSSbAwgvGzpcFLtRocZoCACpQLmgUQFrKZpNertx", - "7aEnmY6hs4dNHpqtMyE7ACVaMaUuiRxJCJzhWMTCUq6V", - "7aEpJi2UvMndnYniMHr9Hj4SMQvDLkvvr6G7xruLUaMV", - "7aHVzTcxxXyKERnitfjLEf6LawTaHP11TprcpHe8ZfCq", - "7ajm6amGXayr8qe3nPYA6j1bPMLMCxEmhNdzgz1EjnW4", - "7aKHeoUDCYbEYdSEj63i9m6vmkXLbiafWxoCvyhcQtPw", - "7aKL2G6UMcXWXrvajhs3SxNpBh4gYxgWjT1HBvr36MEK", - "7aMcWdP9oHjppgetCyQdHWVKs1ceCYdApgZEqYWjBPFV", - "7An4i4w824jC5BRGBnCrVj2yifpBXVkY5TR7AhvHX7tL", - "7ApzwXis2E8ZLNNgifRFnqkw5uqNH2PXwqGrV8fa3Goi", - "7arfejY2YxX9QrmzHrhu3rG3HofjMqKtfBzQLf8s3Wop", - "7arMwy1BnRTC995TVdgZYU8n9V2gwxTpWmVNDdeJihdA", - "7atMLyqH6yHXfTi2zMXiTrXtXpuJTsqoPrkD4N63ddv1", - "7AW5VGSNcaECGKJD2C4rpRuWpcT4kdAHrbahc7KFQM3p", - "7AXaoh4Ry89JiLJVUz21QjS1tFLRxcVmNuLtE5poYLyW", - "7aXw3dDraQuRcA4UbRvZvPoPSctXmwBFBhEr6jwFa2Uc", - "7B1wzk2EVeWrorZzFAqX1czbBqB8mV7s5Du8YWCLsQjX", - "7bAFVtFKM9XzNoJH9Tr5YD791EhuozT29eA8mAp64Qg5", - "7BbM27xzTDXNGbPsTwTkjtYiP5TifMLYnyY14arNNNKn", - "7bCMxXqNmSjL7wubkcxxHRFraLE1SZis693X3BHbrDBm", - "7bFx5g3sh5CqupFYtch3J1RdZBZs29HtpXAWyPPyptB3", - "7BncGLSgSexiAXz1dRB7cZEDdkKey2sK5xiLpHESDjpf", - "7BNstrgKG3fmScMEuMQcKW5LfsC2SxBpj44pahsXHeqc", - "7brMQHYpqQHJhkmSNWn2R5biktFedTnqHmHH5uG1nxa4", - "7BS1RfipQ7zwuKAdiUX5CNFCKNEdk82TN2C3CmoXR4ux", - "7BuFEtkp8RGfEnuxUPu1g2AZUY3yqS6RLmXF7FsK1Nfm", - "7bVEnUUkMX6EWG8CXCuqPSzgEfhnQarAgiwzxPSQqPQj", - "7BvucQEF1JL18ZTs7g8snDjLUnCYU5xZjZAkhK7DdVgD", - "7bwm4jeZgRP6MiVnxernffHCLtDF7GxT9NzGzq198hJT", - "7Bze3HYU8aJW5PWsRve5Z3BSKzSir792k9mjxMkiinS4", - "7C1rQNgTzpZxTb7EpPrfB8jfa3MmUwQbDmmEZNgck9LC", - "7C3FrWyhFGc75WgccpnpuuCRSqpZiWpvj6d7U7jScSKU", - "7C9dQzoYGt5brT6giYm6Y98zN2MYPrBEfNY45PaB7Kse", - "7CbEnryDVK3Z5RUfTTZfTjy4hpg34tNTyAjrdaTG4F8G", - "7CfutCL2fCxRQnRwyxnqgRgkyXpHYtsjUmYfDRrkBzp5", - "7cH4E1bG6UAeLvdgQU6V4ZLqr4v1HhsXjQhNCfT6cpKG", - "7Cj9XfthjKp4KxccS8tV5RmjZtucBuyyXJDRovLkyFmS", - "7CjZc8korZvmuToJHyPcE9c6gmymAgu1XPXMfSsR2jDW", - "7CM6sN8wmVQCA3Kwze8RbZicDpjozCHbcusjBthA1Ehk", - "7cMutJPEe8KDfx7MgjUxkANFPYJmKHktTRnbbJNGpGMT", - "7Cnob1m8J6YosNyJPqti3dUG4k4YuANXdZdsEQqgrBRK", - "7cpQWMqTjbAtUSY1HT5xajymLjEmjrLEdEmkLnSom2cm", - "7CT3meTgwU7KVXgnj2tSbQ9kXqBaxKbFuXzQ8Sm2uzZi", - "7CTdZm5CFoWy3gMUhyqG4SMbf1EE3M1qeqLctXVp4ucJ", - "7CuWFz5cMBqyTqeT718KhRZWM8gAsAPdi17SWRDwjRKE", - "7cxjMtJv5nmkEa2dKfv9MRZn8na53HxyNLUdbDHRUV2o", - "7cY1beonNGzrqUk4pNWErm2vYcyw5yyLqwnrEHr6iKmu", - "7D2ure8oWVuwAvVhddnwiupqAVkLfW7TFmtB7q52SYv9", - "7D3BEmpQbLgDPwoP4fJ635ikvZkT4osmPDAkvfxY3Fpa", - "7d4nq6bfMBukyoGECU6BvJuuZpEJ13y485ohTCyD9tqu", - "7D5N7KZFN9hCcc6HmDi22JQaGwozaD33MQQbrkNwG7mK", - "7dAe9wFJdfG1rmfMbWdByYjtEZRjxosLPvXdqpto2RAf", - "7DeaCaqKkfisqLNm95F3hJhGLqbgMcL1YeirkVJmzgAY", - "7dEjSFnrm66CJ7Aj5mC1hsYmMzmGgWPr6iZNhcvANZ1w", - "7dHqJn6qFjLEbdFJKivXxLTvTC6w7aa9XUxxfSces2hD", - "7dKiopJkRwh6yrsBUnhEX5zTNCDWQwBRsvbD4fTdrUVc", - "7DMvXPALnEYhxKqUorHgh13xzBvSFu67dCU2MKF2gsv8", - "7DU3QwALuHzaDU5YVWK1BgeFaPo4TJ7QPAifNHCHBDBC", - "7DVNZTeYoQGXmWQGUxKp72TZfxaARRA3JM5DskpM4MJN", - "7dxesvJkAc1rnSaHMc8jMQHCcg2rntjy1fwaSTpzHqSB", - "7DyCSDDKvRe1BdxSyN6Q3bvW72VddJbJXG36Ghi8KRcZ", - "7dZLELryaZE1uxMCA4j9X25o66G7a89cW9LpxG5SkdtZ", - "7dzuwRToEpdNfEjXmJe93oCn2L2DjzuQthWWbqL9YDvN", - "7e6LrbG87Wctp8xN2LT9SikM3AWUQSfQj81PfQfhcfJr", - "7ecwp7vwPo5b2MNbx75yA7qxKeDBJDpQMzxWKYrM5rB9", - "7ED12uoR6C3mr7Apf2x7YnSmEHkApFo4Jfm1bq8i6L4o", - "7Ek9msWDDoe9wSgD9PrPA4Cnm8fVqjvoz3UK1U9LFyL7", - "7ELWp83V4JFJZY4SX7b5cDJN4dY32os67kV4tGK9KGxR", - "7EMHBuXwyktaKKs8U4SgPPkVNQ9SpwERmr6515haioAQ", - "7EMmiUb1TxdX6G7B7oAJ3jSsXMgjg7iR3WkqDq67cCKg", - "7eqt3e2CmNk1Tmy79z4pkEs7xR42upPfPSTMf31XN7uD", - "7ET3iuFkJDTdWgetabdoZNKgWeRPmAaELMz7LbiHLxT8", - "7eTfg8MnaL5qksT242QTwSLtaFxsBkiEBmN6MoF443g6", - "7ETjs9tfe3snSKSnKqzxJJHmpNTT474TfcYG8MSQnuet", - "7EucomZSKvQdiZLvra8hLszL1kRYiGewxyMJnyyzdbH7", - "7F2vcJca5ewzdJUNcVMKCLVYneq6CX9JFMH1U7JeVG5", - "7faDkCvyQkvRzEMjDbGJ2CdbqZr4yvtnXMJP4WuFSbTT", - "7fc8chLC68vNnvk1yMuAzFgGmAookHi3E5tie5FaCiuU", - "7fe91ygxoR9TUnXSw5JKXK1BVqEDttqRrwzb93dSTQRi", - "7FeD11iMwUfHdRPswtJNyPBbw3SA9y7Rg8gN3LEJhxNc", - "7FgM9e7PuWkfz1Pok7gQzQJsCvb8RgaKZcJLdfCDCAhM", - "7Fky5bkW5Wn1dGPU2uooo6GgwPg3o8tVNqGzF49ofEM1", - "7FnrBgjPb1y8PNjzRLihQWUvky37F7wkvRb7MUL89Q8P", - "7fSmakM5Mc71cvgkoaracdwHLg4wpVENgGWLC5793FSv", - "7FT6ekbjaYUUskAgJQVwxmrTKaAay6FQoRkckqBDoGCT", - "7fv6zGstESoyWYdrfeW1DzN4fabJm3M2mRUVid6bx4EY", - "7FVCgatxKrX34VwM4YRhUVdXsJAoB5Kk3EGWW5M2Nqub", - "7FVfX1y49FEJCCNgJk3oSrHQBa2wyeFftPtuW56P7Nv3", - "7FyKLiajGbeJJPQQuYu8yHj6rKTVC8KfPjaAjWRKFu61", - "7FZtd4LzNZ1AasWV9pUf63sET12kTFS3U9nZcSRZD4Wz", - "7Fzzt8dRe7EEsnNk8nKRtWiT6PQSYjKKuMcyVpRUp54e", - "7G7ugDu3Y5R3dgnApuQD3xYRHqVasRRXvq6EKXjZRX3g", - "7G8PAzpQms9S7MGWZ3fyZe1CrabV2fo6XFQzduZjWqPB", - "7GAebAViSXrGPr7Q8fEfyX37ZrLQGirbGvaLv3uGHZUi", - "7gbkDva3gWD9xyx1su88Rp45yrfVoui71MT9CK2c4JXu", - "7GcFEkvo5ZsV8A981ppd57ARHDxJFWYse47MzbLEb8fS", - "7gEoBVoj9bAsuugEwoCzjJvVh2h2kNd31zmWLbPM1D6h", - "7GFA1rGqUT1C6VY6m6egfwu8Yu6U5RMjHQy8QTCfzZAo", - "7GGfCUq6PKroYGouYXvJzHpYSTfzT7N99bcHNh8NCcZf", - "7Ggfukz8aoHQ8nSus4W4EPSmXPsh54GiBkpiSRkXWUDH", - "7gGqJUCS17QFm5LDCAgX5YBTKikf5RChV4pYm7rdyALe", - "7GM9F3HAJeYSdvhfrg6Avq4sw5HBrqutqQqDT7jHMDHf", - "7GMFUL84pr8ibv9h3taxcWnKyUgPvcM7bN9S1shy8w1w", - "7gqNyf2oPtzyD7787Qxnt7pjd4YUXRA3LqZEtk23d3QH", - "7GrtNiF8Gee5AMZB5RmNFdT3fmvn598uHjur3VYdyydf", - "7GSRVxZQstoVDp16ZSkBoicPQa6wbshkohf5FJ13NdX", - "7gwqrBhNcY35cA56egjt8vmR3ez1NQ2hYgTw8dQgFZHH", - "7gYfMkSLC1WPf4RDhgkNP8ZYR7vaqgcMeRe4FqLSERto", - "7gZ53E6EHW8M7pPrnEkVFsnPWpj51oXejt7KW76f84VP", - "7h36AncvuyApvkGc6YWfCwWR3SbXCtmhJ8csay8Tx16j", - "7h9eFtbpSX6r3FqmanenbmRc8FzyUHuo5162nRGNdAEv", - "7hAddyJcvQAS6SsfRKLJzYPuq4h1XykRSJEUmr64p8oF", - "7hAp8bJHcSzuC89JrULZDdXkbt5PQum1FXC2UX6pkTE9", - "7hBWnnwKxkrASq3XhzFUkzqkQYVpiXcdajEBR6ryisks", - "7hifPeGJ4YFHh935XngjGuv67PHruoBxiqeALMqqjDnz", - "7hJA4RztfrVrZNTn2Tz1wTUgWH5D9iiJSHVtzn35wyi", - "7hK9ZDn9XgcuaPTd9zH6AirxysKkutuntzYEjn73ieXD", - "7hnp1xyJYSXAcWGzMNoAP7Vg499HmwhgtH4ZQMM89tpm", - "7HPbaN6CuUtT8AVZUWfxt8ukNNfkuq1doBZGVyA8aUmE", - "7hrCU2buYuimfBmcnaih2NrxhHzBXm4SoJySjkkt3dKt", - "7HSAu6Q5LAqrCk7pt649utsDrrEd7yP5NEcqodFd8TTb", - "7i8vEgrQoaLyVKY1BeChRxpGEn1uLSRoZ1JpbFUYNhHw", - "7iDFKaiCbSydTMkT29yBmxroUmocxFdT9B1jzT1amhqY", - "7iLXiGLsiNimGvp7B21WKZAuNfuQHbw9QCkhz5bKhHZb", - "7ivaGH6xo5sf4hACXVNSqeeEDeiLFLTEyqQQwffDH133", - "7iVC4scG95MRGdLtgtLP5iBTuPV1mXk41oCjJgfKsiQW", - "7ivQpiCuB2kF7VEWoZhRebj4Bxrqh3iAWZc6s6fY95Ay", - "7J435hrXJan3XkU32ZG6UL8fJAb95GWNfyzADoB33Zff", - "7J6Hdvop4rYmi3h4qU4jA9edgqBsh3TL6DbgDW95fHf9", - "7ja3ddTX3pExhCzBbJvREn8zJibG8DEWzFaScnPsSEoG", - "7jaFyjzftX4Uw5UbjQjjHn5ATLiMtTsRpmNwKvnAyPBX", - "7jdjBzSKJnqHZ676UURpGTWXteU9mr1rpBDW7qanTwsj", - "7jeyRTfzimBh4PjYbFcJWmvi2J4ieyVaaziMxc61LEdu", - "7JFfCpPEodnt6SWY41ePBRXR6LUGiKhLSKJNw9ZYjdah", - "7JfhU1wgqAW3kPQrJxfn8mftMTzcizBzqQHpZBFHnyRD", - "7jgcNRZbKcEWGZndJDpsgB6HwYeQ9u2EGnSX5meoyCbw", - "7JJavA1X6JK2NtGzmt8x2mARXjJ44aPq9wFD897w6YJ3", - "7jjoDGgbbxZCuBqJZKFAfDGchyYcjMYKfcYjkPRu8bLg", - "7JnRKPLKVRybN1VL12j8PcyqaFJpTCfnCEq6Fnf3qCbk", - "7JNusQkkUKD8oVxmFCF35S6Sz1pCsZ8Kua2uwTFDB6yH", - "7jnUZRgZuCKwaj5NUXpAga6iUKw3YD7NSjyTo9eiSXx3", - "7jNZvKUhhc1A2RDJxsJFt7UCV3xkLesiyJnnX4ynF6Zm", - "7jRsfqCrhtZX27XXVyuMwMAPc3dbjAtXkuQzCPtd3mtK", - "7JuwEN1a5PcQXrV7wo42BqyKeMkCVSeFHaAdAjeCYfR3", - "7jZvCyKbtQjKGZJsEWNza35JZMCiSD7MCNwYPwtAncg1", - "7K32uTNK2zJwp5WTt4t57qJMf1JnHBq2HcSkc4oV5sQb", - "7K5Cx8jPryK1nkeyU8nrCNQXhn1mZMCA6Q36PerK4s9N", - "7k7bydJPG3m1cGFTd5SAmoPZNae8EJNsAmaQaMsaHdDD", - "7kEQ5shYYWLepVBmoGydVKiq86JAeVpUaFYpS4zJzuUp", - "7kfnSPPvYhjUYaZjqjagt91bDESkNo4Pvi6KSKCB2Twd", - "7kHCrxgAAbRJxk1ayPsqKQB7ZmX8qz79p2DJ1DenXJ15", - "7KHHhdx9YANGHFayAdZvLQnSurqaWApjFSZTvFifZy8i", - "7kHoSEJ58Bo6bSGXHxN3RsJv1NG2GfGCcRxboqvSfxbQ", - "7kjw6oyy2r5HyDcNKDThS9X9ZsKwK1oGxTWP3wVnXZnV", - "7kmwiz4wbzf1kUSZmKKzaJRxybGeDMLSqhR9s2FebhoY", - "7knBdqtoSrqHVmw2aPWFPmTqafUnYNRdh5H1rkxzgMyF", - "7kqhd82DvMjqUT2gBQJ5sG8i2bKvdkEQKiL4pbr2WPtY", - "7KvnzA5iLwJeQ2q84FA3K6ZAKSWwvyBXPGPqcEea45Wu", - "7KWYKiRdPoFYw5C1Q3jqqcjae4VLNDNU7StnA7hJ4wge", - "7LAtuwWfUenU3RumkusdBpyN15KfHGgcuMt3m2cBAJf2", - "7LccZ6QXtnSMLqXiTe2tDnfz4WN1Z3B5RPYsEsH8w1XD", - "7LEdt7JxNK9pMBpCwkaBobjbYHqYsjPkHYRhFom8zdNk", - "7LeXBD8kT9xHyjhwcqRJqcsr8QgByPpg1dBLkkXzwHkP", - "7LtaQE6wT7STN9EVjniqETUYFXStGgiLMq99DCWtk4zM", - "7LWFFmXHDPaEgpcVTCCs7vxCvbU1o2SsAVtRw1pNWixa", - "7LxmU2J2koi2zpkfkyPPZbBzY6DGZY88twXPjCeyGdMv", - "7M3jvtAidjggHNhs1RcJDD56mWYzym8Em8RoKhkHp35h", - "7m3rgSgyS4HXnBAc5F8tPY9PTXgB5wLNz4xC8b6XA19z", - "7M5x1VsxAfJop6PF777RM8bgbg9txDVRsunF9kHYP598", - "7McnMxZD4BL6D7QrbzuyGZ3nUFCzcezRwcCUXeUq48TX", - "7mmRxJNttYcJVNsJmiLjTHYmNDt32EpzUSgLDoBsTKKK", - "7Mob32yQxae4PH7rgSFR7FHwMMjcWjimLppS2D6Eitoq", - "7mtKMUgM24GPTiR2krRimUiQgXRRmMPmmPkQBzMZak8a", - "7n15PAcMaqA6i1eNUFdBe7v1XriLvgecrDJ7YsEnLqsW", - "7n1kgqj5XJrp9n9jxd33RmsQJ563GzEHLV68BCqLhbSF", - "7N2tmS4edCuwP6BsyfWXUtDzwBFb8PmfZd5mhb6EYmD8", - "7N4tWF3KRJezeztovuMGPtaMtnSmjxEJpjRXVAeaUHeK", - "7NajPkr6K1meH88b17teMpEWQUuMkCtqsDn3HvzpWAct", - "7NBE2BW1qWq9JzANao2aEfQdPUrnpU2YwpQqyfzadZSW", - "7NCbMEbXd1myiSPHkG9Nq7ke9pej4GBQMXHL7HVmsyCM", - "7NfasVzGcyPzcZhiKdn215iyMTY47Gk149TMYApw1Cx", - "7nfvytjCRguVQL61NP27c7eWTe7dP7V9bGivYAWmQq8c", - "7NhhKfPTCPivYvKrWN3mfdeANJawYjE9h73tfRUVs9BJ", - "7NniTvNZcrEPN6sp7TaGdqA1m2JnUTABQTqyqzWGFjv1", - "7NNpLpbJicSjeHUXiLuQy1cmnHNthnsmosbLes998KqL", - "7NPcRcHu3jACoQf54nkRBLgdn7zBbUYhnsdC4VHqBQwK", - "7nTLSKzbfNRtKiTgBjDuDKU3FJvALU74ZSvtBBUXzbCc", - "7nuWizYQEpkytGTfgEjrvoFFNUCgyzfvwLr3wbTJotym", - "7NVSMQf6GuoZoZB8eb6rfurYQRSQvpuAq4BjPvY9nzpU", - "7nvtPTUn4EnbLp1SgQCnpS9fqgF139gfmfr52rEiNPyC", - "7odF9faZtwCEATzPFjyFHCYQAgNdBxGzB5znqEVJzbVE", - "7odNkZmb2sG52sojMv2n2sBXsarYNPvgYPSxV7XJmSei", - "7oGJHKc1xVUwZVQGqZTjk65BeXv9UxV83Gj6fC5B3qep", - "7oQ4anNmvJmXUXu6pkXFb5fmovuPSdWzbRkwMBvHi4yf", - "7oViXMPAfhEQ7fF1FPbR1tYe7ojFgCiRf3RMPsqAEzT1", - "7ow84jPbuMUYiCBXzkdJvt3ithTGAixWX5gxHXwv3opa", - "7P6KLsDkUbUWgLzx6Xngf7zzQQ8HTTiFmjPenrviEtvv", - "7P8QaMsLK3JaDjKWCfbtdX2jqiXKh5ewfVctE4MYBuaE", - "7p9j7jJMrHHqNFCnuDBuoExEhKBAJZVqNjVqXNdevPFA", - "7pbP9WNjCcGmL5Zskh5gyoGvRMreu9wn4RkMNharDbAE", - "7PfPiZHmBEQ6mMV3QLVUdk4eq23qk2kcHWevn2NTkwTU", - "7pH81EjgfUs1aVra8v88ZQHqnxBtE4w3VfVUy1PLFwTW", - "7PiPtXc98GS3KpzUhazpqxWfkRDakvLsjqM2EuPQLMP6", - "7PJj6MaGTmVpn69E4QGt5mmEdarKL3Lfyi7f6pFCKCgf", - "7PKnD2SA7JLuK7yghefGXxubnv4nnedyFxz9LkVhhaU4", - "7pKWpEQLzie4ZwMWaPpcv9Ko66hv8FP7kZEx6w5wgujc", - "7pKyFLFW9J3Ntu8jbKzcHhfK5rr3VAvKHYjsz6D9DiAb", - "7pmKg3hSEwT4Nz7FzjnBXLuekp18jgHPig3FjWmogB3H", - "7pQTPTnEoLd1ycpRNZXmxfHP3bjbqUUN1LfybHnNoet6", - "7PrziL6NUubzeAULytKx14QJuP8Ti1xUKL2KPpW2p9Lg", - "7ptcPZ8k6v6kYgxLuYvKZWXANXoCLACWFzB8x8t74JYr", - "7PTY3nkBL6yYXwehEtY8szyoCbGvHSzyPUJa9NzWzH5P", - "7PuotSq35UDPRu3B7RRZq3AgprJzLRRv4pXTQee53DJT", - "7pX3LMd46vPSzezrWk4xdL1kowoVDR2pBmvachzumF5H", - "7PXRMgqBwyqnNzomJpqLC44tUFtUvfS1r7sA2qZYKmsN", - "7pXu8LkJ6zAXdm8NaxVmsjM8X27Y81kjHpkVSU4uxnG6", - "7Q1sjiwY1Re1xK4YvaR6ZjTWyQJHBeVGJRPh65q8mT2r", - "7Q6g52pNXSqmSkty9TzFotJPpPSgnqqEdSYsA63GdogQ", - "7QB9q4YXRrpZVWu1aa4mYU6tpmejoGPHZBDYKQH6MfJe", - "7QbgiYgcfhphNrZJaKDQPy24ku5GV3jP1d6siGXz2gnh", - "7qDpGd53o7s2LSQyKDMPd8Z5kbvJtLutZDZ7TvyASZYS", - "7QeAXgECApkwokELcWza2d255xdcg61NB9ffSpxaProN", - "7qFWjQLAYeSGf7MBFo9LUYEiFN4LpMagwFu4MwAUueVn", - "7qhtgGRvLV6tPkTiKFHBgjZyMQYSUqQL5iE5JfRbJKig", - "7qjpkCoeu2btexN9DBaaC3kQMAdacC8gDhhbCt9E6Fo7", - "7qKt7gLrWXadkpPYQxpi51ZXE1k2WKTB1obGQftujqU1", - "7qP714EBnFfYBtakgszeStUevT4YF4nXPxv3GZQs8r7E", - "7qqq5DafwjjfNBHuYXPmtFf2YdSj2rSbhQdA1cpAxnSu", - "7QqYu69Sh5WB58JjXEmnuKVfvybC4dxWTsDFmNqiY9d4", - "7QrgfCAeoEhfKSfmrzbYkrHCydCBzEqAgNnGTHZ6vmzY", - "7qzobSMqm6JQns146x94kDeFd8BSTxXtFwCKGAbj3G2c", - "7r5C66jooXSkMQJm8ZRK832Vc2w7Risw6KUPETafkuJ3", - "7RDFicpHYkxPEJAA2FRqtmyCew98m8B6cASzgtSir7mt", - "7REGgFMBGJ838cEuBRS76JJGeZ6MY9RCS3CRobV5ZRki", - "7rNJ7j82HLo1YpRC1WDjxyTzvwJE9DZTb4JCpsYQJHA3", - "7rNMaD5xECLtK2RgF4DMCjkDpNX4u6LJFAzFT8pbEW3v", - "7ropxH5miyUohqu1XVUW9Z6hfG7XPCfyDMvE9THZLjSE", - "7Roywtqkx3F4tpCuPCQ6bQm3LiX8zr28d86DdLQX2Cbt", - "7rPKktkX77E8USe1ghYZQBCoYkKda2r5o7KpVTdwBjKi", - "7rRcphhq2BtqhdbR9wb9f6mohSuKt9RAaJ4R4fkf4dj9", - "7RrKc8sshPPHMkX6FvrxtQDKFytPiJN7NXpmBRXsD62h", - "7RRnSwXSKKCjPXrGzx5NgvjVD5ztEPwo8Ci6gn9i643A", - "7RSF8nL4FZ4jS9vNk2RTMb2W1asd2wtAfV5heUX9jnjP", - "7RSLZN7uB5wUYMH228VnLZvVpbq1hqXVLK7SWXefwE5F", - "7RTTKCWBJ2XwtSHkUfpwBTH7SsdKqHrWfnD9Dv4z2Wyw", - "7RTWbtenq6KcsHbP9EEQLpKNH21yZr3kuyiBq2nemi9n", - "7RUobwC33EbHaWWR2sbdaJhT8x8PpgUoAbJQYrQqrSgQ", - "7RuUBtHw3j1ncgtPi25uL2ZawHh61iYg6j4KK2BRi9cz", - "7RWaoTXRmQ6SXQXeyE7amvTaaTBgyC3a5ZpgFKECTuHC", - "7RYAwsb91ZL8117TaYuis356M9abKddFtaSga6XpZhjx", - "7s1uGD2CDsbNAy1qq4LJTakgZ2pLMETBHzeMonQzjAaC", - "7S1xGwMrB4x5fwhchayjHojKQoCWZsd5HnRHRUJGXekR", - "7s3RHk9DjN99vYcKViZzgrQY3g1j3mDD6p9c8P26oGUC", - "7S5HUGDMXvKXKe4MgfaaeEupHmzepsStGpDFA8fa5EGH", - "7S6moneEwLjo8LPyPGzC3AWBhdUWASZpGc2mYaXSk4Uf", - "7s6ngwDgEukA8RxkYfYjTom56Rem7cCrMeJ2WdATfuc6", - "7S8RtjoSA4ph4XMs7EVErwJ8QdgMxohPYAGdEKoUCXuf", - "7sbikkbs373o2hKLW98h2zMqfUJoZviZiHYbkB7XzqTf", - "7sC5bb9BZJMaVjmNjaKghtpkDS7WYU1dYmQkg5ApKbYe", - "7scarR3Z5obfefZr8bPKYoMNipua43K35AJAc1YchQBK", - "7sdh5QHFPo4ktG9SVTPM7Sek1WLZpwxNNHudojYi8dK6", - "7sEpbQB3Dryn5JhQVCGWoGgUfYwNEZzjPNa1Tu9mVa5p", - "7Sh3RvLcbKBQEESGQf5rmDpSNyVkSYSJqqeTbJTqk8Tj", - "7sH5bH8GD6uK3qQgV6RMxSoW3n5dqiE1i3Hj4sYBMmVu", - "7SmrzzhfgKnhEzBFu8GBDaa7rFYwEBz8z5YfNK3JRssX", - "7SnprbyWdKCUNCBtZuNLA7MuJPYwyZdCFWjd7dPdeifM", - "7soLaFdm9gNJZGhSNJqveWU97gonc4Rz3EssdoT5KDkF", - "7spLXv68UmS9KaYHdj1vM7189AfdnmWhgqxhdph2sdAm", - "7suRNpX7bJsXphHJtBv4ZsLjJZ1dTGeX256pLqJZdEAm", - "7t1DCPp2xLNp9NoeBQXaPCHFdaVTZeFXfWPzi2UJPAuK", - "7t1KthvNQuKfuGYioj6ZfgmzvJPXVLxZhBbvgwssa6t2", - "7t5mpGaXMs6Yx4t2MwaGU51dQtA92ozZ397oe2374isv", - "7T5ZekSsBSgLNKVzQmCRQ5iqL5ycprREa1tz3GYmb4eT", - "7T8Xr27tPEpYi2ajYdWX2HN2aEWkzBCwouPzsr56yKPw", - "7T9ejTHAzZb3X8mtP2ACKGdyRJ1HrNTbxXtVSQbZVuV8", - "7taXjCmy78gNRNii8bKngFXYMtPTK3AAGJsrpd2jxe3h", - "7TcmJn12spW6KQJp4fvvo45d1hpxS8EnLjKMxihtNZ1V", - "7TG3LLqWYn8ybpqAJaiop1bVb5mPWJSDhxPaLzUdF3M2", - "7TrdyNs9oHeuYoskbBmHSemMhip78JjTZ9tTWenuDXT8", - "7trWtWjH3cGfSu8z6MgkqEEuCJWN5NhRZBYvbT841Yi5", - "7trZdu6xLZXdBQHmuhmCq1MzqeLfWoV1ZFAWpWDs341n", - "7U9PDgYAphVRRjQ9Dph1iMErCbLjgnHLk1Lm9LDtpehr", - "7uAiNJQihwhHX4mUxxjgndAxk6JmqFWNW6yVZHsPS7r", - "7UbJ8L8vXyeWn27RY5kr7cYjEKPgEYqLcGEXWdvgvUAm", - "7UGrc9CvQ21sszPoSZBaxZ3U18vGNfrvV89T2pBf4PfT", - "7UhB1RRWxkyAfwetsGxJ9nJrvD3mBFKEYg5VWpDnoENf", - "7uJexnmpVkbz4XzvzzSBbN9tLpoZBsabPqg9wcYFmLzt", - "7ukpegvcmvCk6xPUoLg7axawLZ8C6thaJK8Cz564LWR5", - "7Uo8CEw4yWm83N8adY5LXT1QC4JZjEoo8J2Bw3YrUYYo", - "7ur3ePGdZhfSAPJLSpqUUT3Y4oRa1PxnW92HvxmHV3R5", - "7urBmScRfdSH9CpQ2SAwfmvGXp59nTDx6Bw16USJVvGa", - "7USxw5GCB1m2cMfJux91juuq9UfuDd6ktTNqtgrasFDL", - "7UUFbQSderHWPqu6BoezL27ymsgrBbXSi3qQHAozwDtP", - "7uuvTX8C2uys6EcVdoEhESFc6Akd5wZLeAerJXrPcdzH", - "7UuxHB2MAYMD4VFhjzHu7tXjL8ojJaQqeFJKE7WZAxfz", - "7UXDi9vQiWNaLrp937gVD6CZ3L5xPE5PwQbW3GX97PPL", - "7UYxZ8yzzE4wiY9HefUgYCgpM8AAKmonhArkSGQHssT2", - "7UZAaZTjnsFMze3RWtzpxTG1CiJenrvPixvVxW5xSicN", - "7v1L5zcmpYyde5s8hvtBSrdW4V5t8Qef9RB2xTRKSqyM", - "7v9PVupixdqhaRogD2CZvGRSxbnR128D9kcsZYVW7uYA", - "7VCXuMfzubtQhqq4kar9U6KwjtyWNA6i22aSX9G2eo8E", - "7Vf1S1YhsyNh5jTTiNULVBTQRmM94agUX71rq8QiaGNB", - "7VPjtnnxsj11JPaM4QQtNkytRvSHnRX2j95BJkBKyvza", - "7vu7Q2d4uu9V4xnySHXieeyWvoNh37321kqTd2ATuoj6", - "7VV8eZcVAN79xoGL2eEAj5sXVbQEsiqiTCZcbjisjXUx", - "7vvgucBzi4GqDBBdSkcAKfbdQZ5uYuq2nFkKf2XiqyXg", - "7VVYonADe1jj2LtKZMfTKNPiK7gjVRDsX7dvA4BXf9sc", - "7VYnR68uDAW1AESFweaPAjTYoZDbiNHeUq1o99cTSspC", - "7vZ1Jh8HFqS2ATzfsNgFS4jdBUhT2bbMCgRgpTXN1yDw", - "7wbd5PmaScSxFVMkxTYH2qgKMbfE3X2jAi6JwkUuGpwv", - "7WfCCV2LWV3u7oYspp1r9P99xyxVwaDuN1H9iiw8DMtg", - "7WgNDqtFHr1hLYo8wcw8X5uCnGwDSYQMz7MMKL6dyLLt", - "7wGVRd6FzES3QCpVNdiGKHhcMetVonwd2mA6XRj5TpdL", - "7WH6nrQ1MY9i7pLduZEAuUQNFrSDZJTxQWN4XfmD3G3V", - "7whPeUt57CtDY9uG8WdUaNxiZ9kE4dkxXCYgubpjnbLm", - "7WL3m8c51RELcLyq5AbEA4jzfdiXerGym3DsVH5LBgua", - "7Wm3VPPirPYeY6qeBs9DGqk61WercZZeehNedDvc6a6u", - "7WNkC3cjwngUYWrAjEwXHgWvk3S1adKJd1JK5FZkh1s7", - "7wnYDzNZqRD5EzXNRChJqsP2gonqTv4csk78JMJGHsQV", - "7wrS6TVsTYLBf39LmsebVn5WF4dnbrrxTtmYFgkBQsc5", - "7WSmH5Mit3Jgh5MiLfnQiJ8D1WTPsYpmNaAXShxco1LT", - "7wsTbSt82EDfR8HrCi4BwQkSycQDzutz1WtHLkKP5tvL", - "7wsxae1rHhA7x1329kfhGKzukq4Ujhw9D241ziBxdKY7", - "7WT3vCK2re3Yorzh38w8Ea6Xe3RqyKsW3WkhrHsLMut6", - "7WY5CWTSXZ34QFpBkZrvcb64PBMBD4nggUPu1mXUoFmF", - "7x29aMXJ3kxxTXeU7ur7NpLFWCmedz7LFVo2oUqYA7tY", - "7X3csFXUN2AZph83GC2FZCpkCTZXfVWssaJ72cpwG96w", - "7xAPc3WYomPjiGA5PAwyLMFUNej7ESVsPnXaUqMyrqzE", - "7xEAj6xqE93q1LS27Qj2cMsgCK7Y9HLrkf3QAdaLYLrC", - "7xeb4YmoYsorvgv9UGZjed9rso1A56yz64cWBXaYKDBQ", - "7xhwT3FQqW88unUPfVQat5F3koUTPSujfwaT41bt51qc", - "7xqAunExq3P52Ps1jgoxroP7To4cdV2vn6jRU2rxsicF", - "7xsjU2eSPZUWYiH7UvhFW1icQJJhwnAcmK6XiNAinfCu", - "7xTjy9z8QEnJB1AS79GAxY3aeaQJfpHpd6zsMbT6xTbC", - "7xtsXgZpeTksCNtoiC7R5Z4fJixmAWFo7JkHMdAKj3Vw", - "7XXWasLEbXXUAwuix5a6AfB12G3SzMYm3WYqCvU7kh8h", - "7XYJkB2hXG9jVEjQx3kEW6HdVswWW3rC8Z79oxQHg81X", - "7Y1mo8YnxNJtotPKHK18naWYeMYHBWrKXt1hV2HwwtRT", - "7YcE9TBc1jsm6vrYfni8FJk5cnf4rNgxgduy9QbhmRzg", - "7YdePTtVSUyi1zgwK79ZFGGuxUVfDhg5EiGYFQKLFiS1", - "7ydq2pkViQ5VyijXq882P8V5yjDYMqUrNGuXRHEeEKC9", - "7yiFPLeyH2B2p3xGrr2Y5nmk8B52nEaa6j55Nk3u6648", - "7Ynm58Z22a5t3iL79gftSCGbYohs9Yg8kTi2a5jRjoYe", - "7yRo8i8dV6MgNnUnzhHvgwExxKo2HqLHJeeyK7AbL6ME", - "7YWwzLyUFKd9B6HdgH7DZRN8hwbvEkr1AtFkT5afWvpL", - "7yzVecfpWupdJwVQby3inMggGSotFSnSrhvPGPp6JGdU", - "7z8UkUobye3KensYyVyDwzjSQzvBKHBiYTMawCcfj3Qt", - "7Z9T6c4c6XfAzF2GGBkqMGJhHadUUwk53RqpLVqVdBrA", - "7za9eW1e6a1zZ7RLCmE8uGJoNZ9xCC774QXM55pmUcLm", - "7zdZ6r6hZu7yNRorrD89njTjjuyTEPoZfGm11n6qAwXh", - "7zgs4FiwtEFeeQrCh2FCWyL9vAWerrtWVtzZCKnwgin2", - "7ZNLg3A7tZpvETCHXG7DuxVKVqb8Lw1ZHtBUFCzsiWUW", - "7ZRGS29gDTon8ymM9jEJ7UpYBDrLREvMNznxnCCLdcB4", - "7ztzmLEVwGCGNzWRadS3xv5ZTSGJpye3XfvGGWP4yXnc", - "7zvwpF7bpAndDGPMWiFGXw5tKGCpRny2Yb3US1V6JqiB", - "811DAFtf46e45HbHG1Jx3GkdUWDEB4K8tT6XArtzo81F", - "811z6K6vDYLVNdLp3nRYMKLK7kWL4T5CU4aALqhGrNsU", - "815srzMfHibMqH6RsZ5okrxa8SyrS7NorzdoGBdCwnqF", - "81ArELGMvJMk2DPKppKYuFzqc2LLMFoscUR9rtEKdTgp", - "81mwcTZnCyVg3d93DNLHKrHfM4h92mdvfRMjtEfgBppD", - "81oPtFZWXDkyKYTNADyMqkSWXVuq721XdGzPyChBxeEa", - "81YhFweqX2XQ2oMVY2Yk1wLBM9oSJ7W7dCF4ekdmW3SS", - "82BPXtNdKBhiEEFdB9Vm6dJpj6jGuoUxEKHxZWiBcgyX", - "82k4RGZAJxtXvW3hzgmHB2q4oDHzgwMR2cGXup324gsJ", - "82QNHsDhgqskMH9CSSbirM4f7LxTXyUFxus5XiZ5XbVS", - "82QtvH2Bnug2CKKSiKcH4GhY4Fk9RURxkWCfxvK13dDP", - "82ukgzK1nUcg2VxHhPR4oN6ErF3kFUU4oSkbXSSZevbk", - "82v9YP9HUrLJ2VHUE84z1YmWSg32x73j4e489eBaaruy", - "833zxHGtDtimp2dimnaDVDFwfGdC6ChVVriZ8t5t2kcT", - "836riBS2E6qfxjnrTkQdzD1JkFAoQDyUjTmzi38Gg84w", - "83dsamELA4FWaGAMDR5wo8FnFc1wMksyVY5pSi5QHxbT", - "83MDnvUfr2Mb8JWQJ7Jnq5FonpDF4tgZLk27ciUBK7tQ", - "83mxyaEUpkpyD1U8ARVK6z6rpa35cLA9t8w5kyNE6o9f", - "83n6hb2twBbaiVMgRKRzSCqTbB3Tz2bLo5XByT8DUoSe", - "83PWQUxkBDrTJmJeFL8VUah6BK4p1JPGdXVuJC9Vf2Pk", - "83yRBcvb1TvdXd2gdXEfNmhjrHtebdYoJPRPydtGfVn", - "83zF7LXWvETDkzwe7oaDN2nPTAtyfs31rUbUcg3qgjze", - "849PifAsrRLoGqcYopZvPuJyutbsLwmhvB4z3NjaA3DW", - "84BoHfEzq1FccYEMZPeuTwc68DQC7LS6Bm5dRMsKypA5", - "84GZWtzfKYX1yfstmjA9eUEp3RnWys8DmsPjsd1ay7wv", - "84sCKfepG1RZEfAghQfPi4fK33skBx8FuXdAtbPLRDQQ", - "84tDtnEq5EJRt24aSnoM5EibqkN3tFgJSHYN8Q6xdRSm", - "84tfpwPFCu2xCFZineY3F9uaEcfarhKZrDf53V7ksdcT", - "84uq3rDVzFHz5XBEpU3XBVQdzwQQQSeSaa1bj2ihhjgq", - "84wGo8BroKGBwqQZBDo6Nir4o2HPhupFnBXiXUPvsVkd", - "851Nq4eoWb5AuwjYGWBtenatjwR6MjjchRNu5bCanxhY", - "859Kqd71jDi68MHayXjQJZNy9nWBt4gNs7HomAfdNurH", - "85rUxAk7KgHbPsoMJ8ZZtQm5dX1f7DFLm5jQ99UPTqYc", - "85szjkcHLc4W39HMJiDPtLNmkuVVmoc5nteBECh59p1h", - "85tCTgi5s1wAb1T2puhc3wDvY6exXTNu9cCZ9Ahaa6Y9", - "85V32ef16fZxsNc5cMkkXoFEDLqDPwutvw6eoZQ5dZvQ", - "8641M19beXr6FB4zaf6GPYdLaV695xikBLYFYTVEBZdm", - "864BMDPknGrEG6YRqH2NuNiFfFNyNuFir8X1UVAgwwTK", - "867JdzMFFnTwXNFpk5zr1hbCeFN5rPg74fCqfZab1BS9", - "868xLCLazH32FPkQR8zGUBLeELraJC4PAdw7HiESpwwm", - "86c9oHBy9jZvngrL4xmESXtfPz5SKqdzvZfyxLXbWyCJ", - "86hxQGfre1vvVsYP7jPBka8ySrECZQewjG3MfxoCoBYf", - "86kgVBnnriopN2yug5En7cQ2s19t8iMu2nzopW2MBR1m", - "86n3YQAFmvCgaBJNwWgyvaHWPuDXXKQhjwzP9DtQqDU1", - "86udvSq3mdGcAS2sjPGyZ7cdzV1Wmy53pLif7m2ZHZ8G", - "86uo4MtfpLrW9EKd7pxcyKPWBSPQ8jEWYLj5MpVBigFk", - "87bkkoM4jWCzHrRPZ5QWpxUvAciUNo83P9XYDwQTC92f", - "87DD8V6dBztBZBWP8YaPoJoJ3uQdvySf4grDZs1bdKdj", - "87EPFtmvtp8ard4tTotxw7KeV6AFAhRHzzctJeCd58ru", - "87KKjUQzWsj3J9mY1QM7s7YApGjy8HJxS3M43uMzC2YR", - "87VdxCZ6cxYCQGHwEsf51bmur2exvejfoBnWtPSgmWiR", - "87VQhN7dUfS9wacre7vqRm561bNUk5PwUB8xmroc2yEw", - "87WR1cJ2AHMtCqpyAFSb3jQHB6KuxS6H4RcX41i4N7Nc", - "887UbeeP1exyQmoQZbM3LL2PuUKAAFKooSjUoe891Z3Q", - "889fcdhYYMw5XKdFN8HtiS5zhR2iA5QS2oQf2d9TstG6", - "88DJ16S4EQ8bk9fc3b4NQJ91rfrcKFAA2KuLS1yk374j", - "88f2cVWZdpi3n2ptcEjUVx2tRrz7TGtc5Z6CdbkbY7k7", - "88GkmbKzEuf3BvZFNHfeqBvMwhrwhHbD8sASdwg2aoM", - "88HehK9H5yArhs9ug8xaSdZAKo3jbVDQrMo5QjrFB9RN", - "88K6FaecXMrEzoaZw1vnpVK3eDFy6BnjTQg5VNqmTkVq", - "88KkZuVgNWZdvkoAXzsnHdLDhByhT7nqQy6u9jqwRf5Y", - "88LsPiduRUoUs37tvJspRMxUWf2BuJkiXHzD5MzwHCnW", - "88ms3Y6Z3pNaMrYY4zdUwHp5K12csjNeffomBnAdyaBr", - "88p4BHPQmyY1ZC5ZRhkqyhdLYmkjS8e86JpR6SZgqitL", - "88tkq428gvuVt2UjDkX2RYPvV2pCCKCAXSGzfzG1cn83", - "88y5KFYDc6jbnZUFPN5QfjJnz6dgUdVesCjh76w93EES", - "896tvc8WPdR33Q5XYZRxPQkRZaqUv4Mtr1kvFhYPFao1", - "899YZ7zRkmD1zHrf1WLrhsGDhffFAL4bEWEXk7T6WHdo", - "89dMyQv81adCBz765E4GUZ89jA2sBu1EFHskjAaiSHDU", - "89GSoaUq3XfRAJ4E6tbfPKhnfnJ5k3MzUzxLa2t1p4qP", - "89oVVNiLBedKhdB5LPXZXmy5q1DQYFpQaiD7pTTXZ4fj", - "89vXkL62kciXTe93joRCGiP6xFCHrNxYGJbshoWoTut8", - "8a1x2PEGv2hfwBe1pB63F5ipUjcGaxDPjmQBiJosr78", - "8a3rCvLRcSMGqQvzoVcHYuJptd2o9sK2rt2CKfTtbGnE", - "8a9njgsySJ3LUTvHHyCChKajgZXDoU5cSXkrfn9gf9Um", - "8AAP7xv3CTCGb8oLsZXvv8o1qw3ZVQc4iaRdRBF7Q6SS", - "8AebZP7pkQnPHzT3avLQ4HUYFCjjPTLtAS6LTU7siYwG", - "8Af2gBRyuoeopiKSw41BTtLPfiKCisztd3fUjxsKSfz3", - "8AfqCBEenj94Sd4npDZkTjXDGCJLVXkFop6mDaZpbEeb", - "8afu6HX3H2BvneuHdDXtS86Mot6h1HdQaMxhPutdZq7P", - "8AgqfNWYTzmtoxRAvqFB39Z5kdhoW6BV9hYjW8Rs8NvF", - "8AjoaKySc2SEasya79bdS8qGmdKXZMEEzffBpUnuzohb", - "8aLcsxJbvynmpXvFbGVmtMAbnr3KzQDSQxXThXLDHBYG", - "8APXMZuvgzp9MY8HWNiMjCLvLJ5p6hmgQ3hhp6DAt3Xa", - "8Apz17FY7vts5PUEP28apzqQBVgg6McbetFJqb45ew8F", - "8asbfNka49YELpDoD1ikRp8fmxZgvaFGvD1vX6XNum8e", - "8ASvX43WvDF4LHe2ioNUbn3A4ZRD9iC6rsxyjo5sVGLp", - "8AW9FsZKtWku85rS32bxnQQ4FM2BqNV4JqrFFshefkso", - "8AxUNm21N6cBjTnYTLCKJgXRCRATALyb8bQD4fkH5ki8", - "8aZ5CJf9qYnQtT2XYuDKASj2pCiPwhWoNsc2rBqc9s1n", - "8az9GBsu44bnEr3aFmqE7AYhP59xG4PoyfkXBhKFmSEv", - "8aZtHhTNFhVWp4fV3dUfBwsKKBjqzHDwpTZRbpeqo7vo", - "8B6ceuBqhZdLacPzaysfGGgSTH2q9D5oybomyjwK4nKC", - "8BbYGTHvwLXfsBSq2Z8oyTL82op1xDkhb51QZpAxS3Rw", - "8BdJzya9vC1PUZrciyMDadChSiEoCLQo8m2yezEzdaXz", - "8BJ5HT2YAgdA7DqVxcwVF5mp9aeHEaWSz4QLH2HiynaW", - "8BLttJjiTudXX668BMZnFVbcUvGyhbqQDTnU94arpEaV", - "8bn2BhTzfNEQoMyEPJ2q58hFzQY8GxPkLRFWHMWksLet", - "8Bp1GmdCguUrbJbrhFDL11ZddgC83cPcbKEUbPPPmxsj", - "8bRnkspqHntTjRpnWrCKZpc6pVwChAjUhtZrwUVPo6NN", - "8BsUWvGb8vvNKtBLgSVQiK4y22eBYXeTD9kfAKaJjAbj", - "8buHwxjeC8fnD5MZrTaR8iLsZYKaHJMXLzRD37HqYjLx", - "8butsrHFxUZ75vKbFnyGzvb2DeVZj8uDynWhbv1L6cSF", - "8bWof34xLUjyJzxk3etx4H6ZXqUoKVWnzn99TAJWRaHN", - "8bwU8pTjJdC6risWVrmBKvo5gVQcN86djN3CQWYtYrAa", - "8C3hTBQDsdCf1Gq8nj7MojFA3PtwEo5DazQ2NLTH4WdW", - "8c475ek3Geh3X5hhCr9Cb61piDKedhMrPo9bkziRqpah", - "8caQuNVnmywtQnKWv6j8MzzJ8mrLwJkeGcKEtkQkoFZA", - "8CBHVHADYuPLBopg86FpZCeohiFGEudCWUi4YtHAEVUr", - "8cDHpBhzqzea9mu51KwFaBLSquk1dMuPNZaddw2LfC1s", - "8Ce22R38MddAZSpEhLC38BqUEzVAcZh7h9MgfVCWibN3", - "8CjqYQENKvvNJTQruxR6nDjoJTfW9JUHv3pn3j3MBwE8", - "8cQwRJkJgjxhiEqnKv9Ww9SDQbFSJHmcw46VXJq71MiK", - "8cRQ182d1Bai4z6BzPBUk4WsByphHgnYwWQ6aju3FeNh", - "8cxdEbo9zBdP6UMkpauT52oAizthyqbjf1Tki7ErSaBA", - "8cycWFpsC2HJ8mte8LhomdAJUkd58ayyFF2GcdHrn2aC", - "8d9aUvzeKb5R8oYHDuxP5vT9R6EARxyiH9Sy2NA3iFSE", - "8dBgKyy3tNgyujtxeTLDKDTXwNwaxJtL8nHXmcJLmAQs", - "8DcZb7GEe62nEzdVx4GDSi5mkATGfWJNQ9xjgAwtNzic", - "8DFZngo58v1EkxhzW8zJMSVtcRMDScaXZx4ErepWTyqU", - "8dHEsm9aLBt7q6zu3ESfRXkS2eCwkbbzzynfd2QxDzms", - "8Di25FopYs1crYkwwrwuVJhuEkGj2rSCjcGXyZeBGttK", - "8diJdQj3y4QbkjfnXr95SXoktiJ1ad965ZkeFsmutfyz", - "8DPQ7oRJPWzyYDBQe3wV8CFCZP7vKqB4Akb7GKjjNJAC", - "8DQFvhEf2KK644TessvznhT5srsjkfHFZ8xYJtdHDvpe", - "8dQtzfHmaFK8GjKdiBU3DWrbE5HfEafZDQ1RsQg5TZ1H", - "8dT4hRJHCfizTc7f6fadVS7T5d18q5fxQmxJ5psVD2oT", - "8Dtbe3A2QkaRoAMwB7yyqPVvcHZEVELCA85uaAuPbRbz", - "8dvic8N6UPXHBeJf9XQMZD2YHfq2xx6yKBdgTFc2NWbH", - "8DwKvHQiqBq4Vd8yvHyk83ZonhzBLMu6GxQhT2gfdPaT", - "8dYakfEyJqBxobSp6WsSPSe2eEQs9oGHtgJ8xvHbKYiv", - "8dYApDWqSW4EYLGW7Lt5pSfASJe92korRCtjDLn1Dowy", - "8E9KWWqX1JMNu1YC3NptLA6M8cGqWRTccrF6T1FDnYRJ", - "8ecSLqNhqpC1UUiuR5zHPBav3oic9mVpRD5JKTkPEEYk", - "8eio1idaNjEmeaHUbmJYJDJXAzXm7nNevp96QB9vLA5q", - "8eJnj63BDzp6mXjrBN88a9HBfvHW9z13AgoaVw5AdAMc", - "8EMdxPdBh8JgtpCjmLqhZAmbQHbx854FdUoZcUrfrGGL", - "8EmUaCt2jq6G6dsBogkbWHaQ1uW4ZMj2fojTcBrN3Ng", - "8EN5Zfv3gX46oAguTj2Gp1b8rmmL2mocsHkT2QfgorVk", - "8eo5oGX6ipU3J7VS8DDW9ZKCozF7fH7A9vdjsC1Jwk6H", - "8EqtKHaSgPskksNFSC8oWzSMT2mdSMMtNjGZ7E3KHxSn", - "8ErfQpWeqDi1qKSiccZhqoGjCc92e1k2SEttrj9wSBVq", - "8EUEa9h1NiW2GLrMmqJtDXYer86ixtAgFSrBy3jU71s2", - "8EuzNEhHbysH4vvQ5iAq1G4dEX3bpfFeQBAHGiFC1eNH", - "8exVRinRkcsbTkup6KorAVsNBxYjBYHDCnvvxEhhcW3h", - "8ezK4ZCQFWvkfqH4aRSNf77tgRsG2MVpv6MA7856a5Et", - "8f2urzmGbB31tQ7ProT7xdrkGYEjxeVSxQ9oUY7jPUdN", - "8f6TTpExC6P1h7UYyq584EBZRjoiGZbjy1GNDceDDcPa", - "8fa5JFErG7MeWAGFW6JVzuCdjbhqezcfM7QfdJpb7YNz", - "8faCuTioHxq7DYADQwQeAHaKXjqBzELCgUQBieXhmKGb", - "8FaFEcUFgvJns6RAU4dso3aTm2qfzZMt2xXtSgCh3kn9", - "8FDSpggVtX112siqa8evDkJ9PRdTSkgsRv97hPBYCWB9", - "8fELCwf8vTtWJShtMmo7YoySc4CokbsQvm1yptQGwV5G", - "8FFRtjiUL6c37qhYahPAcHgbUDeNpQnimzCo8btqvkGn", - "8fgrVVtDCGBS7kVaNsGRoPu94cFQbqoY8XDJd3DSx4wh", - "8fLtWUfZSpAJk7h4XhvM6TqGjXQxiwzWkymxmGtJoGdu", - "8FLWf81JvEtprh99FDdABJRutPdYHBEBdpVwAgccKZrR", - "8fMvrzL4oLJjoeY6QC65PzuXuyxUBzB5e5Z17sGxBpf1", - "8FNDABP9KpDe8Vp2CaU1yygRSptySHBQ64pCg29XrLf2", - "8fPwB63iVzhGWGj1z96BqhgnkBQ55yKgcGZkyrTz5gws", - "8FQLiwRA8FYnr7gY9TnxYJEP85Gs7ze3rcbNpWEArWKU", - "8FRFYPcwBan1KBKR6HuPy152L7pr3ePVYVxXXnWzPjEd", - "8fuqS5pgY6E7Yw3p5KipKhi4LoH4FRmY8XhTbX1bU44t", - "8FwZqUDdR9A6mzkwc6bEATHQAaQAoERnVNoKgbVqtMkN", - "8FXWUxjWVSahY9Na5uiLpBR8rJjswuir9w99hV6Q9DPV", - "8fZ79axNM5qUV71C8qkAyzmGwAcpmW3C4KDAS3Vv5JyP", - "8GaMqVpXH7JuEs8D8bdXpe7ztUasAP3wdEXpyZZbUJeb", - "8Ggm3W6g8hq2KzATSESccNhaAsVeDv9198ZUfQyKHFog", - "8GHYP5PNjWLTPDrowz6Eo5uRPsrzsmMrBaheiQ8vn8Bt", - "8giECigQz92qDbXKXkJwHd9i6w8vsYsFThkgtbpGA6F6", - "8GJuF7n5F1GNuoDNGmUMVRQo4bPhiVTrk1Fq7wcNha7H", - "8GkWHtXzbcLEZnhYE9TnwZSceRg6W7cBi6RrrwrmseqE", - "8GpsptdhGCGybKqEw19pVBZg3gMaopiKtRMVzJFBddfB", - "8gsqw2SJqieV6MEipr2NZFuW1iHooGZuWH18s1JT42K6", - "8guxGZ3yR7L2pBtXgoBnPpq2RE4GM5qvK8UaMG5YXds7", - "8GVz4ZtdriBPN9qCthh32dyVed9fbFeMtu3YCJsbjhBR", - "8H4ERiWZVLUgWxs5fqXuBkqZYS5tN1jwzELJQdRrGTVo", - "8havzk7MnbjqcwSjDGLtvPVpTtC3SFjtGjg4YLmqvmcF", - "8hcj4iXb3ESkaEt4CEdJBvu5dpZShJLwYD6WoXYMESnF", - "8hCsi8utv12cBVcxuWepXWFFR3SvRi2ScUangRk7spe1", - "8hD1AVXPYCCrSfZGQKc56Lt6zuSLrFxejLFRT1SN2oXC", - "8hfRovLwHnXFZY2d1uDx4Bz2NSwKx2VwDFNDoixvZXvh", - "8HkuMwe42b1W1xvxhLoBGgtvM49FtxTFjk4JgDpLpbMq", - "8HkVCW7vKa9cUbr8SG5TckWunWEW6tdyjRpKeQTJyovN", - "8HL5VpqGfTG9SVkHyWU9gjo4xdQYbbdVS7ExTrou3zCE", - "8hm1sMZoqn7ZA8SmaEq81Eda5qz7mvGoNxsFR64BJqKx", - "8hncwNckV5toGhkJpkKXLqAUZFLSwvRDS1hguzH9uCQk", - "8hNwygCHeBAC1xtooRT4cKxFQYhycL6WzjQP3jGt7zAD", - "8hpUJeGB6BF1JTZcbiNEgw9w9fdQ8dEi8jF4ohapsq3h", - "8HQ4ngyTJecFpGS25yWbKwJWWSYUdFxy3gTntaeLJ2cM", - "8HQJEEbnDghogpNp6893GVpHm5m2YcvqWK8pWgpJyjfJ", - "8hUYWTA7EknmGRfJ8AZ7enjtzTvcx2v5fGorQQFtamG6", - "8HwBojBhDJCgCZbiEqHN3Wq7tXn8GTADJDLKom12nZ6T", - "8HwzfqZvk9vfZLjc1vJ7y9wN5LqKdaF67Fa3BVFnYTSg", - "8HXTLhzZMUtPFAf8XhG4WjiAXyH8Lc7K3wgLbrBW9reA", - "8hzgFMZG4WqaaMZ9H84J9fvcxkYDPYnTDFznx9mxHWhP", - "8HzsgkGhEFP2MKuuPDy5f8qvqR6hmwPqeq7UMY3X2Z6T", - "8iCFX9mKt5WRka2naX7FQ5jgfGyB7GUGq8ajgCXxnFtc", - "8icN1FhPkk2cfzo3ZVjHpZ2BbGFdoSPaLAkVHtdyxcNc", - "8igp2RrQ1F4drmXGpV8qNyJL25Aom31jAGJ55avPZLc7", - "8iGxV1RcmZwsemmCpVTz7f96NDbLXxKKtPEtGGWaLhcG", - "8ijRD1ySEEArpP2MLWpWT698z5uMLwFxjygjUWAUDpw8", - "8iKQDAis8FN586zVJ33t5P4XgrAwvktcuQeRAN1WRENi", - "8iorF4s4S4NYYEMwGNJZqBbKoMePdoyYyrozanasEWyZ", - "8itTkbGjHRAx3cum5TD7bXaubmEFGxmKxqe6STrVqLdy", - "8iZ1Qk38z15xMW5ATSPbb42pC7FJdFj8NtbG7uosNdXF", - "8j1Km7pAP9FbJsYvj6cdWzTBPjT3CdzjCS5ZUXigVdd6", - "8j2Yj3NmFHr5kzt5z71QwvaxpL67N5bCPnbDPZ9QJbeA", - "8J4eQKseuoL1BT6rHSZHNG82U7gDorjy6JuqXqEQSswe", - "8JAouMKpQNai5VeEGQ9pUaiLN4v1A34MeRocWp6QWWNx", - "8jcvQAu9XywtkrQXWpYVXrUokRzCUQUdaBYqvqKEiVjZ", - "8JEabVuVHztGdX55zFYUssDCYH3gpdktWCHJsK7NReqb", - "8JGx3F1kzMd31iGorS93XH55wMs3ugPUidronb31hmDt", - "8JogSJBPQYR4VJPuWha1RJuS8dP1KgNSjSnLm8Gow4Kt", - "8JQGcMT1RLnkMjCxuJ5fGhtxNZ6cdjjEVuaGy7ve32oe", - "8JqSz9umwSowZzsgtsCuDuchQu1HvsKgugAT8yggAjbN", - "8JsxcRJHV7Yc7nmLxr3gjnWTbRhDGPtApAZCma1X4gFV", - "8jvZGg3ZqQwmvNxj5Lh6aYMQEcie9nsv4ftqbrzV1u9s", - "8JxdhUn9NKWoK5AdtcrbWpd2RVsmNgeUSXJMY7TMZqaH", - "8JY9UwwkjTNSn33ymgQHTwZnWzQ7LzE2L7UokDP2VGj8", - "8jYnpEZcE9SUYPuaUXA4TMBWn57G1pPecRmT1fLssHqs", - "8kb2xXcj3FYGxGuYnGmiyDL4jNGXY7phvLpEZ3ENCpKs", - "8kbMCDRQNWnZAeF2JchoUv8R2wdHxaqXGd8Sqq1x7yp5", - "8KbMvJeicpfdEskf4dkA8RmQ9QsgUtuLHQcYeyk9GEAL", - "8kEHR6dMg7BxFSr8xWXAhpM44MH6XG1ux6LPL8aKxGiZ", - "8kf6AecWjLL13ymjAXD7fgQPKGisVvcR4iPwNsjwPwU8", - "8kfwLkFheky3obfM4WKTA1xdx4zS5HBTohvL3GPo4jQq", - "8kGctEMMZXt5MonKQ787nczZ8r5qQenHQZU99a3j8sKx", - "8Kgev9VsouSrCNbtymxd83V7ptNMezeA6hYYeYvvxYy5", - "8Kh2wvCgEPU8c54VnhCpb3zva3ZgU9CZdRNXmoi8EMBo", - "8KKQ4QJ7JWAosHwL5pmjKpYWMNSxqtQjJVes2hQezNRQ", - "8kKybWrPcA4q7jFg7zuNmanLb1q6YcMs3eEvCZq6wJ31", - "8kmGKeciDRaWP1btAwYdmmx7xZmeLojtgiHV3MXgboQc", - "8KMr3SPmuEyY1xDTDCSzqkVC7EGhGd6ucFw1FRtoyioQ", - "8kNcQZj3XFoVTSE9nBsf8U6BRdXyDMisrurrTixtAjB9", - "8KNxrRNDrqQJ9HMYrYvwbxNiJbTnpMEZKTafN6GRsZv7", - "8koMZ5htQbd73gimMfWeT5CApHXUetqVRfG6qNxJWQdz", - "8Kpca9h8Bn7N6vcdWjirvJ3kP3PEuEAwXtcXWX4ks4LX", - "8KXc4uGJQvc54YHENRGLLGBbKWhwxDkKKCyVGywjVBp", - "8KxmN2JBMCxnLKyVJDitTDBGooCqqVZXndtNGviTmTgc", - "8KYQAb2TqCq4Tay6rLTVwWr6BfSMtSmn6E2qosc3xm1f", - "8L1k1DCCwRoZVEVYZcUzLht9SxUBhkNw9fU5PGnZfw9u", - "8L4RzEE6AapiPXkUdxzerNtyH3wQBgQWhSdMWqEYf8WU", - "8LDnhd1QvG7DXpTMwoH6FnoPtWHrn4XaFczDcSjYtuds", - "8LE2Cv9L4wLsbYuYfx2xHJEYwjwCn5BpbxjmuqhnPn1B", - "8LfFW7WB95WnWwq8mK6zAu7WvYCY8ZearoQttnJ1WN35", - "8LknwWtMatn1uRenrXYzJS7MxQJXZ245dqTuQiD7wZtq", - "8LkSKTrwqFgw1Knh4gc2BFYb98DnUJvQAxhT1BAFYh2p", - "8LSwP5qYbmuUfKLGwi8XaKJnai9HyZAJTnBovyWebRfd", - "8Lvm2DbYmWYRQt2d9RV2QebfMz3ruYTTeBCBjLo1zsT3", - "8LWgfq7eMxFEgoSruGrcJK4DCcDu3D8MTeUPZDL3YiEH", - "8m3BN9WCEFofSdACwiyDSEvuGikDUdsrWhgq3X7ULFZS", - "8M5PD1YzZZrt9V2pt95TF7rTrJUUwyXTWEsVMPwckU9U", - "8M7An6zodLdasjjM7wFZQociwW2VCxjW5bN9tZnxqe7n", - "8m7KuscnsUDYyrg5y7L39FoFBtpUbzeXkJg6LrwmyFEW", - "8m8SjBprJdD7xg7dqmpR5Xp2H8D99F1bJWApGSQkduJd", - "8mbCUnEm9arjUtbQfSzE1cV6Yxy6F7CSTN8Y8VGGwRWP", - "8McbNLZyYMN5AemZ9S8q7t5oacbWoWuzTmCyNqrMMsE4", - "8mCsw1jgZ3xKtSs842mCNxVUevrMBdA4oa5Jx5xCQSaG", - "8MCWvYx4AmJ4B9cjGKQHZBzrbUCRy5SP89QadvkKZ1Hx", - "8Mhs3hgdpL7AKns3wSebNkAfFfqycwd7K651WwSsg57L", - "8mK7gCU3DhAG3YQrSN2p3HDM9S9vSd6wddhHKsXyKHvv", - "8MLVpNZCjbcCq3PuoLtdajwSohXrNCoXsQK6T3SxjAsp", - "8mMjcL8dW6A67zuMJKDUW4UtfYDe6KpAAnVGKFDG9HQK", - "8Mn39PNexvi1XFZTzASyHAVTnDMED7Ct3ivfvCGgwoyk", - "8n6Vb1eCvzdX69Cmasg2BQSmysHHENGP5XrMfRRdsMG5", - "8NbfzJAE7hSCVc4CnBYc5v9ykTKN3uuYAgpdXGZLV9ef", - "8NckKPrPLY4kxcVqD6RV1EVaxyKHkf9DBQe9cz1h6Q6B", - "8NEL8uj7R7ep4qce1BRAoHeETnCcAojXRxAjdzw2jRdv", - "8nEwkhZSLxEbDPwqMPsAyYRPSHQvDCbRPRkWsQRdXpuC", - "8nGsjSv92c2n35pPcxZUVytPTpD4WqnZ751MeH42whqZ", - "8NgvLoYGP7wyramK2gEzS4sj5UKpRVHZeTUSUvMPMna5", - "8NkJuAPAPTyb5VnUpjdjepHPiD6GR2dT9BxwrmWtzYkf", - "8NndwQsrH4f6xF6DW1tt7ESMEJpKz346AGqURKMXcNhT", - "8noQwzDhpb67yzfREDKvymKWtSdPZtbfjm3pxPYA4bag", - "8npbWe9KrtLMZabvNootNfW7FnzgoPqVhaNkttP1QVR7", - "8nqG2vCnDq6bzoiHJhoK2ccuQjzZn3AXPWa82pRCWvso", - "8nRtbmntNvBdFWgnw6S1HpNYp6DR9TrSsnmozgDcGFYB", - "8NukQN7dRSNmVGW6w9DHTKoLmr8zqDF6a6BcXxyhiMjV", - "8nvD1CUE48WdcmRdvbyWcM5LdJKRTNP3tXT6Qp2CSND5", - "8nvhPfZMet1yWpYzrEJcaXjc6AENvSC9AcwRrXJeMxhK", - "8nVToBBSCKxiqowzvm7mKGwG8E7mzurHuRcDbf6hGwFw", - "8o6pnkqZDHehoKn3TQmGqFGxuTR56qqPaqL7Wq67b1CL", - "8og65ngX9WuGbkzb5crHCgZdXKmC8AtFaVCPPSWTgxZJ", - "8ohHjP2yEMtGwvRxefAFirXJzF5zcGR7cfdrWVn2SPvC", - "8oKFriavd55autxD2gbx2yqcTH9rJ3nbvdpKhPUnFArG", - "8omESudy1zEmWPdSc7RWed9jZ8EvbRWqN8A3YxWxgutv", - "8on1tPwSim4wg1azJz6Tv86idhhGZMukwBTed1e9etHY", - "8oNDayxLJScrfHiVXmVoHgnzct8LNHnjDaS6GDBReXw1", - "8onJp7KyshoMcxVm5CemhPgGvA1hdSnHbcjLCvJidV8o", - "8oRw7qpj6XgLGXYCDuNoTMCqoJnDd6A8LTpNyqApSfkA", - "8oRxTRK7ZQgdDHXrhaqKWiQpcScGhdqQmYt3JMaX4kK1", - "8ovTnEEYtXfBA7GnBcitzxJnUDT1t12j7pQbV8B8SeZA", - "8owKC9dY7LGUNQr4AmrWmVuGGv4ziG2r5iWjtfuGZ8qk", - "8oYwBGgUFSJwoEMpFWNXExHfjvYhoEocmECHypq7NvNU", - "8ozAaeFzxcBsqX8hqtBEdQ7cgwGbcKEAutHxDLNSxF1L", - "8P5urYePCoRGxwpBJrMxLxWinEYHQpUL6n3Zp5D2694C", - "8p88nmvQ3uKnZtAi6poYpo28nqzzsRVXmsKEpvqCX9MG", - "8p89b2h5NHmiDs4tGnK2jGao3ZZWjhmrthyCxjacVFiZ", - "8pBBcPuSz14SSohf8BiHrBdAxgzrbA1jgtxTkwSjm28j", - "8pCBjVNV14jQ61MJg1y4z72RBKKWA6cxibu2JpdJARGX", - "8PCr3ks9tj1GWSX975uPWKrmvHcUNGgnoaXSifgQudGM", - "8pESJ9JxE5PmDiXP8MAvDpdxL37mA4UFrZFKZ2BFTKYG", - "8pf1LTFXYNmvB1esMKvqLq92KZaAt2ETe3pGNxqy2pc4", - "8Pf27Nf99XfuprRSYv4TwDRPPuLEJjr8btyEeSpNu64W", - "8pgXxhqeSSf5CibMAUCCyJ4JXRQAs3uV4VoWfGgAGg8q", - "8pirWYGpFxj7NbdFNnLvFhQDBA5yhF8jH1bxQryXJkmV", - "8PKkAxmSKmtZsAqNdoTXXQXmubNeSpcBhdMzmPRes7BN", - "8pnVPdkLSewtm2g3KiPY5wm4R9ZVMuHMu63UUrUWcHH7", - "8pNyye3gonyFtXewkEN6AVPJafUfnEeVHSn5r7FDiRNW", - "8PpjiFF9eMpuPHfSDLgFuQz3m2GDmQyo2u5KepoRkLvZ", - "8Ps5P6X2up2DWytEJRqc7SmNqwiPqMVJXp9MVaKZZ6R7", - "8pSa3wPqXbFjFri5AYf4NzAEgEPXr2YxX13JawkRCzCC", - "8PTjAikKoAybKXcEPnDSoy8wSNNikUBJ1iKawJKQwXnB", - "8pU43qVnsBZfVpFUnFvcNt7RL98mo79VJgGqB8nD4stG", - "8pUJmSJo9WXWVz3uf9rUmvQAxnbuCF6gWNeebbjGdyD1", - "8PUn41CP3VdK15qzrxz1BvENBCjV3LDeSxunxRnRtwGs", - "8pVTVWZN4TZW9KevTysmnxLh2jEP5D9r5d7n9CXjT91Z", - "8pWmLkuR3yio1Kcu1CqciTPmPMTiCf72h9n6Z1DmQNgk", - "8pXEg4dMZYwT2MhyaTgUWr1xrpEey1ArwrXcjXm5Z9wm", - "8pxP9Q7km8v6HhAAXSiJvQWKh6MWsN4bvCnhvooejHLm", - "8PZNvPTVy3irci4T9HGMFfxx2jiCQov1FWgbWcjps5t6", - "8PZtnhmPgASnTbefTAFvRPJDR35ivLkEMs4qjfV9LAEa", - "8Q4HYJH7MfjsakrFG2F5skB9eFc5mpBL97iL7tfCjoPW", - "8q4ojJQS9wnCrP6db7G36Eem4TguR3fGcvALoJGWswNJ", - "8Q5s7urHaNhhWJ4ajYr63wgosdUeXn4JyXam4gebmsLw", - "8qDD7oYQLc36h7kHTZVKsyYfhfpWBTYtFEv2SZ1TbpNe", - "8qDvC448mSjMsPQK8QLPmXqdrvxFda359bgE2hrHDdva", - "8QeWaSZrWpHBBfyVTEwECMieo847Rd3HLAsSZYv38PmA", - "8QHpiGmDQagfpuBL9jqcAovE1Xihv2nhiyLuwdsemVcK", - "8qKrKacHZurjPgm8QhBMRkaU6rSBTRKN8ogowfLLw3iH", - "8QonKWPvpEwz4kdfgZyZrXUr6NTbrwY7B5F9iTX7PqdH", - "8QyeD8B4oakhRptYPcxHBj7gKMZ5kk3gqEeDkNc62ZvN", - "8qzfv2P7ChZgFj28UcfRvFpGzEesbLqqXjHZzzKt8B9r", - "8r2C2A2He8itLWdrRdWAnLYHYxytvRFP61r7pMwn2EqQ", - "8r6pc9CCcowum9RLoR64imKiSdgLjAN3FC21XF93pJp8", - "8R8mxR9dzu44FnR4LRGhuBsPTYBMeWfWF3MVexKykRd7", - "8RCDDBMo6A6kLuQU5uUHTuDDNo4ctUQNtvcu42be37Zz", - "8RCU23xFbML1P6gBQu6feAzaGGXG5MUsT19CEBw5RFur", - "8Rd6twX9XJQzo8LTshf3Jty7kBQdQsGe9dfLia4vJzfW", - "8RENoU4tihnRqoAJenZUY4SPJbS8wFuFPiv8G1VcXy72", - "8rFvDX4Qk3ro39MedCCtFURFkyyfyx3ESYKL3t9zTbpC", - "8rL6aTgGXc4wMCKPJVtjyS2UKTk1qLPknX6xtqXsi7gu", - "8RsYRsi6f3hiK4EhyLS22Cy5KkrNbuidVYmsaYR1Xx78", - "8rtRDdfaHnPMCNtvWWcbsecvtePLac9HeryNZceq4gzJ", - "8Rufj2YDPU2fTmoddtpZvUNrMya1Gr3m239Dkv1poGsV", - "8RWmN2RNgY5JG7TT4V14qRF84HdPaUcMwcJRG4ieKEZK", - "8rYvAuvyVbwym644HepSRgCXprdFxN4Xf3PTcqxrwEUq", - "8Rz1a2MMUQPqWj2Gd5Qv4mnnyWFdkGCCBhBr3eXQtA6c", - "8rZRRsHokUy56BKKLxcjrwe8QgJH4xy1R6E9wwAbLhuq", - "8s3WULtbWNjeDG38kTxcGcemdiPEMDxu4DXt1F89QkXT", - "8S4Xb96cH4sNrnKfMDHd4HR2bmjWbeUeo1o6yJC6ZGkY", - "8s9C3U9bkoRJDmaTnJZyXDohhwVZZxzCh16bcGWb2fcq", - "8sdfPtx5azuMnM5X7BMNyKFVgFyyrYJMi8t8w6g1qzLC", - "8SicY4CN4ag1otWPyXpsqbJknsAajF9c1yxwCBJbuXyF", - "8sJbSYEP7HtR1VGwobWNwrwFkjSMoPZU1hMkPzJoNApb", - "8sjpnniDJn2YopDTcMuucmZJavAy9kYZgfga5f7EGbf1", - "8SK4pYdR7Wy9y5msqFi75qysdN6rErTvESGzukKXGgGr", - "8Spi4hLXLF2UBK3guqBLMEZQK33Cyg73JrSHxziSuK3V", - "8SQEcP4FaYQySktNQeyxF3w8pvArx3oMEh7fPrzkN9pu", - "8SRkEC1b6qfjzAcfaQeU7n1GcqvqPQHc3b6iqXHRbpqi", - "8SRKNfvMerfA1BdU79CAwU4wNfjnDvFrBo3o5f5TS4uv", - "8SSakGsWFoCeB5QavZ8rogqpa2d1sYSMiU3gv1pKTm6T", - "8SUe5gZWxmi3ke4rjneuZmgcNBUeQ7C7Ukmeoe4P3xF9", - "8sUeES7FdvfW26GirKMbU8SdMrAzQp2bPSFgeMbWMV2o", - "8t1QckJWbvNURZvHeJ2vLttKf8UfJkK7trVQb4cB9P16", - "8T2ntjCMtcb2zBWmL1BiVD5rho6Eqk41SmMm4AsbuDFi", - "8t6UUXRkQTBpanRoMjxNxio1baXXkEdeLniCVJGMdzLJ", - "8T9HuQCuRRZX6aUDR852z7rxG5vrGhAQi6jsZfqBJ4Gi", - "8tAfWTqBJiBaDfgE4cJCB9AwqcXcfoDeopm1X5QHeq7o", - "8TANkJPTv9uXZM5XryJShan5YzEW5Cq19RX6GgR4FzAf", - "8TBZGt7C7QjyXia45cuaRp4rhQZ7zLTZXY5ktiu28U6V", - "8tFgUYpng8LcfyHUeL6zSKwLQprRWbzgigWdf1Jq4ste", - "8thRpgbWRpxZtUkEy7Q75gZ64MdMEoyjmydrYdDFR6Uj", - "8tiCet13nwqVRtG1UbW5Lf4uuj33X16JnHPZssfvPXpE", - "8tiRHsGmVaGiz6GpFTwAec8JXCqttYVwoaNmpt4nAoUz", - "8tk7QMWkXBbzw9AJJtLkrdf8ZnEQMiWmgXx2prk4DoQv", - "8TktgyLqNJbDWZDdcz7XuUEkM51j7uMSAPmMfX7Hi3Fd", - "8TL5z3PpUwLJFYhsUV59gPc7NvDvwSZFtstctkJXSGxj", - "8Tm88BjGbP1c8khCnURhnwztxXYYWocR9ZmXQYk9erQb", - "8TmHpiEzmR1Fn2R3LUAjHvFJK72SHMp1rgEdmNJfNnv3", - "8tmRx2uahhBJsW99jhbcCc9738zHUaihfCDRWyzLCW9d", - "8TMUbvoajd6bzvL3ci1mAfoyM4N25gTXzNQD3y7nJyEa", - "8tnw9JrcHReEvbSeQfgxDpBDPJr56sqvCigrcKJCfjDw", - "8tnxFEN6MzbzMtjmkEkztp33dPtTaSFcCaUSEeYBFMdR", - "8tP3mpKwavxwhDo6La7sNZWQ3UmLnWtZ2qPfroNLc2zB", - "8tpfLTF2bspZ9fkkV8dWHNvzdjZeXxYzdKicTAqCkGDK", - "8tq8DvdsnLd9SVzNKBY1Jpset47pyyS3szCAg57vQNBw", - "8trHyY8YjVqiZ6APHYpmsmCYkVbWF5sMRSpKku6Yuhbj", - "8tSzNoKE2tHYdTpCQB4apHaes2YWhCjbo7J5XCv1ULZ1", - "8TTY29ya6cSGGJzwrskHNYau9cxodwfrGMFGXUk74zrm", - "8ttZdfqqFbdobvDBecyyVffguCC17xqtvnUgPLpFe1QY", - "8tvbi57yAsmn8SHLTLRn26TE5R11WHDH1UjPSAyAQRxm", - "8TwWbxXTqbYvckxQgBSeY3bP7czWfPRwwAsw4D67oYV4", - "8tyk254KkzfseqXtMBQUU5SvAgGttBvYTaXPpLysao6x", - "8u765S3Xp9YzVJPZJuwvqHPB6VWDhipeC6NT8ZWRQjB8", - "8UCvEEAPm9kG9LELTAXSAyQjBng2CJUfo43kgjSEkuyK", - "8uCz5ZuhbjskRqPpeoLsf4QAupqBB2tMb9eDKxc7ot2J", - "8UeWFtL9LJd9nfh434qrzuQpa5pqfoiY1qHzcpXwfyrM", - "8uFzTDu4EGFEDPwD3Fs1H55W1XUZeqJepAwLWonsqNRy", - "8Uh2fjMMvjpMdVV4bEUs4pZjTFj2hiYV5oDJBZW9w1qv", - "8uixkd8w27tuBfkRHNw6mqpmChe3QmVgNjpmNFVKKqZe", - "8uJR7fEaTiriYLe4YMFkeeADdRkexxm8jkFCGRjPBvJD", - "8uKJ1ixbY4rMaWbfenmVczdszxQ1neRLgmagVGk4J2Tz", - "8uNgUAK2gn8Yc7eWmGFMFvwNfaKZqpj9fV8cCTkahZaX", - "8urA9GwBPxSiLvDaLBsAV7BtEX5Whcmu5gGKHjuYW683", - "8uuHFGwZCLgi92SMwhjaDBwD3MUDZk855rk5KmaL7dQi", - "8uvRcrxAx5e6FRzLzobXupokSLwF31cPEkJV46LxyWuQ", - "8uW7idymcyid1aLXehHKZaqQPbmJ5K5s8MvEG7TWcstZ", - "8UWq67B9HN6jjmPjbjyHCBkg3Z7QeUiZPt7T9AmDLHxJ", - "8uYPziWpAceeTPkKM3GSJafkxXT7RnCLtQwYN9jB9g4K", - "8v52QZ9KKj88NJJKMsh3t4kndqWPqkGAUb4NTz6XK2Ts", - "8V55WpeLEABj3DbDuD4ptdReMxt3kgktdXXRzgEAxCNH", - "8VBYUW1xLZgrxPJ4q2FFBdLVBFZeDQq1QinuyPG4nCmC", - "8vg3fKRAwDVokzH98CTNjiDhHhZbwXhaNeUtkMHPAv61", - "8VGARdrVXDx6SRPtMW6P2T62ovxfDYhR8vz4TkNtDYa3", - "8Vh9GGKGLQUcHykALzQm5UAb1mFKAWxf6WPbFaxeWWSF", - "8ViZ3k7b4Xiftg3pxdRtfcvwMq8K37UMJejn1EXUh6xB", - "8vm95Zybic8D7auuV9DVx5jTefGfB7DBCMqCP49YEQxp", - "8VNj7K6ssFcUogRfT6miUzz8HTKu1nX2n8MYr5z49CXb", - "8Vvc6PNQVbGAXiHssGez6a9ovgu6eyEp8PiTijfzE7nX", - "8vVeEkf8Syi2YHtHysUYdBxtagEFkQQLTPUPDSTyph8p", - "8vxL9EvPuPkYak87D3m3odBasvFahEPerrW6dF1vBVqP", - "8Vxw2DRDAsS2EyWEbigkoQS9HBa1MZivccTUN9Kv4zMv", - "8w1i3Cvny8oSSrQe55oo3FULHFUXr4wvzi6VdYsa918d", - "8W23L8SV6cqHDxLq71C4icvjMbj2GPiNsi5YyzcgPLzw", - "8w34wRFFLh7NKSfiJJAD67cFP7KEctcE1nKpqdSigP49", - "8W6ufjtm7LYeruvSEcEB1GVQQiRauRfoyZVracy5XsGd", - "8w79ZiaX96eRmjru2YLTBhabfrBgj4XhT3p2TLTktM25", - "8W8zc3tHfhGbaZgQauBY17TxAQa9mTixmfqbf8PvtYAq", - "8W9xzPf4AmK4tRYnreH4wZsipgf9Dz1uzyW9CfL6vmoZ", - "8WaPmW9MtMR1EcGgAWSFF8hadSh7c5cRzWBfM28DLKie", - "8wFK4fCAuDoAH1fsgou9yKZPqDMFtJUVoDdkZAAMuhyA", - "8wGNDKFM5TynxK6G9pVzR3nywVUwXhb3UWYtmLrs99rA", - "8Wh2G5tQSoTUAa2kEYapzxmhzPY4j9m2DmYyjQ79nqUs", - "8WjzRz9HM2bWBopD6UPbi3swyRE5kk9aJojhn6fBKTJk", - "8Wm8NVShhNEfEkUii61o9mCyKFcLmasPvQSUMgh8mGVE", - "8woh1X8SMRadQZahLKgBb2nmuCLpMYM1nvjcf8Nq67Jk", - "8WP7npfRM7gwCgyeRXgLyCEZReVGgPqVgppEYSh2ggHR", - "8WqBgoVXkVggLVuvZuF5wP8taQpzTuKGoK6brU5s5Hh8", - "8WrESd49NkVEUPhnq84ZW3EgmvMWEX6TrNYpjXLmNNHf", - "8wSXzvjqbwBCdGjNuHRVJnY2G5drZn8RknSJyzfUu95X", - "8wzyvMnn6HSeC4EbPCV7XA6LeBddziWXjWKL52wVt7vd", - "8X1DPKxixYpgnWxJzferLh1mQGPhrvrtmB45xJXTddXw", - "8X1LRJ8JJmpEXDSaEAXQwWvc8coLfy3jr3iZmuooAtKw", - "8x39tcQuDW86v9PDWvC4cutKH815ZU9YPqmz3RfV3TMu", - "8x3pt3B2RA7er5SCD2UZfhAusHX5UyX2hkHLLgtq5Nrw", - "8X4VcQeuJUg4YYgHQ7oLLCxKDURDAXcmJMNevGJKwqvN", - "8X9qyFucazrtYPvdujCVzTyH7uGQLEN9EfdwJBeiffX4", - "8xaVWRHJ6uZgmDiFsrw5iTpYGkkAuVXq5LGtMx9iqzBD", - "8xBctorJev11jCWGTf3x3AbhjXu5wEWTSqmcD2R3PmPW", - "8xBzUcv1AsTyjXGyWPZYLcvEe1S2gAcP4ijnaFZosRW7", - "8xeMnqkA8CB7f6VZND6tECB6LHyeQDhEgieWcPfJw43C", - "8XfjVuniQUTmxiYLJS6AeKDyhajxNqBf9UhhLjaFNcE4", - "8xjrvh3F9ZKBWLm2DhphFdgGgHa5P5QmNdVbZkQnBhq7", - "8xJW7G3Ny3mJafs9632or36a1gRYqLz75mmAmVaJDKNs", - "8XLMtT4mLJHCiP4L75FR7ibEB8ZSgziGJJJNiA2jbksw", - "8xMsR2LcoMddBKyuCrnA82jPN62Duxy67QRz9VZvCwMf", - "8XRkWmiF672BvqLvkNnt8ggaywyTQxoH3pyWAWtEGzzp", - "8xsMN2rQHdmZJ4T829PAYGU6hdUivRU8c8X7jH8zNqmg", - "8XTtduNiaVgeZ2jcXXfoVK4u3qvriXrDQpbu61cgr4tF", - "8xuLPDjNjd9NeA93ACpshPUxhNWJZdcgbJDkSH65N1fU", - "8XvoJswfYCxWf2WkUmNBjtDWwonmKugYhxBruNpSfS4a", - "8y4ahpcSGMWPNN2Ts5sFP8fUFug1cWgy8aJSMrKd6mQr", - "8yai16eFWicUEb3oSwzaJfrvfqi759QgBc9Ar7efWJ3d", - "8yB2W8jAEB1sCce2jEPnnU1wGoTUAcezfKeTQ4HBXHoZ", - "8ybtbfJ6rHeU49gtkQUBhAnaXBYGPdMk8dd4VCPmtbGz", - "8YC4pub2bmdP99jiPBVaK53HeU47ZagnzqA2nbWbBTXc", - "8yCubYSEFNoXLUXn1tsSm9Wwat2rzHUaMn2ATwmYLr5A", - "8Yd6JXi84581f1oEU158yJp5B5ahGPMLnhPBbR9NfnsY", - "8yDrwntYFBMbBUEME6eDmK8gnGEkuSLxWemjpR2VPaAR", - "8YeCzsKqRKWMXMbSoETZzxhbefBfYpTndp1bfPA3CCS9", - "8YH8DpY6v4KvgECtc7YRnpbBCqT5PCPeJSv5X2Ur9qot", - "8yHavC6E35srdiEfWMyQTbU3ahsVheYQpMLDGHzXfFqq", - "8YhhsDRDEQCi8HJxe7MiXEBhCXeH7LHE9XQYLMUni3k5", - "8YJ6rtkMPduFFgqvApsDvWETKf2CMhuGR1amWagEAv7d", - "8yJz6fotCuDhpQ38Hn1qFyF9zigwF71ENtd9FwkMwwWW", - "8YL58so4fJSuW3SAJSM4pVr5G6gXZQtmP5aK6xrww5ih", - "8ynA7t19W7tsMTAogG6Qk8WtcnH18r7ungHTZu3XsCwb", - "8yNrgMs5qUowc7dHb8seExgfTRgGghp7pYw9nUu37jo5", - "8yp89uEgpKRJ3ntW7B7SpLuujAqeHXNdwwJvzyLUnxb8", - "8Yr1BMUGm5nS8Wu6m5f2GvwbiPKA2NRzuPD5YG2PMdFz", - "8yS3Zc45xptsaay9iaUSpfdb5gaKcQaKAShVvEUFKpeN", - "8YtyBNBsa1qSWJMT97s4eRM4eSVMFNMP4r6VWs4MTeUy", - "8Z6pMtFS1DNyJUKjYVgmLK5mHFqjxNXgyvviGF6nzDFU", - "8z7nBV5oFyZrmJSJCKn6H8Pi5tgTMhRuPZJp6K1Q7bxr", - "8ZdzqxpnUYh3reE9pEc3eAfwUW4T1n4Kz2RczuhmHKgw", - "8ZgmpBG5ixt4LVRQEK538hsKTsJBgmFFH5L6X5e9iPTd", - "8zH1mRkic3WDpUkSgtq1geCXXh4CLVfLrEi2TEqdTgFS", - "8ZjS3d1bQihC3p5voM8by2xi5PoBNxzTJtaQ9rvxUbbB", - "8zJvH7zc3CcCNaW16NqenbZv6LGWJG8kB3uhYMHETiKs", - "8Zkx6veTUXdfGcF4VgBJtgZCRnhfhRA7yfpCM3Xty72Z", - "8ZRf189Lts5VcGgmSFv3NQhafxaJbdGkq7PuKTZZ1F21", - "8zYLLHSU8URmRaAyWEY2H7uqUF63uezRCYpzFFkMG1AX", - "8ZZrpXzvuVYPw3HYCPN9GNJhegj6M4pMityCZnCLfVUk", - "911tr1Hifn3z2opEsEEhxFQuJzp1YNM9QMkBQspJviWz", - "918wM2oW4uZj2cwTAGRrDcSdPtvPHt5CitZeep9DLYMt", - "91g5eQTVsz1XfU2SQhVWaHsqGaFd97NvVbXjNkez6hkg", - "91K6thzfVGAQJZkdwEdMYDA7sWL3QJ2Bm3PRXHXkq44R", - "91SaNemNcW8WicaMPsTLxsBNcDq7MVbJyrocJnKTHwMt", - "91uiuKVReG1apM5SLPA3iGPkoALZGQhVEE1yJRHYoQ3m", - "91ZgbaC32ySUsAoqJzvX13c7ZjhX7N1GXcHrrFz8rute", - "921eFLm1Ysc3g2CmbEfVt4mgbX8bgKKTETyoE4byZ1Jg", - "92B5NRHQrmi5QYNQEUQ2WNJ5jV3xjcfe6Fma9ycu81Ui", - "92qyTUX9Kt7wGevkQNHCa3aCLY2t16SuZPrtK8DQeDwb", - "92rKq1TceaGFU88CRahribnUR4mTX8RfiNYHmZtaJoiw", - "92rvaeY6RYaFPZPtEUnXiV6wqy74bKK51A9PE3YtuqPW", - "92SmJMYEMHgu6ViqsmuQy3vFrGUQKC3gwFGLyxZMUpLw", - "92vvhLbVqKHcvvfmUoe9GfyZrkHd6xug6RXV2p5nJpNA", - "92ZDWNRurKikxrCQcfR9jMMYmqWksgTvSFFJ2Pa5FsMv", - "931gma5V4qjdd4wDcRnSMeyv69DawFqSb7BfVN9dyVyP", - "932qurLn7y75UwSNmmyfZCoKFRC1ncDSkJdALD5M7y4M", - "93Cimh9W5bBEuyQBDpvSPP37TNNxN2zhg9xYjhRyjLBg", - "93E7eWXX8pVKLSrbBx13VpvDtvSU5PJs464uPoty9VeK", - "93g68j8QB4ZWAtEbvL6kfy1X6k2izXosDiuCfPPPYdjx", - "93GHkyzoyZrYtmAPpSDrpGmDDQDWsGwGKJTz7JrxozA2", - "93m93bxCw8PgrxmF9PT9C6jjTqjUbJzytF95VBQ5T2gq", - "93uTNz3UrRWHEvKbHJYDMF9VZZMPnrGgKgdc5KquUouq", - "947JWggoc7LKuMek4e3BYGK7K6eEfqwALjHAwUGwKyHL", - "94D8evdgHeghbjhnbfNxzwuPXFVwjpV7CFbdjNZNdHR3", - "94HVaECNTwEQ8Q8w599c6BuydY5B32iG3Jem6EWXQvGH", - "94Pk8zSFvQTvrkwBkMEHzjufx53w3kX6MymDx2ayH45e", - "94VqMqQBj1WtJfyMRqsxFMWPPaAQQZ2CCUYR4UVyodbL", - "955xvVJ18xqHdshcMdvZLM246fVABJn7Q8DfSEpyCeLe", - "95DFiDxHupszXRTweGdc6Q3aKhF7PLRS1nhpBrv62Lmf", - "95dKmVQwhAqJoqvDULr9svBWw2xg2Wo5irhoyHaJwsms", - "95m1Sb5snrZpYRNZXZLwM4FTNLFA3vYQrSmRbUabLkzi", - "95ofWPQjtonRLAqKMrBrPzn89o2Enr7BqRJQ9XN3iobN", - "95oWcswpsjjoeWcWFZzpAQ1CzsAiYur5PwYbs8SxxZCG", - "95Ty53hBhBmzjwNe9T6RWzE1FHMgWyG5XBksc6CkgX2Q", - "95UfY9GFbdcWZpUbGsjkXf3gVGpR3Gi9QLu7SX6wjVNA", - "95VPY8GWPEquURxTXY49Ngv8rkb1LUaYEKyFudrWssUt", - "95ziMm55hpPeJmWtqQd6knwmt5TNL3Z8W36hxs5iMk2E", - "962cxjgcsJqpencFFFbNuKrJ1G4XX3pQxNikvQpkafT5", - "96JTb51qjTBfWe9ravPdj3jLojnrzYiv7xrmpCPnrw8g", - "96mJah1KpaVmqM7buvZgNgNAp1pqLFsSEBZGWCoRjAWS", - "971huuQCwdZ47TBzujWAWxvceQBJgqrnaFSCuzzMUnnF", - "9796aWxHThQAv2mFzMeswho4PDPvPG4pkxFFT7BnActW", - "97AKwkqitwZKcBmKMTbpmTK4Xh11uQqMWbywfuUY5oWH", - "97pR3k5rxCizxeTC38rgJrTNcgofi86k2K5WtUmchvRe", - "97RYCmadoigF9PqZCpi8wnsvAoQRE9V6mJdtzqmTEWoB", - "97vF6NK1NgmvMunNw9QL6ne9wxzUQ5RLAJqWxmDSkKuH", - "983hEVpz464mLff3NohfNYjw4NxN5U1kKv5yH1iGuA4", - "98DSb27CAF8kD1txFMVepA8ifSB4JZ4YuCi7UHhD4d72", - "98EPAsVWHa7qKRLMEX2UGR73C9aeaWK5wRZSnA9udjXH", - "98hKKLX4STsrMJk518taEjq1uPJgaTpEpocXFWYNwzJP", - "98QBdaVbQ21GW1hmwfZfkpGmwmFswijg3YcS6Y6Ba9BA", - "98RB1d5uyeG6Dy9ojnkJSBvZA2xGtQUj9dhvrZLRkLNC", - "98x993gUQrAkJ4Wtztxyn2ZQaaEr2ujTecBVWKpjKfHE", - "98YfXykE3TFevkSnkCij8LdyZ7w7LoQDQrQiLJ94193y", - "999vPueFgE7LEjk8awARTr1MVN5MMCAhaMph31EHPwfn", - "99cEtaEkW9tMBAG9jD6xi28QVo45aEnGK9noTymnmVnp", - "99k3v2XAitRv2Wwj7GrjyopBnJY9EsEgi9mWs1UBRNQU", - "99NHmMDJeSo1AM8dg32nTokVRXByoJuA2gjDUDfiKHem", - "99oeYiP63YTtJYVpVLYFgAgRh27tdKdPd71fqFzHvnvd", - "99PWsEpnfFaBMbW8epmC1pnRp1HrsFxASniofXNxDaQQ", - "99R8PZKJNZV2DMHcLjZRBwGXLQhsYQc8agagwhL7XoBv", - "99tbDJXVEhvbgBneC6BwyegyfB8iCZ66wwhASawniDYq", - "99uwSf9zhnt8Co6Y1qB1y27dBVJkbWbMSUDU5Sq16XR7", - "99xVYjX7xNPZjot7URcwX8Kz95SjyRhvTnreavMaE3bY", - "99YEPZoX7Z69961fejw95XdJEAbHx5WVP5t8pmUFdvHC", - "9A1JePcV94NNZSPvzWvRGqiHhPwh9PVGytV9HyEdxHbc", - "9a6hqMaPMJqF17H5ypmFuzTGe2sZLTTVSnqxkohQ3K96", - "9a6P9AcwXqMrMLQkUKoV3tFUHkC88yZ9oVoHxU7ronqu", - "9A7aYiEPK5ymzPjniabXofR7jyEyihGAANakUf5AALT7", - "9a8Jt8i5BSYh1T9cw3PnYBMCNDPToL3H8kU8zwLwzgip", - "9a95Qsywtw2LKK9GkiR9dpTnoPGMVrLBLTAMPnaUwDjY", - "9AaP6Qz1XBsB2VZKeQTVRRjoPFYbZnEMm2kB3wTzdiSn", - "9AfyFKgSNqKRxfFAqy7DmpvkpeeUEu6CX1apJ24xQxw", - "9ALXATcGseJpkZPNVR6GUj1gDL6Va2GuP3gcDWVW2KzZ", - "9amTSaGFKwtdZNaAmjZVH567obGhdkFArA5UEPzuhwUD", - "9ANkdnjsRxQ9Zc8hR9WsbQmnds638or2uPsrpjUz18wb", - "9aqcXbrUvoACsDkyX7RbbGLxkCaZXm7tMoTSyGc6pAuV", - "9AqGojQvdK5MAeS9jqqawHqWkF6U6TWb9zeFTR2n6a2z", - "9AsHMeymjWhQAR8EurZyy3qDLBD3erW2yiAqw7hL7ywp", - "9aWVG4A2Kutu4tBmg9V1gaLMHSU44iuvLemPNxPVSzWk", - "9awzdQMQ1GrZJUUymUVm7SXZxfSCUDZMpWcHNGseHW1G", - "9Ay57reSjCYUU5TSBaDhzY1EgszfhB5tibrEQA2QjUdB", - "9ayfFjwv1brbXoAFut49me4FGoRkTaWKV7tDt2vvhtwG", - "9B3b4JvBXkRvy3XZ7xRaKVxy2aQFQtGUo5jfpVZYZcnS", - "9b3tVzp8GMRau5hBNXm8RwCAufVXKPyaRjmdAGwQdApA", - "9B4oF52Web2deG8jdbNbBuM8DjiFyLYM6CTid3dmQkQ6", - "9b7ZP4P2s5aKQ6nBqibKnJ8nhaMPYxmUNzTZeU1FX2Bx", - "9BfNqgQYst6bjfog8qczg2nbe9HwJ2huca676JzwNJXz", - "9BnGnzN2EwD79crptagBe2TeMRfyxA9LPR1aJZymBBvv", - "9BqaV6yhFcaeBQ1V9sAxMpsgWqcYNv3vk8qgtFmhYocp", - "9bRAsDExAXcdu6qqb6XABBgHTvvfcbVuUDDzmvAdxkxy", - "9BuMNUhJJMh1duqD7JzAJjTZYmUVpsiqF7v1JFX8ZNGN", - "9BV4gDVex3dFXmQLN8LXDP2mqqAqCttmeRo9t4y7WnV7", - "9bvznCZtsMM6N6ArGr4WoDqw1amstxzcqGYUSBQ7rqpW", - "9BypgrpiMAJabGMXFvWbMMXGixJwLh239Cwk6DQ5oo7R", - "9c2aGPBPGbzw1yeweN1TvC24uEV5oUaGvWfFNJif6npa", - "9Ca2G5fykVGrgrmzC9Yi6U6jnNHPxEVmohZEbbvmrACU", - "9CCuWxTSZk4aGY8iWcEW89gTzCerQR3RCTBsMbNpbqfN", - "9CdecN4mgb3k5yKf1htrREQ59EzwPDU7vkgh8QUEDBK9", - "9cfj6CRdhmfqzP7pPtv85gCHZQeRkZHGbRSExZNHm3MJ", - "9cfQ4Kz6HY4LifqVSfVCRY1ZQRwhNsnk5FnNLEqyGpaW", - "9chrxba9hHt59f5zypYHk3Yfdzim1eLGznRBrEecbcTT", - "9cibr7ggmPGTzYNRwvFwbSf4sfRB2wYGdpLti9xu2zEF", - "9CjCwpFfvex43ZrxC8iW26y34PsRbDsF3Y5fnf9iQTdR", - "9cNtFxgtpRe4B5tTNcNhDHx6K6voe2mMhREDmFyZ5YKf", - "9CnXcFUXEGcgHz2SHhy28ShuxYGcfYcRtoNSavUcqdUJ", - "9CpQtpHJ7UrsT6R27RECtE4dWWBAVnTcCTXj5HkbGJQC", - "9CqFnQed345m2MWXhLTaP7wzgs3uia3RCdipPeM7WyrJ", - "9cubqGZ6pA3z81wLXQe573BRZSxGWp6DJDci8M48BJJZ", - "9CYnw2VNWfipQiDKEjgmZsh36xTmDBcSu93mCfSvMRpc", - "9cZbJZnJ2psRwuAZFT2EyHywMjzQMxZNrdhcx9pRXevx", - "9cZua5prTSEfednQQc9RkEPpbKDCh1AwnTzv3hE1eq3i", - "9D7yxnfBkmQZM9ij5Dgzw1wAi86qUEvpYfcs8qMzBVQu", - "9DBdgP1ggAWJULBJXBPMzWvA539BhGVgTuTfebXhfynG", - "9Dbzw6wkg9cP7N3bh28Xxq7raZgPbf63iFTyamhbStVz", - "9dCMmPpfNuWKyZ2D1iRstMCc1rhr2DbHVFrZ9wFncQjp", - "9DCoEsj2pypkeZjxZPdS5Tq3AwuXvSAUrwbTasVPAUyu", - "9DFBaBuozDLVEb66sZthFvUH6rRvQsTAbc7Cs4pHtnxx", - "9DgTEERummZyV6MVSTmC8A9ZULgnN5Yh7VHjP2PADrws", - "9Dk3jnpTiSqCKBwXkcFy4LKRb3xhwTaUqqrd37djkC8L", - "9DKVhUmkcmKafx7rhx3hnF2LGnVtPfsm7m9QYeDC8jqq", - "9dMpUYnUchJUjdcYw6uPB3CsxNoJQhAqQJSxPtiG5RdJ", - "9drDmgwCQChEYc27T3eesQn6LdaycSNyN4Gg5Sj3aoch", - "9dSTVY7hXEJsqExDcD8vYMAZpJ5mt9HBMPwRe94nBwny", - "9DVeYj78LnDj1LC3tLZCSnTPDt44p1nR1Ht8iUVL8tvU", - "9DwpbFkQdUo8kjsQUZ2LmtPnZkrAzFL72cFHhqUTsyWn", - "9DwxPyCRcS7Exg71NSrbPPVnXN5piKsTXQdgF9SoC742", - "9e2RvEzemWs6ZkEhdW2NddSWiFKgJfkw5LWGtgwvPnvw", - "9e6LHRrLDoR572wfnoM4DLFgW6C46edjdmuCYtjkTZeS", - "9E73JagBweAv11eS3bUuASquJom6WsV7mrz78MEy2asH", - "9E9VybZddNwo7L8s6dUdRWxAtQMWNKgHyGdqZCpKgSBE", - "9eCo4hm3QNaxLjsbXZDC1sLXYN34G4FqJaWT9Df7LfiH", - "9eeipv4uEyZjweLHQYGjzZqaTQradWjstQ1uW2SyuBPy", - "9eEYqbdJ5AkhvSVvgG2ofaGEXo7ePpbbSuJ5AogYe8NW", - "9EJHA51CzcEnPTCHFNBBjcqFfWEJTdGQV4Y6Nvpkgd5k", - "9EKcWUSw2C34ZQtheefitHSQWDC1mnwvHmKhuF9bKQB9", - "9EMPuTLsfceEHH52JHP87xkmTLXUz94uxWwDzxFsjgKL", - "9ETuvrUdt2TvpmwtjasYryHBtz81MFMvPpfhLCfXUj9N", - "9ExDakUNsM35KcAqwgmZVny83jqyv3SS55KwRCjt6oTB", - "9eXsGF2yBdAV6Ewf2XpGo8bZU15QNcNsHRjnftoJ6x1k", - "9eYkn2v2a5mfdLyLNJRHyqGNMcFRhcmnnfyW1ViKx5oY", - "9F1bGdE573c7DomVRk7we5JjdxAXrn5t9cf1epFTzvK5", - "9fgxPELtuQrwrsk4JQDaMqhdBx7n8MjCwBdfGzDNUzTT", - "9FHjVF9go3LTyZ1TiYjUTjEs9THPjULKzm7BMEB4cSud", - "9FHwok72BJRBGyNXJqjwNNx3nAaFS8LLxpeqDdiHMnvK", - "9FknUgUdi45sQcTz3jmaUMnMLmHaWwYVjfBjJBYzvQCV", - "9fMqL641B7nQZ1xktU35qXuFESxMB7pkqmqVANtovzmE", - "9FnHoafSkEDz9PkgEAqEybFucCngDUMShNpwwtetDnmE", - "9FNnRxn5uU6dVnViJeewy6FKu1AWdnknmLZC1pKqRuwy", - "9FpaqErkV1mTPow2JRrycQqdwVJ1hdSgpG1aapqo6Wtx", - "9fUpkEkPvKMHyrV3VbCwLTXdEFjqdzPMkuWxFkh7uz9E", - "9fw67JnTFpiuNkD81akUG6KqFMLfpxa6LqFfXbFDqZgf", - "9FxqatR5HMtMoC6BEk9bLF3nPa4fcdKuTsgyP6KmMkag", - "9fxQtf77BDFoN3igY9FfpgguzBGSYGrKmMraNvUjYeNk", - "9fYF3ore1rFzgLbF48YVkL9Pw3KKaKv8JDD7ebUpun6J", - "9fzTNMZxBHaf1dLBrMcMkjo48GjLZxvt1NFDNRXyYtQx", - "9g81kKjGuNGh8fReZHujvzpTZGkoWHnCh5cebJ4bkhFJ", - "9g8JucKUtsttapTJNczVhuHMp8zqkjJaPDSkncK9Zgoz", - "9G8zRFACfB3gZAjWkgZb3CTr9KXhvEREHbaSm8Gm2mZy", - "9GERkwr654jBUn8cvDydFwnTZ6v4MZbyvp9ZKhRep3wU", - "9GfuAKTcfUJvPqoQgUsRi4XUaP149ztDPXWj84QQ8RSy", - "9gGa6bf5x7WZMaHMsWMBEzWetbt3kpjTzp3hiwQHdxSS", - "9GGe8sYSRWG2QSdf14V5cKT3wcFgU9C9114BAVVPvHwF", - "9GhnGzTAv63tKorZ3rNudd9W499NhZFPDHcbhaQ8FoU9", - "9Gi7PQ2UPp7dvCExWdFp8Rv8xnS8hyXYQyw4AZBFLv6J", - "9GLTCgNARubtcAxhj81fBSeesZtHe1TNSQ3NF2BoRpUM", - "9GMmVYJBw5Cj58P8QtXtesyQUtA9GyecPb6kCki7QSo5", - "9gmnbM2GUVXiTfCg1Pj3ZTJdqyKdS81kjBWwwnZbS4MR", - "9gn15vce8jTbUuWjJJgdgZRvagmdpjeaY2D5bcZ2wWa5", - "9gSc2ALusYvNtkj4zo6idgRXGbqrgrKBgyZckTiEoLHT", - "9GTY77WCerst3cjbizSQ2psUePQxZgQPxfT69c2M3otY", - "9GUJV731ZaZi48qVaR15PyDnkUA5NExNpAk9FTctFXoo", - "9gUMvQ8peCVhxU8ut4eyfzyTZZmvBUVDWw3s492yWNYC", - "9Gx6myZBqcVndLT5vf6pEawnqDmjJyB8SfanLTzhWjXU", - "9gZGTvubqZXxcsYBLKjrYCsqBYRY6fVJvAJkfneQxTJZ", - "9h2WhxhGjad6vaVc2fGztQViJ3LhYFh2MRvhLE3FgAX", - "9h9GFVcpa6AEjziHStxt2f6wDSwWNcALBjSp6RM9iHXH", - "9HaeWbRV9TaPCkTS2VHF8JyVMdD6F7N85HiHHAR7QiR7", - "9hd9PA1omynTWinUspHgkt1y4Vm9anbiYVa14ttiVCFF", - "9HEBEmRD3ouQg9d2Ht3gFbwDvrCwXG3Ue6jPqzF3YLgK", - "9hedZ9TnXRLHipwYnuD8DdyvAwE7sPs9qdqNwjWvV3YD", - "9hGMw1bRZsBdEor1Y1EeEzer7KvED6stU8bCcvSFHWq", - "9HHUBkYvf5f3yhqJx7SPqeZqMJRPPrRTX59DD8DvXFw3", - "9HJ1PNb6MEn2b4Eziy1sCNAq5YTC8MRSk4t1h2SnPtYY", - "9hKMLGZpMvm6dK8vtwbYcLRVvrxXUjNDEY3zduMRXXZA", - "9hPkijM3GYakW3chKbcwzqAKA7SaQMwVbBYYCdUiPQzR", - "9HtKBPkpUQcrAun8rAy46S3DPQt1AfNtKYTXuL8doij5", - "9iEPYLQRdJ4FsuXm3JHagDPhYdHBh8o6muP1EM6ddB6C", - "9igFRwkAFp4W8uLLdCTfD7UMkPnWraRHdxMXVkoxTxUP", - "9iMBFJGvYJuUYr6CRvKM9oS1FxX6ZD774V5FFuQmvqLD", - "9iuaS2zoJLw3cAsGoXSJsvPT1tqJpV4xpY71eXqbHERw", - "9iw1DodA9pNCJmqnRFm9gtUFJkUwYomYL68LgR5DtXdm", - "9j1HUrun9qQLtq6nRV2qiXSjECukgaVBXTKyGR2mHGs2", - "9jAhC6dhjVqVA184dVczcBAar2GtXT7D7LwtXxLji3Re", - "9JaiZ5KzqQsQqJbuVd5qs7wx5T3pXWtga1KVaeYQop8S", - "9jCHKTs4E6fsFyzVXH5v7cZeugG3uP6Rh33wnPYRhfn1", - "9je9HhWYbPeU4AoULHojY4epAkaPsqwbPua9t5aGXM9g", - "9JhcJ14unhuWwFjw5EM1EJDiCMnBtqkmGxuGtmtwBot", - "9JKQiQqWkkUKHqnR73MmZ3kdiqQt7d3bEvy81Y5rv6k9", - "9jLqhuDKB2NG8KGBFFRusNhJB5CrwE1BDpSTnrcW8fTd", - "9jpddNRkSJTpD5GJFXocmLsP8JUasJzpwgKrHrLtA8a3", - "9jvdYKGvCX1NTzphrjuyjNj13euMKMURBeqTEPkgwdNq", - "9JvKbbmSH4T9MuHfpWmb5osoQ59dSnjXzWbS57N9r3bY", - "9jyaTwaoEVFWrGTdFC4vxTGxfCzPbQZARgtEoPdcNYrf", - "9jYw6fG74BvJQSWML8TwJhiC92QeR5hQmuR17DmwqHZj", - "9K2McDQyRzWh45bPySPaHTwVi9c9ssmxDZwjgHhsP4c6", - "9k3iSe89rmKvDB3NerY672jQvNaoFPZSzMccQRfbgxhR", - "9k4WzeTBZ6qVzQuqAFeCC3gMyNhopNmS83UhUhnLiNeK", - "9K6ESkMaXjzHTeauGXJgdeKhcxNK1U1g8rWqvES1Np4i", - "9k9ivXVaQaH1TAJhrKHwDgjXzEU6yBhbhz21tJYcyNxu", - "9K9N9jRyteh1gauEjuBg33hqPYReLoySPjG4Lhpa4hiM", - "9kAi6TF78NfW2gNr6n82dET61fnGU7YyYjhMRRcdEQcR", - "9KCFj7pL3hzyCzhgiy1Z9nMxT5mkNBgm2QjfbX4nXBPi", - "9KcWSE7GDYYYfaMTH1fV5bAes4LmFsNd5NHWLDrqTzrT", - "9kgXJqTVA1pZiinJevbFEYhtPvXRfx8p6Pyo8Vrn48xL", - "9kH9Rp7k7xuWqbW9FYih4v7SyXPQXKKqu7EeojDbCvdn", - "9KHCLENP2vj4vPgyociqVDqpzEtaptcTiVH1ha5RykAq", - "9KiCVqnqHHThrMkaHdQLNT7UbXegM6qBKtvRqFD1EA9T", - "9kj5C2q4XySy9f5iV6FMaUstrw5NqjP8YUevn2tEVaUW", - "9KJyBBRfCt29mR21aP2NZHuyvZnf1VjSSB55WPExRgSJ", - "9kkpTAQfndU5SW5iVbG4j1qngoUh59Jwqndd3XpkBzzm", - "9kKpZomqGpNYRPa3A9o7s2SKZVeHKFCWGt3GdXxbbymR", - "9kksWQYY7feMrXrL1MQwm9JMfsiwwUYu2LZFJkP8iK7S", - "9kMzAEdFPAQNVA1W7ZQsmMPJ8uSQxfBkkBTtiqMPJit2", - "9kN3krpDdShka5CPm31bSzLFi7xYtcFMTtPYckWKoLQo", - "9kovz8BcLYF5u7hGaZ7kZDXSjigKXSXinsmfWTpCy5P3", - "9kP53mMPT2ozUp6vUTmvrrsNQfSpdNhhDPHSELCuGdqE", - "9KRc9vNF6Bpcm73V8CicFjCvk4DJWPev3vs8D8DUUHVz", - "9Ks7wcMvHapnT5ULC36XJxZfNp9rURLuSd85mJrD1qh9", - "9kUAkfKvczyRJMn3cRz7SVnbotSdiTVyCFXkX6qeXmXC", - "9kXh4Lg5ro3NKiRW7hqDD6iqSWouX4YYy8tqyGBFrZE3", - "9KYf3WMrHUFJACgUz6HWEP3xmnt3sfzk4dy5akyyXyhp", - "9L6iKwGJWVKi2ffz5mcnqdaKgV8gyRebTkTwuYnhae5G", - "9L7mwQp97dPAiDioNpHyryVDjtmJdd29kDunAq23a7LM", - "9LaJNXMSxrzsfEipvWb6cHN17F11nnXeJno2GQY4TTaK", - "9LjFNfFRwxpocCF6kQDKMGZz5PdTnh5V44rn3fnDvaFz", - "9LyKLKjujwPdaDWNYVuUa2eTFdyhXjp3RsfSRCvhWmxe", - "9M6yxATtZiqTMeANV6LuAT8cMJ3ayN24gy8aqCdU32FX", - "9m8CqDBWQmhmyT3HdNeqqJ7FarGuXGQbN2dSfGXBtpom", - "9MbJ2U37FNXh8iMALLMtZDxcNZnpcPjjo99AQsbra53p", - "9mbQ9mrRjBGiUVnz9Tdf7PuAkWomw3GLZ6Sup3R93Gw8", - "9me8oFZvWuc9cjBuXiW8YDGGZgkitk9GTKYTNCHaBQaF", - "9miqenD7FrGa3a4NNP6ygmYbpxtcAmW3AukuTUbAgG59", - "9MKRmXwt2GFHdrKnoQygkA6bojmHV26uoX1xZ8p6YQ4m", - "9mN1765LwF5A9iPevcJci5imXHe7kXWqQg1U2xtXP6xc", - "9Mn4HMQGMvTgw8NsZqS58uY8CJvr3UNhQsFxaFKbBd4X", - "9mn4o462w5HzyxfnZGo7M84xsqRXL4EfJ4Ggot1Bs3Sd", - "9moCsygwa8dFiyhxAho4H9cirwDpEvL9ixrGtHBJzFWX", - "9MRUTN19MtA1matBH4ddgpS14mPAdeCoFnsLkaLxFeBQ", - "9mtVv7wqVSQAwVpFA5s3KycCBxLWAN3es7Bq4LBGp74A", - "9mtXp5xF7xM679fxc55yzuaFYZ58Sidv5u75Y2XxHj2Y", - "9mUHnWfn9h8D4WJWH2TSQYTvfs3UzJ2YhRc5R9JykSnT", - "9MwZP7jBejUkKKymjvpdQA1qsgpzjhnscNizAgtcNJKS", - "9MXVURfFA1CLXPo1AiPGyp3SjDPPA2YigqPVMR8rMfG2", - "9MZY9cHJW9CbYEfVzTVmjsrnFonURh5o1rFHN56q33sn", - "9n2nh7j2kMYTuypgvsgnQkQngnBSgigCs2hprzKFPBFb", - "9ncrGy6sU5eWYvkU66Q6sShvQLKLmp8Ukc5JhnTs5WdL", - "9nd7ACFquAbSQaiP1hh2d3tMYprLDDyFUNAeAJATtgSJ", - "9ne3MLzrzESX4fa7cSyRvFsS9EsNCVfPRDgAXD1RgVT2", - "9NEiV4HWSyM92gn5vgD8aRPm8q5nLRbZdDKgUsF5C7Wr", - "9nFdwDrmCcaFjx18ysQ6tysTKUeASXYsxzfW9egGSErf", - "9NH1YKSijcX95QNQ9KBkM2sUQ3ig1xV3Ycb3NZJFeHZp", - "9ni3XgT1WS9831pLgK5JxJ5hhqAA18dTPd6xjH4nCLhT", - "9NKbzLRd8ZLNGRFPDB3Mn6EDjJk6akmUuFaKRrzeN3AL", - "9NmFDPoggPqqrG2ut88t1RwfZ5ETP4UY46YAVLjb5sPj", - "9No3PpMTnc24CfaoPmXvqLRyaZaTxbcDQBM3t6EGfM7D", - "9nSJ6osLuUgx7iUMqH1ueGpdbnujZZrv9B9BFNJd3yXU", - "9nsMbTvE7dyAJCWCfJYxkrQANwaWBEq8VoHUwf4xKy64", - "9nwweyAkLSXutqy13N54c4DMyvgehnkoa72EiwtnBqzB", - "9nxKgAQjBtDk7Qe4Z7u1Yc4e6gUu7SU6zZywC3H5BxFZ", - "9o1FYFCGuy8oBcNcTPfABkgbqvWyAbMJJEJyosbX6rZi", - "9oG814Uhivn77HToA3V4M755B6Sthx6aXf6jDG7Bwjh6", - "9oHnJhZMHhjaxhVmnmwcKQWBEJRkD2xokbXaKQMCU6tX", - "9ojskUe4gjj3kJWMXMQEWzBQ4uBwzfK1g3mAAfkFuHSo", - "9oKMyQpMvPEHawMT1m3ryUZe624onYKhkXZ6S7aKax3Q", - "9oKrJ9iiEnCC7bewcRFbcdo4LKL2PhUEqcu8gH2eDbVM", - "9omZkvkTrsRGok1HDtiuxk1z9AtWFXE4i58KzyDak2be", - "9oWDUVn41kNZuVCQBr563sgbLXGvZULKuMr74w7NSkz3", - "9oxQtZN3rdbP9VoTCBcpCmjdkLKXNB7uzoZW6GkDz1MU", - "9oYvtt7RsKxo9vsK1riZwEMb8KtQ1nKjGSsZvZEGkQPN", - "9P4eKxGAoHe6aktpKZnFSRzc2Y4c8NM9u7pmMs26Cf7G", - "9P5sFULhNktpQxEST2Wiw6zBH4aJrANCjui8k5FhwcjH", - "9p9jb23KKxp4mhwYtaCzDcsJ4CVaCyUx86Tkx7tVWfJz", - "9Paysbs5evoh9BiWiS77NNutMCG9koUK2xyAsJm89Rfh", - "9Pcmh7r2126PX6oYc1xM9bSrCxqYKgq4wbBGkTT2LYVK", - "9pcMsgMfteznYByNwnbbpkRHzfaf1MmkeZiqkNRghrpY", - "9pdYZZukEv5RRoneoTH2VT1KQmFLhjn7q4FMMVqxtLxS", - "9pHNBdibr5ukpX28foKK3UfCMeaB5GyAuGcHyJ5DmUAJ", - "9PJUFSMG5cUHEQdgBU2wyKsbqC8ZMKXresaDnNNtBaRk", - "9pmYSuc8Axay9pkYo9z1jmAd2mDRrn5cQj3Ri2ZrCjN6", - "9Pn68H56p55WFeg2asNwpY9bmM4Kyzm7S7kfnEY5PsL8", - "9pPiTqFF8HNaiKWWdfbMxngZ4W1YzTTwugoKv9BXWwCG", - "9PQ9ZYwgiQiZGUoLLMvD1m43QUgHpBZSHSvfKACAhBKm", - "9PqR63RosK5siiSNvHtQMyEKr3CvJt1jh2qxoVmghhst", - "9pR9Q1y1kvesE3w24ZzuWuoMZ4A9JJezSjVdhK9Q62Lu", - "9PuwrLbRfVnCPq2ZtEEHz7FSS4XjfyniccgrXu4q4yJX", - "9pZZWsvdWsYiWSrt13MrxCuSigDcKfBzmc58HBfoZuwn", - "9Q13aVkSYeBRweKQ4QWbyvs7cphZkphz3dJo7uAwzSZK", - "9Q8xe8KgzVf2tKwdXgjNaYdJwvChihmjhcHdae7c4jPb", - "9QCRg1R8mksiac9tcx8CzJupTzTHBa7c2odtnW9TbueY", - "9QdzCHmFMSTmRbNLcCMfztRcTGRxbHW3guPAonU1nq8Z", - "9QfskkgvxG21rDc3ZKF6B3PeE7PKutLBy5N8g4C4mWje", - "9QjkVoifeRP5U5ktkiP3XEs6o53KfwudJ77scwVczAZh", - "9QKrtqHxaZwh3y3bxs3txh1xYYaRAzEXKWSYXyKSQcEP", - "9qMNUfnWHfNKDrM4TnpnnUGBFT54eVs4qrefVGGByK4F", - "9QpCZWEHm2yU5CWWrGNMrf8GczRuJbSNwGVTxXmC42Nm", - "9qpfxCUAPyaYPchHgRGXmNDDhPiNmJR39Lfx4A49Uh1P", - "9qqE4s3mRGgNQCT58cuj4YoJaKWQNUAeyL3PrsYtchAo", - "9Qr6iiYWCqr6PrFhtani4a4YUzLX3pQXjTbBzCtBroar", - "9qrjiQG33wuqBGd9eWBevemxuw7FkY5osCxwYQt6SmhU", - "9qrro8wWS4tdWNXAfd6CCdg83ZizYPGCZCEjAEKLKg2g", - "9QUEoFpFLYnRPd3WwPwWkXYeLa24pDUSomoLsu5EGS92", - "9QVunAXvQbWb7Xo6ZfCWxnGwE4t1xh1dBfPc3qgRBSVV", - "9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv", - "9Qyrp2KoqLtD7TjMAHHksKtQ3HJTv2KEHJw41LKDG5Cs", - "9qZjVAvLFEnCxbNpc6JuPRjLAQjFMSdfPHa9q8Zgy9UR", - "9r2dWJ6DuLTjAwFeHr2dddZ5NQvdagDdJBvM4boLoXTy", - "9R4xE5gDN773UL1x7HPafgGqNHaebJvimmxJqbqQaNS", - "9r6o1qtq2xJaHTyfa3WB4479HAztAV4Aky7sCMD7XdWJ", - "9R7NanMZerZE5kwyfZ4hxo3C5aCNB3x463i5XtLqVEQN", - "9rC9rjWma2b1XpEQYWEauRC9dbiwWZu9yafz3B5EuRES", - "9RdMTths2GN7BW23DQiT4Abyx4WaV5KXVNCc9R3SJg7f", - "9rdz3sKb8MjDYeUTW72ZbXveXx8LWLDfUpVFSWam4xy7", - "9ReFALypxgL283t7EMxD6AHTBvtBztdzC9FFYMyZjc8m", - "9RfnkuiCa1AdFEpQ5fYUcmDVozef18xWQCErxhz2cFmA", - "9rFZdLVQwoyhg8qvn7n14osjYaBJ5WBYrfjjmbSyronY", - "9rGfXDukY86MrUcxZNGq3nTrUaQiE917DMQ2EFW1cbDL", - "9RGzowv7eFha4rUmKDwQZJPBYmRbGztJaHDHf9ks8Dst", - "9RLnzRod7LWYb3nemb75vKhEBSsGqS1uHeuqh8Xuz9B2", - "9rnSaCdrURmdoirXYxdBA12vovm3KJXBL6SN9wExq1Qf", - "9Rnsh9EMB6LKC2ZuGz8FkXsN6E4zy85cQ94KGpCed6Pp", - "9RpRWFyTMa7GycLffvmu8BZXHPbYM8QoQM2giDq1AGMs", - "9RT972AFxgCiUwYTmBXaYWGYzWT1xa6cUhtst8dZxhPc", - "9RUxQquaeSkuwb2qFqenPw63qXLypEwMwUVNaGHzDifF", - "9RW2F4q6MpxGMq1952ohJHNaA8HgVZq3Svo2L8XtvR46", - "9rwWeEsGkYrF4aEsHauQuAgxDoqb6ti96oEixBvoML2S", - "9rymRYmuDH21oqtg5szfqwFFWUNdEDo33YyTTp94YUFN", - "9S6Mpdi2bKihGUygm29cCpn2huw9uLbfAVC1eiS8dEDe", - "9sE6ZFZ4oUTEB76Dwqwv9d2fRVYi8X8bU8jDJ3s8EsvJ", - "9SEQw4aGEJh37ZVByfHonKu4d4xDwc7dJo1HGhRLYimS", - "9sfCuCnSbCpM1p29FNVAwEMhKhPf2XvYRG6kg1dMco2A", - "9SGgfmFejfeEmJtyo1oKF8Z7C7bnN1DgMGFCoFPhYdMn", - "9SHZFX3LEuL9dRpCgiETWfakZU1ZaXiw7aaeTzgkDzEJ", - "9SjdDNazuohEjjoWnhQwyhzQvCnTkq6RQp3fxnezgiSb", - "9sKwYwnhzSJgjNRt5GhVnPQog6QanPvuV9VH6BCm7f2S", - "9sQUU9LhZBdYUFd7aG1NiG69sEadf8pXVhutXWL1whgM", - "9sQVaoZ7zY8UqRr4wJ96zY3CwQUW97K2tkbEfj9QRAvZ", - "9StH5W5oei8tNy8vrFeu2443Bz52Xr1w7NBmes1xnd2N", - "9sttpBHogmgtBFoLZWjFsB2RZp9u6izrTQdUhBn8FHix", - "9stx7x72V2fKwWPE9YT5rWh4M19ymQtiEmkSerVGPrz2", - "9SvAorsFSk6b2szrdCKeiYyYHU1NHQbLeQVTi6fmoZC7", - "9SvCrvMQx8ieALztyGN7UsBzHmMBsQT7fvF9kHTxj9W8", - "9svgXU3n79TY6nKs7gYWZQshbE3TNqcCGW3PVC4gmhkz", - "9sxoBSnEiVwb7tPzQ8BgYk8AoDnoekqPp9KGk2ufMYnK", - "9SXpQRC2veMSkTRY1G2vLktNgc3Bbw4Nkg4xK1a1aVjH", - "9SzVWwQsRSvSwLJnUEGJ8jsxooJ4weLo83SnDQsRPHm9", - "9t3x14JJPXnsybMFLopPaAxwBrbTY2MwUwcN8vfW3qsU", - "9T6WSVQuo2r9b2sLQDEmyn4AaFV8XmJxASbqUiLNUMua", - "9t6xmBPjxTcybfTh2pvMiktW26BeUX2NXNSEbwU4GzHb", - "9T7ZypsA5BmrW1Kwo5mL4atiXdkSdD1oVv1nWjaCXbCB", - "9TA34Aso9JfisCAsdqtpJ6cukxhDdqyE5xSYYvxpCM6H", - "9tbzUabDi5D62Kkpd6oQs9r28Ts7TFJHLvx3pFJshZRA", - "9TcuMUf8f879KojQAyKBt1tyd8TLcY2gXnFX1yrmZEa3", - "9te1QcDZ1UdEbRJqCz4TjUDLjriJcYxbWpu1K4QKMpR7", - "9tG4x6ptfqBourLdqUi4r71EekyXgPie7PK9sWW6qgbD", - "9tJ8BjHCSYxVMJZNvFLRJj39QPssKoTc2h7Fev9xXTPD", - "9TNP6ecZXsjZojsgFeajszVSRLZbFbgWQXiujYUrmNfb", - "9TpLKVdN6DyRan9yfconQ53zyoXX364ubNRDdeNDRwk", - "9TRs89jgqVEWpxvT6yybQbs6aSG6ZYT31BcDKC1PKPuH", - "9u3hzeHS8gtxzSEFbto5aQ2nFNuiFLtYj8SAPATiJGwQ", - "9U4fqWRd3kcUHEX2jt1kFwF2dSXLnz9RA6B9W656Skbv", - "9ud25poQH48x42JefCbjH5po5Uza45MXorEDwdbyd91g", - "9ue7T5af2ngT1vMrkyrmu6YSF9tcuQ3BiG7qjFkZaiF9", - "9uEUEwNyRXVHkuaAQ1Jy3rBPi1EmRYjqetG4WR1dxYVo", - "9UfKWtaruM2whJNqLLcrxKrSuS3VcVssdbTyNvfQCUpg", - "9UG8D6GS6CZs9ATp2x6p6RGhiAxgMdCxvyyw3LkVR2rr", - "9UNM4KscPjzoyrmpLsx7XbVvnfpKnVwY6oTFfPBdtX74", - "9US59KW8j31mxr1opP4fbg2j86b2p88DDKhcSeyDznnA", - "9uWx84rb94sr1uDbEz9ixFj8Eer8Ns9qQUmsTaZ7rU3r", - "9uzU9UrJXz9V3sLNw5x7bfn4TdQZh9vAsvkJncQDpJkn", - "9V2bqR2Ts54hHnvxuwtG2yaMyTF7uscuoatWzaCUs1RG", - "9v6yGno4dvyBjzwnqqHTR7vsYCPqVv8HMCKhubAtoktN", - "9v7E6oEm1V86hjTubtBon7cRYPvQriWZKHZEX6j92Po4", - "9V9D2yALVtrTKWBx8CBC2B1EpawKG2c7sazQNfnGvkU5", - "9vB9uLqkUjUPKDXR3tju8McJfsW8jB42Pr89vvA5hxoQ", - "9vCvEHbTGCdUVXKSq4ASin3U8qfTNCy2VccjzfBAi9Uk", - "9vhF4B5VTSBES4gEVW5osuy9kg2WBti2VJYZ5S2RmNvg", - "9VisDNea5VQTNwsLRAVd9JvEzHW3g5MSX7yU8BVF3EKE", - "9vjwYjituHWADr4ggnsebemEsnr333YGL38jTXz3heWC", - "9VkfVYY6uBjyqoKaJhtLxPfmF25YK1vTfRLeGNmXdhnp", - "9VKjxxUZpVo8kGwB4E9FiaZvFKHu3EhqRR4ZMBVK12rb", - "9vM7nDVvVqwbqj8HEXUN2khsyuvyZkWukxd6vHRgd4bj", - "9vNn8MasaEwTj8J9U4jY6v2jErqTFER1JEkZimMGBHeS", - "9vtNqJMybxkbTeFdHfFNNgfg4tW2P3jm7Mv4KBJRCQYC", - "9vvtmKzRxfZMVgEmTgC2tbbMkk9q9eadjV9qB6Bd8gBi", - "9vXVYzYso2Hh8tJdpRo2SoYXcPN8hs3YWRCynLcdbJ4R", - "9vYpcbdf45kthYvu8yzcKnbQz9pSywa9PYi3Dz2xy7P7", - "9VYsMms4mgtcrZsbGfMVQFgyo4B5Kjin1PWrJRAwuaPv", - "9VZHkXL1svmzag1K2YtqeDrEZGrvmoVbirH55rNgxjwv", - "9vznyJhjjQYn4qqZ5TzihVxioE4kx7DpoaY9RNKUos9d", - "9w14aTABG7QKrjkqL1zDVvxsg8thNWB5P8DFXhz6bt4Y", - "9W6ogrdMWKoSospgjZMyJGSfXBmXHZkdSdCxeuB5WGRz", - "9w9V4upwLqHDqCU8noHC7YZZXoASbm8uDywnPNykbU7R", - "9wAkySUz2KihVRMUs86DcTNqPqtdNYVHMwFxoH7xbbiM", - "9WaLbWpbypeU8Rt7HAi1SgcNEywLrmHfjvz5aA9dkCyY", - "9waRyqWAoP68etU17DdWamgpTnPb3skY7Er9kRZMzCfS", - "9WB4FkEtYT6MjHzeuexSVawMZAi9JbJMvQfLTRvmTke5", - "9wbAKVn7brvRaWuqeWcyBKdce7DUd9FTvjrf99xq63B6", - "9wgqMFEtHspw67xoNVnmzj8SLSisLeeBoiLEjGqqujb2", - "9wH9R8WZ172nfSEwgyY6cex4oaTbYHmAGfpZQgzYFbNx", - "9WhJXmK1HShwFMQjidfpvYrTLS4syvbJfkkPDTgWEG6K", - "9WJvZz6Va1qBHFs1Rt6jXHEmPtUv7ZjxjbrfxVDuTk52", - "9WMz5RKjyGBL3YNWh48c6PWJteg8D6Jq9xmZcpUZ9zWj", - "9WQvXagjk4nHAxisrbvzhEV8o2hJmi2Jyi4AondvqAnG", - "9wSnV8sujWbGrg6PL9uoRLGPiWRL33VMqHBMcLYeCAfh", - "9WUSPYs1iHDkcEM68LbpvuPCEjaheg22aeyJkztqHpTa", - "9WuxRcmEZ7W3RaMBrbW1VnqSiyZwx7XAaDyUPF9zacZW", - "9WWSLBsBqq4bQySmmhuUeDfknopNEJnJQZ1KvPAdZzvN", - "9WXjR7Ea8hKt6Z84EGENQvGR3rFsovcxDYu61TJFcWJ", - "9wyc3PcVUEoc7Xzghnb1JRuEwYG3fJ5d243GPaubqgA5", - "9wykM19vvLy5bTtehXehSh9RDe4Zrk7neMoHrc5NVKYG", - "9X1qjnyb5CfMkGfEnuRZS3G58iyzbNZCp27RpiRVAiV7", - "9x5jUWShXQdgSpFjrBfa4NcnCkH2QDrCgcXYP4zGzR3p", - "9xBBQ9abKiQDrtmrRjxoJAJCGfyqntEHjrDUaH1zjEKN", - "9xe4rcxYUe6iADdnvLkWn8K26bvyWgfrp9HYbtwR2sPs", - "9XGxyZZuTkXXhGuaBBxLYAvhA5HH9w7jHL24yHZGBQNS", - "9XhrZ8TQkLJjw1NxYvgo7nkR3jScpdUZZ33Lf7ykSDzZ", - "9xKzHz7GsDhhwaNjpNBPdGv1coqRRC8pRAiJRq6PxRUo", - "9xQfJQ8HuqVQeyjmPPxiuSqxfARRewo4wHZjr2JnRbvK", - "9XQKWz7cuoXgRTZt2HjU8yF4s7BzBwWR1VaQBNF17Ai5", - "9XsNWQxnJuFthhQ9peAhf91Am5agfy2y6SdMKvfudwzM", - "9xUxrNRzNMviUmZejC3hQiBFSGL9oET7WoYNvrwq3FXz", - "9xuYYAjpEoEpSt5Wd6HorzjTvVtQcXfcKAsVVCSibcSs", - "9xVXeU4ACEwrEkum41hggGCF1bWrcdxE9XbZVMoD1muZ", - "9XZ5o4iuYPbTcmXK7UfQQoDyAZJ8PY6Edk1fEQfnS344", - "9y1aQ6HEMFiZSCReu186ZvM4JKAmgYddVQiUg2VyS2y3", - "9yfGcic8bHYjx9tH5SVowZJG5WS5HygW71A4mrVJRUTC", - "9yFJdKWuNxtCUkkEwBkfHYRmQEnHuoasRgQVu6nb4Do3", - "9YGqnnTWECKuYmukQD73y9WWRM7voLH5t6siECuuiku8", - "9YhBwuxo87mcJSK3WZ3d91yNDx8ZtKwrfpRn2NcfvpSZ", - "9yhe4Sbcf37aedRUAAmyZY5YsKZLNmTvuQTQ3oHJWrks", - "9YHpZqGdwED2uAxZbgixESvavajvuHyVZJKbVBevjitB", - "9yid7aypgZmTAtzbnzspSu4n2Dk36VdCphSeHFhypgvY", - "9yjm5uqhDV9dxTDCKEepCx5PM6i4T1Ltp6nsLvuCXP9v", - "9YKbXSWxaxzAiKv7ynnLnXoQQk7Lm2ssV9WqN3hpoURk", - "9YmTjrVfhzEcfTvXMs5GrAM7CFekdPwhQkhvV1aba6C", - "9YN2Ddy8Rr2b31C718ypuERLqanzFTXNsW6b3GQaU2GK", - "9ynQgcm2LGuWVH9kyAy2cNMviFpYXJV5qq6NPTpZn8PP", - "9Yp7sEu3ecy31pKgQkCxrUWMsXiorGsCmxPG8FNwnFuN", - "9YpAfETAaXzKGVTkQ1R6SsiodLXuWSNWZwh1XC2u49fm", - "9YrdkXHAaEHts4zU2fFGE9YiPXsiSC6bSUdcKXsQCkEN", - "9yTy5duSRgxznU3mAfQp29qu7Q6sEQ5B54CedveiM8ru", - "9yVf9SV9q3m3ese14dtvGWFjFvFmigHTQH9cpd5rWDug", - "9YVpEeZf8uBoUtzCFC6SSFDDqPt16uKFubNhLvGxeUDy", - "9yvPnQVbhKRdctgF5p3hpGTqYCrgA8rZxK6VTJHK5jnr", - "9yW7mfCFtBNUWzNFzjqhr3X5TN4LUm1jhnWgQP7epoZe", - "9yY44YYMAgRU8hKD7oeb9tZQEzEgaymX9opLU1CifprK", - "9YYVUfjGAkdQ9YjryXm6mRffrjUg6pAe8r2s4Nwef5z9", - "9yzUpsEZTyT5kLxvr8LUHa3Tt5gadoR2bA7g75JETCkU", - "9Z8s8cJe9WrZGAQusraFagf4yhYcDUzosxWQFLCMeqqy", - "9zBmAVji8SVJiuBm2kG5Jj9xbomorArnANvM8YGzjUZK", - "9zBpLkezsqCM5cfCfnDdhQ6WrZ9EBmjVUaYSZqWot8pm", - "9zcTqTaX7gj3t7a8vYryt76AU7e5hcWMZ3bda7RwFrVo", - "9zDYaQWuxXuri4QVhpumkFij7nq7ihWnmtj68UgZgJEx", - "9ziWEWjsoq22VuvYAatMyHHoxYERyiQq5riHFUVaj4r7", - "9ZjmmRVA1DSxJfF6rtknTk8GChDWhmAnt49vGkQwbzoW", - "9zkU8suQBdhZVax2DSGNAnyEhEzfEELvA25CJhy5uwnW", - "9ZmPyLezX4JNFsYbB8NUsd9quxRnkEp2wtS82fMvDJGC", - "9Zqcgqref1GnwwPNWcXaK88qib5hKqRMaoQ4257tvBpG", - "9ZTaH1QLsw9dcdkG2ZbtdbfzrNVyjmM3Vqxp16PDU8yX", - "9zu5fxWUfXaw1CG7JgxnugkZ7GSM7Y8aP1H8pRRa7Loh", - "9zuEEzfNFnDHMHBPeWcQR3mv55z9RXgirUmgoHHsE1Dp", - "9ZUPVba2EaMNoRSdvpEVU8XJ5mBxR9Q3azJWwzdr647t", - "9ZygBrPpVRpKidwWHfWzcajruBqgFnixKP7qVpKasYTc", - "A163h1Luidh7zcPkGniuvgGrEjFjFGxGH9uRLoF8knef", - "A1AMd24PMza46xXyeBJRK7aK3g3onhm1zxPCFw73i8Li", - "A1H4aeziMqQjWx7c29U6NpyJ4LFr3yYy6XkcmE9RZ6X9", - "A1ieLrRfZyrRQ64RoGVyVQ6zqRhnQKQutm6kRGRPg6ma", - "A1JevizjSWZwtFe2F9HujwgNZ5AbUoXLApBQcPNLGVEn", - "A1ng7TyWnWYew8DASM2RUiNeN7gEK4rrY5XUmnaXVVDH", - "A1PH9sMohLrSawmboQuRuZgTbD8mG4aVxY1BLK55QvFp", - "A1voPbfnmCq8UBNQTBKnZ3Xbhs2x4cS2Gx2b2wJtqCh1", - "A1WgfFLkA821ntJnihsxEfZacaaBKu9piHgDpF9TUYcL", - "A1z9q4Vg8fzo5jLhrBDNqz6yE4FTz3ASSWPfcvKjTbp1", - "A29yQHSPDmzecAKDk5mGmqCvu3aLtrkri9XNoYNUFVNU", - "A2cwUo78PdHWoKMgRH7ct5zoGPp8XCXQLkLqtnnhMFGa", - "A2mVt3SFERpuYdk4NjmkHcXA2jxSVZepK92ff6gnZM7p", - "A2tBBzjR1zXQE9NXDzTiF4EchmLYdeMdHFKBhCRi3Ki8", - "A2UN2ziKCgCtkuVboVFTwH7eSYwsvAaE66Uww4SCWAcz", - "A2wYfDhhcoEvm3M3oehAtFdcwdZcxWvWAnk4yrpzbSS9", - "A2YbdhMxsAHH6LZG1TTGDTZeGKqqyBj9PLD9rR5aY3s1", - "A2ybQoRudz2z3Pvd9PKBoLNHkCFZynZk9VDAFyHJ6YCb", - "A2ZtQBjeUYU3CyGz6v6UE8JKY56mzExWuTbxf6tTj3FG", - "A39ND7PgiND3TsBdcnSVTeqxnXr9ee5HDtfWnnmtzkGd", - "A3bYRvT96jebDnt6hE2Ya4K91NnvpwLBJUmLdryjBoB9", - "A3EpW9SddnMdqUuedvCySkwRpP1EzSukkj7dCrWGKM3V", - "A3iynpHkra3TAVYmHDe3unD8343XJu7ogZn8Mhw6rEcv", - "A3KMGZCZR2PJKqhk1nJUbEPCuN5fjg3gSCuVeQdGE2SS", - "A3qrnLEskh8ybTXi35uSjngDCbd3MteXXXEYw27kSf87", - "A3QTLPL7u3tYyornA5dNkvuFLcypt6TBoB3SmsZFMcDU", - "A3tUrAWc7iZne1UhTMsbaKAmeJhpNx18sErq9FPwSsxD", - "A3WaMe47ySMTgS36KyuEWvbBX4SGU2gR5k3pFeYdUMJe", - "A3zoxWHVyqHui8y3Z4rKyqWJTyr78tusgAEpAtr4ZEfg", - "A44sq2dYdGs4JWa7sEMRs9zptgDv5ULy7BUDSV7yWUPX", - "A48cKYXoLRg6iogdg7wtragjCrWQpYwLX71GEQuBzve7", - "A49FNQjF94BWtwMvUCVardQC9w8KeS9vXELPW2jXekwX", - "A4Bz67GutEFuHpoLLqfvqjU4PgwKkff4uNjEXXUomm6z", - "A4Kg15NX9i72WeQiH3Gp4u6QceScodz7CrkVdD2xhtws", - "A4Kh17xLBZmd3Kazu9aa2iEVa2hiMy4VTB7NfMAtmeac", - "A4KywCRymdAezgx4uqsA9wzrCQzZNz31cocJNYSLNQoj", - "A4L6Vy4bGqUCMaVC35ZbGbTMXL9AzNifhHymRj1u3nxM", - "A4ujSrodkszQyChYNZ36teeMFQeb7qEGCYEGPp7feL89", - "A4vXgizfXzKqK6SdJEiPbebBhRwoM655DNssNR6JX9nY", - "A4xoiWbs1GmkV4p4PXkBZWM5UDfJqXx8z2sDmHP8FmG3", - "A5hMwgm8QfooAuCMw9Rw2S9vXbBwCknFMhhUwKKHvYeJ", - "A5mV39Cb5d6gbrssHvaYjGuurWpUnRGfMMtST5EKxx5m", - "A5oH9BPo6PRnEHmLnhtyN2YXELnbTotEUDB8axHVBcY4", - "A5pMw4hmJz6Vmdi7qFG5UhxaGQLgDEUUzzJknofAzPSk", - "A5TXyVrR7WwfNf2RjoN1W4Dw5CuuMDiLV9e77pWhmwAP", - "A5VN9HepBAVd3hfQFuBbbdViTVbePA2S7hZkZ6SaaqRz", - "A5yRJu9c6dK4cJVFnkuj1tSEBsTXnb95b6oK1kenrxCS", - "A66b4Ek3oDFj2Yrqbj77EgGx6FSijfW9FB4b8ecGX9cR", - "A6dnj8TxJj9EcGgk3cqVeWPNKfCTK2VmwnbnfBeJATHr", - "A6jN1SP7PjWMCU13MtLYfQApYzxVcFjnCbPmPeXwT4JR", - "A6RXanjfgm9ivaGUFvjDHeSAe6BXYgJsX58UpiNF7TXe", - "A6vafujLUGNE2mS8J4DfSFPMHT6k1KgKc1iiz964VFz7", - "A6wcqgtoxyRhGiH3rSo3yyV4BQRaArPUedNimNXTP69U", - "A74htxNfq1UDgDP1dE44CcMLc52rZDSEHZgWgRwgEf6W", - "A76AgnFK8GEcGvnu45p14UPC8A17zU9UafFpA4qZ37Xx", - "a782GyJSBYKJjutWNErdmPwMzncN7NBQukwv3Y3K6A6", - "A7jnGYCtAYBfwmQUeupgKPT91TQZcQJWnXXSaHLF2e8K", - "A7pGUnnKbwYpxYpdSgjGjXBTBbW29sGPAXWrEopjToh8", - "A7xSwGaS6PMdKSMLxaQ3Lpsn59McgzxCMS9Qgqp4ZzjX", - "A7zCq95mtG2enn2zWxNyVDvhU2EsH8T9oWHs6jV3rtCH", - "A88R8eTktesZdMNfZLhF6k5BATri7BWZMk1Zxgingfo6", - "A8gud8CWchyGCtmgJrzJgFMQ8S4zhnDcVtDjnLby362g", - "A8hpKUZ2m1XfCtsXr1MQw3GDquZmLZQnFdjYemCztMsW", - "A8iMHB6AYqNoUfqeZVVMC6vfeLPKSyV1oKfNFh4gpxad", - "A8Lv2ZPKKSBFiAiepFsmCBvWEBSVGzuKxSLVt9z62Bqt", - "A8pwipYn7j1WhYh7WBy3vn59ZhA37nAW5unErJqH7ZB2", - "A8ZpXLD4Y6Ehj9e5gYZuWXzF4q1VpNmjwFvEoVKVFoJ7", - "A91g1Y8xXFEvCGg9afjTn222JDuY7iSVmSg4fdbQEB21", - "A92dCya9ivsYmzeGHzg4chen4or5WfCRcwq3btTV78iQ", - "A93VaDSYAjSeCZzAEN3JpJpfqt2savcBJ7xgT866gbzh", - "A9CwddX4BA8AgPCmcHKAEZU4JDFRzruMFytr9oo5ZzPv", - "A9FZ6XCVJB6fUGxtCy8RgDPmQiExS6YUDLr5b8xoSSNL", - "A9Pp1pbjgpnDRoVcM5a6bZt9gfJ9PkeMABJNvRoS8ERS", - "A9qeyUzZoNXJQPe3fd3QgDujekiLg9Fd4VLX9UsSzAn6", - "A9sGBwqQDjX4k11dToeUH2APri2ATTzzMREhGQ9uLoMr", - "A9XUvhm5yKVs9Z3tYdyiAYRx9mNr2rqnv2VkY8D1N4uZ", - "Aa1wHAVioviDT9QoZWPbD5yB5cZcbCDEvo4Bn5NupE74", - "Aa2AHUDm8CwT4JAJCfoVZsr488uaj16iC8RVFyiuhwhw", - "Aa61QTjvG8CZpwxiQ3GNTcxVH429nmGktxL8RZfRX6Wx", - "AaAXFW7Cpp1fWMCPyXCK5fCbKjDLEYabRgfXSNZdjs38", - "AaAyiWB1xckFRrmZpkY1HLZjGa2fsVACiXGB8UtktimQ", - "AAB3RFZX32GYRLKL5xtHzhNjciJXsJEY4XhrMBcLpr99", - "aacUjx9kF4sJdudRVrhLejbzwnkmrie5gphJZTQRf8z", - "AAdGgaBDnphzcQ1AVpjAC6Nj8rqxoa1BpNYDa9De9kCL", - "AAEuCfGaZinEcV9CAhTsHzNqEFN9mUTcvSCnrm6cAjBR", - "AAJjEhpLT5LnQofnMJ6MxpHhpvE1jj2LZ3rEwoaMRvz3", - "AAmV6JwejQnHGJdUeke3hiRXch977a1PzTzFacBWximi", - "AaoooAffaS2ppe1obCZvXu8XetpFURipNJmemsjNZP3p", - "AAoWcx8Za4fVpKWeUY8N4hGpbzYJDeGKWFabXzrBjRdD", - "AAq7sGN8FQbxJUEp866ExhtgV2AVR4kpYMSJiz9rxRkk", - "AatpmTXzKtMGnTrEsXgDqrXPzuzySF4dK2ZqGSLcd3GA", - "AAtVy3AUh7qUDjTsEXS854H3V49iweMyw3HWuwvwWpLe", - "AB1n46yPX2f6ANTEjTPLQoc1GNz9sGZ6pAurHMDBZ7a9", - "AB5LRaQLG3rXoB865zMJ8scKeeNPKwViVb5FjuK2St6w", - "ABeYRcHTh2RmHMHpn7y27ZZocTQrHYG6cZxKfnuSaLNy", - "AbF88hkkpZ28VaT3vYn4xu5CeNC8G6Dq9cc8ciRR4fY5", - "abJY4VRU47W839X1oQHkDxAz9zGULMzMU3VXaLVzjhd", - "ABLaXirCtQDMjNjk8JZHVXZ14zkbTWYwCU1puPRK8bY5", - "AbnagVJhwwM4wDuZbvoxWeofdpSWoDMhcmZCdCrxtCkN", - "AbPhydVxh3JxopRc3edacPEVxiGEAjxNeQdyQVdR2UhZ", - "ABUFVxb4EsFq7NMe4EpSVPrGsmFmvPJ5t4dcUW2KifSC", - "AbugrPanttkAnggmgUezxh1Fzd4P3Xm7TeE1gXXAfR2S", - "ABUhDLm3Y8HyLsmua9Xj9on87RyiEsw5j5eVVZQVw1hT", - "ABxQ9Cb37qoDPtbbm5P5WH5iibpTL4ZZcyo7UjgQ9Frs", - "AbXznYBSqoYyzEEgJ1pSiy2DJfuqReSt9Xu8fEJviue", - "AbZgc6PnzvmVuofRwTV3YbfQZbAffb2AdqenAznRvnkG", - "ABZonS7EB42XZFg66md9KnU6Tb576jGvxu9AxA4fFuQz", - "AC5AxhVYaWXEgyrBsMX4oFh53uyekNKo1wxAmC7G2yX9", - "ACD91Cb6A2EFCbRp5TxSzcUDZZnMTzZXyZhofmRe39R6", - "ACDgpuxCiBoevA2PzNVAWwfvB6vXn8ub7SGHroTbWT85", - "ACdZCQ3qNefDGSVUcmsvtKofxQEk6wg1YhUsSVpuge6L", - "aCHBgpLMJNfYYAKMpYF6LZDF91Zt1iUxte47wqCZ9Sw", - "AcjhWohnu7vYMdu4Yha63XZupqMKVVnrWmt1F57ScXhG", - "AcJzZzpqqRgs65cjVJcSNXK9zj7wxumGZZpcr3YW9RAv", - "AckzuxyTuDwf4EjdJaXE3PqTiXXLWLuiJJsxd5yqvf3e", - "Acn15HNJAYvsocPbHmwzkixiYY8t9wuvtvSWzbv9gtAi", - "ACPgwKgncgFAm8goFj4dJ5e5mcH3tRy646f7zYPaWEzc", - "AcQ7j1FQmk4JHqWC1CkXo8yrRjvmwFx1etursUYiNUyg", - "ACTdwNAS1w8YciDhBUTsVK6JM6XZABzLzU6M1GjNFDtN", - "ACTufhPXVFfrvUPqhPsPHo4skw9e2VU49t7n8ty82uUc", - "AcUhZzHRSSoLzeJLMiMnL32dXHa4ADEotG771jjV7ebY", - "ACv5dTk7THbmUpHYGhgPzMhWr7oqHSkuPJpa5RfvmG5H", - "AcWhuZr8yZSwpFPonB2UDWEgPzw5EAWtNJ6T4jTDvdh9", - "AcWwYTscnn3PEk7ysYAtFYcSQNRkhELzFFZoZ7zvn6Ns", - "ACYDnrdasgqavXoMR2pDxeZxTBxG9RS4evfhy9G5PsCe", - "AD1iz4BSBLpDKWDAyMUbPcgCPPGHxkdgtizRnoYQLYkF", - "Ad2qksNjGPK2rR2Piit9Eytzr44eoXGKVCgpaZfMf7mL", - "Ad7wDeMFJMbAMPy8Atwruiq9g9zuSB3acLvHqkPytZDt", - "AD9ShMBjnM4ug4bjv3ha9UyUGPK79CFhXSNf6wVczaGN", - "ADaf6j6hXSLESBTgFdSt1zTWcCsSmPiPy46LLHakNmbv", - "ADCqmaUWXbShzh8GJN1WeaUzy16y2yYEdodPDcru2RUN", - "ADiT4zpCRryJ6NGtvErT5dtuFzTxwYRv24fj4b4LDQDr", - "Adk7uBYMjHAvg5jRCFPX11NSwtoFJU6tnWRNqqEc9hJ3", - "AdKv3SFdhSZDfjUVNKmLAkWE4NPa9sudvkJ7HG1WYm9i", - "AdLWyAVdqx5PDCjLhyVZ5vGhVwWtAzsU3f5o62qrpVg4", - "ADLxDSW4cuMJr7qHvNdyAD7wJUh9qWsTM8BU7NMS1fBv", - "ADnjKZ4UoMgHUBWC1m6P9FfdPRyTKgGxBgt4KhJnBCnr", - "ADriSmPTSeyKwNCo3geTcAY31G94mHmCfRfrJMe3DmbV", - "AdrwFufQPWrBRAWPG2ferUA7Bi1EY7SeT62DRkaGmt3J", - "AdVKEVMZSd6VZ53PYbw3PSaj4XzDjsNoEg9LwDnyWRE8", - "ADVqUcnmGF2Jkm3rVkhDbkNxiPUSSTvZC5GdSza81xSt", - "AdWHS2VWxWvyztsiSEL72ecUFC8CQEzN5bbFNRUEgqk6", - "Adxhy641TNFz5iXa2cXr9buZhYULjT4pQhBT8E7wA1mD", - "Adxn3HngzfQ3Yz3ZzRWDNNhqreiEbGBwgn2egGqJXNG1", - "AdYSzYBKBeA72YmD445fHTrNR8tk9QiHK71CtbQa3R5L", - "AE4yhitf7idVMWAdhjVpScGiTzUE1A2enjMfpHQHfDhk", - "AEabBRqe79PLi1xSBqU93jE3jAWcaqhGS5pSCZyfrX1F", - "AeAGcGCs2DGSTsad5aMycCVpn5NDL5VHX6uSJRsMSoYV", - "AebcMj7qGCHVcBWd4qm9Vo3YjWtFL31uydMgVPRk55xs", - "AEEJPqYYFGD9ku2XmvbtoG2XUv6x1RHoPsMeVKMHUvmw", - "AEFRMKgTtBR8dSgt6KAGEA7oYtvQwSFatTzpzeZTJ3eA", - "AeFt2K3Gq2RVjGwsUM1uktNw51Fsf7SCpduiBbZq4tsd", - "AEkYNfJU9X7DfTpDDv4x86VXYLj1yy784neNqjiuMUqQ", - "AencD2iKEEmUE9DN5E3fpsKJsESKEwYqgPHvFE2eyKvk", - "AENhNTcgwaaiGE4ZPbwzNDgj8nWWAr16pvYJM7JXgKF5", - "AEoyRgQnpuTWZhZGhbAaSAmR8PkhfkJH8D6Jn4TPgpii", - "AEPNDgaApdcfZEZpww458Az9i2NZrwxsVCdiUih4EaRh", - "AeRe6yj1q9gWV11kAo8Fzz2sdhKQ1HbVmRPo42diQf8X", - "AevfeX6N1PpwdSXQztNMcSP27jLMJd4DhFwKuxkPij8r", - "AEWoxb4i4qGP57iJqNyubSA4frWN51oJ7pQ6634skR45", - "Aex3fnsTWQF8xf5rEf6bZawaEKsqED79qx7zJKzAR4qb", - "AexxpcY1JeyyoRBJ6nnCyHYfqQ7X1NVu6pcPtNB4SWEh", - "AeZ6BJSaGRh5rGdNVJ6TD7KQbGwXrv1rndHGa8SnkoCD", - "Af3BY8yRnmGLSX3XZsWoCS4UrCravpZuVY1UofrE28sS", - "AF3h2gdkGYndVj8W9qQN8jA45kQ5RB2WmoAQN2iBk37c", - "AF4EKSfrzV34jHYAPVLtcGUsp5Q9rHBHoju9JBPtHtSE", - "AF7d78Xu7CMXR3cjzwmc6CxDP9R9pHcAJBH9B7YMHUC4", - "AFauxynZxWJ8NRHZVbtiuCD6XdJNbu2TmJVXq8gL2vYa", - "Afb2Q7sSfop5XdMzcRM8AEt1cHtGyTKgEwrhTwcVNzGW", - "AFBogerkEpPTQCJU1QTaQ9k3rzBGuTkK8fMevqG6Bbuf", - "AfGmhzoubc9DzrgbsnoKpoh4N4PxxzyoLqG4GK8PBnYr", - "Afh9EHqvjmH88KA9UYxWqjE8ASVb45Fsmv8ZWYxcaC9V", - "AFhXstfivJL28gUG8a5cCGsrEzhqqnXY4YDZeMPZTutr", - "Afk5556WeFEAFkBR7Pqe4D7PpVDPCraPoy7oNmpkNfuY", - "AFkpm8QAMCLbNebefoZsMerbWNAKCkXLFrxeCj2DiRAn", - "Afmc37RisNAWvYvJz96P9jg5WdVvKM6c3UwFuv4nvr9u", - "AfmhA3jLhBkzFGHLVwyhq33Z8or7kZdQKUhqTZAyj4Ho", - "AfMteDHnBsgzAHjj1V8gyT26Z3XPp5feGXx9yJHx73xi", - "AfoWZKhR5DyNp6HUVewjqo7dSbKWWZv1MPUFF6JnLmaB", - "AFQTTdvEkWuUP3yj21V4iduEwUJjWC9M8gHSgPfGJiz", - "AFqyEjWKTY7MzboPeRjLq5wGD5xBSbniPF6dyZN37jUc", - "AFRkC9ppZEmq41bbtntE1JHs2MAm7GUJvjLbJfeVUJDN", - "AFSyQPAdNb2LSBaYjeGtvByeyUxE3qRLYC3QX9MjprxK", - "AftA1yXaFqfVPVCvtHSSazhf23hi1nUeQywJiELbnasG", - "AFVkDuKCb9V4TGYNYK7H9PT3sj7Ny3DCRumQby5UHBCs", - "AFZcYLK6S1k6uACPiCV3RLgURq7DqvtVvzkNFzNs8aF9", - "AFZgaufP4KjyNyGA6Bf3tJMfutwZ54TxkEmBmbUDC1LH", - "Ag51oCkwGy5rkbGEYrcP9GDjvFGMJrEdLxvedLSTSR15", - "AG7bmSguxGUvdaf1hNNo1aQyiHyesCRHe4LsFiJ8aPWB", - "AGCsyz64NLvoDAG7Mi7k3WFbkMjRDCv158Q99WGGvKNM", - "AgcvBSS97jBoKY2x1LXrqScziFx1jpCzdE2UpgSiVeQr", - "AgFQkQe2Em2GUkDD85qPmHrvybnaXKMa7anSNdCunnM4", - "AGLNnxxfrWAsub37nxJzUJLVtb6Bm8a3WVPBSKWH8o1d", - "AGtpJvgYgv9bU48tVVXkJvhWtJgzaPmqw7GAT4hRogv6", - "AgumjAa1wAg5BaZgpDmxQbBLQb2fCUxNYppDSTtj5Ctb", - "AgVCFV44ydJK4GzT7cyA3SExPKQYQQ8EvhihDRcTBXCB", - "AgXjebfjrntRA9VyzeddJkoNTaUXNnCZJ4bso5qZK625", - "AgZvf1YyADsLxkWu6eoxgiq9RpKpKABdaXbrbhWNM1nc", - "AH4aSqFqgwb2WZAwo8zTzDEmZfpohSTK3bZedco971Bn", - "Ah5arzkbkHTMkzUaD5DiCAC1rzxqPgyQDFTnw8Krwz1V", - "AhBrA4t2n1CFqTqcySoMshGxzgWWMdCCsGpE7viLJ4nn", - "Ahc4kSePsGcaeXQHby5k6DGxwZ7bpiddceCqbr8Nxktg", - "AHE7R4tZYnJ2xs5XKoh8BYevNBJPJhh1bNEoXcfbvq2D", - "AhNzmvTYzRDmYwF3oqM4jFpH7mGiWT5p1RRv3LKzhxi", - "AhqcpuL44Ey39kgiC3quggpFboVsubvzWjdLht8t7KwX", - "AhT4yWiSg7nnEWQokWoGDz9QPURwa9sEHrPkidC2PK26", - "AHWVP9862jghMZWBqAW322CRwN4gfdXbcjW9s3vEDwYu", - "Ai1QB5RaRbw4Zz24rJACrSW4SV9cfuEb6ptKSQQU9TvP", - "Ai6bw5eggoNb7aBvJbHYrvXdv37mdGGvu3xyjWbqfCab", - "AicKhNhJmkdqafRDjKLPgVqLzXLzJ8pS6aVrYrRkq1iq", - "AiCSHuNnGpFobCLxpjSybNp5zk75DDPUZduW3hihSmpg", - "AiiS7TxGeSQcB3MgBzhfzdAXL88feL8ibxNz6t4QXBRr", - "AiPN5MwTHxRjG4eTQ1nrmxERRj4oXJURHPiTcNpVYcmk", - "AiWqv1dqsbvkUMec7G4DmM88ka7SaoqDPkn5U2iuvqnn", - "AiXLqBpZ55gVH6kALhhdxRvC9TJvVTBKnzz1ubwcvJWp", - "Aj6cb5bk1JbCYSHzNrV7xCzECWZY6Ys3VRTNw6vx2XWp", - "Aj8VzY5djvsQ5BdNw8etWaV9aQzkYUDn8AoiW4kbUHab", - "AJECXEpcdNrczdoWVnaoyZ58aoabq3tFNKWNjnyc1Xix", - "AJEfEkFABFbMoCivkR1vwZfJh5M3hXUcHTy6YvMHZHKg", - "AJEi7F8fQWAP1xarPkFc6XJWTi7qvPRcZ4JhLSG3CZo9", - "AJeuXG12CxqTQTnxseejE6PcMapybJejMYHpFc6SErMW", - "Ajff4BHPxgLiBBnQYcaZcC3iHhUPE4KyHq9JpKjupxdt", - "AjgfW9BrU16NFRGbPHi3Xrs1W6KRAezPtSvfF7yK9WiG", - "AJHiLSrYhcd97pyAu95Pg9q19HaSwVZ4V9VGhkCn5NaE", - "AJLWyfaLmio6Gm8GA76mdfUtuLT4tmyZsLhbpXsndNab", - "AJMFojkmqEhnBLUdx56tgBbkkpEK4vgKeSZC4F5VJiwp", - "AjnmonDs8Mg4GY8cHg4grv5DH1QNdRmdFrCSfWhs8UC7", - "AjP5uK77iuq1dnVHeR3wR3EZREStQXdWt8pRHSLgZPgY", - "AjTrfjYY2SiTC5pLJXwNXpcP8q549YQ9VrPAxzjqjUaW", - "AjUJBNkeVdu48RPFD13jzfVbEcTypuMCVRsijwN51nrh", - "AJUQBNHTPdoyAuTpSbRCZcG7jVKSyKb2khpCSvQ1P1V", - "AJV1DF1VvCsQroEJ5Ep6j7RLyMLvh7Ye6984LiqnbC71", - "AJyQWpskWfNYu5wdZF8zqmNHgHpi4n6nAEdMNi1SqhYo", - "Ak4BNgorzDrbQSUTuxc42hb2rkZt7SY533b1HrA5U3Zq", - "AK5hfHFusiS2y5cjqZkiyUyAvH5qfidQgrmCccENnet5", - "AK7E9kDig5RQLynCGPH4ocVccBuc3wWjA7TbBkpDHrvH", - "AK7ZZx2sdo39coZN5FsPdae2xNGqVKHX2TWJixmY4ecX", - "AkC9ffb6qTZBhZ1v5222vg9tddqX8mxm9c4r5hAMvSrL", - "AkCNL4jo2qTQwHXpjvAHhe1RpaGUUnUyU4pesWUcySiX", - "AKdhJ2gVzrMky12QF2j5F79K1F21znpGdFCQdY8M7mi6", - "AkjcbFfDvGnsyuau4ACVwEhxitjiYHZ5KbeWqNMJhHkW", - "AkjkhtrmRuXzTkzccm17cZChGT1Ehy3SeD6FkT1kizBU", - "AKjoYQqtk5WJyGobytSFLpaeptwrMWosexz6rMufxnFo", - "AKJUDmmcLuMbmi66L8UNo4y1W5yWUi6AYv68oUiyL6mc", - "Akk9n4Ed2GwY4LWSgXqigQqz9bFVUE4Uqy8iKKQY4Uyk", - "AkkJv1meyo2Ax2XTXEXWpvHTh4F8a68Lja5dx3TaX47K", - "AKm41uMcqEUerYPuW5jq1hoW8ZrrvwPWYHJDU2QmrNmp", - "AKmDHmzXzfruSK6ZDG47Qz846sKkYCkDHr1X8dSMnbEz", - "AKqB1VaJhf2Jsod2ciEjzdTzCUfgh1kUUUaC1sQ7iMnG", - "Akqc2WGCzgLNEvzgTfxrUoZTau1rBgPrs6XDaitHoyR6", - "AKqueA5Vfmf6BWTXuPdWxrYCDNPGi5gDLrNpdc1CSEzy", - "AKSgisi8j47v7AKofU64kG99Smm5XLvyMD3egAs7gVc2", - "AKSWQUyjB3h8vS9RD1fmXfbBpaqwPLraEDGqMYokfSqr", - "AktsTpExAz6MxMjKhW9KzCPqDYeAaAYCBLgB3fi3zUJf", - "AkVMbJq8pqKEe87uFaxjmt35tX2cNhUJTJwv13iioHu7", - "AKw3Hm7JdCJJaG4cZCdnD9fXUpEJKyj2kB2AeRbQauHj", - "AKxehc66bKqhpXCNPoDxHimzsKGoELmjCVLEBFTvmFRj", - "AL7rz6oDLfDaiuwNqqKKci7oaK2SCbH4T3qjmE6MmddN", - "ALAJD4YGY9fdw9CxSQv3UP2MFiXXNFDY5PB2CvgcZLnD", - "ALC1U2AoLfspjE4DUTFpGuJpJpfjooMS8PsgBe1bVn2a", - "ALexT3M7cyrXkYsctKbp6baimq2WzxfbHGKqxWs45jzw", - "ALExTRuD2ujgzcghDydwXRatX4da7FqgZ3eU3rBZZrfy", - "ALho6kykFz9KYbA2mPkjna2hjK7cy7rzMgiLhpWvUP2g", - "aLi6Q7x2btFGkkKnruZM8XERgDLS5zYwzKitUs167P2", - "ALidnu1Am9pQEL1fL56cn9A5b5PhQoNaRJhKtShc5iZU", - "ALPXVb1A7C8EkR7NuKy16pXcBRasdeRNmRPnWGQHpe7j", - "ALSqeTyLs7pzUc6UTtnHRBDJAG2YuhjjqjzdWupnPBnY", - "ALt7XgAgSp3KN27Lg3xHinqyVzWAfgzTYpbEbrWyWT75", - "ALU3DwfXkhJiCaM8FxSUxmAgNXXxwrr11eE3BsyTHJtz", - "ALUTvz1x8KD3TvsDGU1EHETHkgguCGa2zAcatZRSXYwc", - "ALzqkbSgVaQz9nn5xh1BtEsey57otKRyGmaSLhwphYSn", - "Am198DZ9uPqNHCtmQkZDz1ApdZ9bZq4ZPVeSsQHgMHSx", - "AM6BNu2WZibZhYYHNo9ZWxmEAB7PhjNQBGKAhhN2VrFt", - "Am9t3zgkKqQj62aEDefwDJWdez8vEGPnB5ddMFjrhARN", - "AmayCRwQF2ECAjTdz7bsLffpK1vr1ZgHSkCRirxmTPbH", - "AMDnP5nCa4tHDeQt8DG7SDU48UeGKtPy4qnJyT3o5Zwm", - "AmF7ZbGvCt3pTyEyBvVjh3fMaVP3USXJfp6Q6ZfW4Lf3", - "AMFMheZthrgKjYad71CcUTnDXZoPapGTAxo62gJ8tjHE", - "AmfucjGCSEAfRtsAU6gTkfehAUGm6R2ifpZvy1UQrRT6", - "AmGk8mMeo5bx1DVr6dhDwHzqQUUDGi8MJ68Q8w8quvgN", - "AMHwC159us6bok6awd7jdvjFVMY5ewk24JVpZNwK7Dno", - "AmLd5EkU8Cg7hEpJ1F1cJwZCXNN4EtoK7atqWxstX4B3", - "AmNRXJSSaGJrXaYBahD1PBoBR2ApkfLBAJ7SiRK4772R", - "AmsRH9BfG8Sqi6YFuB854aZ1qPHwvRfsVSxzHJQZc5EV", - "AmtSHsetLtT12qsPtmTbKURWLSM5A5kipPwe8rLoeQUR", - "AmUEx2FheAFUUYjwMzaEPPkSsVsrZx1HU27KaZsqsSkP", - "AmUY64jsSNtnhz6cXNRD19jmEBYq18B5naJhoKSU41oG", - "AmxCaQJHSK6uw2FgTJWXCgUCJbwGAHn6LfxRdpRxPgdu", - "AMxRLwGETJpQHsw9zZjHptmNAR8Rw5hySerz86n2mE2q", - "AmZ1nodB6yK5BVbbzVcp7AveuegouTbkfnUvMjeXbDBR", - "An7LZE7tCUAMnq2iTrrX6b8iguwZbajbYyrjiy24WztD", - "ANa5NUyMfkQqKyypB4tzvef8KJewh85KGYwJrMBTiM8T", - "AnbcuyWTbuDwHK2URBB28kHvhns9S3euEmKtY5gQ8J22", - "AnCW47d9J5V8W9pGNhagcHiccH7mLYcZR6vXbzTbPn9Q", - "ANdhH4GMx2HTitQpPpNNbg8jdBRKNY93tVqvUVkv78Xv", - "ANGpqx4Ec9eU377L2LtqjkafyjBGz8kDKqcReVf4ZKqP", - "AnjP7Mix8QuYP4wZv1ZWcbd48QNmi1QQDe2yiYJNDyGS", - "ankaTrZdDkYkcFq5hG9xZG21o7ejTpbYhLFp5VHvB2X", - "AnMbQV5XNUEwC8HYX5wGkfmM5vo6eCkFUH29PvjtUHWM", - "ANNATYhX95VnwB2nKtSTXBe1z7LPUFXLercvp4uNbSKQ", - "ANoRnbxuQaCkkVXtrRra9NKVbBjGTD2xHmvwhf6okYGz", - "AnoziZZWpH5T2YX2SjJ1bEmGgKAk1mWttpKRJe8SwWYB", - "ANqJaJdxJEnmbbjrs72WCbUAwx85ZF3g6YD38kr7hgHH", - "AnrpydL3zZXhbaSyXinktWvGVga3sEBCqPYsHSNo9JcP", - "ANSmNS9DhU2JKdDFnm1yvewG2NJrJTeXycMd6WeHW2w8", - "ANsSvKenUePSaYCWDgkajcN2Xd2f21mT7mZEMhZei7PX", - "antF7nXgRAZeGayZSc1X6uwtiCdz3tcxJMgvDVqvQWv", - "AnX3V8ic7prYxZQRHyZSpRowWDXJBJ8o5zTSvLPhVoMa", - "Ao4fLaFf1R4H8WELjjh82orj86U3jiMhXLSqF8j32HjF", - "AoGPQs5YeEmcxtjyFEQXnt3JVu7psEf1t56T1Yo7Z7WH", - "AoKD8QZ5WVvY82UgydBCSDZ5itUmyWeZHmu51KddCvFT", - "Aom2EwxRjtcCZBDwqvaZiEZDPgmw4AsPQGVrsLa2srCg", - "AotZAVPon78J4k5859eNNkqjbwbB6Lwqae87y1JwuiQB", - "AoUwfPuiEek2thVRDhMP7HbQb9rguyab4rDiz2NAfwwA", - "AP1YYBDKC22u3PfDizmppBLrAaqtEVWnufsygH6Qxpwo", - "Ap26LrzGTSBSk78BToV1szw6po4ZjijBU5FAVWvDYzaL", - "AP2ZiF3mdoDsVd9AdzJWRUb5UHHoQjnLLPXn8rrkERGc", - "Ap7K9JT4WA59s2cukCpaZKZryVUwiFJ2g6793ZgeJqDb", - "AP8Rrab6whViUb92R3fXimCfmyiJA9vFrFjKHtvYpi48", - "AP8zddxnBwJVikM5BSoaparrbrGeqbAcMXL6NB3em951", - "APaEYwqpsqjBGaT2HdAMHkRxri4sPe7iRZckeMhU3Ykb", - "Apc2ZVGHg45cFRF9LmAaJkFLTT7YG4zEtEah49PEqohg", - "APg6h9hgXaJFyd19qnwUEgf7RGwSFZvat15ATPXoGFd7", - "ApHAg7ySBsNghy6vLgdLJtS3LJ3pX75Z1jpqmVPd1zqq", - "ApHMqJjKY7CAC7V1kSxEgUK4LRNxsmwxBpNDMxXKxvnx", - "APjVTcfzJSzYEkBddGFN1mtFWb8jDzogpgUz99tQW3Ei", - "Apk8w77ignw5MWKJK7dT6VThwLvoqspMQjfF2Ver7ySH", - "ApmbEdiVVnC1b1MJnBpC6YGcKrWcWNhmzhMvKGs8wp7Q", - "Apna5iwPnqHYTe8meJfB1rNaYxw93C5X8yrdhhvivEYX", - "APThp8BqFoVtS13vbrSGJfbpvnum35urgZCfH5V2L3wq", - "AptYtdYA22z4SjLPY7gfjERqgXphf47onjaVwAuYTxQk", - "APvWHwrNBtLwdXLfh8C9FS594ve56wdnu4YqnLHcos78", - "ApXgGnHWSdh4QhedEuisvzi7y3SpWV15KcpbnBQhAEV6", - "ApXrqZeFu7uFr4kZNQpZ7Win9MCCTsuekuMeq5TEhzTG", - "APyr6VeuZ3bVVXbEY8ackLHx1i91wFDj2xjiYHPAWUG1", - "AQ1U87eirJqCtANZ2vXT5xHexDBgncVwrGTpg8R1iEzX", - "Aq256QgXksYuvHa8jxmrnto8m2VU3woLtEKrs964vzdC", - "Aq8yWGbM9uA25KDKsU9KPwoPEuquP5vTqrYomh8VK9XL", - "AQ9BHM4y2RyFai1xGRsux5s1Yhmq3JFzQAA1KNET3nxm", - "AqbqoM6E41cYzpPJFP1iLPekEYomnvBQQyRYVQ3Qhwfc", - "AQcYB1Zp3YyXjJbTjs7d33dsRuapGPQPwxChHhsrVaGQ", - "AQE8mPPvp2xjysVRHKHmdvDGrDtN5pq5PbmCWYpR9TC", - "Aqh2c1x2AA59pek7pz8PymDXzq62qmNiQ5GXhpWq3rNr", - "AqhSZXj5TePD1E7d7VrQ5JhBdoa67Kz87kLQXPcfbwaw", - "AqjUDR1f5sEwFK3c3CEo6na6nt3NBxfUE23wpzt4zmuT", - "AqwRcpXAYMPGSJuZNVKjuduPTGgaesRQ9XJWG4cbzgT3", - "AQxGzKnSCUiMdf5Pyu34VkHeVv5G14mc6N7ToMeBcMHM", - "AQXUYRhH2meRQtdNiU7bpGSqSPJEbGKC2LaRx9QodhR7", - "AR5Lgk9sgoz69qGBeeTiMyyxZdhvCi2qkD3XUzre1Uvh", - "ArD1wxhHo5vd3nxSud4j18mhjnkUxaZAA9CXdwFhykxF", - "AReN8GjQpiMGimB4NgcBipK7WUPUVWs5DGm7tgCpwmyk", - "Arm9aGU258y5yqAXeyRYcfPyG6Upz5eT8YXC95RstVFB", - "ARoaxL1Wy7PZK2aFEBMLusjiSAcrrLj4btzQVDQfC3N4", - "AromD7z2e7YjviBgRgAgaN4sBAUqkuCytyScVkYd92ao", - "ArpeD4LKYgza1o6aR5xNTQX3hxeik8URxWNQVpA8wirV", - "ArVspBqfajnC23uoQmzgex2ge6NKRzFC6BVDJ9DY5qJX", - "ArzuQfms7PAaBEKMDvi6pV7BTa85tjmbsNA66VDiaaRM", - "As2K9THaRCe4G3UxrfTmDoPgV75anZCvFNh1tq7S3yWq", - "AS3rwVs9WR8HTzN7GA4aLBs3JjWjt1yKHfSzmwoqp2bY", - "AS5n5dGThxx61ZWmUvAAUEPraLgbkddN7LAtruSKcpF4", - "As5qDHeYP1yGjNdC7BohESCRxutwRy6Q443a2ebeVjyk", - "AS8AvnWYMNBNPD4S3NuD6QxwFEY2RD18TQ9PVheUZRpE", - "As8hU2btbqKi8jP8LoJWeTy1YxeQ3Nge4zj11fhY4JsB", - "As8Z3LfCRQoFx5wjqMX2QgGDHAZNqyHR7rKKuXh7X5HP", - "AsbY4ji4Mzh8kFGjTv2n2nF21PZez6HFQC4zPCC3JRyB", - "ASDE3uRDLHUQ3rkfeGiThetAyU1bY9UssFv9PeAZDtVi", - "AsHjsc227XTAcR5WRqyNVTjZ9XAYA6d2554g82jMG9MR", - "ASJii7EY7KV4brBAKNQRSNvabrw5LNAt1psn25xwbCu4", - "AsqtCPXf2v8X1L18PsiUcptZB83Lsd6hKxGo6YXMyaMd", - "ASTK6yxpK632GjoPsQotsosyhbE5GM6dgpFAXsLo1bAV", - "ASUeE8WXu8rg9NH6wu5iXLfub9Sejddcc2C2AC1czRju", - "AsvCrBKwz9Lj44Tp5zkhZabzR4bxE3HLTobrRRGQozcn", - "ASwYSbeE4S1j2pDbtppLqzbnJ7fZg7PNLLJZfjZ2QkT8", - "AsYEsmw6peTCFtvVKPgoVQY4FwoR4omY8heNL1vkC8C2", - "AsZJrzaMChk7k2AdX5jymgk4wE3SpYNnfJbSAfRkaz5N", - "AT2N17bBBtTAu6ombzhiLNLc8JinjMXmGMzFbxt6AvwC", - "At4HLr46vxKbAXeUKKmjtFEUUGWRaUPozSuUGTEWDsGk", - "At81qZCWTvuat4rVnvZxxqPmMyUhyKMvUeWfRBCLpoPA", - "AT8cZMMPuZgBC4Av3bVd1NcmEQC4GoDzYvAS5t6hr6Bz", - "ATd2PeimZwgDVvLHnBARkaFMDmzwuVqeWbzqvJgHpDnE", - "AtDbWh2idqoeddHXYxzbBuCQ8FADPp8NAr7VTg46KWjq", - "ATf9JjuazVtdmgiDNdLc6YaxLq2ZWEZL1ahyVa9opveM", - "AtHoh3UapTWEBsygTDXNQgphTHcqTj9g4RFpbvPTBDND", - "AtiVkBjeWMsH3AgsGBis7gtL6Ua3yHDW7iL517V2G5dc", - "AtkFWxD8dEkjSoNHBwMFMMv84WY2ore5XDWWjvLfBZ3q", - "AtNdA4RywbrqKApcJPiVdNS3U7v83Yta4sGgrVbsorr3", - "aTPi9R1prHHwRf9GCSgK4yLZiCZLs7evMtZP7EPNKw4", - "AtPzBJqzmZB2FdqZwNtkZV6ZsCoPgLiqrpoE8NxqpNg1", - "ATra44iNoKxAxj8zpWfE8oALhdyTZY2AA919CyoQ9bJW", - "atsTE1uvopi4yuVEu3HT423U9PXmBCmwubHh92pywrz", - "ATTbkBhr4VSmTRuQMuiw67HPuZrND2cy1dF1gDKrD6ME", - "ATtMQ3Aphrc9X2SeTJD9JWbcDJfn5aJs4NHWSknxfNb7", - "AtUD8QwodrRPdHXhEH8ZUkXkSZwe6eVaQbsfJYCarcLs", - "AtUPHuH4zSEQBELKKBQim65UEoKSkUca7BzKHAkdVf4Y", - "ATuZhiCdjCuKChbeVd6Yvq9mbGagDNY4WQ6aLeuofxS9", - "AtwnoxtxUVNLw2Mhad2bwhGPV8bQpnr1cier5UYJCHRX", - "ATzLEsaydfvFtNBxu71zBVpLAtdszhbKjCN5fdStJbUZ", - "ATzu1iMaTr8o4zikDL5BeS2yTwc65RB1uBiDJ4ZGqmZQ", - "AUA4sQRvzwWiL2DTEk6aCaAqZpKJ2j7RGMsJthP5aa6y", - "AUaQFJMmfsoehtYL35QAbA6oWBQZexQ4594gG8rGVtvo", - "AUCNgx1UR1akEzik1Ni4vZGXUUEis1kwZcfn8PXfHTRe", - "AUcXRTirGAjzepCXnyL4UyuBBxkYMsUThvcei5M7x3fp", - "Aud8JaDcq3Wt7nZLx7uSQr2GuCQ3s7iXYdrig5wvV2hG", - "AUDArgrKyjyhg7WcSSYEzgt3b8UFT957bZGy3MDWz5zo", - "AudhVa1DskDfMAFTuF6EC9vDhA4QnSCe9JtJeEg81KXH", - "AuFuV5VA7ZDjiH2sYv2htDin5HLCg7WS4NMYWLwZiowx", - "AujCsfhAqohG6opjF9AbWH3zDvx3znQtquhcuTWy5CVt", - "AUKA3dJ174DTa1Tx1RtfkHTaDMmBNiUUEo2D6jLrXsUV", - "AUP5YbMyJsEq1Ke3bqnp4Ada5wku7RND98yY251VJmAe", - "AUpDYNAz3JgfTdoMGHZ4nxKHdnw26u43xLt6kNrNhdKV", - "Ausrs5oKg8x7fYhPMKsedED7KaRE55z7mAWJ31Cu4T7V", - "AussSM225GLYAGE6wDBoaSnAsSu9tpHqa1c9FG3PQVtL", - "AUWyyaFNhSDafmMCdpKZR3K2D8YFC9rHD3EUW8mYkt7P", - "AuX8i2wxd4qQpiLcie3eGyWPbVeh28dx2yasJiTbJPNC", - "AUyF6qD4MMtsQs2W77Wv4oMPyjf5xEgs7i6wLb1TsM3z", - "AUzmGFLmiL37698jKUiwdUkDKHQF3szsyki4gzBGjDsG", - "AV1rp1JstrGxfKP88KFcbBKtHCyKUYLmuKo9iGUKACzJ", - "AV3nnAu6xyF7GcYRnaaPkWG1EBVtQwGUfFyd73BTrDxK", - "Av6KCS2k6BL4P25ucu4D6aqszD6EfhxFK7AU3aQZ6Dtr", - "AV7xiqZ6mVK1v5KFyqFAaJ6bJeswhj1zPmFB6kSWhKEE", - "AVAMqDmPX4qjDZYc71Hdh2ZtjhGrGsT1yv86hAFVNt9u", - "AVbDir77HAnALKsWZ5Qh6x3tb37cUxkabQcLGcsMLrmJ", - "AVbgqbxXqx4bjCyGanxhNwryPETbfRkrPJ6qw1xXx6xc", - "Avg3oEtzu4YBiyPjMgnzrkHnfCzVRrFhmefZLXpopjdm", - "AvKQ7X3BL4FoBr44VKNtbMtCMfHuwPb5ZUS7PLfYgVbm", - "AVoVUZHsiAWVR9at1AD1jVTntcHQefkH3KbbT37FbqQj", - "AvPbRdiNN5nMJtPgRxihyw1nsL3prEgVdigGRYiUoEGi", - "AVvcBzeSLoNGHFszgdmzGv975rDizhu5d36PnErH5Cai", - "AvvZG1SMd5HcMRsxCNEViFXtXke4dnszqqywuvtEArFT", - "AW3MLxDTfigYizfigb211N2BZKa2epePVJZ39ChxpEEx", - "Aw5qHvzPyfLWmgkKUtfv4ra7KC8dfrcRPwMj5UeCyYwg", - "Aw8hyPBf3xG5Qah93TKktVfhJUU874TfLXpYdzExJeV6", - "Aw9vQQ4Jpo6ZkCoKoZBffzBvhbfgMLqtjrpaJ3kJu65S", - "AWB6xFSTGa87qErP5YEsVd7y6KkRy6f3sZPJSbWDBDy6", - "AWedmLMkxpJSmXQSBPKnzQyPuYAjrWNzZ8XMM51PAZ1Y", - "AwHLAbKu3AaVxpYNBQNCxiATVbJ8dVW2BPC3sZWMrmhy", - "AwjwLNVhpp5Z4hKoRgoYCBj6j81Gr6WYgFw1Lnw6V12B", - "AwMRTUyLVeee4eR7ZdPaj4s7FHgTvYSNmD6CacnTAbiB", - "AWQuXquyMY6JffPHQ7tZRPBYmRtgebcngnN83EUMexoi", - "AwTcUy3joEGT9Je4ZhNydtrQT42d6Jkt9Y8Qt9dXi8x6", - "AWTWtog1GtBcjUGuGVY4zpp9xrRm3aepsRi7P8EufjzJ", - "AwU5F2xKZceZYUmyKiufTgMbkmK55G99X5P33GbnCdUb", - "AWUKT8yFeib7omFJ47vqneLobXqUSjNqtwL6ArDRUvDa", - "aWvc5trQunbNuynHuHmYXYNRiw2ZcVESe3esS693z51", - "AWvt2Y3dbsHAeZbAzZfK6G9Yu6AzGzE4puW6rUm7nPMX", - "AX3mR9rafz5jYv6tpSCEnWUBMTCDYxD2E7qDSharPWoP", - "AX44APbDNnr1J2wqa9yRQyuaiJ9NWmuEjyK51LiBWZWt", - "Ax872mmArvzz711tSwa38xfuMtMjfmenfYVLojUuTcCG", - "AXAwNoLVVHHbZtx3j6KZaJQNjRv941cwSLVUi8xY6XwB", - "AXBpZSfZJ7SmwF5f99r6mMQf9nEfuXXk192yAHN941rw", - "AxBt2PSuKyxj4muiCyNqByX9uwMG95CFGea8LcacBwPN", - "AXDNExE4KLywepB3ixRhZ9TALev5h6kCu5uuAjiS3cqA", - "AXfAhKbu2urtzCMLgPm4vDWwjK1hEs5ZaqMCbfEEyn2P", - "AXgJTkDM9AWW62Th6XUD3L1Emdxot2PLRffFSrsSamat", - "AXGrBfE8tEzF4eD3ZcrRG7XvXrfDUZuBaMXFpUAHkDus", - "AxhyDKPeWSDkCYJEBuHdni38BgKcep8PtDyf4oZBBJMw", - "AXJXq3q6JvQb192nBU2ZQYJBznrc5ucdvhpQRoAfCCkw", - "AxmDsUN183T9dfHgX385XkjCJLnPUpdej1mqFAK8s3Ms", - "AxmTATGM3mNw51G9JwBd8n41UsRq1RksDhgUBctJSeRk", - "AXtMaR7F3cZ71KSG844Zo3YPF1UBM3FJp1jdfA7SEp6p", - "AxvBEJRuVzU9DoZrNYXk5Fp3sBGKCR8PxyugPS64Qwja", - "AxwaNyUMpwfXU683LkcVuDnQJX5o8APJPS1zGunWVKz", - "AXwviAZcTWRS2Et6BuFd2dEVhXFWpXi2et7bBN9CABcD", - "AXX8EECcFxpp3SEwT9vfYpyd5yHS2bjhVkR4QmrWdTQi", - "AY1P1BYmPoG9yjotBBhcLVBhhruGy6Kg9Dwd94QAztyA", - "Ay4xJWtJ72Y7D2ymbimzW3mZRrtwrywFYmSJLtXwTcaS", - "AY6NVQ5kbdQw1UpvkVLD93M6kgj7ze1cpqhQb5rEqAXQ", - "Ay9TTZQtpbTohcrb3eq6doZAeeLHXmKgMiJeiUumC586", - "AyD2xd9GiyDL4h9rDaywPyZCH2e8trMZJg65pfJQj7Jj", - "AydLFeGXYfMTqFDtcDVrVBRijeoHa1odeqHm7is7HuuM", - "AYEHTBfsPvdGxkCnrMHEu1nTziUJB8Qnhjktph5aQvrw", - "Ayer8NhVD5xUyWkfKK2bMi9wmhX91QUoJ9kjy3xh9aPy", - "AYhM8fXxFQtNtxffovvUduS6MSGxo7DGk5jeU4BcTAVS", - "AYk8cq8bicfUAhXC9N1SJsEm1xonRdVipTUH2HpX7AZ", - "AYKbjnx7G4ewAfhStZohFGsbk8Rc8Rzm64EZr1m7G4BJ", - "AYSACY1Qv7KKUESKZ2a3mM1mBES4qJbyxa39A79T8bE4", - "AYTHLYS71eFMrqj68S3zwbBKhACF8umgFgqomfsWEarq", - "AyUdCT3L7FmC6ZGLDhjZJRCTpHywmpfgsX6uHejxWicF", - "AyvS9yc8cuHM43EekkAd3kx25iGZvq9axPhHPvzre2Ym", - "AyVwauiSL6aEsKeXL8XT1qNTbgty7ryGfbZbkmSitSyi", - "AyXabqmk7gTVHUJagtBWw9b9S2sQzFuC6d19jZKEr9H", - "AYxCoguM1XJXcd5e1bYVQB3Tdtu3vnT5iubjxgwvzNK6", - "AyXMWbdxpvDoeJmueCBA3B4w9VURpiQu6pbjrwM2z3kR", - "AZ3pPKQbooU37RLahQeKfxDsRedJeUwQSyirLrUjtBv6", - "AzbTvaiD7uwC8NV4VevbBWEq8d7A2ckDbJ2KdTXsuFcp", - "AZBWhbBeVwpAJNFRK6fK72Lap4Yw4vhz6LKpYEQzQCrE", - "AZdDxBLMjiNG5so5LjaWz1Xkk8n6bfufyYhHT9ym7Ak3", - "AZDv9wCtQupfTL8mYk7AVb9Dssogx6KGhku68mBFDApH", - "AZFkNiUSszcpsTSAmCWFTcLPe7iQf6sGp4ceV72JiCdt", - "AZFRS7MsjYLd1oYAqeZjxyxXyG53zNYLQtKRk1qVKgG4", - "AZgEaPEyCiMczdJ8htXHHSL3n4Gh6UpYqP3g9NZrChfz", - "AzGNuCEZ1Ke2geBqMamPqtmyeggqwEeKd68PyGpKHHmc", - "AZkufXxZFJ4uer1DxxWPboxreHb6MnDofmwmyxmfewNw", - "AZoLrV6bVBnSwTnzCiHCTd8VuoTzbaCtiuwVLA2XMF3G", - "AZoVwq5UExuXkZXKbHeEgnyQe4nZRDg5oeKegz6HTy97", - "AzPdF1xfxLeW73LwTBRzpdG76ZKFP4DjxQXcXuQKZp7U", - "AZprESvhCF6YVqsnuakKFtbSLDhD2M6aVagVrf39wmNf", - "AZq4Y8BQYmqfav53bWKhqNRV3X34UJuybPXADVi67AGg", - "AzQEHgVP3FyvvGSbihbRKsPFA7iAqCzUosekn6NgXGBQ", - "Azrcp6iMFxyah28xsHPEkZjDkwH7J1Z3uja7ueuMqmDD", - "AZX9pYcH2LpPcredemTfDXm1mDXWQ6t6GfrAfZDYBK7Y", - "AZY3mmLS39SKps93TrsZoC9nT1nUrpYLUmQWzbtgyF4t", - "Azy46R5c7U7fzhZQVEqFs8XFwtqEENJM9prL1fnRhjDh", - "AZy4dhpKY5ZeYzobsLys4GUQhq5diA7oGcp18h6VpVxT", - "AZy7VitV6ckNdSNh3HBvCg6PM2n9DmvQSbKWEs1vDgq5", - "B16zKR6K8snMZegyQzmbKRFf5koX5HaSLAhV9vnVPxHf", - "B17KXHW8o8HK6QBq2X1A5JYBqDXboF6DsRpskDAWAigF", - "B17qEhhj98EQDXk4xFnpivSnrNpPTdkmfV9ACRJ2KsFd", - "B1bz4Lc7dYA3FAni5Yu5jr1jAuuDvsGHfrTC1RXDBeGi", - "B1k81zGnWcfskMfdTMcq9DVzNGmXNJSSZKk3ozeFYnwu", - "B1rsa9ASoXfcWMDHmCoUnZVf4bwWmDNi5J6xpEuGLz2D", - "B1W6MaDVBpHC3tBhQ1r2it3mnet2QMYXx4ApYDSZPSGF", - "B1Yd287CKFxZnZXMvNjbM9V61kjW1agupihzR2xoMWBt", - "B1yhXQR4eSY25kgiGHNE3zBo8AqEBgH5K1f7sFHuCMzG", - "B21L2hCrdE4SDhRi2fHKohfSUNAhoLeaWfBp1C9HdF6Y", - "B287xc7KK3N6Zk28sPwUANPx576fmyrt25DrcF7EhAVs", - "B2cidd4mMYpKheEGtUqdDWyUbDDxTG5QpSinXKPZLTro", - "B2PyFnWTjasQZa5YqSsKzkjZ2x7K3fvBrGXe5paNwpJr", - "B2scNnE7FnH8RBWBsUoSETLmq9NVCzFUmkzdmkBpbXYE", - "B2snx5wkWfhRPj17Qbzeo9qN5sTGLtNn3F2KL2yR2cm8", - "B2UcYy4WiS1fSYKbMPeAKZoCEzgfQKKt5QBAA8NXLvpZ", - "B37R7vN5ZwZHSmwce8ixJ1vQLeQgRWBpa1HW8Migtxgp", - "B3fuLaQ9orHBEkeGL95m2oKcZZQgwm2uRaxVcaAJpcqm", - "B3HVYHdHqRQCzKRnaArBaayhyxaDqRDxJeFETMZ72R36", - "B3MSsTseLwC417bvWgdhxyY3qiiXnfnhtEu9Am3nwp2i", - "B3oAnf1Ly6LAJqiy83Zn5nfC73f2kxS4FyZ4GiVAvEmq", - "B3oQELbE1RYV6TGAmKY9zzLMuFrxwpo94B7jvirvmRZF", - "B3WHx2RMFBDBMR961wyZL3dsfwLEwtHAazAnXbaDLune", - "B3wmguTyTx9VETtSWmX2NzgkakhmrV1PbS6wAJnRhh4y", - "B3ZyMGnSX5GjhKtopCtkn2jmmy9g5j3KdwcvXWR4dALk", - "B4fnmQe6tSwJMGCQNZPwBW5zoVJswZhXsk9Juws97qL", - "B4HLEpRDLeWrrvtMkRb7dKJXar4dGrfSWL5Hv6agNLUv", - "B4jmAWReKZHBuUPXNxi5dDLG1Di93HT4hBidTpEjnQj4", - "B4s87syh6Jk23HKv9rd44hsFmm5qUGPNic91hrgcXCa", - "B4xFUYq2TDmz6PsiCj29vFyvmYvqTRAtnhQ3uSmxQVFd", - "B4ytRaLo8YysM3KHvqPsX6NktfoeU79jaQ3bsZX7CGSc", - "B52Da5MCyTcyVJEsR9RUnbf715YuBAJMxCEEPzyZXgvY", - "B53tbis1864ZZqg9BBdXFAkDponmVvKHwHySAY2tC8gy", - "B5eQ2dBPk7YZ8FFpHKq1n4xgp22zhaCKXEoKcGKH2vfs", - "B5FNFrfrrfpBggFBp9h6Js93mrz1Tham1z1GgP3bDgNc", - "B5i9UW1d2vkn1EpxnP5kwq3PmUCWgyCzo6XP3aVA1RBF", - "B5WTSSyoxCpkp5tqLH4x479aWFiMoumXkbf6UCiUX8N2", - "B5Zi2dgvVU54Es1JLXu7b5Vyn1HXBfSBEiFS9SAT5Npb", - "B69Y2vJRE7ZGU7qzYWG4d9j27LuGG2ZioE8bp5xR7rDA", - "B6eeWqfF19AGj2HtEk6jzSPEvpnMZjTvbyh3d7HzRBeH", - "B6G2soYfRnhkVtb88yyvmoxPwknKRvCX2RTVPqNXeeXc", - "B6PJC25oDXqzS1hhnx5RLTp6SAdQvctrHF4Juyi4pCWE", - "B6UmBxpX61Z88aP43EpusE3jZdMbSurcLCac7sZJw7WF", - "B6x9WRHXUv4KwdDeitt4LLYHABGgu8mJQxvS4FLtUj42", - "B6XkCms9GZFJJBT488wT7HM2oEkyaoEafBPdAepPSQo4", - "B6ZramCQhQWcq4Vxo3H5y1MYvo37wRZiAwKk88qaYNiF", - "B75YnUyemn7ixtnUtq4cDUVKrFwQmn8J2Er85ypcEJ1c", - "B7bj1jT2phyHStkiiVziipoSYB6QH7xTKPtQMBvV8pjH", - "B7CoweFX333gtyRviBDJKm3DzSLsuqUGF1yxrxGHH5Ph", - "B7hSaNjuKCFhaS3mc5z3qbokazeAetkM6VKpuBnHcM8b", - "B7QNbMjAsaZDvNLVaBXo6Z4Wg7tKcESqPY9tQrSefvBy", - "B7wZE5gXXaoVphugcapJYo3sq5gABS2j2xXBt8X8VreA", - "B83vQiTjBKHYMBmxARQhiBVUujSdYDAGMATBzV9uxDnW", - "B84LrdspMckYCoD72ntFyNMPXwUhHfEuX21dohKDoJrr", - "B8d4i3nZvFTZ2x4G1pbrHtfY97dFpbb6WFsjJX9xrPVp", - "B8KWM3hZGN1wLHBrMmyQuBzG5NskJDMqxjjKstW9wm1V", - "B8npinUBKrdivCncnaNoy6cSsZqJ4qm7MgbXPbd8KkSK", - "B8T2dbvYaM4gJfpLLbuBScuWKFhnG6KspRK72v5D5uoK", - "B8UmpsNTU2RZ49BjTwLv9e2AnzfR3Gz7vBvNBWRWfWnE", - "B8wQDRb5JLuXjJhAtmY1MAQtLjWQySberTN7wLUHmP2B", - "B8XR3DiutP7SP3eynoqqyUFWA2sNDkeaYuMZUBV3nj8d", - "B8Yg17nWrRcrokec3xTkQotGZxwJ5HaJFpLtnfLYgRrL", - "B8z5G45EbtZSXzxtTtKf1p18xCqM77GBAZahLtNAX3VQ", - "B9FoWJeAVrDGZbSzWYxsbwGJKrwqMu6vqJHr6JmRdCx3", - "B9gJJ4vMLJvnb5geZjU9PqhkyHX4jESMYajfcALQgRry", - "B9hLohTfVFfCHyshjGSVuvK2UjMKcSuQKSvmU9CDhrLA", - "B9jApJmpNnEpyweF1AApDumzJV1tYxqwqREUt3pJPnJm", - "B9T7YT6LJKKENvBiMVEA96LTWBDZjJ9bkpbbxkKimHQ2", - "BA5MAVH4EfaE8kZJgcA7XdXjUKA9ybUh5eTpBUYQUxsp", - "BA7TEgoyiWMuC43fo1gm7BqedHspU3fdyAbn5SyJGwZA", - "BACRUXQ16XaZGmSajJXd47vcRMFcL6TeNRNwASe6oP53", - "BAFFC9FVYiK5sezrZc2Az9YZyTaeawXvKLG86FMbakxb", - "BAiJ11NidDAybKeVC3fVTnDmTAYgABrzyxPrMdtBHNkZ", - "BaJ78AQyMyJ9c3QWuVcyakShFgxK7sHg33fWaMLYTbQu", - "BajUrEg13yUkzf4u64WWh2LcczAvker3B7c3WnnQg83w", - "BakjQAaBvnZ8rsu8VSSSzJP2Ppxom9pgitCVFUDf87QM", - "BaMkcRKCGtVDQ7USiboDMCXDUkcyQwSvqaTrG8s7Y98g", - "BasEgecUwQsZMsSsckpxCMo3oQgJYQVQaVeL4JR1AgyV", - "BatoKBDE3NQYNQ4YFgH8cUMRPjEwD2tVPkMi8azz9M37", - "BAZXbEwTXDCZHhVPKT7Mqi4FRTkQwxBm3dHW3sQdAaXz", - "BB64Erpv2mE2UZFThSjw4xqTuCsjuFZYjqU742rmQdex", - "BbaQwKjFrYbZUJABaZfFhaond8NChHZsitMZPe6r1biz", - "BbAyKMQ2vFmamjNbDREATh4SqStium9q5ZXZ2PMJA4Ha", - "BbBZuVv42Ps5ggZucWjAfxxHcDdwH1SpHeLDEYQBJmB5", - "BBcWXKoMhoseQJazEUEjdhmdJrJdUkDrugnFEoqzwZCX", - "Bbe9EKucmRtJr2J4dd5Eb5ybQmY7Fm7jYxKXxmmkLFsu", - "BBHGLZJrRvT8HXZ8BqNqAQPoUXbJ9Fjh1xzpeM48yj67", - "BBikjFkFeiix3hfxmZ9JtMWo52dde8BsZNKEp7JvuUhE", - "BBMkXuzpTnt1MKkV7cPrJ5XKG9xUQJLMkYbbbLksG3jZ", - "BBmURkCyCVMkqQbfhhBHCSTr29Y8GXKGCZYyXF2iDJAy", - "BbQnFTRZ12wxPbQ7h1AQxv2UXuSrjhf8gJr1e7c8EWFL", - "BBS2e9ons93zDSDXKGcvkM9xxva2ne62zag1rNViG5bD", - "BBvV71ncxGrMDjmKTkcvcjipzu3bv6ExyVPPuRxAPtrC", - "BBVyX7PygB2bt3TPfpEFeWTD8ESfpeQJbyhX99R1KJLJ", - "BbXAKbRFRHq49rMHqBnm86eRFNthNjjKMuTjFUqv8TAa", - "BbYNpVvXLyDohtsNx52JB6yUsuTtrdC8a3PRALXTpD8t", - "BC2U4tL65XVNmqfJqYuKJQFHsxPYE7sgphCNKy8FTnt6", - "BcgqyFJGQeBfaTM4XFH5aJ1CxxKHPYhBzUopmvwgmA4z", - "BcmrLVVFVuzxFY5okoyxHcFRiCEgR5jZMk3x3ZbzPcFN", - "BcTJWk1NGzyoWP1UVMXDis5aVGbjoZU4xw87NG6ZaHMS", - "BCXAriKF2upYJJFqy4iAV3ryuN1APAws7LuffoNrG71F", - "BCyxw5wWVwKW24CXz5AjJxV4rcnRhrQ2B2uZdL1fR3LP", - "BCztBoiSHPrvB9zGU4yBDy5pFZ8ogtDtJsgdFz71YDGy", - "BD6xExzE2hNtMiMQTxQxfmBbWV1dgNocBFyST2VGtT6w", - "Bdd4XhquueXBB7aZXVYUn1XBdJ18G7Wx3LUe6aKkmXEV", - "BDGhL56tLJJ59Mt9oSYQUTNPXcJhAQ4Xj9DccJAgNFBL", - "BDGLqucJbn6FKfvzeAUQLmjZfNhWCjcTeWUhwstERexi", - "BDhqfwgagNWWqqmi1wQoTYqSs4LMMhz4c7wuf7bYaSis", - "BDKAGYg5SLDNRz85TZj4DeDekKVLxMm5kRNJf55WgJcp", - "BDKeFjbKtRRyZHNVNeQB9BnAwmXJZsXEkEDdReNuNMgn", - "BDmpuU6PJ1KH9TCJpbQwWWBcZw1xLh1goANU9od2A4wo", - "BdUh72ZNv6HKf1Dtqm3UGT66VvT8cdiLnYos3Gt2W7dK", - "BDvTyemQQcaazR2sw5Zxb1QDTmp1myS8cPAX2KpZYp7W", - "BdVXDJ15krsj829E7Gwou8McVYmVKTsPX3EcoBWPoHmM", - "BdwH6GCMHfPFGYr5MqdXzSBP7YgnBKpp3imBBvHhPCRn", - "BE5FKsjWDjPQYsP9iKHdKNcJjGsVXSWtriMPynrCFt5J", - "BE7SFDX7rpvqhPFJSJq7UYLzkZ4PeLnyrRTUrmqehVDx", - "BE9viFvKLzRqoc7eKyhTZ57WdTWUys5KekNXq54MYybW", - "BEAeqomV7JV6W1nc8gqBDQAnyZH7vpA729umBAHFNd13", - "BebUNmLyM62d4BgE8N88YsJPygWrCWSNaCeq5s2U8uzC", - "BedhLBJfq5QYGnGJiA3F7TmNvdqwDLmMjus1pwKMhroC", - "BedpVzxKo1K8wjT3cmCJKPbTp2hZYszm1ubzwYRWE7SM", - "BeEB244M5prNdBewfCD6vbRyi1Z5JNK73anrszGLS36P", - "BEFD2nMciBXpk43V8LPQ5D8NAedUzTswMD7JrXjQpQBP", - "BeKrSH4LYpAwBCCvUBSmgRwgEjD5WXGcgbVMmG6E7Ksy", - "BeMHt14ueZGx7ABpPJm9ahG9nomrkhvTvVo13nAPCoja", - "BENaaH9RPG6QHg4EoDKW3T1HGjAkZU55uL89PaufV21i", - "BEpHYHGxaAKPezZP3wVGepqKpHRZ8cHV8ub7qXXfrf49", - "BEq8K2LHtQdNGGURvpUxbbcutFHWQ1YATAvujMz5ju51", - "BerdkMBXBVjUoKUkAuRn4DbadZpxFCB5mSBDadr8GErq", - "BErLhip6XE7Z3XT1p7EACrkwCXPcXKa6pCJo9eFPYh2U", - "BERnY7T9qvVZESUpVfySXAYG19aWDsPNhZuJUcZ48ztp", - "BeTwHdCoNhXWBeKnGxJpt7VEbkuzJnwGdDG3ctpBgmPb", - "BEVuCqaCgRN9t2nTEEpGwHgDa9fxJFMxeTyzuBeVLX8z", - "BeZcVDLTqLtaTJvfePc8m8DncgzmzkudYGHRQqZXez4y", - "BF1f26A9FdL6uWSajjTfstnLdCpynXGVrAEzqUyKXJKd", - "Bf4iFPLPvBSN9UpmWvg8vnt9fdh7VTMCtzYs4jnWgS52", - "BFeDniSNcXi6HDQ5Bm1F4mdf9xnQGwoCwytnNPHshH4v", - "BfFiJgrPfecVSMTn1ma9UWMbqcFMftrxzgVp63TFWvV9", - "BFFiQPZsSGRrQ22W7HdN3rzxV4HN9R35mRv2HrmZ4Cqf", - "BfjmopwTknigm38Rj2synkw7mNTjgmm6hsCCb1hQetAK", - "BFju1UkzRrHTcJhGcLp4BF7JVcqTpQfrccMkmBaknzpk", - "BfQmAtJwMy6wjDCqtNbJ93sCQKvj16C52xwzc1hBjUG", - "BFZpksditzAhQbBrLXcbBEPNLz8ifVBG9RZfvbTN77sF", - "Bg5j1Qfa2SEmio9U3UQKMtERNEjpqvushEmJMAi3SG4W", - "bG6V4uMwXbDvvGessojvShNU2YwUoWy191W6Yr4Jq8t", - "Bg8bjzEWrx6vu75eV8xEWjoJ8r73EvCLbNv4ctETCKZ4", - "BgA3cC6LWFtTuDQHhXe5sHA9EFPLuGfvmaU9ehTEgyeJ", - "Bgcx3McyoR5wmzMrWKDHLK38VJbW4pTwhRzsiqS2gbif", - "BgiuFBCwS2DiA2f5VP3HbHx2pyHeHCTVFA6mbXGjxhpU", - "Bgp1oskwwj8mQe94U1Qn59BLEbqRDk1qRgD54bz2fTcr", - "BgrS49ViePLQ84qwwSc5FqC9rpfo78jUUZU4Qbmsva8J", - "BgSsPST6RyNdX9avBLThPLcsftrVapKG5Uf68W9jVQNB", - "BgtcjrDLioFzNdb2xPnchgE1L1WSUQGiWcDqj7XNDMbi", - "BgTjyYhAwrmNfXaFzouVhoDtE9wkUyUHA27NAu4p5Dtr", - "BgYeVujfdKnYGbJbzv7hjfstq73dZBji8gSWDKwiA9bZ", - "BgZsMP6d9rdBdQQ7Zfh3Hzeg3Zpbi8sWUYVUR74pjenP", - "Bh1NjJbfMm1r82PV9eCBufG9LF5t7EQSw8h7LC4KBTXf", - "Bh1UG3DudyMKPij6Vgj7VxnXSpXhqhr3bUcNVYNZfYiU", - "Bh2xVd5tSW3CHJuHnPpAoAFGfB87XtGvs6tjv2Dc5kN5", - "Bh5KPZyNaLz5BDQvMXDcqVexJ3BZVXgMugWz7cxBof3J", - "Bh8jsbGHJ8WTxdSYqanh2Mv16pHjaCGfH2PKTnGKPMsh", - "Bha4mjHBAS1yFjvjPWWY7ht3jMneu4Lezq219pdU9dFu", - "Bhap8oecj1m8mYRAAGjEQ7VmjWQ45xPPjtgqhZ3C2ssS", - "BhbARoxdh2MT3vb4awXraZFPzSwBdmF9pGgURKNsjBqC", - "BHDp5EA348jgwSeZtaaZvDE4vc6n1R75G2Z6sTQnWnRF", - "BHDuUZuePEbZ7jQyLRVTEE4fVPoHW1tFWPAYEWJp4csJ", - "BHjXrJ9KkYdvZLfvCFf9TGcWGVZXRVLDb9nVDsnmLsBe", - "BHKvJsTQHub7Y8KYuiSfxNN3ztbNJ8LALaRgAHH8Qd5p", - "BHPjYib5bUmwXAXa1T1UT79eVNmC6QgKkmbBxipKJxkK", - "BhqA9QWfMtfr4oh5bnGx8mxZsudPses7vNfAriU2TPoe", - "BHR2K2tpc1fowNyUf4PfAumc2tfaT2SpvQVqmmpuN6tF", - "BHRvsq9EMgqV5PBTrVK3Nfk2MpAFnJHDL4HB7nnbv13h", - "BHSMusZBuHSjKQPfpXeLF3fMkHaBnghQV3jwaABf8fRK", - "Bhuwe4uFWxRYvUEsQk7aiSu1z1CFShvnPo9qHMbkGC9f", - "BhvukuxHigUVXgPmYFC6exnvvUmKoFLjU2tzGKEnWxUx", - "BhWkrBa45m4JJVebN7epkw9jWqLcJPFbYQ521uF4Hpp5", - "BHwVbZBewrFzZXTDeWkagmegz23AT136x5sHgqKgZ4TZ", - "BhxksnBq8DJWCxHu48Bib84YpbDjd1BkAULnPjDrUTuW", - "BhyWTwzVE7zf48hg9nYWsYNj4cpt5MiT8grDgAi6Fojc", - "Bi5ctY8LERZpPcHk991jna9HHxUxgy8EoWdmTg5toJ47", - "Bi5ys8HXXthqy7H5DMvdYfWHXLMWD3Aj3v7EcdXNtEYs", - "BiD6ps8ZnacQrmGan3WSBasFDmcfonvB4cHTLFpJU6XD", - "BiJ9Q21LYTDERvesMdg414KSbvoh4eDHBZNvLkG45NDY", - "BiMbSXciWwiy2nQ8JY27LB3B3scWLF69bG1xkt8dczci", - "BiojHSNaLESvULioqeH1oae5N4u26Bo6V4F1GcSyozfk", - "BisyyTP8iZQBLCvSczXwRrKTicGphkdhvfg5SySaRYW", - "BivRLUsngh61Ua9T6No8KgaJqkyxikgHV2Y66ozZ1M8B", - "BixqUFVW9RSpEf6pjhbTxsoMz25df8oEDXC1tfqcJsAX", - "BiY9bp5mMsZui9oCr9Pw9SHsHWc8dyEQUXM3QquL4MdS", - "Bj4h8GkBiiR3s7JRrugYP4e7qpZe6LuSW6Qa8ssCJZAw", - "bj53eWLx461E3m27qmHGtJE4NZxefhvZUoewioSavqH", - "BJ7c3j6taVij5Fhkuvaw8sJsSLmg6AwNCFemKCEaE38p", - "BJciYzK7SwU6mAWiFYJDR2qz4k55H5MgF4US5pXQXmEh", - "BJd9CEJPmCnpkYfddAznh3oV7h5NdZ5JkpJgX6yL5iuS", - "BjDPMTRfPNGhm7uVkQDnwWiBf76ttCmRJkwZw2odiA1J", - "BJDPVva3kGqpwRnsPFNw7pJgwdaVwqLTFLgbeuBWiiMa", - "BjDVe8a6kJbAcXDYRwWfLh4vzX22PSsxFdexM2vucnAF", - "BjEtwMKjF3ZToHo4Y88pqN51ETLtGg66KdYpBQdWNR17", - "BjEW51vadScNvcfYDChHj25nsh1C5YSZVvyi95t3pNjd", - "Bjfx1uJGHQVH4vLVUkZ4XcCxz47pFYAHoEJvVjEPXgdM", - "BjH4PQTd7xEhTJzvG2T6fhWoVD7GDkEnfGdjjJbPpQJ5", - "BJhh7JzBaSagZidw4Fmko6SVqkmMgazfskP3qjeciVFL", - "BJKsm7S2jdrGM8uuH7LuhU8koCP4PCkRA1YJhxHbxdaR", - "BJMh3mPmJqwzvXVHgCqGpgJ8o6hAGJThvW2BdcwRbs1g", - "BJmpgFaoBHXNTJyVmhTBMHTtptP4SbdL3kpZUpp9jRir", - "BJsd1aLzJ8ScQh63jFtDoT7Xa9Xw4XXFdvfbCG8uPqSy", - "BJsy2aKAm7MUswYM8xkoznGKgLd6fZ9Qs9tYxMQA5gsZ", - "BjtzGi6a9BC27wshMD5hD7UDftAwuZ2r7oPTpQECoWvm", - "BjuDha11xQ4R5avmP32syWXVNMBTRh22UJxtKd9FsMMC", - "BJV8P1JC1gMFKoGJQLCZ6uGtCYSz4f5Eoxz91ZbyqFdY", - "BjYqhSj1t8cKgj93GZ5ea6GJKin3VJtF7q7FQVGCTjBW", - "BKAgnBWgAMtC5NaP5uS4Vq3WZme6dAbUmEAJmyronddd", - "BkCzwZh8ioKXPb9NCdFmWBZVHJVJMZJb1S7fGMqVCxgh", - "BkDDkFkfpvVUmiTRiExdgxGELFVKK1Jwk6sFkgQKhj8D", - "BknuD72sApw2ydVHCiSBNXTHirVzhEdyExMLGSB793ed", - "BkPAqejgehqu4z8Jey426xP6qe2ZzhT969nwcSdHERi4", - "BkPf8F1gAeZ4kPmTBSNgg1r3vnYi2NsU1Vfv3swkyBMB", - "BKQq7feS56yp1PvAcBQjb1zV2XYtASm8EGTLy7eGq3bN", - "BkTtw74AC3rDKUbFboQaRVnhLEhsUrchotzSvuweaUCH", - "BKUFHQtdVM3QgW3qGCxpGxqkbwFwCNUAxg4Jhn7BBxVr", - "BkwHbaZGvJFd6aMetyWaUGetAnFKM9k7wwjNLicdc7up", - "BkYCccGobUbMYxCwD4wXHyKYfQYyh9tS4mF56TSErQND", - "BkYehfAQCvdh7sTrMGa4N6v4fMqTprhvw6bxvMiJ7tgH", - "BKyXqAjJgKVgE6JAFMgWHtGzhrkbPi31ZnDG99BSVLZn", - "BkZ6KJEPYWadL2Lf9WV4Gutw1YeX3ZzJYBb3BXKUsSRy", - "BkZue4zsibrhA39YBGs1HLgvDiv28N3nN6yKLJU97Sj5", - "BLDMeJGMTMXrp5Rb6M6jMv3ZosTQTk8Eguyu37J46CTL", - "BLfpk2WoF8RnerCqjxHe7qFJjpEE427riMkf2fS6vUB6", - "BLj3FTJ9wyLrtHYcpdmZScNk5n86gXaNhGGSs8WqNLtp", - "BLJwLwPQQdcQJDpHfbXY9qw1uLWxNTjAXP8qfSkepUYu", - "BLNd2cbWL2dumHsy8YL6npp38YwpZm4xWG1STYc98iJQ", - "BLS2wmLDL3zRgpTN4aGKeuEHckQfbG4nUnYo62A9W5TY", - "BLWxzv9mGX3DLam8z59A55qDpF9KyMEt8krFf88Sacm8", - "BLx8wufVGBcSTAK2cFHssizst67fsv7LGC7NFcA3L3sF", - "BLYKcZ5JZc7VkNfHVwAVuYKQxmwLsV2CL8UpHtrvtC2n", - "BLZtwHMTMgnZJdhJQxQaksgJgteXFFDBrA13ywWagji4", - "Bm7rPFCXxTYqBvKrnnghb5vDhBBRS5Qn4YPR5KFQnXFE", - "BM7WjyPRbrZjGeuHkgeWinewyeX19BqM1GoUAscJNt5u", - "Bm8rtweCQ19ksNebrLY92H7x4bCaeDJSSmEeWqkdCeop", - "BM9FHqo81ewzkvNZJgE4PZciYhZkEEYrgFtgAZGFgtFs", - "BmBQN1ENLcsNc1BsvaKw1tR7oNFjf82KjuGoAaPsL5oe", - "BmCFZq2tQ3zj3qY1pjK8iegUp2TAHj6cYPM2vJkSA84d", - "BMCpNAoZmTEp5pK85LG1uXUaGBkrfpp4nyvQZT4H3ySW", - "BmDv4nAhayi2rvCqLnaV95AqJ89qqzoyYtbZjAsGHB8Z", - "BmDzVzR1i57pXRxFMWzG1dzjJ2hYqjqtrMNr8oPibodE", - "BMeb32DosmmuepncJGK3yrGvpd53FYgsYgZZjz81mM6v", - "BMfE9KMRNun9wdBbMf3AQokmLb9fTCiF3t7NohmW19ph", - "BMn6vz2XGDbHH2MqQBWGFDmEBHUuyZJawSb8iC2ASx51", - "BmNws2SANaqK9Wr5f9ctU5T4BahkcMthtXGbZTzTaX9H", - "BmozhY5KYc6JpRpzgWfgBPCHrKH3bRsLhAZ7o6CrXpwU", - "BMptWCkxuT72oShStCb1jxUrCeexkRuSK4z5HHvVqez5", - "BMsgZKhzDb7y1gBUuxqtXtGrySnY5ytiuf1GezebDNFF", - "BMUVvCDosrMgx6PNpHhmvVKAQobNTULr2oNJxiyHagby", - "BmWXcfZS7TqqaE2eqZQgyRk2XSnBLFBdvQFxA6i6fRXx", - "BMX6VV4pMP7ng4vwKt4LyBzrsy6WcbWw6jcND7FsSpA9", - "BMXfUdAuvY2F6x7VZEwdyRF8Dbp2gHJafL5uQwU6jLNx", - "BMxJ8qWV29WwDDVBt74nxBVjdHXR5KzNq3rn9YpLFjnt", - "BmytjrTNhPLdJg1TUmtt6JtapA66vWgEm2CQFsG6Q7M5", - "BMYWpwG6JDLtcGh3bddQ9RETFm3epvAnr1zoz9JVGJwn", - "BmztoE61fB71cg7uV33DWBDvEP5JLNWJbJxvPDfJ3eNN", - "BMZY98zbjg2ey4XNfhBQXhEuvVqzaJ1T3AKD2quL3wnK", - "BN1dPUuuyfujPUcNaRJPquHTuqnxGfY2oeJUV28wTWMR", - "BNa6rYkNdwWpXSzPTL8yf8tiCZ4DqzT5orRh2j7GuWB9", - "BnBHhF7VA6vgyGK5goSyc8sdLgWR2DcaNNRr7JMuyGUa", - "BncRYtvkRJ2TaZ7ud6VgpWY17JcEd6Hk1GoFGf8mua7U", - "BNdUouEKA1K7mQF1GCT47GHCHxwh6eeUddidc33Reyma", - "Bne9y6ZxrnuzowtVRHvnQqhvJu8dQRDvBDSMJ98mvNmM", - "BnEg1R5qDnXJBv86ycPow8CmD2dk6oNu22Tjcnzh4Dbx", - "BNmwawX2hrDABSAqpsUULqVGL3L1wMYSpNDeagPZY2dP", - "BNPQHhxPf4Th8DBPmvJS1ee3VfQ36m24hV8Qd8g6jhAt", - "BnqoTc2VgseyBFGVuGbNZnDfrPUCyam2CrTtVEEG7CXp", - "BNxiTTjKG1vQmUjMaSak4SCJ5qmTdu138P75NJaWBdrg", - "Bo6e2SZEdu26uDDVuWcJqNQv8ZxvH2jpsgteDWD3V2pp", - "Bo9T1z62GVKmnttMz4HxPPtRXs2BUkAd7T7yUsKyG4iA", - "BoAGyZwshtZjrYy4rY74jBWBqV3LUKjcHC1MrXJo9puJ", - "BoBAsggJ9YHha1zHK28owCzyL1qwzBS2PXvHzRvqzhuj", - "BoBRfESED7gdYZE2gCrAhEZcQFfNWk289znkWmxpczhp", - "bobTcy4Eheg2c9Y5UCVF9auzTjyLpuWTZJi5M5Xjc8V", - "Bodj2iMEYUdwu1rt5EugntmwdqBsuR7j4XxBJR7TVffE", - "BoG3YBu1Hz7PW3Lm4ehLDoPgs8LkUoGW2MUA4UNpJZc1", - "BokN1ASRV38tbxbUHzUpDvQwJwDNhywCpYbjFfH4aTxT", - "borTmtb3soetTuTb3Mp5wsViVwv2dZBREGiCgYQ1u9n", - "BoZviedWdjsBkTFM7os4RuMHLJuS84qask3Bn7zVDWFK", - "BozXLjJk2WeAaNxsxr84rGJJCMmTc93UNFanAxZyiH82", - "BP2UsM395DKbhCr9JfaBQxzbGzscF5wATqCVFxztXuBN", - "BP4zXspSSbjP4A2n87VzNyuPbT522CiGqFWp8S1DsgMk", - "Bp8QCM7AZYfkmvxe7VGeLhqXHnhDAhvQnvtB2SfmtwWn", - "BPDdLkEpohufUdHk14NfhTLTYrqCh593MT1tm7vZeezi", - "BpEbwQdx1SaHLZvnKD2UtNXjWvZ8pMs95k47vCiXKALD", - "BpEYHvSpV2TzrEGtkDhXumAsNHys4X2CuXs49tezwWUX", - "BPhWj3sajcgF9EnHqgFWs7XoqwSdPfJoDwsRH2v6k95k", - "BPKHLcLmWthSMkgjJEbQR1XBeYYSrUDNLGMfyzWGcnvE", - "BPL97jdKyszDH2xxWzgS3QVVwuYqHaWvhsPxNJPg6Nn3", - "BpNhDS89iZgeTEspeU569bkQMwSdbZtBvc1NGJ94cQRU", - "BPPrwZDHzoodVjLAD2yL5KEbMmU3tWvNmB4TnEpdVrPx", - "Bpq5BM15n4ps9zftpAiJARqVmAfUsmjSKfMQN7yEZARe", - "BpRZmBkkJEBCFjAPQRBGyj2vxYhvt8xW6UgX78EFBVm4", - "BpsPu22aaozdVrZu8kcqs7rrURKPH3fBAPnMF3oLG2Ea", - "BPt26wecqdGJiZEMED3myHap5kLQdTK18MTRFCKk8sdE", - "BpTTe931wKmtZj9GC17hT3AucerHJCeddESLxj4GJ5Cw", - "BpXtvGhGvcfLEFZvTAY7nvHLyKY4YyEoL279KLfYyzAx", - "BpzoDhiEu1zKqVrobUges6vd58crEDpSW51v4qNsShXL", - "Bq46YaSk3ydeR9y6yvj9887DtRG4iJGyfkZMt4PB6pHB", - "BQ53BvTd1Nnt8TKYP438SVLrV8yRvrveuXsXww37SoGd", - "BQ7mx4ScgjetA378LnL1Nm3xiM9bbLuEsX7UKxPseRCU", - "BQ7xbikXQJVzrmxg5Ty9fGiTcQG2KdjuGp7pQbAS6Eyi", - "Bqa5L3exJsCkzWLdjdes2z7eSnmviNYS4qV1KkEWkhfy", - "BqbHLs4r21JCy9sGqUNHNRzQhhHZjuiHq5NMu8GsGtNa", - "BqEKUbsrLqGkZnRHotMxS3ohY82pUoM2XWTiA4Jq5Xb5", - "BQEzSXJ1f7nCuEgmfSLiPbX4WxTNjYy46cfAAm9XGMyB", - "BqGCBrgYpLv62ebUp7DKfnjvSJ2qBc783kehzKJDERbv", - "BQhAsURoPUqdDokwwprFNctrJ8pYHxKTn2hUgjmaiF6e", - "Bqj68tse4JV2UwJoDy465zPEo9E2xPcsGHQ8dHVMGiTb", - "bQLwQ3C8jhxuj3ubHErMHKgxKFDgnLR9H7ayA38fzjB", - "BQmxWxDnbLEQ3Pr9upNnaeiMV88K77JiXVUNoSHtYjPB", - "BQPGWZALgxUumc6hH7Ur6oHJ1VTxMdDTYUscw6gfdqNM", - "BqpyE2QsxB4VVRit58gs2Ja4YtYxbrb2xB4aEvPHRQUN", - "BqQQTEWX4fLtDVcNdUQyV1dFo2UPunTMjVq45Ay3UDZB", - "BQSzNM6a6o7VedA3q9MTwft3tuetLzmQtXJqQD3NDDsw", - "BQuomrkPMZaX4hrBKxPPRe4mkh4WcYxtR73edQpDgsKE", - "BQzW1qyyeP52g65NLB9dzTFkXqDpiEj5JHQnMJQLBytX", - "Brb4XHWJ4U6vM46Mh6VtMu2rCnPSYswUewoDPVTUv3vr", - "BRboZVveQxC2FubZfdySfihk8homJGyoQShuVYdjNoXX", - "BRBQTuXWHFDvVTEm9XK34MXgp8QpHXxfrq5SLGMNpCnj", - "BRdWvFU4QMXvJcAn7wkjEkkgBTUEYHPGD5oZCpb9gqhs", - "BrfFMrKVdrNFuCjLXAXAphXJELZ8zHhStr9K7s1ttMMi", - "BrgWTUdNh6J9YJyQqWViNSNkJ3wLw2KpVMa4qYmx9XpB", - "Brj3BHxkG1WDKUWXTG2SUycCYSETPeQoXgA5g5JvaFVr", - "Brjpw4BpNaAw8jvaXmVEBpGYzKfAQi4HdtshD1a1KDLt", - "BrmBMYWThXPvWmRKt89FsZScadEGt7fy1FRV2QUArpwL", - "BrndU3hmqHHikRAzpZmYn1FFsznGA7aVjMgghGVSb26q", - "BRoUnvEwTMaNWq96U5E1yNRWJJRnSthPZxV3dG3bbtV3", - "BRpwT6K1dFePr7gtEZufW3HXkNXhsugb6Zji9bE8CzFA", - "BRqFEYQDpCXUcR1Whag4wXy1895139DtSZoLRxd9tzJp", - "BRSaQFDvrxmj3PGSkxRMN9mWgVeDPtyPBcdsJLSRbTEu", - "BrTodhhechqPQrCgStqzQHQkBDwrRJBKajS5W4P6s8HE", - "BrVXBdKUcq2tmjDodXNtiU19DZ1MiSyhMysw9nRhtU6A", - "BrWaNwmKM2mpyFmSZLUYyBM3hiu5W6gwqwv3E6tbEzHe", - "BrXt8j3SFEzuk79cAnoq62JcW8qbLth6ATXFEq828Bsg", - "Bs4fm42V3TYGKupTZXuzs4aAMY1u82ykp4udUtPCByZj", - "Bs7HtZ3zTNNKtXHXMgpzzkwXQd4ao3jtgbKwjmyEBzyW", - "BS8bcwXhZi9oud9TPUX5FRpVJGVrXNaWgxYGhFFXytrF", - "BSF2yD9mqzaixDaLEraF1en82EWaXx7wbaCqSuKppqG5", - "BsHgecAUx7hVf8LCefJe1hzr9mbmaMYy1zDQ5ttfcndV", - "BShixzD4zspGbkcUv26U5QYG8a7wJKJZ9TQS7WdLQ5Pt", - "BsKh1stXNS8aEtBmKshL8vaPvj6ctUw1Yaf4tVex6cdD", - "BSKsiRzrqwDemK1im1DUQWisMRPYmMAKeo4a5XU7k8SC", - "BsuJUEyuUS4Cnoq37ELEGMPPas5uPbnYEd66bbnfd5Y", - "BsXLb7se2Gn2DSUFaKcNySHjgeHdpHquo7156qRDGwAT", - "Bszp6hDL19ymPZ8efp9venQYb4ae2rRmEtVp4aG6k8nx", - "BSzyD7UGHVbgUsq2yMKyXKysvc94Njudc273pcboJM9W", - "BT2H65WfohpY2n3Kjd7E7jkvvpj4rysvpQrQVya62F1N", - "BT5bANJXEmnacdBHiVWCMGWckJEUBU7VRiVMiLmA65JN", - "Bt5iAusup3SifYAD91jT49NvPV4RnsUFsAWoy23SjP1S", - "Bt5XHaEb7aCRYi8i6gSnMUyUHbX6oi7T8TsoVkDXGToV", - "Bt5XXd72XJFQAnyg3wB7gKE7xFiDqZKzqn7fzfZPdoAP", - "bT7ZZEREYCpTB1LxvGyBLyjviviZNVfejSfa4R68GmE", - "BtEyPDBPCX1vygv9D3T1MKv36gyJQBFxYsyVqe5BqSAV", - "BTFGAGpCMsqi9XbsU4CmCP9pbizVBTzaJxeBVmZAKg8Y", - "BtfSHF7UneDPFXJdxsiheqEH2q6RX3ZShn7K79fzNr1B", - "BtHbnzt6SDwyKpzQFUS4ReNEGrL7YYwhuRoMdV1zM1gZ", - "BTHudPXsrQdF9YWEFsdwqJjjzq7Q3ciinsDkiD7s3ssx", - "BTmNmwvknmPMtzMXfhe6nJ5YUpVnm1oFGwQ6gV5VEFaX", - "BtNTPnJo2YWQhiaSQtNnCeTz7XDWUARRLSshe1smVmx5", - "BTPLNRj8EPc3G76HNmRpUFPBZAnmvBobe2HyvPXgJ2sP", - "BTPUdVrsgfKFPyBmy5ozHvzMk1QCK9vii79wgxtGhjgn", - "BTro4T55yBRLcva98rdpTvWfxGHLqMCs29BCJ3gvfmn6", - "BtRvACk3Sc8G2EvvduLv3kA4xT5PYyWApxm8fJnw5W15", - "BTtcEF3YiK2XqNEPwLnbi2X4aatvFbxdHDDKqC54esxJ", - "BTtSmS5xJ6QY3rWY3ysCiwGiTaQkJdt8SBZQKMHkZn7R", - "BtUobugmXQ7X6shUi9PDNoG8v9aPHF8Bi91WWGPVeDPN", - "BTVmKrqHyQU5vSqExPNYeozop6JPMCgCCZkVfCMKEa6w", - "bTvoZpyp5mhGUdu1AkKDm9dDtBdFF6GFWBdta4YgnG2", - "BTYFCqpjVUEtxmWvDAmMMYaJ8nMWbCii87HseZH6ic3s", - "BU8np8WoqP7cipMKWdLFoAe61yomgpvAEjFpFjoxfJhZ", - "BUdH99HcHMzVNDeUxFmeSTWaxTjY3h7nMoLnyMxYPxGR", - "budTgjocJuq6YWEUxxbo2gfqXtxbY95AChCf1cAo8gY", - "BuERfVHHyUvCdKF5g5kksR61V4K1LMDE968PwWxWLtth", - "BufE3FPQa8F6KPGTsz7FicbqofYRfMfvEeMrUAT8vYYx", - "BuFKun14y2uagDQXKou6x4ArWuG46US7X8TEEJVvSMTq", - "BUhz6aFvQ7RoS7o3GYhr4uCdRnCWDk1KpWJ61aQe1Ewx", - "BuiUZY8d14fa5ZTueKiMXRjA8QtWAoP8XDoJXsixUob5", - "BUjn1rDsEXawbho9Kk2wyhs7qATMjBvjML6W3YY16m2G", - "BUL9AoMKntDqFBvd53Syei1T23aNWpyzrC42Hu6h6n2a", - "BumvLADNjax72NDv1H3bbZWkFwidwCyjfYnW4gG1HXu6", - "BUn4mki9CktX2a2SMuxwei7n8ttvUy7uYJadbGDheAZH", - "BunxTHgkSEyHHMikCe9ofDB5dsgcXKN6nqKC5WQsd1op", - "BUpSXme63yeBchkv7pmMUZzv96yiRas4yaXqXi3TVc1k", - "BUtCnn8mRsf7uaCMKvPEBXSmk6epVuPJGTRC1HzZWrgA", - "BUTjYaSaegdDn2VdYoB8PqZDJ5hxp8jTVqvkp4Sa5fZ2", - "BUUWs98gxFs5MDGTubfLjx6PuBxb2X4TqS4KaQkCRBxB", - "BuvYmqQuvqpNeBrPao4GKQyEVjV7sezT7M2hxb4rRLoX", - "BUxTpBC3T5A2JVRCsDJCGWHzXRWqJWBojoL93F3Z1d9X", - "BUY6rEkTiuWZDw2893ru3DRTSb8UokojvmmrrgR94HJi", - "BuzNCPrDHCCLbmT27wTDEMrXpiYTVc4aAVsrsm5QFchu", - "Bv37FKb2EeX7M5tPv9AXbfL7ZxdfbTWpERqbc8fRzqTt", - "BV81Dbeg4mXMc3vH8nNLJTWHLsx3e9C3VBJdfbGneQwT", - "BV8sS1jn1AvGAptY5TxNZdcm7aa49MZCXSpXQjzjdnYG", - "BvbKo5kSTrGJaqQNigTSzerxJ6oECncT4wLD5hnU53xx", - "BvEtg6hQaN4hf6kr73yDGkjr3eyXKPv7oUwFVmk7qM6u", - "BVEX3B7fRUbadEcigqknwc3cM2CUXpyz9vtTccBpwt7r", - "BvH6ncyZow5NL95LR8MRExfNUib1xKQKSXGC65Ypae1T", - "BVh6vVRaUGgzCXuZfU5hS5M9kwLotHJ6tVCiU7RxuUNp", - "BViVDPTbQMsxBHZw6D6SRR2CwXQZkBs6GTNCqBT6EC1H", - "BvJSLTtfFz2Qt1MLDJqfEtMw8uGtiB99nthg2aWGXBPP", - "BvJYXjxpN7aVp9FSCC1woia7DJ3ThcAQ3wE5dgQZsMBj", - "BVKfEHkiRU1XWmNkiEMooub71i4hHhSVssueSrXsFfY3", - "BvKLVZXzRhYLo2pGWqYQCVnsP7F9bRT4uaQYLrwi58bM", - "BVLVnUm2tkgX1sK2f5oVtTMR1opGra72s4qBD9LjMd9Q", - "BvqH5TvsXuW5PWqHEGRZhkAj2Bo2YPNjPCPo23txUKzM", - "BvRges6QbN3CHXmqCRNqjjq6bPYwiG8u52cgtUfiX31J", - "BVSbFiadwxwi7RajrGgx4KAuwY7f3s6sB5AaL9pGZ4Hh", - "BVtjV3BK5wUGZEyoBF22JPx6T399CDtaPntydbXxxwAj", - "BvVKJxCQNsFWpB5o1B6To4uZzqAUgNXLcfbS2inyL5XU", - "BvVqN9DcBAXfE6RxyDLbrEJNKvFfzhZXwXH8RVNmBKtv", - "BVwgxUYkw76u3bqbGMAH2nDh3sKuUtHJL6o5VPr4vzY5", - "Bw1CECVFncyAULd97kEr4mg5hV7Y3yUL1nqSHXNuzTKK", - "BW9KBKjToQpyBPB6bt3CVnZxgGRpYqJiZhfLAGLHcubS", - "BwANEBoPYe76VPtjRZ8gvfi3auEu7W2ScKssTiBzHxK1", - "BwAt9hYkS5un3yWEXTJY5r8SYjd7eDTNL9dTqb2eo7i6", - "BwAUmKgm1qLr7vFLvcwp4eg9fDtumY8Es58YdMvVAwwE", - "BWB2qTth5Qedzeh4i2J8BnC28n9vRPavJ4Wfae7H1wyF", - "BWBZDvXHUsm5WUhDBzA65TqMF2CNSCtow2M7tfAtJA2C", - "BWcppbytWws8jSbeCZYNo6ntTdMLSQ2As9kqoUYfwTA5", - "BwHebRyGu8B9DDNLkx3bJ4npFMjmXzRKAFAzPtpvJVSk", - "BWi58xPQjb3yqA3jmL8ZT3bkvS7eMQnUwxq31zPkDvor", - "BWiftESMUsve87rkjU7HsaA7fkiJRAbv3xZLQrmKZtnz", - "BwPBFYXtVxJyTUCmnkdbKZ1qGu48MoMbug2LFg2Ng7sQ", - "BWpJVTUctrFg5gYVvTUpWX7N4fLkhDsYKx3BByNwxTeR", - "BwQPpmy9TF2KqcYmLNbFDGnDLBwdZhKeRnQDu5j9VnYq", - "BwQr9Yj4LKroUMEXGQQqabPRjLnj1C536TcKazQmB8mY", - "BwUNc1ntSEDTECW6jKmwNXpewZctM9q4Zv8J4DVSvXYC", - "BwVDYeT9sUadojNc1JeFz66FktsUHGiFQa7LeuNxSBdh", - "BWvF7PdWcWFo7HNuww3VZHDE8QkeFoao9Xyi7dBwkPtX", - "Bww5kQtZ5rHmaByheMKhwg3J2ceXUMQXcGi7qJPiDopM", - "BwxUhPBXUAEVEWDk2Co9xbTiiSFAgVieoRiPFNGbjBcY", - "BX3bikv7v66qJhobjdqLuNTfiYwPNVJYrJDtf5JvmZDL", - "Bx8h8AN3Ak2UPU8HqLMPtiArP1f4CQDVeFvF8jiciQig", - "BxFCg1xrZukbRHhthKXRY1gZVnHvu1xntdg1YmYnqeE7", - "BXgmMhytahxWw9fpCM1qirKtHo6cmDMFUGcfubLWRV6T", - "BxgzAqSLoZZLB38jJeyk1ycq4sxif9vyeRfqNu7Pvduw", - "BXHj1ZZSVYirYcUVK15bmJpHEKswc3TC93dEK4vwpePD", - "BxjFpiwgRG1as8denydVjxhBCHipvPtS8D2EsEdA7JnH", - "BXjzAqxtjEnUCczhNzoK4hYuiH8o7oB7keMPaSJXKpD8", - "BxLUkNxbwARzCsroVyFSniLBx9FirpQJviXUiB1ZpBXQ", - "BxN57xXyWN4yN5jAvuMxFMcpJrDR7VH5n3UMP9sKAy1N", - "BxNK4rM6cnHoyyKKa5YEH9dF99iu3mX6NsTmy7rScPE4", - "BXrrTMQWAiWEB4T8bZTUQvzDarXfvfsHkjcv183yZ7sj", - "BXWqrL3ZuDU3fJ2qbBGmmMagLBLgWv65YbXxqEat3Ud6", - "Bxz3dhUuCrndvoYUXdcqLsy4z3P2Z1V8AhcJjg7pXuat", - "BXzrwKv5JDubq6jqPnzbAiGYwpNMyZ82CJTQCbCU8faZ", - "By3vekNumiWGjyxVbeoa1NgaP8fLm9Jgb5uyUzLjS73Y", - "By7FCAUu3YYRnfPjq2Q8Hna65HeSYkWuQmNNyPEGEZMP", - "BY7MT77pYfXdQiswhcnmxToYSEUxMAumb26Wf3hd7ErD", - "By8BBocWV2yLsEMfkfHk7JkCmg3wjh8hPyKF4kd5nTrZ", - "By9835gWCc6iukWAci9BHjXhdd4EC7Pss69sjahiutdZ", - "By9sviMKTmYMhduzpw4biBNLd7j8n9EbCH1FkEhB479t", - "BybfBnKQkWrBJorGq2h15XRmtkJr9K79oByRXE3gLs8z", - "BYcSUhbDqWRFhM6asjtuuj4toPssycEyUnnspmuStxiH", - "Bym6kqpSvhHKoxUqB8eyZkW8nvd2kmumHCTJZ8VZoELX", - "BYn99WhTKSAuZgsUN1vmnPevVhn5i63cHMcd4gLjCxL4", - "BYq7b15ych2vTxvNRWHaFwgDbjfsL5x9H2sXYMZpEb5Z", - "BYQAKTL4XHrTsGoDyxCYUhspSYVQpEZkMe7UCRGEBXuX", - "BYRUnuotppozq3YZp5EcztSSiUbYYg9hLasvSXv3FBir", - "BYsHPHeXAU1BF9wJAJeRB1Egpr9jc3f6ktVPPfj69Duf", - "BytDnuhwwoArgSKBG9JaaSxAmUMjLMS29rvoVPiRGjHL", - "Byu8MmZVH2JdBLusQDnQzxyyn4jepX91QMxGukwDnSnQ", - "byuWL6ZeZsAjcnj5TQhQQ1CJ5orgx2y8S7uXijs5i1M", - "BYVvRFfGbHgyCjaWiARz5p5yaUrYuY5tD3CQpaUfE84a", - "BYWeoPrtLAhZdP2FoScmGHWmZVqBKhgwGy4kHyKyR9DF", - "BYxEvmSwA1o3vJGhooJoReSjrzou8A9h1TZX9S4xomHP", - "BZ1nityGMwnhDJroiAmkVTVUpM3WnWsaH9VQKATx8H1n", - "Bz8RS37HmegF5C5FXSnyEz1GkGhmx3QRHcHLwuwqmyzF", - "BzByTEor6p3uR9m6D2dsxJzudCWbmJpV7DZK5tova1Uc", - "BZCeZyvroBrSq2SbwjQKU41kcxkutUti1A7rzZqCfaHK", - "BzCiTZTjvtmTEZMiN77ieJiWjZLLJjSHtC8xdWqfLvvU", - "BzDaiLQG4EUtnvSRLnsYkfjR4ouNRceCoK1iB8pjAriV", - "BZdJbAKwNJgKXSfP6gee8DPe7ipJdwT9kmA5ZvqUZTs5", - "BZehsFmSj4iUhwxHNqJVzduQQiaLqhzfE5mNT92UZf55", - "BZge3R65wtucToQwm2nQFwfskv6oNjgBTaJ1uG5wsD33", - "BZH5WFdZrqSCE7YuGiLLzwyNNdaVLfiKCAoJTAw1gnud", - "BZNtLRLmFaXi2jjcNGcMkUH35UJVEsv7GnJ4352x2WmH", - "BZohdwEbKL5QJ4LRosaB36ds4L3sJ9MXohcqouYaNmku", - "BzoPEBru5un2Weex2nm7zkJQrjFrAUA7AudNBtEDe6hs", - "BZRE7J63EBQav69CnPQUhtSTx1PL8RcBpPbQH92x8HWT", - "BzwAtaU5sqkd2wALkiR7A7TimJzN2Df6vr81tMWmiRky", - "BZwNKUuM4pvw4WPncZUbansmSmXBHZyUVBa5DvUt5oVT", - "BZXPrqqWtQCJdhqH6QKtR47n2A1w88Xj4EG1KWndJB7r", - "C11Bo9VL3WhfhebxoYfbbgHN7J7bqPWKoWrE2xVRJFFz", - "C11sMmmrNnXrCiYtKeMZ8jtv1jFVf3Qa3a6dFn8YiqRu", - "C12qkcTFb4hu5hvt55aV8X4vKh1uC5iSnMMaDpzY1Je5", - "C19RDsEMhLcjwS1HGdPWTdLvoVGuN2XB5NCeD3ynhE3A", - "C1Ag2mUyZnLcd1o1a5xDWX8XZ8YG4nVXZpehcrxXa42x", - "C1naGNNXUF8PFyKMbjZ9DmgqBhZ5Za9gYz1RjrDLoki1", - "C1QUyFjgVeG2mNBHErtmCLz8BUqS38saMUz8KA8r7921", - "C1WgoBuwPtAsUZiqpQm9TZXXzhDMkGp686sG5A9Y31Bz", - "C1xBNq8hc4u5UGrxvBbHu8ESyu1R2eKcpVKdrVsAY8vJ", - "C1yfU6MfvtLU6n5oHzCwXW6nrn4MHRT6tM21dLu96rHr", - "C1ZQwvHz2JWTGk9HRUesCtxGc1wPKz6iiVXhSF9CxPhP", - "C2DTLxiMUh9k3HD87baoWmZDnvhEXWMYEVNUomaxPFBj", - "C2dyZf4pAnKvfksoRM2qZgYNugrTVx5nkxkV49zBUi6v", - "C2FBZLSVu1DjZuuzxzyc7wE75urhKJsEB4jJQuBQ2qhk", - "C2Mb4MzsoXExpcuRhbGSc6X3AuisHcstzAefyciEwCis", - "C2Rh6raiNriqar1siQQYH1QsD17uygPPzrMNDR3Z41r3", - "C2scsTc3Rro63YCZ3E2K7S6A5MDuWK75aLPudv1T3LT2", - "C2UxmG2V9y2fyjKVNPhBAdT5eYurcSkbsid3x97aFhm", - "C2wdaDNBfChUj65So5pa4jYdgXzLo3sEo5Phsyr2vLWT", - "C2Y42qjb846RqdkPzSmyQHG1RBxA7zrxwWgrhgksRQU7", - "C3A6SXtmUVBciX8vH75mucTSeLTeWncBRafH6XXcKVdN", - "C3hD8Q7dLoodUm6E6LTWR3XqJgcRrvrVaMscwMBV6vaV", - "C3kVmVcsbDHAyQJa25sX6QkboCmd4u1jJ39yYVhbVg91", - "C3o5ASCuCyQ387zU6z1CAstXGRXsyCy2Kih9hMgDnFhF", - "C3v83daKa2uaBTVysbWGtZX6vF8R434fybk4NXCFQGod", - "C3XctAkQw2CaBuhV2k7Q2hEcU8ipsak9YsXz5qjAK98s", - "C43SLrPQKUHuRADuWU8XjnFs3wd7bCGkoNnn4qcW7J3m", - "C4aTL3639yCqxj7T8mW6KhSyshN5rrxSB9Yp63tCvngT", - "C4eTa4tqvvzpTsp9pa5NKAbeDXJs6sHWS5BfxGB44Xex", - "C4mnHTappcore2PdbGiSinHMCdueBryum2qdNXAXjaiC", - "C4N1bMSzbfDwHGMitxyufNZPaAkNYx8vJxHRnHWrptAT", - "C4q1VS8b5BMQUgErv9DnvnePX2vmtLwTRHbaB97fLWpx", - "C4U4nHtvjuGbhLvwrVBRv6yvmR9t9yU4RMh8hcHhunDz", - "C4YeupMCkDkrse9ngx6mpmHrucUmkMxSpwjTouN2esRA", - "C5bwGrYnbgNG8kJ1sLCnp9G1r37WHKbYVGfxpZaruUEs", - "C5DHFSFo8y6kQhG8GBupLHxpAqitZgk15N4rHuQyt7MC", - "C5EZSW7Mzt5bktvVViVqnY3H7Ujo2ReE4bJEtdqcnrQw", - "C5HvMeXdHGxi7nVTFPF6KcyK77RSWLLvEEB3ParXoK1F", - "C5L2t9gSXSSEcGXdbr2LBjb2p2R3HpbrByU9uMUsX1y7", - "C5VDTdJWA1ck6bPiX7d8CurGTfG45zpWdTU5G2y2deSG", - "C5WnJVyuse31UoWxUNQd1nWuiCdQcr7v61a5yAdLmHcZ", - "C5ykrTyfuSudsBzVDiFqk79RPb5ZQ5t227PmrFMAMpNS", - "C66yBCeSs2vyHjuvgjQip8fKZxJtNacYmA1dxmwoWaWY", - "C67ppi57SquidBnM6UzTSvQ5AksKPvLQ825JL4PmV5qy", - "C6DfJvQTTs3uEDc2vCpMRKo5xikGKeV5jsW4tQHEFszf", - "C6F5BX8cM3KWtAVSWBRKAuMic7ABsST4pDX9KVgc4U6R", - "C6YDoKbWMTArBxpA88NLpvZPxeyY7usNv6ZHvvDEsGe2", - "C6YP7PeYAdLvoLXrK1zAhHhCEv29JAomN6pXs1Egz4hF", - "c6zUwkPpB2mqtzRXo6YJbeBiRqsr3sJsny2Vn2JPTWs", - "C76CirE3C1553115x2eQfLYxaWmukyVRKZJseHWaGj87", - "C7cp6FA3hctfvH2kPUYttoJTNowrghE7xJZwS8yxCp1o", - "C7E3755uw9sm51zKjhidXKgu4emkag9Ec6YesVj2eD5", - "C7KC3opmz9FuBp5JtrFDowc3a4ev7ZQRc4E5qGirMbRT", - "C7WCRxvYA68VeLFHjrnMvZnGn2BKBcQFm872E7mJ2AjN", - "C7wxxkKVpvbEeHdpNrEa5xN5dAergj4h3jjcXunKJZo4", - "C7YHUi3xjz35VSRbzJGwoZPt66DT7NseNL85BEKPs1PN", - "C7zSrf3xPFEnagj1rGUS39yhuP3XNLi6LVvDio592GEm", - "C8cazvdJ9jtfnsYs3QTAmDrnqrgEbyA4zoGkJadpLniZ", - "C8CYmtWbkf82L2c5n91hWB61DyEBqQTDHT5NoWY8on2S", - "C8Dbf2E9gJS8vksBC6wBAtMzU5aT1hbdXJFuycGw8UvU", - "C8gk6Z2dm2aS8dNQEXDBbuSenoxd8HSWxDSMNM1u4Ebf", - "C8Ksim6TT43pHkf4eWpemFd8EY43FqpAdVmWWB3uQfvD", - "C8VJytJbZM7KFMXHNUdoF4V7V2QbhkxNs1qYybRoqUEK", - "C8X3QTF52FhTXLg3yArhzgT9FBuEdxZN7aCUnPUprsxT", - "C8x8gRPxVQd1rk9VG7fm5MqtbPkTF7C9R7NUvb8HJ6xo", - "C8yQnRcUMCvP7ZpkbhPUx2TXspyojKNWttdVWj77kAWg", - "C93yuUCdot47fiTQDaL5eb8Ra8p3ETJvL67S5xTAgt8s", - "C94wW6Rz8Fg2vDNWUweFuhKv2np9wzkDcZzpj8GAkDRo", - "C9DbRnpqJ9koHUZvbtYYGAwyfVpu2rUxutcymDMev7xA", - "C9ntxwP4NpJNGqtk97u7miNWosT7uo7NAA3a4U3yFi92", - "C9pe3PrMgXLaKUeEUjMFt7JFnnJ7ygFXCjzYFenmtqJu", - "C9UahsjNtQao74K3zYdJdkGrhfcn7Rf1szmMtUP6fSRf", - "c9WHdQ9WkNXGbwseHVkwwgKxunotv5t2a7i4R2H6EnP", - "C9xYj1tRMzk42PbaSmWQYie2qfLa36NzsTs78HkUVbwS", - "CA1cjuVG9mxc7RCRSrJPhcpr933G8XNDrNAKH671Cvpq", - "Ca8DQQagVHeUAhWPWxGCmaMuccr6aGsm9HxeedxUKBC7", - "CaajN22SYF2MazQpri79gsTpDUaBZL4VmLZaiDkmyqqA", - "CaCaErMi1TtrTLLv9jaM9VVG95Tva2keMe8BZSuji3D8", - "CaezhwZi4wsy1v4HbxE3PM7r8dVuVk86fdntKPwQ59T7", - "CahiUdyge1w7Z4GrsXNpVYamxj7pJoY7uSThHC1LCBPE", - "Camdgz9uPRvwrtGTCtRtPz3wpE3RUKApJz2vWXhXsBT", - "CamZtw5WThJCqyBYuoBVN2yLBg2CjCin6SD9DBmcQWDv", - "CApjpsbLEh2PUkDw2VrHAQV5JXD5ju4cjeFdkKk6qjbJ", - "CapXd7bZdDgmjYbG8owMcEHNtjjs9bz6D1w64RbLJ177", - "CAqkHeapCLEx2u6jjm5L1L4VqWJ7QKexd35XU9tfdqA2", - "CaT9dSx37Quj1kcAXEVd6ncM6NLvYUSqhtgEnn1JtNKC", - "CaVmQb9CuaVGpLNtYWV6NwZnpNoMq8156TVXG4Cd1CjU", - "Cb99bWt6gL8L1tNvsTTWaHhi28qoxtnget2P7goV1FGd", - "CBctyda553vBSg9uVB67eELfhpCEAqG351Ae9MtG7Q8W", - "CBdvnD6hssqBhPRD2Q1X2fPK2y5Cjxn1riz5fVGQwBQX", - "CbhvvtosVdVwZ8GVrBqgYT3JrXLh8JRqgKpimhnZw31h", - "CbLbkJ8uSiatLVN4twLdEt8BFBbGZjC56FYUbGu4cov4", - "CBnwmAk9KrFy4cvh7dCB8T9KbX1LG1v9ZxQ7nzFR5p8Z", - "CBtdYQqYuqWLUbiM6NTnwqiJRtFTTZdH3v3NmyHAHksK", - "CbU7AZf49Nvq7B8aN2hNq4BxDKRQXW2z7D1KEDRyvWVE", - "CBXyzBUyb1bFKbNKVVAhakbgWb5pn6XjqfxGGQMt4EzM", - "CBZfPKAjGsiq96LwMNuB82trKUSZHgY12uChzQNmMJ6s", - "CbZiYU4DcBzqtFQYtWgejnc7vywKJJvJkgbaHsaGPgB6", - "CbZvL6G4eu4ojLzhQzLwtRBteHLFy3vDCCSrgYdGnJi8", - "CC3zY1bHHmpCV5KMvdckxqDfQtsdtqFEqt21kTaPuBZR", - "Ccc2NkHbJBJJ3qu9573aGkNvgNGqSvgmpEzJkwECfXM1", - "CCCXmEDvN7fDpN1Ca1Evn4PKynKqTKZ1E9CktLzVt7kz", - "CcGGKpCgzkyKCC1x61MaHamBQ7XjxKeXmnzKcV3ziXPp", - "CCht5DMasJu4MGEoZWvq44oXGkkE9uuKa3rE6u1bGF6o", - "CciZjkyZMhSuDZTSycKBAaPcZ1yU4Qaub5qpqrGJzK6Z", - "CCM98AN1SENGvAF6mNvYsCvQ8SPbommtAdxSLdYwdt39", - "CcorN3BoG1XMZehZ9Xib9YLo4mcvo7pzeVurC28gYYqX", - "Ccq6zHdtv3DWCP4AccTi4Ya2xPGsEVHSfoPmQ1qffb8H", - "Ccsg2QELQVvfxBXzkh9KzHdLiqZjouuoUw4yivUPiQP", - "CcThXu1i1iFCLR1XmzQHKxNDvHVBqvfXKuBGwNwivTNJ", - "CCY2c6SQyXxSxrsQXaLqWtGUyU4dWfbvUdWtZJ2Hz4gw", - "CcZTCsb1HhptTfLCv8PXLApzVzhfvXi1MYUnmyiWMsY7", - "Cd21SsiJPocawpVZbDNAQcFv3deHhCt3Su37XpHHyCag", - "CdgoKJdFPyqLXNmTFjiXSyrUefmUnjhdQr2kpTvDBfe9", - "CDjzEAYkWa6GK6rmuESVHLXsEc1hHTrwETar6y1nTPM9", - "cDK4eZakyrZPT4fdhpPUt8q4EekNEwwGEz84LFnQb2S", - "CdLK3QHLXS2qVa6tDgPttvhS8doVTUac4MharoETAC7F", - "CDMz8xERj61CnDtp8VtzMXVQzrhbdd9ZLcUVhXRKNipR", - "CDNfXW9py5sXf54xXGtLHRkYUfQnFQsbG7kPweRsVNEv", - "CDRjc2ceMYvWZCrbwQ2YMbW4qXHBefbUqGQRF3riNGgD", - "cDSyHwXcQ9CpYhqo5mPr5W7zVV4gquTyrVpayZ5WxmB", - "CDUBfF2PnBUWEmrRJpKxT8AhQbkS6jRVghoGZBS5M5Tn", - "CduhFNRN2CF3Poqu2SR2MYKgWDz55q6W4EtSWN5hjZNb", - "CdVRGmoyFHxc5gJ2gWeiCYW83YGFf3gq6kqLboNaS86f", - "CdvYY3C8QbbbBKz5sPmv9VvWiF8kM7WCx3E4oDUTbuMd", - "CdWPn5Ssh7MNc7DNbWGkZ4hu9XSAzWiF14H8KqTEPt8v", - "CDXuWDquixo8pXNiUzNJqgjhyzdMsQsq3a8qgbpAjAQZ", - "CE55AJgEvy94cMypkHUjtNXFL76fn89byiF9d45J1acN", - "Ce7YqRKj3HL5CHnmFnm3m3TrgvjveztdUdGnzg1xCHMC", - "CE8gfz8De5SoAqBBpY1dp5wzGHC1J46NZA3ra2o4M2Fv", - "CeA4W1pszd2HWsxpFdvi2U1vw3b9okBhTr2qJfCcYyx5", - "CEb3kZGxYBuvGmfe8EmzacUWr1Y9MbzgP51nV8AHk7KG", - "CebmHLhRkbwpaFAKxAbAqieaEQb9AANn9ydb8rpAw5mz", - "Ceenh9awCAAkY9qV8zyBGP7gdZAgQT5zmkfzrefKKELp", - "CEF62AG42AKnx49ZApR9etm2jjqh5YEUXKpHufgXyvCi", - "CEgDtpYHfqAuBwuC8CM7hdYzPthefrgUdVqtZEj6TVoB", - "CEMuwgTq1TXoTvdFjuMYfTu8Rnvo8HVUbKGquAsiLCXs", - "CenFrJAktGiEtJEGZXEtyN96piKvy9EuAmD6AAugTTr7", - "CEPeD38X71jnTL2iAeqLx1ak86sobJct14mAc6fDcZdX", - "CEpZUo85bUcM2gR5Uavth1y41yGruSoPGpEESLUpco7", - "CEqqZj1toeTd9dsH54gWbisW5j7ErDJ3YXjE5E4XcVmN", - "CEtBeRs88x3TuXtsUqvpphbPfrTaoZhCKYbX3cPCwZZ7", - "CeTirCDrYzkRMBhn4P8WYQen8Ka719PvPnAJqbDPm6Z7", - "CEZUL3MsYWWfW5rhYJ5mVRagiSURcbHve16pUhsVjmnJ", - "Cf1ocErLEHBvjvcz4LVg2J6cvx4ufUDkpNzQTEhxtYEd", - "Cf4En5cYi5G5R6LsSz2bZghURsscxNUYMdBcjy7isiAx", - "Cf5SjpYExQJLQrwkj4QTak5CvDv9cv5xK4VtuvhVqy7w", - "Cf6aueUzmUyiAshcnkr62ve5nUufQuLe7mRU6L7WbqWk", - "CF6Fvpi1S6XijqKFqVbbrHEJLdPscKuNFfnY64qNwmQw", - "Cfdus4oERdgB8TSB1N88NeAM1fddt2uFcvy9fcMU8E1n", - "CfeyXBy37JLNoqSUGoUWAMWVuzDBi6QeVtFLHTakUwkw", - "CfFDUAgrwJM2PUXdDmvPEfNrARcj7M7bY8w3e56dcvme", - "CfhJ45Zx4Jod7LydzyrDyrywhmreZMWMZaT4p8YtdaWk", - "CfLwJEyxjA57coi15F4Tfg9PHtBxYG1HbkVM4UyuiP2a", - "CFsdA5GVQYuXMFpupQvAFa8qA7rWq15AxQrHME3ichTe", - "CFtGf5wQ7jPgJVSk4GiVxvqVZXfkpxzdnkFJGduUKA88", - "CFVDLHMN5biMvv5YoA8MVDdHiitg6W4uWeMVabsuEeaW", - "CfVMQoRTSZYznLDNUXhaoCeiycbyV6nRnMfDF1tpLc1X", - "Cfvq1eiSc2g3xXhEqL9E8MiPgaqqeC5MT4bcfKsAhxRH", - "CfWv1ixRW2zjFgSZNkjJinK5hD6mLkANnaZVwgZVPT7q", - "CFyVECgPos9c5Lp2t2ipTraHB5LBmtdwQgq9L7Z4xqMn", - "CG3C5S1L3vnWivYAq3cA29aSTdPbDYi44aWRPhb93BuK", - "Cg6ce8stTTtFP41k9FwYUWn2TEv9uq5Cb56Jc1p9XZnU", - "Cg7gnb9EwYJDVpVwhVCdTdVTwzxz3jK4aihFPw6T4WGf", - "CG7zvuaN3PTuQN9tFNoE5jERxtYwg8YVuKE5CMYD2jp1", - "CG9jLoq9wwBejRSEqMBPaaywNBcmRo48xHnMwcGAnVUA", - "CgBYHFw9cK8YWy7w8XRrrW7rvkKRkanxwPYywqutLHsy", - "CgBYR4jF7Hsc2FmNWWccMXq2osi2veZfdDxniair49ks", - "CGFs9JZZEaBcuU66T6hpKY9zPHSN8W7UPt1fowk9XqrW", - "CGG9aX5nNEXKt92PrFTP7H3qZCpBkk24D8eHC4kh7hUE", - "CGgiEmA5whBdjKKyJVgFEBe2Z2qDVQQd2rMvAaUJP6Yt", - "Cgi7SigvXJWA3s2nuT8KybkpaoKF5RombGmRixpDMSDK", - "CgieNgKQw629VPiovu6iHbtSQiCUt7jKBWnK586LHqTa", - "Cgr1ZX5UZms1vmxMy3cd1Zp64ne7PjtD2iNRFUnFn6eD", - "CGRhSqVnFVeavAVKiWnrABGBWG2mwxto3Cd7Aie62GcX", - "Cgrx1Q1mRdy9GsBFoxy4Fe6stBaZvSkB81BiFAXtZ2uG", - "CGsoyXHPpZjcomY6gTwQRFXAg44WjJ3k9UTbCXAYyMFF", - "CgSpoAy5DHxbbBz8ojxnjhZpfhGvdiZsHosBcjMQYb8G", - "CGTPPvW1UsUNWsWLNFNRaf5h4BQsz1NZ4aszhPF3V55b", - "CgVknaRXRZR83TtbzTzSZ3XzH1fHHTCcxkwKBpZ2JzL9", - "CGYJpRhizVqqEyr3m7Ng9ghVpFRhBdD4sGjXSvvTFeze", - "CGyU2MFjzpW3QUwnLPSk1QhMjcaPZV9c5Fy56RnExZN8", - "CgZWJCXkxzvFUis23SFz8GghC1URNcJ5xAtAJVqkEWAA", - "Ch1Ytp8jDdCH6DxRe8y45A8K8rTDrm5pUNSrgEUPcH2J", - "CH3Dq7W8zoijFHwKyDzm8wsSWtVvRJyvBMt4Z2fPnor6", - "CH7ubj9LL2i4ESX1EHZRTzKia8LpqSPKtwSCDv69PGMX", - "CHBn6VdzQuA6FdMniQAxHf6UbWu2biqfq9My67nssoXV", - "CHbX5dUkTMBaTmWonue9avjyikJ1J29uQmct3fVoJcvU", - "CHFbPXHspWQfRGmxSPh9gkwWviUEdtko39MT6L2Ucy2Y", - "CHG5hPRcEx6RENVYhwhfob2ezjyNa3niWGrbqzBzHWvw", - "CHJh9TnxhvwLMYhMuBgDHHarisPzj5JBcVy8HAZGwvkV", - "ChLMXZ4KXsMpa8W1VymMxim1vdPSK5a1jDwfMbm7cycT", - "CHMnVyGsAUbuWZ8ncWryJvcUrek48esMAjC14MJS1EuR", - "ChorusM5BVgnAKbg9PF15285LkqeCoZWK2p9s35T7J2A", - "CHpj822jTX22VcSqzksxkJLB8kBf5gDMCqYbgXv36dvN", - "ChpV3NPQ4nHdnynwvAUD2PK9X7UGVYRKvUm3wAR8T8BW", - "CHvrWLcG3GqaaaMERDRVQYVusrqpvAXugRtRTKbXrKwE", - "ChYxw2m1msnh9HDh8N6MhYDJskxsWuEjq8JCsyYu7Sp", - "Ci1oJuvUmA1EnjCDYafCjVkQsi4dxKMacGHvH6VrEFMx", - "Ci3mhQjehY4Ndbg9hThDEcN21JpNKzt5QqDB8W3z2onn", - "Ci8bvhnPFBm2ooc1oRg13RgvkuHr2xHVMA9fzem8m2zA", - "Ci9ycEmukAZpNmoAZbEqt4GFoGPAA9pMWSoD4XAHkFek", - "CiBzARkWeLSrfh1m3G3o5he2anJywd79Bx2MxoDPP7X4", - "CidJBbVgPwrVFK4Je2Wxz5zuiC5sxcETbRdhBwwxZVvA", - "ciKZ4RZpyXJECVeJidLfz2ouDWHMhkav9cu7dXp6d1k", - "Ciqwu1wKr8Y97dkJWNjoB5R1V3BW538n2QXiamrmzzTv", - "CiY5RjWPs1XyegKyBLcG7Ue7YMf98eiEnmvqnSuSKbob", - "CJ1fpwtQp4GiazGzjhYxwYfgRfgJFKBi2Vg8fVxLjW3Q", - "CjcNvLeFexCzqGRTdC3MFNzo1Y8bDqD8maaW5De237zT", - "CJEfC2MHZb5zrBptv5Jt2Dr5BVGSaJbjH4yhzB73KebE", - "CjfpW4Mnz7N4B86fmNH1CjLjN9wbBacYCok3tpnKntfB", - "CjH9SDd4BjxEXf7TsRcNXtmkT7e9nAYwk5aPdaRBPs9m", - "CjhKCjNC1WUgBjAGst3D2XmSsWHvt3zGasasmogPTY6J", - "Cjj3mmaXkDUvUpk5dec4MWzMSynNtxiVoCc11traVSgu", - "CjjZH4Q6fnbwGmhfFaganLzxjssSWYnarJo3z32GFuYQ", - "CJKCfZgMRtSMX6QUhEhcZcwRzD7Eb7bXmYCYwtiMavCn", - "Cjmoqcny9d4GAxN9YUCPaFmMayWJy9dniWFVsS5nc7jM", - "CjNbyiXzAcSLsNHLzeLJ9J6wryBvkjAFMnFQeXS4rbKA", - "CJnJedgugDdHjy4P4e4Fa1feiRskSPyy6rNSnNJ2QVZN", - "CJNWxCCuevk8cJJKVVr4h9iuMVVGK2pda2r2FfrCbM5G", - "CjPphGcip72z8GiNG1wezbppCV8UoLVpn4zupXzBgBv5", - "CjQzg8D1Z2GNtRoZAFNc8kKyghGvr7NSNKW9hCXHrAMq", - "CJuwhohWZio6R4E5Z1Rn495sYiM1xbyues6M1GLpnksH", - "CjwFsHxSV9xvrQ6Yy5KyMfQJHrw67bgyr6RvRQ3Toisp", - "Ck1Rv9jMwXCLSETKkVrxNYJqfdV3Lxy3co5p5wozoE58", - "CK2CP4ST477isMu81Hf2HRzwfGRQvXT2rFhFGpTsWQAR", - "Ck3SxoXUShtXfLKfUUXAtCwrFVsEohESJfWGWuSgtTQU", - "Ck73GLXHAqEA3mWckg31kYDZygQZ5Lq49CAozcXjCmna", - "CK9yiW9cCVkJGs9qB2SZnXUJ9Q5btmrGWp6KuomttDXo", - "CkEhoG5YKHt6szYHD84r4x9r7VHWN31aXaXYLbse5oYJ", - "CKm2wXrhngjLRULcxx78k89VnpGvpAiRJ3DJaF9tZQTz", - "CKNXGoJn5kkU6qkBPdnXB9T8UhAc24WphJxHMowKZLBP", - "CKqMAWL3hrgm9X7hqoKRJ59tGJn2GffpFiBB1KGGvixR", - "CKs5FjmJ8qx2o5gzCJukb9Q6Z4TEJ7ogJjuA1Fch4bwA", - "CKSSegsBZiEJUHgdFyiDtF6CyHmDdMxUogkreFEvVzgk", - "CktU84VGeZzbwGzKFHWZbdxXGCo8o99TdDikXygfrHiJ", - "CKUdyz725YU7FuXrPfUgRMXRg3TSYbyMpfAYZzvez2KP", - "CkvY5QCPPHAtibaUzkE6szfcgS7kn9AN7fG67ozcna6Q", - "CKYDvsLjwp6tPXfYxLmBv9LtX3FPpaAPj8kw1Gqy7s8Y", - "CKYxrhFXzETFgs53eSwmwrrUnWTxnfBfmC14ipy4Niif", - "CkyzPHiSKLHYDYfhh8mNVQeNF2VRXs4DxTaFrUZAjub5", - "CL2NSUEmfgWzMqAZtdLUCzowSjeW3k4cqMjjHCYtXiZ4", - "CL42kvSDENXa4rGt6YAAuRaJH9z2hA6udoAC3YzpCMvW", - "CL9NsQ1jhv18FhwS6PXvK1KBUqid6RF5eKL5Qb7d1V9W", - "CLbXUvWFaf5jcVt1WSuF49U7mG34g7BwCZYRvL6bM7Nm", - "CLh9Cw5dLZBsVejDVP1ssThfkdDy4H5pfsMFBKUWNUE7", - "cLkCe43sYWyZ2TYiNA6SYtAwm2Y6YGUYwWRLRuE75pR", - "CLq7ip77pM7Mf69QVh1PorC9gdvzVZ2QXCi7B8oowU5m", - "CLrTpsPB4m22CSgu6JgF9VCWuKLDfJBGLkgR8PCnb6s5", - "CLxa7CbS4jQzuqR2f2fmoBwqXtq6Xirx8sUzd9S8Qzqm", - "CLxdkcqJf1gVntxUTkpvWgpPbtCxs7RWvHKjWLWt4WHp", - "CLZMAYXPygVDS5Yyr5BA9LK2VEkCdkJsvTkDWoNKMkhx", - "CM1c6z3pRNgHFcfZG4z3wE31jaR8c4gCYQBJVEoCUyq8", - "CME2N3pJUo8FGAL8ELiSEqwuUBac7SYJhd4kU4UBKvy6", - "CMFZtuwCGnXbnARnNx9JrrAXhGHjbGEis9ajFwYPGqCs", - "Cmg9ZbuT5pR8o3CBLo4iwHCMxWzd21ZyNAoLH1sAwHxh", - "CmPrdR4YUp1SDdwCMxhp9bc7b9XUjfbD5v5zopHqiGyX", - "CmRCP1dquTeYhzvEiPPpi7gxwZhgXToocvEq93gK7HRV", - "CMwh4eCAdia71WEiBRw8wKidE4ishnxh6PB9oo4KRxfJ", - "Cn23bN3TiQGAFiByaJxp8aE7suXJaarQsB321wJqEAJM", - "CN3VG9MhaLUzwmLYVq8snzAxq3rzq7KEaxkHSzT1Vbmt", - "Cn5H2oxjXemT13eeFU45gobRYiJrjCrhGaqKTMd66SZM", - "CNDgbbgmAfM5J5cY7uZ1SokucjNLRa8NFq1Yio3Pu4Q4", - "CNdVHTP3ZBganD8qHMvznWeZTXh9KfMB2VHqdfdvYZBL", - "Cne4fEUhcwez4GKB9PaMi4tSbBbi1j2chnSWMEU8cesy", - "CnEFmn1imVQf7MinrxZTjxiqW112xQ2z8zgwGPQtmMX8", - "CNGAPEKhPGSiz8RoC1Lhi1sY29fYmJS7ZnNHuiMpsbPH", - "CnHnqA18UGvA6Nri6zSv3T8HurqsuHshWWhSSP55RMKu", - "CNJpampAhmSSCG96H7EJcXAa5dbJwQdjMp5CeFHsuFSt", - "CNkXpumUHa5jvdJPvEFmA5WMXX1ugRFEDSDp7Hnya8gU", - "CNLSdrWUDKNUUjrrvPRAcszmz4gzZUYHVieRaKTRwdDw", - "CNm4mEYYFUqGD1WtvdNZv5iZvVXNcG9rnqodf3w9xkNk", - "CNmnLyDb4kZDDc1P989hqGjxMCRWVq3NxLJVWZhGpA4j", - "CNMZWA6qZWRHxAE9pwGnxN8PSzwmGS6vYz9h6Ka21Lkq", - "CNQcMD22xjQB8PAjzQCJFfGfJnPqQuxFeUv21fyyTjAT", - "CNQrX7fgMCBmCPqmB8Y5xN4uwF9kUJux7z3vEJ8MMVQ9", - "CnTEqcRswttPWdWX6UFRybvedx3RRjerY1sbTTdDxPdF", - "CnV5HYFbLd7z3NCt3XJvyvAmKMCn8xWQ8vj2Exm8Sitx", - "CNVw7suEhz3LJFDzN1sjin1MScbjRPWB9yZ3tNT5QrB6", - "Cnw2PuZHpJjpLd1ZxxPxetuLiXHniZjjYMGhQpJYqRBU", - "CnwQFPxFz17VuMqaPjmF2CWQumDxCKGa26d9yReHim2q", - "CnwT2qJ8eUdKF6ARtXFw9kQ6G1nkpW8tuNHhEitr5eX8", - "Co3ynoS7sSf9RSAW6em4M5Hi9QXBbUBPY7h1CZkJS9nx", - "Co7UqfqzXzTjhBwvam3zhNi4p8dKtdSrfh6rQykoNMy7", - "CoCKdrHVE1bjMZDwP8Z16vd7U3E5tGyt1hLw4tTsysmU", - "CoFT1gFckBRnoZbS2R19KtBWMBk2bBc4Tgn7TUJy9TEK", - "CogentY4pfVuA9iVniyyoDxvTABdDpS1aKUPryMZwcML", - "Coh5wJUhsWBtcvyFAi8L1vu1zvfBnZHZDsEaf3MG4Ex4", - "Coh6CJGtbgZDzESkahjCtN7CJsfRG8fVqHn5UxpzFniN", - "CohpYs9UAW6RA16wnryf5ycJNyGthyKutiJNVRUFWexY", - "CooyfbvR3vQEBoHQsb68nsdGCTYXNKVVKnoZRK7WTMRe", - "CoS7Jf8c8WD5QfQKYDyP5S2cBjtXpZvrRcvFQDeF3r9B", - "Cowx6w6oyFdnkhVUBsseo3RbGZGMLv13SH6J9Bo3J9VH", - "Cp2Skrf9vdEENePaQ52fWSjiEHAk4DZeEEnxwgsVjNax", - "Cp4vAErEpqLsfBySVp1JQ99obccZtVpgh16kCqzHLpBG", - "CPdmkqB1uy6xkCQk2N3pVDustVbCAzndgXgQp1YF7d12", - "CPDrAt4osz1Bi7RRh6KYNszXPEqsmARy7Eimaz6ViXxw", - "CpFKK4LrfnCZ32gQPPW8hVMqFsMSe46k7cUjs8h77iQQ", - "CpGXhkQci54bs1vRaJW4EsEbaH9viTZndMFHeoxcP9Sh", - "CPhtdbaWu5mHD7a6VoiPm3Ct5brF57HbUs6tnaFkuBze", - "CPi7yFjqm8MiLFJpdyfWowAgQex4DjJxxHcLa2rYZ2XZ", - "CpnDkZLC7RjdH2a5N7KKFRFS7qTEmH9AZhgpzkeptjjw", - "CpNhk1HjrCHydQwDDz4rXVfRNwSJe7fmhAfqoCB97waF", - "Cpp6qidLhCztkpTroSD8jwF3ZToYYmvLX2PdTs91bgqN", - "CPPVEbGFbX3XAThetvfveCE1vYLWUwwJGT7DxkPAWb8D", - "CpRPmDoqfgUqse2g24otcJAZKgFuC9q9rqepxvwooEi5", - "CPzdmC6tg152Q92FeHfraRTRxSCdsoSxheZEJ6GR852R", - "CPZDTXDMmE8pHwxhECEfhWZYNvDNwjyFx2GJ3pSbzBX3", - "CQ32LSbcZVfqRvGM5cugXwCoLzeN5cQudyWG69LRARh6", - "Cq6PQ6HryMpcjCeHFgSqA4M6xhTEQ3TzFi1QCrX8fnCT", - "Cq7fGmyKGkJu29uZ2MPVMgQH6rcxH63PD7BhpM4BVPfg", - "Cq7JRbEci3CvfU6nJpw1yPGz79ngE5rVrjcpb1gg732b", - "CQaFdGBBJKiByMFHgeiJJPJ4xPRxR9Ak37K5smjA2wA5", - "CqBkbPKXjkBAHcQZ1oJWKQ2imjUqN1fh7YdyRpfAhruA", - "Cqhiq1EJB8F6cXWJSbWLbFZhr2uG7jHEszBQCJC8fwcF", - "Cqhkb5RDWPW3WwX7WmQvXoRhu4TtAMNA6tzUmwmQDNcE", - "CqmFtdV4KcUJ9TbiyryF2GYYCNDzxBARhACv2gm9mRT6", - "CqNPKmYxPjoMdxiwgj44dSjguUghaGe7GWwPowQPTSVm", - "CQPjvtvGi83ehumLUTHxzrapPkyySVgyqbmYWf6rFHQ1", - "CQtuaJNBz6fh7Anvy4YCqkcadsEyk1y7q9oH6497WXS5", - "CqtvgyCEDJG4vJHFdQ6Vw4KNtzLJiQAtUfuaDT6oTQp", - "CqYDujQJ1AbQ6Yi35jNBwcjmmbiKC2CvL9kHn48k88Tf", - "CqYhmD8Rox5d39hfENStRDh8TZgHmux11CFjQJN5rDof", - "CqZVJ4n9EnLR16ed3NTf4UdmKy1gTUBdQUkz4HGiqiiP", - "CR3uBPpKqj1iSLRMZ8zcHoNXH67uDW5jcKRQPftn8yc4", - "CRCp8aHuYiUVfWMn8dG7z1T7SMi448ruuP9n1e6NEMmt", - "CRCQfYWcQNB3fT23T4wnUiLwneaZ7cySmp3jhPCmmA9Y", - "CrDAXwLufzaf9MT3vuuhW1ze1VDRoykybafkN5o4x9x", - "CRdCy1rgsHsktVKuacEZhhCrCiod9MQpw3PvRvoLkLNb", - "CrDEXEnA9RTp5XqpUjtvULDkNvkE664DtckbdBbsbdZ", - "CRdymzKyRUo48RqtQFPAK3QGgdFHxSj4o1aizyNPXLz5", - "CRG1c3e2oPqeeumjNJAPfQwZnFQCvZ9Q4w4hdNu4PmvY", - "Crgn2mEU2gjShtfsbBS6hKFWgxPgR28UBjeJ5YjjwcMA", - "CRoRAqCVnC8nPRbkLqh1jPsEoSifCGvXABeu5dCgWYY5", - "CroXW5BHAubsisQRSZVcjdRE7vypucF3GNWMhesipsZu", - "Cry9e6rhkb4hx7okTc1KDC7HKP2Krjq4M9TkoDxTLKT8", - "CS1gFRMviT5qw9b8hCDmsGUgwhgV9ANFJFdUmQVyBoam", - "CS1Q8yNkw6a8SmY4nJ1jKrqhaDo18Wr4CnNbwsvKoswC", - "CS2rPE3QCPnrrCRmEreswevT8NcgR5kchrB15SP8fqXT", - "CS4rWTC1ZqeAhyhYVYAyyQvueixLYTcBxBv5LNVmxnXM", - "CsaAGRau3ZvyMQvJ9CWSqbqeVv9zw2Am8FhnL9sr6jTk", - "CSaCpVYL43Mv12KEGEQ4JZ6GRojNLpMApSY94Df8GLMZ", - "CSEeaESxTycV1Yn6sSkYTLobvc8wTk43N1uohD8jAo3a", - "CSGUB7yD9b3byEgXnBbzqJ5s5wcCBexETgWs5BDFnjMc", - "CSHkDdp4NoBRn988b5KEh9JMxJHPLKVx5LWFnncT3fpv", - "CsiPaAm9Zr9EpGojSNjQ92h1kcKQvYubiKmpWb3C8B5w", - "CSj8o74gANwA4V43QsgpGHhoRT9KarDvQsecBSCkXeVf", - "CsMpYEtqmqT4GAXJincGiqPEK6tS3vuHNd8i5VAeGa5h", - "Csrv9JCbebTKu1uBWqkfwuPHwVCXsYDrQmeXf19onbsY", - "CsSqq75DrEEcSRqUaGtrgVG3UxkRJY5NnMC9EmV7TTaf", - "CSu4tdv9gp61ew13rQ1JNMsuxGWC6PTrNjZtnjj6VYTr", - "CSWoF7Sk9rD8mLaXyT9cQBuUEPB5jrbkeoRFXbYMcS5v", - "CSX1ZVkdseSUecuAtuTPyPPadWcUuTodE9BygHjMhKmU", - "CSXcNyNFNL7ymcMowKUByDi6DHCH9oVwdJgbgZGrvJcE", - "CTAqarrLTZ58oAtRVo3jrQYqcuGke1XDkAMqAyK3Yfej", - "CtCMS3BiPEecgotyN11vZu2YyGB6QPWuA4m7H1Zt9Usu", - "CTf95CLnPLBiWN9Acdi8VumUURfzYna8a8vrLjmv4Qfw", - "CtgcuRPSMc1Y6BVyUfj29abjHTD936sMoKFET7sH1qtz", - "CtHSPKCrDrhAXR4bDLYvvpakxaVupoKPvJFf6EyAuhN9", - "CthYXhfQPZDce1mZ7Jy3PA4WyF9frjqKpvxBgQ4XtPhQ", - "CTinHYqJWMLRstmkfH2mgPRdDnQu5JuFfQucZfMuiisK", - "CtTBuVswm7WewoupnuUDRwCrgJkpqmffRmSNrCMvZRSk", - "CTu6f4hUrVf3HScq9CDera8KDJ9ocXfAN8ZzZnXsjcqL", - "cTWicVPhx4g9mNhFKPEUfcTyg2ULJvP6nMUFB38fwWi", - "CtxU5HwVbgspJVtWxwjuP8wXUMdkjYJ4EJwJ3jvZh4zu", - "CtZL4Qpp7eBvnEE91GfbL2Bz9jwzBdK51APn92gHqJ4", - "Cua7kdvgYt5cJnqCUMq8bWVYU1t5wYidYXzLiihgBCZM", - "CUb2PwkRDKE6xCh75fakqvAYEqhZ4qNobFhetrXYhRK4", - "CUdHsUm5eaCZRctJo4HayvvYeh3AE3wCrNYXvMtVniBc", - "Cueo4YyFDbfc78o1idV9T5rXtHooaBSmZcg7t78iN2Dj", - "CUEUC3U7F6GpQQsrN5RLX7mNioMZjd9KyPRAsyrgC9qQ", - "Cui1rpu4rp2f53vzjzGGo55DHvgf5HQVGqNbyRwjWMXc", - "CuJecFtqRJmuyznjtUwN6cbPm6jiae2Ka92Q2wTsWHiM", - "CUnpHJ2vUXbgPD2JNX6NBrkH9XvBpAMyDhUxxXVzAc7x", - "CUoqPhPEPFdcF92Px4r66Gmu67Mu3Q7WXVPt9UKbnVpe", - "CuqKgjept2x22Ffmn4YLAmbTG4jHAGG6C1K71pPtr82D", - "CuSvR9mMjAxCdVqtMi11VSBBBJKspSAbgReUqf3daEdx", - "CUWRsgmqth9ubhcnS41f3VAmmQNsBntMGabVtBssSz3r", - "CUxahJ1XmEYEWUjhQ5QmUouPLsiMewyf54JD4B8rGqUb", - "CUXDhA2qQr5746MbLRzqjo8fNkDo6n24eN55vgEp8fPv", - "Cuz1H1T95bQWNFaHFc8t5kSB6zaasVVsV1FbxQDdy1PT", - "CuZEpKivnxS7s6rX4TLw8ECT9nDwvZ5Kt3rGgok7UJkv", - "CUZsqdYbmLvuaHXBmpromgtAPnzCSodUnarfB27Shqm", - "CV3F19YAhoW7DpfHQ5W9t2Zomb9h21NRi8k6hCA36Sk6", - "CV4CmE9CWVp3sRbSVR1m1CUEqQ7pRdK1p3LEhirYF68L", - "Cv5Gm9YtYk7YBLdpXPAcBnfXANTDzJ6Dha4k1Qs6Mude", - "CvAFPWEYoy6AsUsnPg2menKxfvehKyWPkUvtuDZ7Dnyd", - "CvbC65nNU7WjvgnTd9nPKyy7p6KE5Hd9YwQf41eMN2dH", - "CvDka8dJhB2PD3dXUSDJgk6fxjzUJqkYWvjjafCmXtyZ", - "CvFAYiyQTmDqqYV6avmiPFPDcjPndq5C7kXYj47g1wwv", - "CVitj6NAUfmEfZtoDrouqnrD2p7KFdGDouRXFtpPieYn", - "CVJdUStfV55MbPd9zpaWy62KHtsU8DbaC9N9PKAAAHtk", - "CvJwN1WVdrfAKB79iRWcABtm7fgTDUEHAUYrWJAHqBN8", - "CvKyMa6d6ZprJqwtE1JYapwgBzu61WV32n3Xtk5jDCmM", - "CvpoHYK7vyUby6Q5jHuQ8f2fMB4KD5WMFA5uy6opnkjA", - "CVrf3vWZ7Q2y6mkbRFEa5EqBCuTegh345YVERECSYA3Z", - "CvsfAhJUrvuzXYTAzpcXubh7RajhW2vqBftzeic9SE6m", - "CVtdVkbhutoU29LZKuDM12EUZmmdVZABmPk2CYnjq7yn", - "CvwM8CJEGbZhC3dVnVtmBAmzirSjAvQJ78yEvsqWJkPh", - "CW6eHayhnTCN486PtdnoPGAxmUKGJ9MooqhpoWjQdhX7", - "CW6XX6JRheGi48wZpeLHrSHqwqZF3jC8nmdnBGnLceWN", - "CWhhoMpaipgDstFjGnjXSSUbQcGA9YootWozGhCPBqGC", - "CwJksGKcAxhwziR5An5y6FJdxkysDxRJ26rF1hq5HLaQ", - "CWL6skWfKLDd6SY7NnkjfMgNR1QxHhxCadyFNL1ssNaS", - "CWm26qFBekyTtUYg6ZLfJi2ePMLCdXjGkZkhFkXqJfrn", - "CwQMNckNzPeMxsKqNpjd67RKzob5DNwhH6uH9toJqsRo", - "CwRdZZweh7imVWadGS7bSUBFWHxn1Dk7Lh7VUm4QmPvp", - "CWSr3rjCEQQvzNCQqWG4iy1XqCRhCPH3LUHKZpvnpzfo", - "CWvkXVLeyp9m6up4g4X5Yhm4Eqxvzg9imFU6HbSsiy6f", - "CX15GgvYQXqUpm4zs2dZCTMUw1Xxsv7QDbnqeAtssVrY", - "CX1VHn1AZKvEstxheSWEZEmsVNwszS1Bq9sdMVoE5YK4", - "CxA1mhXKXKxytF2eQtCN2iSqxpbWpLbTer4d2cuPMTDL", - "CXaKLwrQ4L9PnK4XfV92Xad8nyLrzYq4haheDcU6BLvv", - "CXCY8Pzu8rDGrWsp8yuA41z1tLv5ex8NJmRGbfu3gbAz", - "CxE3uq23QtSMErSmJYhju743PHLhg2GpitGVFCQmmoQ6", - "CxGbtUyxAAN3mRj1VVoaQnP5RagimkXDPDhna3HLdLT6", - "CxJcGfAkwdupFQYgwB4prGqoTdDEhGDUrx5xZ17V8aSN", - "CxkCs6KjydWBdMcpffxrYAiZtXpkjBW7V2Xy7JkgmxVL", - "CXn6kffsRc5b51vWsjiHJSMDKeyAodW1LYCUBtGUU4t5", - "CxoFQrE38553nq7PWhzekSnZBvmDW92jCPXLWbRY93dq", - "CxPACjyLDJ13NGbnueRMYfWTy9URhQyji8C6HajwJZfJ", - "CxPhLbubp2QN2WRatESeN8YH8r1PkNtSC8mf4x8jirqW", - "CxQfzheCqm3nYwj4pi1KQMrv8DkD2UoE5LF1p9ztD291", - "CXtx91kwGGGAyjfPKnFp7F5UL6awkgvgPKrkThHRMB2k", - "CxVGppgaQndV49Vo1mAotEgBDgvoQy4p4coHyh5wHYR", - "CXvTFeiDYsmHfUXyYgm5byEwM4T9T1Pcu5qRiTfKdsho", - "CxWS4R7rdKxdrFNhhWbPkcqbD3LzDXLr1LSvxpDrU6TV", - "CXXRTYp9693Su4skWXkrhLouFQLwcFJxsz68gM7SPVSL", - "CY2vEnFtzojprDhVsgs3CZdDUMS9xjjoe1ADFEhay1gZ", - "CY4NMSGLuLdSejGRPt3QgbbFeH3bcVw6gZA7g3n4YVFu", - "Cy7ujYYshNtSXAbHfssTswfdhsQ1AAe4JeMjovr6opi7", - "CyaJ113vCZxuf9u4zBzdYTjzhRvFqv5KGp8sVydRTseM", - "CYARE1CzvtezGFZXxWQLcpvHm49HRqZsCdc5x6fYVWFi", - "Cycz9nF92YmbXB5UKoUXK9hL8Tm6eAAqdwxBkBp8bAtQ", - "CYFi7XC51ab8bFiq6neRFmiRJSjmJWfryy2zv6yd9tyN", - "CyiWK1nemRPmyzgfNx9yE9JURQAZpCqXWkCQwqKdQcNG", - "CyKB5ohWpouV2RQLJ69Vec45d6f6gjDA7Pzxrf3XjAPn", - "CYKxKEzxSc8TEKntKTU1wwq6zv2djzCH3dN9c3DBxGdg", - "CynfeF6yNzkfHaDncMUNTVABCmvkUPhsjc87W21qQETx", - "CyQfDTNUT3NJauFAdZufo93q1mNmpRFagFBAjhdyZit3", - "CYx1c425b2sZoEmFxLn92cb3QFvTY5umgmuwBiiFZDZr", - "CYzDowDrtychqAG8cC1ifRc9RtQt5gb9CV9seh265nzJ", - "CYZnDzdzwNXJgCrdtZzj1YzfAcEnFq4G4hy7vwVQtMEN", - "CyzuFnnR1SCUoyAQXf8hkM3qqdNwu4sigcChU4s4hmmr", - "CZ1Rdckd6SvVVwCTTCzJFzkGY4dnrNYQewY6G5nbFy76", - "CZ5Er7KR3Ephxsq8KdFZn7FrvgZZtUScgPwm2Ab6FY5o", - "CZ9ibFV4eywiMwdjWWCJnPKPgAkMbcYMaZVFJVX7vrsj", - "Czdeh4fn24vEyggTKstzNzeXF2D38FkcQHzYLe4bdkyu", - "CZe8bf6XJTBJTzPhrtx2VcvyZw8bdCkjXEsACkjAao6P", - "CZEj5m7Q92B2GTYp8wYhz4vXzYu9Vr33yu3y8bsXBey", - "CzeSEmYoupMRyeSpxiKUJpjqN4U3ewKVA1fKRJNdCiby", - "CZGoY5HAwExsQCrbXK6Y2WGX1sRS2MbwGYVNwAn3L6Q3", - "CZk7EVkMtELuvKbuV3y6hWp2Bn6CPTyxVzhKuQDk2hSC", - "CzkCNjrkLavZEQrVecbioyoNmDGK48zCmLvSeCdpebJ3", - "CzKZCTRQSLAKTzFyTu6GEnBWr9SUAvohfi8Hb9S82ctj", - "CZnjshun2mBtLWcUgK6VGct4cA54376Vv9qn1E6xyWP2", - "CZqqPCE5SVbBzVbH9qLDYYYgAuNJAYn3EVtMVYgzATrs", - "CZRrpeH5XSS5nsENAzgqYoDByjA3M7UkfMvjUC9Htz2m", - "CzvEQC2nqtyWcWVr1fhMYyPxYCETyzsTeQSUcyvLLcBf", - "CzvGSfNAkjTxHA81zDzTd5HPE7GT8DfPJk23KE2uQbFL", - "CZWpCTN4rCWer8fm5ZqFdx82CDiCJjZLKZ5Ti2gdmchQ", - "CZY1ZJAUyD2ZfHE5ENChUmhqSVFwPnTm6Aq6N5tbBqaP", - "D14D7HzubS5JAU2B2b2KJWsgNMFBuMutjJTfo2iv4Le3", - "D15xd8SYavUFe4vuWCdtVHj8wB6oHfdQRQrB654T7ny4", - "D17iHRzwBk5NFzAEiUb5JqhaqDUM269utRqduzMxcTT7", - "D1BaSsmbQ9aL81Ho9F5VuqkLQWCQamQp8HfMS3u3vmLE", - "D1EErA3nKpbR7bD3jMGbcVnC1nkT7rPQt4citpgqwFEw", - "D1oFvnJJFoZAxUPDMUw7dsBgy5c7A1at8PEGiT6XEthk", - "D1p5ogZbKCQM4Dbaix3GvWcdjCe5eqC5VuB2zYmKSmCh", - "D1SCYXUr2jHsFnZDEw67znD43kXkNU1JrYo6o49NhCnz", - "D1vMhrLDN3Kejg61Wf9Tu4wNArzTPjGp5D1367qPj4Fr", - "D1Wx2CBuru3RRsLQNH6AAL3yoHHnnSBXj5b27mgzugX1", - "D21iZ4TDjdicMNxmqzYATih5PwNgfHRKAKYPhVbyYBHK", - "D22jrsNWZG6qzTURrT5PM6QvUBt4vHLYE7dx4Frt5wNu", - "D23634UHAwfP3N4cPhFgiSSSfGCSHQ98EiFtHxdeiBT", - "D23NCAVxinE53BTemguZCheAqCdMGfNTUzWdoWvq4Xj", - "D258v2Xp2TY5MYVSVMFjgKawKrrctH6m5sHD26z1dga3", - "D2CEZnBYQ9huwnhCYKr4W6QVdakwQRtWVrz7fZ7HxSWL", - "D2CxsP3wy5gCDFgr6bnq8LXPri7C11QqNEqaSgtbbKg1", - "D2jc19dVyYUtHiY7H5YM54a8PdLhL7kRjGeQ5B1FvBRU", - "D2NjDkcv8Y1dWGdtWAKPT4em2D3sYzM8AzMTpCG1RVf7", - "D2PNC1USZ1XZ7mZPgdLjAvbDnaWBx59WKKM3CxjAqyu9", - "D2QErXQJvnCQMRTYgE8kHJDm1UgA2T71x5v4WjQNQiMj", - "D2qFn9TkV5Ue83fkQ8pcZyHwH8FeMUcMyW2w2PYJ5oHS", - "D2TpxDBovZWm4mvjDiv8Mmd88aoJnXkCHfcxrvevSRQi", - "D2ULkLgZk1d6RW3Wmd14vFNfkBgi6NMM8CDNsNuNXvfV", - "D2Y5PPUeNm8WjREWnDRSnQgP89BF2EuV6pZKEdrNwrbV", - "D38N1Rjq3Aw6QvhER2CeHCELkCsgcUkyPkP3FbRxp3F8", - "D38vfgXzLV2usBPyeEuS93SmwS6CggzyeAzv1nKcv3pr", - "d39Bobw2gNPY7wrD2uvqzaT8J8X4tqnDXBrsfKsSK85", - "D3beAkzLzHjdG1xF97hEYLCMgUvTRGMDvMoB3oGbp7Vi", - "D3fj8n5LR3TmaVQaLzv3xiov8Zs5fBvXTVwXECazHJTe", - "D3j8UVNS197m2AgoRvyKyjKzbcSBUjH927bEWFuQ1o67", - "D4kv7YbigKSHMbCpzLGyP8SywUAPw7Kvn5VdHkx2gNom", - "D4pLf3e7kDGC4yc156Mb9A7JSAYnFH63jjsvAkfguqZB", - "D4pNW3yemTvYxgqcYVfoT7a46C12bhKjvrjimMsM2NKg", - "D4S8F5WWcLc2v73aq2rs8Ffgm612tsVST9AEhmmXE1fi", - "D4uFjdgBp4XCjmwcNGPxCm7tDi4x3KAUWKsowHmSSoE6", - "D4xPTEsWkU3zN5bDyTX9zgqnAhMoMccnCRGRLwSfo1We", - "D52Q6Ap8RVMw1EvJYTdEABP6M5SPg98aToMcqw7KVLD9", - "D56QGkzrny9yHgXCY2Cf5x5MAJcGcy3QH3nPzpJUfVyk", - "D57fsD714E5wfGbNHtdWqmcmekfWu1tgRFhEGfL9unPF", - "D5Ec5PQZfCPR9TuHfYGGLT6eCVhgiD3S6hDZr9ekb7jZ", - "D5FKWvq5BL9YJMr1SXsS7ivhy2DtchaqaxSGQhAWQtg5", - "D5HvMfJgkrYeSoMzxvDi5VFWsRMdgUfpqFkK7mtM9uW3", - "D5JqF3qkLkeJKKEi145oMseEGc1ym9cWKtBKtg4ZBBnN", - "D5jZRQxjnPZgzt3GAE6t5DzG2DZBDmKCf7MXrYUZr6Mr", - "D5nNZwJKamnqC6aq36tCop3QTQTBYBDgMnhZmErFtqre", - "D5nZHcE9RwEDKJLWReepAxsMvYsHC3TP3TQuXhXN6AdQ", - "D5teppgEtoTxypjFGbUNjJZQNVmrrarhSRwXXas2TS2X", - "D5VQPccgR6Db9SiqpRVs3FbpPnxt7DuZM8ztjFZNt4Y3", - "D5Y24cuanx6u6T67nVQ2BMLs6BJKyfXvTqmh8jkbyaJX", - "D6beCFAZeFtXoZKio6JZV1GUmJ99Nz4XhtxMePFvuJWN", - "D6daFYRVeQMkbHwesiwvJTVVWxvWFj1BmHfca6VnVKs2", - "D6mE3NLzxsmyyeMWQNcHbcG6z3Fs1ssxSysxNvuWN5rg", - "D6o3yKQfM17sTKhKoF5vXYuEfftC882kGL5eetQDsAFN", - "D6pwr3woPNRpnDrtzBEvD789wtx1imWvvpD11T99C2eX", - "D6q1Ju9mSkJLokBE3q4ujrCf3TdLYLLRC95Tatf7TViC", - "D6svmbCCUDFYmw8burYWAJwBq3e3Cdp9wiLdfNZ4SLus", - "D71JRzjPpHipt8NAWnWb3yZoXezbkGXqSf7TVCir6wvT", - "D76hrCBfSMNqmuCw9yRvABF4vE6axrUJibW5DjaKM7hR", - "D79jMUCmnUhz5NwaNFMzF8p9qTXgwayPbfaimGpz6ktK", - "D7ewLVvziWKBrp7UR7PCKLHkMjSPQw9Jo3JV4qL6iS4x", - "D7JEHyobMiegDAWMwmue2j3NbacSPUxVzaQSVi6uadJg", - "D7pi3Y3FaVaPRFDPqvy4U34j1X143bjbzSXCLb8YkWzW", - "D7U3X7zhbRbewr1GkvNT4qUdgGv52SErH2ptqxguTbM2", - "D7WU2j8KLKeUsKnkEeLnTtLmzr3muswCXf9tzbE4LuFN", - "D84CViaCNGci2d5K8i3Z2kEennximCXthH812f8sG5ka", - "D8Bv4FnVhmr118E1HeWYaXNSurvziDYopuxzdernbQ9r", - "D8e7uALahjTMSH1YGUw27reebWx6rE1sgsxwbbCQiW3d", - "D8F9VpGnkkdjU7PHL9DUiy1BuhfZ4aVYQFrWS4p8XFxa", - "D8goKEZAXaWCfVSFbGKZQtFn3B5XFdLLmJgUSgMjEJf7", - "D8GPniYe6dPrKFubycaBY8aSBE549FcPfEjCcDJJ8jpf", - "D8hv8kQnEKGZNU4AnrcuShsuUo4rhDbPz84CmAfGU39M", - "D8P3w7GQ4zTYbJfEGgfdQWQ1vrL6umGYAUrMz4hBJjrN", - "D8WfQnAbBmoeBj7MPL5qWErd4xonZqJuvbJS6KjkXWj6", - "D8wUJAcgFSdEqvFrBDFHzSZuf3SE4zM8p6F7HoVe3fRs", - "D8zY7wrNX9QeJVJCiCtX7SQ84aHZfrKiHMEPGMFD1hVy", - "D9qVqgr6XPC5a65WJM9QRZ6gVRPW2q3pbBzEs3cK8t4L", - "D9rCbP5rBrJztzv2EaACNt2LhXVLpPmsNgcWyB6LdfWW", - "D9RFqwE8CRATj9yHyPQoC879oNmp6nTMwTYuXJfStNdz", - "D9t4rdFyisXXoyCiwbfzy7FkhrPY1unGATBAVdi3AZWF", - "D9vwVgkBJY3MTorTb7PjRS7yorF7uL7w7PZge1rLkJSB", - "D9wGFLhzz5cSMo16d8RwvkHovAQtSVURSVzTxZpJuoHD", - "D9XxVJam9pQtMHxXgxNk1w2pg1TgXRL7sSJkj4Fp9CKz", - "D9YkGDRwdQaPXZe6V6WwWUeTWwfSoNmXADf1GXePetpC", - "D9zb19jiBSNEBu9RvmTNBrADrGvAsJ7HZnCk8uSBjHJe", - "DA7SNDUGAHwcXxHoUhbPqTv2p8GnncMpRYYoT6eJKmSR", - "DA7Uey54xthBbFNyZPJ979xdxSTLmp8ZWo9Yz3k9orXB", - "Da7WqD3H2FsDZB5fAhq4D3Ti3C7dyBKMGwNdaBpLJ2VZ", - "Da8NtWWwcSPoyGoF5kRgbuYfPQZMxALoxxkbNuXQKHJv", - "DaB3ZwVtGLzSjazk5STQEu3MkJR2nkK3tDdCPAvx9QpM", - "DABc4P3nZo1kHnYue8VQrNDwWrtSkwpvnB9ES4pUmKF7", - "DadnDZbFH5BHHRHD7TaobaSQ7QATXgvWegHUcZ7ZGzmW", - "DADouepabmgJ1axsPvGLN3oHKUTXPQfxecW3R7sk29gi", - "Dafc8guPwp5JC8fR7dPjSiMhd8phwTGn6TjLcqjovcBW", - "DAFv6jQr58rbNzpT2vccoAJU9RQqoisBGiAVm7ajhvzS", - "DAHBtkeAqfF4Zucj3Xk5TFXK4Yn8dPfd7z7dVZubz62M", - "DahDt2bS4EWgf546qQm8PLiRZuZPGeUKD42urQJCBYJS", - "DAjNhGAuZ6r36gbaHmvRajLhE7eoi1HadpYukJvmMe8m", - "DAQyYJBhWMNbnGECNJ6jnkuir6AaQdbstvHBXAUvLpPW", - "DaraKtkE9W9M7c7EXw4QQ5FB1qDjWk25Vrgutk7M4MY1", - "DARCCvvHzoWr1VLtrhs3hrUVPeyGZi3HrUJ81fReuTtM", - "DAstJgEB4ib8vFraok9MxiwV1iTzxF99LNxoj2mhQ7KU", - "DaT6uACgcB2nxVZ53jCNjWNobREfXhJkXHpCdme5wtdG", - "DatMDyrEByFRiQeLn6gNznSqV3gHK1SN8FVUPW8CDD3J", - "DAvJfPsBBm8RhMNLQ9fj5vnDvSbLBnKDQYQyL7KRpa4Q", - "DAzVJ9PCv1UMsHg4F9wSGiZ1RrSPBkVS92SK2BPEiL5J", - "Db2V7nPHc4sPHne87nYXPGn8Kv8rMsiWCAjgAXmpqcpC", - "Db3xGzhem75r8iVTZK3uDxLAcTMQKhWVL23Etds3Yfgv", - "db58QEA6aJK8rNtpghoAoihtH5o4WYizwwpSsjTw391", - "Db5FG9D5Z1WWDSvQioKkymwRiTTGcTHbryBniRqYE65G", - "Db8J4gwpgKyQteGE1ZsGgd6kHEAAynqLNNYhwrXNr4Hx", - "DBavu5D5LKxuEg1Tm7QZsFxvRqn6QVaspTnaqNtRSaeH", - "DBbLyHobm2UNyZWQt2FXgZN3ji7hDEx9gJXQ39kHgwr4", - "DBc9sGfoUaaSqJs6PX1uJwygs2FLwS34YNEhuYf9JRZM", - "DBd1Se2ugdr6WChDSGzSzkyENnqq8ZWerfqGCfKYUred", - "DbdMDVb4F1e9uZaRUHhEyksmda22ooMNaVBnEjuhjenJ", - "DbdMjxMQaoUdK7tUNejBQxqbQLzZhwED2tcfZ8x1WeWF", - "DBE6kHxzwvk7N5BFxFJDTHj6H6uZziVdsm4ge8hVaor5", - "DbeefJyVJd9BvRdUs17uRvYDwzUwffFVe4dJGKfMhP7S", - "DBFjUS6Yf6i2pPexhXNrNB7urinDx4U1mNEcUekeJash", - "DBfSoRkPjM53QdkbEJvyBb2fFNqiTa2NAqgzRaRFNJww", - "DBnHiBQxRomS4ReMQzr7om61TMPKt6PjePokQZy4kHUU", - "DbtbM5N8Mv2B3Hv358L6HjDPi6AZKrxEriqCSLKZQDjb", - "DbWemxoVEj2CNLgGuKCGVihHmRnmhERm4Eb7g299XDDb", - "DbzdjE8TFSN1Zb4g3N9NsgFrzJ68G5WKtgSxqVox7Nxr", - "DC2exQP48tkp4MbXB5jKX3bXTy9fMesNPWtKPLCFU4ig", - "Dc3PwcDQTqsL1fKtrj9Gi7EncNdhoADPpjfuDPKkwM7J", - "DC4A8VXiAFzZA3NukvH4PgcZd3uUzJ8FEYWdGJbyQPWA", - "DC7pmkkV1Ci4TMZXLTuNkn33JMT3bJc7kwpL8SwZm3on", - "DcDb5GDG7ZFSbLFrWLKSoXG5nyTGQ25xdQw27Py9yQEW", - "DCEHziymZV86Pe64mBBNVR55XPHVMvE7zwQ8in3Uvdid", - "DCeK5iBWEoEfzyFL7pcPD9eqdZj7bM3Lrp9SZzCqryqo", - "DCePqHt7jn95VedxcYtmoDw1GdPU2D9ZjJXRCSs4HFkx", - "DCg7jLr2VASegniqJsAoA6H4uxHkKirQZkVzLDerPRHF", - "DcgUD8iGqAbKNAa917SBNwmH5DJZiVC5cNu6BaRhKRk5", - "DciwdVV1DXimdsgRGQuQ45zYVjZNaof6a6EZ1JjaCsvx", - "DCJHDbeNtarBSeXLKTF1XLruL8YpwpVo8o1wjkoA6uEi", - "DCMAD3umvCyXwJVNuXLYs7QrnYEoyxPuZBuGoHACiQCV", - "DcnvoT42S9iQXa2UEcnaDmqGJ1T7eCfX1TzDn168DMy7", - "DCoQEPHpKX9GQfvrm5oVyEYYSJR2HsXdHcFJFj3CGpKa", - "DCsB3bGXytQCxD74hcTZw7nB3sH8ryoNNxz1rtxXfW4t", - "DctYdX8c3qBZ7RUtYE4Ffunjv5SYFxVde4H4BDejPzMG", - "dCVbRnKNv3q9aBDMyvLRBYuWWt6tpEWjpucnZuJ2rAd", - "DcvEtMaynzti2G2Do2yR9EivPu4H7F1CV7VhTvyY7HpH", - "DcXLicSHVs6kcMHN8f4noM2zKwgXv2DrTr6CHBR3q7fn", - "DcyAs76yDGLNS7S4cFG95p887bS7Ag2RSyAdL7U6wSM4", - "DCZDwLt3QCPhxbsKgenX7PdLWz5bFPeE5xeun3sQJcuv", - "DCZuA1UWbRyMWqC1mHVMpt51HPSyTHz8X2pXrgQ1ZKBq", - "DD5W7CyfE8GP4VJvU1vb7ZYXzjw8Yvm3BZXikLEhHoTh", - "Dd6bNsbSrCuYBsStwCQ5a6id4RSeFpHB6xscA4fWb7wU", - "DD89H8QdPyWGtR5QnrfM734G4qrD775HFGMobyrkHjn9", - "Dd9DVw3Tc5YSVoSGohZDzURo48qmtEVVC9dE6Qn43WbB", - "DDaZyogc7KPcwvUe3CboY3FTThgBZvzc1UVCtmZX7jDr", - "DDbA6znkPfe6ZyjWUEGLQYcRwUDRoG9PWfEL9RfR8vi", - "DdcM9eKrjJxqiuE1FKh8VTBgWkL98EZjepvbaqhvUX8p", - "DDcz1qnoG2XAg6YYccvHfXQdq7qMKszU6oUjr8AURddd", - "DDDcbbDW2kMiRa8kQomPmQW5HmLCKittJmcRXDmmPSmN", - "DDDkJx5FX61PU1mciTwi7yUDDd1K6sCdqv1zfYftrbWR", - "DDENydVRPJErXjdAJBkoKPCAj3d9RdCbANp9p7hiLPcc", - "Ddh683edemuWxvxFpGj631rRuEZGsobTJ5pHteDRvw4e", - "DDiUaRiAn5798rPGrRcDqXbsNUvTvRULNTpUUwcYQwxb", - "DdJRpW6cKmVbC37TQCHSCKJs5mTD4QYHRywDghQkmbpu", - "DdjUMRKntcrx9DJftVHR1TaiDCesdKbvgLeWLTt5cjxd", - "DDKbxGPbzRqeUEJA7LLWLyQv1g1ke4khbbnbUgFFbr11", - "DdkqDxfoaMJTx8pM3GLwKnB2cyE6SKEtN2ias6PVqxUC", - "DDmzqAHnFzgV5hkoaJTPLZEPzkWVEgsQLUQF4DVg6JJc", - "DdStw1Xxmb2UUUosdWoA2rxmbDKw6zshxS2b2Di6TZ2u", - "DDw27YAwVUMWmStbfoQiYRNhAAUrqFLcAH2njxuazYt1", - "dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs", - "DE1Eg8NFFPbXHSDLET7GxPEupk1CWs9ugpBX2mUtDN4N", - "De2Y7CrtbUiuheHTZnr2w3uxFyjxNPQYskLfCwYCAF7g", - "De3f8bq9dXXHj61anmFSGnJFCoCzcT1FysLoTDRACBXB", - "De4SMvCZJ8FtkbWoqFVy9AuBwU9KvnV8QURJZzo7oi6n", - "De532UVh3mbyHA2QKkL1rxn2APEWZ2qjQwcVstH7JynA", - "DE5uNN4WNkeq9Nfhusufbhuubit9YUL7L6PzgtqgzChe", - "De66NzE7LC8Ri8ceDP156HmLRQR85n4gHPCKiMyDZTzs", - "DeE8bEb4Vcrj5jzNyEVKVLLj9pCKD4eSh5d2kvvPTCSC", - "DeEcF6PRaqGV9s1A5F16o9g5cLkC3LgDB3668nAz4D9w", - "DeeYrATizooKrRSprLfXKV9UzxP8HELioY8iLWMzBo4M", - "DEfdLRjUFQeF4BZ1RR15XpLuJbvKLzfsngWSWuh6CfmM", - "DEg76DbsPQGSdWtkQZda9q9qHibviEfRKTLNHEH49Gho", - "DehRpuhp6DocsSSLHFszF2aP3jgTRJtkuBA79dnJZBQv", - "Dei2H57N5aAugNdbpEYyhQsKhx5XxLjs3xmRpg8g3GGG", - "DEMykXzt8Zjq5VYtkGMkhZnUa4XspEi159YMuNkSZSmm", - "DEnSg9RV3TUrHWMHYrLJ3iP9AkTXjWM6niy55Ty9KfCS", - "DENUkU5hgnLTDoaDeMVdFSMNAH9tLqmupNNCFYtHQuei", - "DeovjrwSsa5s5m8sac32hZgewzcjA2R6amEuDYdYameh", - "dEPoFn44yde6jmH9WUHexvg1rViBKEjftGKHRWy2vBd", - "DePwpyCLVx8ReiZ4Rr1BHaS1jYgQYbAAm19UEJYRNX2W", - "DEqpqWRASZVoDVMQc6NpNjJbiY5KxupgiUXWCsc4TUim", - "DERZpWNzHzusMAK29jRQ573LK8bvmENSyeLii7ZJtCZB", - "DeUW1g77J6Qk6GHjZCRYat57dwgM84yB1ioQWxM9ouPM", - "DEV5ZXDo73Cok1MvGaGuJaACvra6GHin4wdng3HHEQPH", - "DewfdyPCSpDcVScyQUPpCnGsLYS47sG6Nq1FgYgQCFmL", - "DeXED9nidMNJJa3ie4ZxC6XAw28aNhKmv25FDJjuqDX7", - "DexGiy7JdGyk4GdYV3veNiLFtt3K5vKtHzv9nTJrfPeL", - "DeyG5t2FXDQ6MixurGpgGEyi3obLabuM4JgNUe3oiqvL", - "DeysXBwFZpyHzuxygdWo66nRMAohP8P6nGX2ECd914BJ", - "DEYZsYj5yU86GCgYn22a4w2LZX1jokqA8sA57ez5A41M", - "DEZAHY54DgLq9Md8CyxBgNCe5hxDQi7fJaSE8jymtazr", - "DF57amFm9aHKYL9pKLSWindiF8o2RRxtReLb6d8DQc38", - "Df679fURgiGumTwRuZ3pzdquAhMyYCURLXaoe4cJVvfS", - "DfaYCdrzsyshSygLJfgd9JQbq21aMsLXWLR1oWFY12sM", - "DFb6qaAkd5DTnFVYLDjzJNfsUPygP8GHHebN1CBv25cf", - "DFbGEDN8RQAcuWPwEXs9xZW98ZnUTCCwEcGr7df4Ja2i", - "DFcC7r2czdCxvAxbb3CdnyUabiHsVW7uyQeigSrojeQf", - "DfddF5f6xXTa72RsyRVFpQTLtbqDm3Wk5D7cG4Yk9hEP", - "Dfga8kPE6UGYZCfsF4XXG69kTgF6iHk4fsK7aRQnUFCx", - "DfGiu5fdX9Wg29JBCyxufwQ4KUbwDmeVLemhChbQHYWd", - "DfjBTVrgnveaCjUC799e1AxUVg85EtXoY1Zq6qWqLmdE", - "DfNWBZ7EUqLiWbBsGhpXaM9rpY5tfvUFPepsmbJPsD54", - "DFpi7mgmChYV9whs4uEtioFG1R2WF4TpGd1zcXMjGwF3", - "DfTeDaxk4RufkVbykedVnqa1r9S3z3oKFYL3FFmPdr1o", - "DFWd7U92cu5n769p2PsNEKjpdknto8Mzeajz9sRVnJZD", - "DfWrfFfdUBxp4W5z2EJWJ3sjqUv2jeApfz5q6ADwL2B7", - "DFxb9yupCy3AmaKcnN9EYTTSVC8rNqyNAdSP3DTHbfAa", - "DFZYDJiUnUHm9Jt8LyAbFwB7YyXZYUwqa62WZmVLER2r", - "DG4sWAFEjUmjKeGkWQFsKuBBZCN86SGVSnXx5mVj56Dd", - "Dg5E8ktH4GWfKL1vuVTdqZJEkAEgtV8LqmSXyLJuZ3q1", - "Dg5XmqEFcCXiGmZrVCJHFCCCFS36MJM7NwKCTGf1AXUR", - "DGAeJSG1v2tRSa5bq8GoC1ZHAE2jRST2euVeWuU6YMWr", - "Dgc51X4Y9aSiLKKowp9zQsbzpN5XzyWbvM9YJTKR5Vzh", - "DgcU8rHcJ7bgmemZjQLv54768A8xRtSMxVga2qbLMzyx", - "DgDuQTSGdtVyALBEYDi8HN6QiRBF3Uvvkc3zgEgKidZi", - "DGf8USMPMty56BWgwFSUz4orb9smQxsWxufKBXSoX97f", - "DgHhYjwQfSrtyKCHHZ1kV2DB2ce7pNPKQsqEWz1NRsFq", - "DgMNK8c6RngrcB2xL4mchStMGyqfo5Z2KHwZidohpyGp", - "DGMNKm8Yz9AeV3aDWKkYAYWevXahhq3Bm5gkP4AEXCjq", - "DgqjJYoQxWfYPpRu8rF8BB8Y3CtkgyBWPpnmpUHDD3XD", - "Dgv6JWLMPwPDwdyfwCgD8QCnat7k5ynAS8REqqcpXqn2", - "DGV7DJQynhW8QW2zBiC6MXfGVeqh2YSCpTHkujpAPs93", - "DgxU6DEoFvwjVHJtt3aXaw5rM9Wm6aMqf1EaVhWYVn2M", - "DGy8Ri8GzayCUrrKkiTbQT4mvaeD5u5WpRbm76fJRAT7", - "Dh1DRj5mLYMeJVGvaPZN7F4XjpX6u2dCDXVnUXrE8rwW", - "DHa2QSwSdf4uVtFUyGeTPJ7XZcKrStoqQhHDa6dugP6R", - "DHEQ3aSLjhzsnnLd3m7kE2dDN18M4eFw9i9sHWD6ztma", - "DHfYYAbKMD2ckZgZrie21WtEHqHx78JYzxfL54QvYkXt", - "DHgFfi9cKQkk7YtmiA7rV9n5DU6QeSd76cNC2MFErtSD", - "DHjptyCvDQGG2myCZyJFqAymR2EzgzK1ZBd8Ffm3nfAq", - "DhMuXF3UqZvi3GhdrAMVyEQ7pW4prM8DkW54scYXo9Ke", - "DHNSHtEZHwPkkfomi5oMmCQy52ACoDpD5Kc6oNGTJTth", - "DhukytoqRv1H9J7LZiv8FyqTYhBhqb53gMgJT3dtdyk7", - "Dhw74djJyJ6yUELSuYiqu5gMmPY1UUahKiQqgwWZnSbX", - "DHxutrtALUMdhUdbhvDjsANt1xe3MSQgTR8JACPoX7vA", - "Di59qZE8CNrygGCvpcmbg3HMgxBRxEwqfjAekJDxdDG1", - "DiAZodQBeCoP65gTBfPsghk8No5QH6E1PEwntuxyeQy9", - "DiBQKf7KgvJtnD1ncMBfCeZdSvfeWB7xZfvGm6sQkBVd", - "DicJqq6gzvA4Sd3F8xYowAbQEAoTG6FVNeGhUedcJqtB", - "DiGons21LgTywWeGkXNipuNCigwJ6hszJMsJENsCw6p2", - "DihbVNPXN8M3A9TEMBJ55XUX2Bo3w6w1BK8BRsR7A8o3", - "DiM3w5M4ATTQQheYRrizFCSoKCKmefPGnah8cPsrYt17", - "DiPkDBQYCwgHwbW6NNU7Q2XhuKSMh4PWWXr4Znws36SC", - "DiUZd2vLTvfYxgKKghe771PbKVXuUz8yTrbZjLx7fnyD", - "DiYqatHun5FZkYvLjvHNTXAMZTVnPW1BJo5QbdfaKnqv", - "DJ33rPsmqaxagFZ11WnFUFEsBMdxDhY2EdzcrSZyRp6W", - "DJ3iS2PjLQJBNSKMC3DWFrx3DQ1kd3yCyX6ar21jdY7x", - "Dj3KJdq8zNgnnJ2jfzfFWAHuP5bddeJtAgpsYFDXTA2W", - "DJ8UNEtN3qnuMqCMJPmVvvajMDdCUy9jhAXqorubxTMJ", - "DJ9HVC1dqchNKtJSRyYAUXeT8QSZa7dihscVzwQdZTdG", - "DjAw3BWyJzFaSq7donFgKBn4gtRzrZYoUq5uJpK1U6Td", - "DjdqsgUKyJbwaxj3qANjdeMYzsvW91qM8xn5GNg4iRbW", - "DJFSgh2m1K2BkDAeF7u3Aas6aZoAVjhfrCxS3DbCDSPJ", - "Djj7AnBW1bErQetQv4ou92CfopP6tCcgiyZcT7EA4rPS", - "DjNrw9HvqoraJAzARSRR8fEhgiyYQTyp9edcUc2DGWKW", - "DJo6wDUWAdAFvuRvy938ze4VkwCBrW2o28pbcZ1qZogo", - "DJPWuVsxrxc6JaDbfp6aZjWAUaCM5KpEDC6wBtdqsMZF", - "DJRbum8r82ts9uuGg9W7AheFwRE7atSV1touZPn2bEcH", - "DjrfRZzQXd5U6KBAPupFHtRQKEm7Yfi4RAdyc5dxmUcr", - "DjrNzB44iddA4S9VZSy5FfSNZjtA1nZbXE5fZqXEJBcn", - "DJtqNYDnH5HGAAzmM611N2SGd2QA74ygpPRZ1QMvM3nz", - "DjuMPGThkGdyk2vDvDDYjTFSyxzTumdapnDNbvVZbYQE", - "DJvMQcb3ZtXC49LsaMvAo4x1rzCxjNfBfZtvkUeR4mAx", - "DJXzEhS9fs4YUbtetDzMW7y3q1Nz28hMuEWSa9iRsgTB", - "DJZi7aGcSdDLwonfUFtNruxbXBWgzKXERidcJxxAZbao", - "Dk1nvVYPg2fsjYpTHWBr9Hqg9fHftrBickVVZCBvBSB", - "DK6jLVnGoZ8dt4HvTdTEmZZ7N1uDbh7M5mkVyYQtFYo7", - "DkeNVPCBQ7x9NcWzQH5RPbrUtCiNqUHzJLXyzCKdd1y3", - "dkGrhZXMSVmfUxGFUbAuqEq7P1fFxYzaZgYWpEKSVQM", - "DkHhjH8fxnb7uhS5LM4uBNzZMuyjeXWCYrQjcCH4YubS", - "DkHwZDanVYYiNDftK1dQGD8vPz4CqvyhvExJxPYx13iS", - "DKjtWtbx77JKd6tocZaJfxvusZVhhHcePoR4ia6LXiBG", - "DKKbsFdmF9Z1izsE58rLv3L2kmyKXXsfW7uz1ahKh45n", - "DkL3UwEbj4S1y9Qm7sDkfFU1UnbBb1NHjghNRt7SZkoH", - "DKmRzfmz1JF1e1hdkjG6pMxnmFuyPcevcdXFG9dVnzBm", - "DKNy6YAPt6zq5jVD5S8EFSXpQmqA4NjrQf8t5v3tHo7h", - "DKnZytVA5wKbNPYW1pvPpoE5YeSsxu12KJFa95gBAGm7", - "DKpsYs2k7sxU5hZPMafaypWn9WucpgJdLmU7Vzp7Rr9p", - "DKqAtoDs8tb8oR9gXUdEw6BpJhE3qMihtvyNJoeMCEHk", - "DKsXexMRtPM6VxxDGxgMKP4Dm9UGF6K68yKzytUqyBCt", - "DkWK8MwXAv9cNguLEc9w2EvDAm88Wr3xXDFhiQyscdm4", - "DKyon4vSD7mF6uqgEJujABpEdhRbyX9X9EzFjmEz4VBx", - "DKZeJyvARVGMouBRpYp31WUj3NQTuPw3rrqpcZSpNDoy", - "DL7nAeDm8EVb7kM9vHYAaP4MH89mtqh4bxcu7zjddPKZ", - "DLbekTqPpWxTsts4a7GqC37zDoCVJ8hDt4VNWfukPnRv", - "DLC1mPsGUh5qpXYyFAcZU7bLgkNMjeeg7mUD4fRgBDJV", - "DLDshHnnGetLXCyk9o3RpKC4iRATqgw3UyftYF55ffuq", - "DLRt9WrwttR7MkXcju2ipbsULSBhaGB4EpGF3NUFTj1P", - "DLvypFZHGaBtzz4wWaNGWR3xSNNbEJzTraEh6eZH7fyV", - "DLzNaXpqNz6QYaqW6AHpfrgRLtqdaKXGPM1HWnWsP8uA", - "Dm1bTdcci2eVabcYCErHQWVpL7QJsnRmL8UVVSPQHLh7", - "Dm57qoTwcCuBy5qv5nnapXEtLhudFprZoq69ehQgFCPW", - "Dm8Kusyhxmz2NmwF8RivLKembinSL6h7tvh4vrMVNxoR", - "DM9qo8232TJoV9pgLYwtmu7K1YSst3Vmrbur9q6o8iQc", - "DmbCa5uNxZXCGG924uuXneXBjN2RzTHxCb9ZZqewLtLM", - "DmBqkXiTpE7X1BQsBzKDRMjFVpr4a8dpUnmy7rviaXB", - "DMJ5W6MNMthQb4a8VAj1Hjbi3d6pn5uQKQyJywWSmiLF", - "DmJH9UiKgN4wAbp2riW4tubTJK9jyk57SmfcGhTd8rni", - "DMn6yEXUXpkSP62EriW5i7XzV9B8pW4ea8EBiDah8Uhr", - "DMSiJKrrfd6iC1SM2xgEEkKyW23wSogmEygkhCRgj3Tb", - "DMSqirM4z98o8FZC3KPBj2xpKa8KUsT2qopegQ79e7YG", - "DmvVNAcG1hpKiGg176xcWpsx6dftrWH5nKz7PWEmkFqY", - "DMxkFhMSYuFzWmTfyKBdScPkbY2ADPg9uPZ3HMUrwz6U", - "DMYe4Q1fV6GvbLEwyZvF5kYDGuj2Xe6bqxY9D1k8pjmt", - "DmzsRjLUc1Xix6kJ5DeMzgEximjmo8CqLG6XuYk1q4k6", - "DN2DyaKYwgV3qKEcqyfGf3YNFsd9qqA7a9GzxD9a8aEE", - "Dn5Voces1LgN1b7BzfmtSn7WaYqUV1FAehQL9aR4bmGi", - "DNCnSkX9eHoTaW2ekwsTBeierxHJPoP7mGTYxKrEdNqg", - "DNcpMH2KhYwkwuf3QT47uK2ugYgx9DzZocebkRZZBg5X", - "DnCufRKWREBkYEiZTkzLerdQRpvA2vw42YJA6UU8tNyB", - "DNeRMYmrRLuJrr8n6kzyWrQBDZfjs8cyi8jdHUvkXVZw", - "DNiatW6LS38SyWSor6yqFjqtcNQNToTbBeX8i5Y8deit", - "DNiTgrstCjt9GQmseTWKCkFA6Qf7RLgXgwP1QNgcomTr", - "DnoXzaCnu4ftPa6bD2tvCmGmYtGZevbYCCVNm1QNXJ3k", - "DNp5cqj5GdCVJU6L5TEZ9BUphaU8gY7XortKA7QYHurZ", - "DnPv5bC7CZRUTrK5R2rJ3LyEDLcTGa194MxEoEBSutV6", - "DNQuKizDB6jefcE66sWrw5RyGjvU6TyiuT2t7yvn7RTJ", - "DNtbLVUiYdwbKvcYvr9Wy19KLUvxSkhbZPAbqAmh4oDJ", - "DnUanV1XniXzicrw5hc1Ruapq8W1Z1122DqoBvHoDLY7", - "DNw5GVXaC2ZD7zpBo4b85s3Y5KVwkmqDE61Sjbjutjmq", - "DNyzeaxiV3Wyo1kd4qD7z5YckYSMkUz2Jsc1v2AcQ2kn", - "Do82j99YjNr1BN9hLFgA8wG6LCihxJ6u31K1fUgusMXE", - "Doa3QkBnaDcKwUXH8f89w24hC6aiKKGqicySA183WN7H", - "DoBtcM8k58kPzzsprhEJCEai444EYXJBYM2atem7CukT", - "Dof85RogMDFt53MHLjcvhk8LKuM6uWYePhrvAJYPdJpU", - "DoFJjV9EGkMnE8o5iQ4w2mWFPp9y5Dk5k4fk1iLVGUdU", - "Doh7jAGxrFbqKUYLNMU4AH75aJwq4PeEQWLqC1tbDpbg", - "DoQrvRo2yQqM9BT7UxcjgcdBuXE6b8TNx42a14ucVjBB", - "DoxSwS9T37LHbcucET6qUQWr2xeJLWyoN25UaHFvBjQd", - "Dp5dtf1LaxfLRitse8FwJkD2TVUYz8dFf4XLgpu2jWMV", - "DP8imXGzt17kvC6FXdvapKijAo9BDZTdsEFYyMAA4Wsk", - "DP8LEnB5spfMqdPLeiSK5mtQ1BXYjZWNhW8T7SW21Rju", - "DpALW3PWEvS35hNaBciRyXMXd7imTFUWmcPd1sdaWcUK", - "DpDVEz3Cq9gaxjec3BBsPzpP6XSJJivvS8JjtcDAY5Ge", - "DPE5Zqj2GD647WiVCNn1Ne5V9Rc528E5nqtFnFZ71rQR", - "DpGQ7nxPfLFbgDuuZWGMLn5Vyyyvtydci9mENsXVtXJN", - "DPqppsgQs5wwx13ncWwmRkS5HotTJhgFHXtDj6qSAQbY", - "DPRGrY7hQxbG84ju4zC1MBgYivbydnjk3zn9JDEo9Pce", - "DPrmrH86gdxQPstdVuXA5ZqbBna7D3X7BtjYuGMrZTpm", - "DpSbYY3pTGirTTjzKYhX2GwQdKgqQiyQ4qnGaN13u8Tv", - "DPtryjrrMUTTB1uaKkbqngnj2v1adJNuNW4eRScUPSP6", - "DpxquutiBhJSwjaNraQ375557XgqBBGvMhMMAR16fGSw", - "DpYP9MCEhgxBnDoWr8mfAPbSc7nZazieqJhojczNdGay", - "DPzS7ES6wSF1o77RXByQ1wC5Fux4ZxhN7SWNZpuEyJDw", - "Dq16VEt4GLCpArpdn5mdgx2bjau5tmN3nm3bPGbamGqu", - "Dq5r3zG6XGBcXNDRSWPSc7DiWwjqcGoiVcEhZ9mXEAaV", - "Dq7mqEYyi67kqwGFQskHdPWtegziiwoZjT4SMGmqPVQH", - "DQAi5Bdgz5aPhMMUMo3Nun8TBewGf4zJo2EqGt1jNNQ", - "DqbeCr74dFGDPvg8BpV6V2Jy2BCTZWmuvChkZVvPC3wP", - "DqcaBMhx1pyJ4B2vfHYtw66FApooe8bs8PPMWbYqT5GD", - "DQcrJoWvWijCUZrHU37NWM1FZvVQfDpwzDjPv9jNvtgL", - "DqdJPDgZBHUuyXDctvmjHNai5hVaz36Wprif2Za4apo5", - "dqgiA2z2kiCUjpM5BsYkWvn8DkQMSHXgTM8cvbhqHuL", - "DqLtDP95HJ57NKwSnQdWnSJyCSTuC296ziphR3N3iCgC", - "DqN8yzt41ZqMjq4R5Vq9MMCShAdbknJAyvuW53qqx1KF", - "DqnsZqBwsZg27LuiwHtuDHKBypguEe6UVhBE7GwAajGY", - "DqPvDQAjyZ557yaHJJzEekV11WKN5EZ6HQujNXQL3FJL", - "DqqdnMzLyTNmRmZK2mCkbHfsvEMiF7NteXtBTmcRyxxj", - "DQSg1PLT3Px71U4LsfBNhg5yT9GgH8FnK7qQAq1aLmk8", - "DQTiiFVnwD7bSSgkMmwUsBsgnNBza8N6oEGeMC8YaieW", - "DQx6XD5fWQ2Pbkg4Fi4gVzLbGg6c4ST7ZgXTawZZAXEY", - "DQZnxmnLdWuGP7wxpw4krfeHzCiu6jNd6m32DSoQZc8Z", - "DR8tA7YQDWRHNRSemo4yeH1rDQsLxCd5w7o1f5eNy31p", - "DRcX9ABtPfhFJJN7xhX1vYFREgzWxBeAVtE5RbhgxvZG", - "Drf2oN83THfrUJHA9AGzJZaL9KMKggPoL9HJVttkSCgL", - "DRfnZxdhCF4CLFNGMgvZAcxA17CPCCGarfPcEV1B6vEq", - "DriFtJ9VbrhdFJwdKZSgv1XetgLFXWVoaAt9YDVoncBe", - "DRK6coUhAikJdsNhcKy5ZUGhXJwj6PDrsFXKCo1UJpuT", - "Drkj3wbHHmE2iCnqXHKFTmwPkuSc4bsFdgAmqv6eXuWi", - "DRnvWydSjzDkhN1AsZ5oTm8nqNCmxtCxJ8T1sXk5kCmb", - "Drskw4YqMzYRVikgsGPACY1GnE4zTWs4uqSKajKdkU4Z", - "DRUpYPmGX83wz9d2bv68fN6ruepqqukxUcFQKVB2Kvbi", - "DRXQtCNxV6wv7dy3kZbk2AgKVzFVhN3Ed9JrwCAnm3Su", - "DRxqyW3HEa54Rf52oXsUKQRfioDvXQchWnxZDaHqugSQ", - "DRzjFj1FWuB6q6ik2wToPidpyq4Sw1dP3QTtQfdCDWip", - "DsaF77cCADh79q7HPfz5TrWPfEmD5Gw1c15zSm4eaFyt", - "DSEAdz3bK1Q8nULEkqYNCwFQKrCkoQm8qAYxjXJ3yP8d", - "DsnqNtwKA817a2VQypWEzaRXY2soq5Jgc68MgFBMR35p", - "DSoWrtKfxis7H9ZCwzCCGg4RpnQ574tqcWsgjZ2emLWc", - "DSq7LrdHrUMp9MfoLL8CDoM9o6sWBb5NR5TBaReb4LX7", - "DsqX2EU3GeFgvs2XTFcytGvWtRei989e6NPRY6UiCQ77", - "DSS3RqAajjJZi8kdHezn6MhGy3z115skWHN6WkhJ7QaP", - "DsuYyXLTKvpgsaDfkAmjpAkV4HpGTaUwhJMbvWs4HSYH", - "DSVSW5oSDSvoCajwuivSyiXgHH2FaPh6r8F3YeH5L65E", - "DSxQGo6daKMATDx5y5DbRCCUtdY7WHLwx1JMjUF2z6as", - "DSy8rTqZ4JhdUQy48PDs5indpNy6JQqV5RebW8kG9ycL", - "DT3TBrRRH6YS2eQAADe2CRtoqQVbVCUwuKYtqCqBNmVt", - "DT9gaXZbpRwLiZjsrEUg4WfWNx3hUdZmq4G1gEahyQHD", - "DtAdk3dh9Uz43o2q4enbLvUHYUahPjM7jWku1iBRc3Jm", - "DtAwToxvUdqLw8Vat4FcC9WnCvkK5HgN89A2yWfDSeGi", - "DTB9fE2sg99siccXey4aj5YaQqsLx7kTJrFxL38cXXCm", - "DtBWHQRXCT5htdqBPMJjVv35NXpNsscprjsg1Uu6Hhqu", - "DtDA8fVkMXVN6PYzdvcQBcBUJ7c6atiEebh5EyomYyLV", - "DTDiBe1ZLTJGzazmd3k6oHxKGTitNT6swT68MguT8QaS", - "DTf6GM4pB2LY8PyDYYaDHc4SVYWC5c9BD4kwMnPbyZsD", - "DTfJRiAVyiULdo26CQ5Dpzmt8gRCG8MhK5QCRkpngEST", - "DTkTW9S3CWtVW7WRcfKwBmSBzpt4oh7dtfevpyLPyuPc", - "dTN8Th32Rx8yKgbiA6fGAgLLVRJqPoYz5nTgWadFvDo", - "DTPPJWkD94MGE2oA3cyszmCAS3QvxNjXznnRGjpanbRS", - "DTQ4JcbGsYQNXUd5kBfbecySRPyoUNbMLoB4bjaw9QTE", - "DtqjPaZAuxaNRsX1u9e5EHFF2JjeTFwF5SZ9YFJ6PyTj", - "DTqjs7XR1ieZ6kUQifNETeqv5BxAdXbBCcNQpYEK99ia", - "dtReKqjwFzzLZLBdsigXUtv1qFkHddyVnbETxkDUyVS", - "DTRMJmLxJ7oLcC6ruiZesnQzPfjkZhjcfE6CULEoPYTP", - "DTtmneTCyWqaT7fK8DgM8oY7U7hKvcJMwkjphidQEJFw", - "DTyB7AA8KUV2xwdScMXG6MLfVbF76qu5WyFsqUkpLfRz", - "DU3Kw8ah5hm3VczT7NfDnv6AboZa4yKg7wtJjUmjY31F", - "DU4k8w2TY6X9C3LjCJR3ZDHKQgHnccsrrqh1rrongkxw", - "Du5zdm6f23229xviUfyKH9gZmaPDUoxVpSY4TTmzQmj5", - "DubcTVW5Gb2QTULm7nyadUA3zegMnekobJcgwdfrbafT", - "DUBmY4dHTYLveETp9KhExhtL9cng3MX6T29NWQBz2bVf", - "DUDak4ns1VYshAbCTgdaXuL5UXk1F8NcMYdL2dB61JJf", - "DueUJSuj8mo85ipnaxjpjfsqSCZ6oMvYJETjhNHFW4mx", - "DUfPZeyBMX8FSkFFTqogJWaQ18uA89d8Crmh7GDRVCg9", - "DUKgjPzqTdHLiJFjUtNNT2A73FJGDuzMYiAQDCKrsfV8", - "DUKLMgGViPGBddM8NYxTpTmA9BJGRmLunwW996tqNXXU", - "DUmyiy67jZKCTipwnHQ8YpvMy7e5oe45EMBrigQFo1TT", - "DuPVRnRT1USatXjWG413f4yC6FTH8kC4q7Nv6L1P5GaT", - "DUQFBN6tUSjBfZkMBb9dVhKpZKuX5BAKV5ATW1snCkzU", - "DurPT8VL2ehjWVB77WyV3LQMSERzPvu1ezduD1eVeqVH", - "DuV56M7eyzh6Gycs5NWHykCUkLxWHu6cFebJGGD8Y1o5", - "dUx1SFLEELX3sRxEB32pk5Tifq8Md15Ty5wGRsX4PEN", - "Dv4B8iFP8ftBrkbRBr4Ztdz6x2ofPopmyg7i1f9XgGNJ", - "Dv5T78i257qrL5o1SkNrXeuyT9wZKiRpRTqJNWEq4eHM", - "DV78gathrorcpWsWrUkWrWNowLXpizKsPBupStzeAJnL", - "Dv9miU3J8V88uMkUfUPQSA8jnPPqna123e4Q8ESzVtYw", - "Dv9qRs8tB9oCGdA8FBtNtT7SLuttmVnDFT5xoaq9NFTC", - "DVb7vjqcUX6chUxnkZQdPjvo38EYkUopwDE8j9Co21dG", - "DVbHAVYnxHTUeXwFvVMRWUPhkeozQTPUu5CtRgW5yD59", - "Dvc24wNUG54rRJ7diwYVReAuGsbR3WTh2YXvVPYS8Uk5", - "DVnKs7XAL9au7cWrTT335gZ3agJVwrqeSVnSWANo1SJG", - "Dvo25mSgAC7FFpd8u9yR1VcrkfbBqcL36SeLHdNPGTgM", - "Dvt316BQ9SUMao9Asdn1krJa5PgTz9zdgDr8sSognvxo", - "DW1PfBfwWFs53YckmHhEJFHLQDGgiRTSLhGMoQcdVfjg", - "DW258xcFsGer3WDyEHzVPkqaPrpBQLnCjRQuvr9eA8Ue", - "DWbS2L1vcBoov91wvUwWG1T3Qje8pVy385q1qjrS9Mtu", - "DwcCW5dCi8hWMSoX6Yh1WtWChpm5kcpXnKuY1CP4tSv6", - "DwCuwTRTXQWm5M2b55h5oyx1zWkNvTUVGwmUGvBAVbqc", - "DWdR1rrRRtNy9CmbCybaMnzezgJT4aAEgsneQ3Kznx89", - "DWEpNUdJAt2gyVAdu4az8za2rzo8N7tujQMPg123DV96", - "DwFxH81nEGB6fdjtD4r6R6dBe2PYAQ39M1WjoYicvGNU", - "DwHboyTMftRcCRnV4mw8wVFCw3wznxspkko6LjLEWG9k", - "DWic5rF2jQeAQr771cCgzyLbEMgXaq1AUyhnpmgDze1a", - "DwiXbsvSTLDcMs6E8cTA1nXpr5LufWTpnKMnDXCLiiXL", - "DWMAZvHm861ZhsMuzoRMzMgxdLv6fr5rfefxk6GbXwuw", - "DWp8LbVko668wBTsxDU23Fc3GmTwJF5bhkqryfemNLyz", - "DWRY26yk7UHpwhCTZ1cRMeZZRRdH4Xk5z99pgBw29hha", - "DwTrkvqhfbefim3vZdrhkjxmFr1kA814ETu4GUD5qwwP", - "Dwu3AC6pGm5SU7c2HnbKgAHxGKEkBwWppN7WAQH3q7Si", - "DwZBPYjUMRiGGnC3KQBRvtdgVLTsunhmR1CYQEg24YLS", - "DWzhrtFFZEqPGvgeCH3GeyBwjAqGeGoYUPa5jdtu8gcd", - "DWZSdc7awvkMB2heq61tBt8zWVPYP5vHuo2EEGPpwiks", - "Dx4bMuKpGaxAnd53QYDyKhD45PjuFLx16mrgoRK36STf", - "Dx4qoPTLSRdbd4h5cy2TD5rDyV1d7LxQYdSY1TLStjcp", - "DX6Uuwc6jPTF1nqah3reNYpe28cjAzV5LViwK61bkgBf", - "Dx7UU4my4DNPwRkHnJN657sMCakPWYPcWwBGf7WUiyYE", - "DXCvzBZcrUEtzWU8MkwQSUmdfviEFbSACTjFXCZa6F3E", - "DXCzguRGhTGvFm9hdVsDkFi4S3n6W2yrNeUjrFN8tkvL", - "DxfbAi8AXt88GKjH2BJQG3BE29TqxYqQRG16hg6kHZjm", - "DxfS1cXu71yodvy7u6rsjowrMS4Y6YQkdcSpgKpfspzZ", - "DXGGtG5B8JuNFRA5RS8X18HbTRot4dqFiY6GVL5WwxxC", - "DXgJY9hsVmAXTqWQa6WJQDE7n193E4qB1jWHogcJ5Mx6", - "DxkUXtc4YdGSJejy3fM5NXtyp3Qk9hNwC9yB3wERAvrh", - "DxLtXrLUrqja3EFjkR4PXNYCuyVtaQnozonCdf3iZk8X", - "DXoTHzcaPipsrZzuSSF5PR6wcTMWnW6pt6VypiuKniGj", - "DxQTxfgNhgzpRR8dZZku9XHPpWyy2Fb7oJSWoLTKwwKt", - "DyBZXQbem4fRTQcf1JgkCRExwN57fYeBBdDnPbJBNFhg", - "dyEBiLy8Tty9nMeV6aUYU6qHVobsm4YNQmTGRhyvUB5", - "Dyex8xUmMLCM5aj3PRKAuMMcuKjqYhL8iqwQiKCit5pd", - "DyoVzxMFgZfch9L2jDYz3kpEctE7CVPVjvseCnGxqVqt", - "DYvFNbUnmfBBrfQhxbkig4wZuN5ZaJVyLzzBbLgBYxsL", - "DyVJSPShejuyLpgBGR34p5hdQXqt1jpRX51sBusL1jov", - "Dz7kQ4v3TUmS9yBu3Hm7VQzAJm79H3pca69jvf1MhFtU", - "DzesSjb785mtCs2f2N5UAfnnF8obRbECAe4AQaRVmX4X", - "DZGX58qpdbUo3ADh9RL1wqqyHtfGk5yRLg1aXdvJZpxC", - "DZmY6xZnD1EiCBtAEMn4jkPVzkDufj2VjrriVeF68gGM", - "DZPn1XMuoBpNQzcXozfMMCUJ8YxgKyJP1Su5oKvvJk6h", - "DZpRHQVrC4d18iTtqMVL4ddH9sMt8bDeQWvWYApXUyZT", - "DzqTcFNTRjodhbSve5jHiaoejcxiAWaHSAuu74yVT3xV", - "DzTb7aPtvxo5tbbKxEjiSuBe74tdgswdj3BY8LwstoBg", - "DZVvuG1Q4zwtWhdBwJFeZpKmWToKq3PhY5DRFg177ScP", - "DzxNmWD99qvkPdDR94ojXhUrpzT8VdqB5ktYX7fZr4gc", - "DZZgPSBDMDyFV5bkoCJdufANnbQ3RwAXhGXg82m6PuuM", - "E1foRS5kdmdhAPSpwSA3DW5VVPFtDhTSvJMUYQnnycpt", - "E1PofecPWPmjvyDMCxUznwbs6zo7ix91SzyGLkk3KE4R", - "E25BqJUzSjyzeZQR8LYUcUNNVrgRLHhXxhPtZGB7KCCp", - "E25g8333eDX7NscJtSWSJ9x41xSbDywZ6um6hG5uKzm", - "E2cy4hqcUpdyMpx3TuHKpdW2cJZ3cTSthk4jfqJryt6B", - "E2NJ6cSEYaKGeSGTvtkQp5RFoRWT7NZ5X12wB8HmBbnP", - "E2rAcJ1tEzXK1cqDT6UhtyJmHzK3MvnZsLDYD7EkTGJN", - "E2Ydx12gumhPgxcFfxmaz796aC5it3vooZvAJYaaaEkz", - "E357EN4RkN3gQUUxP93hdy4iKkihiqhgNznBXRaTvPMf", - "E36wj8TugYUB94FtGrs9zPdb9SuT6jP4V2eumMXVy8tk", - "E3DU6A5VqAbP8jtQVohvgiNqPzGx1gSK8CdZ7aJAa5Yp", - "E3E7vqoSqHBYpCDNfHs8B5oZFhw1xYkC3zHPJRdoK22u", - "E3JbTm47vqjNVPzYF8xjXPEZuh3PwbudqsaxtutF3YxZ", - "E3kX7M7m6SD9AUtY8KCweUhK291Rh4pYWdR5HuhbTJ9H", - "E3NCr9CVJh5cMPP23aw3v5fHa9rqbU3JPBokihtnDrYo", - "E3sDJ8KkYF4B54zVxcAX9idMUcaxL5jVtpRGPMss11se", - "E3TZ7RJmzrHeWzo83Gi73Ub3j7f23uh69RrQk3mNzHq5", - "E3uQhkdfCndiBBqhUhcsb56WVu2vyncCzkich9sw5KBz", - "E3YPgpK7Fsj5kk1uQdwrdooYgpuw8S9LtJfSEXXge22S", - "E3Z8wwYH5boh4K8P7GT1LbsGGg9K8aavuuYn9f43648u", - "E43Lu6um98dGLscCuPUobgKC2oLANeByzqdab5KjxV1W", - "E4asEAsMg9ELreg62zE39MF9uvQsyfcd4w3TzU3XVf4x", - "E4hUtYZauyUdGAvypKfmTfZYecnUEpay7UCUhDNoB6Ms", - "E4N1fuJhHrTVTHErvR2P1t1HvKHqTz7K3dzYJUKNcLCF", - "E4N2GwgzdCDsrXv6tQmLqZ55GE78nsw4QSS7eHDPKu9y", - "E4nLHBeELXQVRHwN8F5WiFYjKk1EEJFm6x8fuDaGeVPT", - "E4nvaA2qrMXhyRsYu2UhEfyuV8mFMtApwunjQ5xn2e7u", - "E4tSSHKCb3vgVfVaizAW1Vi7F9HHNzc98M5TLjzaR14s", - "E4UuiUAZSh22Hy6nyTSCguKQs1Tpv92uFmQGpKJvf8X6", - "E4YYWrsKv9YkBjLRtVNYn792RavzkXL6NPJ5Z4sHXiG5", - "E4ZAefZFwapRtikBHrRnniEdxqcDVkPusWU4ywCvfuyp", - "E59WeGMjsdwwq3cpBnudJXgXYvwb7Wfz9n8Lc5TXFKB2", - "E5q213N5LpkpABYBWrHWaiPveFZGCRv49sq96wAZu9Tt", - "E5WjvDrvWrZnW6NLR1mToxY1ATRBrppTPSpBgdnBoD4v", - "E5yehypUe6uYm88hQWVTX1AcAZJiPgffV74GJNYHPxGt", - "E66LrS5Bm2kDCa1XzVDqnttRiGktF5ymgqbsnKiYitZN", - "E68E2yXwPvqW3xLDkWa7pVdpW76S5b18M49xVyZGxaMR", - "E6CYBxa8R8EVWEiLq4mMu7fWG9L7EckESqzrjqVhWJVG", - "E6H5jXk5dTvaHbEQ3QbwwqsJaKqLnKf4tcuifxNmoHUQ", - "E6MuSSCF5aoBstVcZaD6sk7hkQrxvh7s5ttVt8NzAiNM", - "E6VmtgRL3ePHZQVZA8u8mitaWNCSD3ySJf7jxFh7NkNA", - "E7NGTJrr79kNHQZZB8a6Rn9dSSJiTusbcTxmSXoSM9Hc", - "E7SRJDYXtowiqHgyTu2GEuysE8fW7xMZmmjo9Tk2BcZd", - "E7uwSFJLMhVrGWuM8ijY8qvSxeoHbaoQ4G514GMBQFdT", - "E7VyhbeBervYPVK578G7Hk843TUxZKiKsv56C89Ai7nD", - "E7ze43f46ognNCZmY6qBysmtP29A4SjDfdwef2GMdnVB", - "E87fFa7Mhrusbgtxwr4T2G4FLNg4sQzv56bVfW4hbUH2", - "E8CDgCsCgLf3gBtQVxhKiL7m8DgUdrDAi4uHMjcPfZVW", - "E8rnBee1jgy8v5WjPX7i7CK7PR6zZni5fX8hDjV5Udhd", - "E8tq13GJhBNtwFezi8R9PjTNicxvknDkCfoY2GhGuenf", - "E91WPX6VhiGDgn7MsMNdqkePFawdiCdd2KMaK8Le4Tvz", - "E94Rum6SYtFXhNFtkWJCpMdzu7e9aV8MdKLij45T41H9", - "E9b3eszGcnxiBdNfKQeCLQDM8cyHC71Hd6TvXS6G78RQ", - "E9bcuniYQhMscfMjE8zaAXQ47TH56gsQoKuzvqXHxnAY", - "E9bwsVRDSEBnH2CbMRcdfiTjbkbUVcoYDrJMhHbESC1d", - "E9exx8kSayTXnkkTCAZT6JKaCJ1ysjTnwyywYWwECmHo", - "E9hGDyC5ifeW4i4KqGhmiNhVqyuthyGWNg1hMiiyZoJb", - "E9MBvpzSGqTr2HGnLVf5gww4W65mkiJV8GC1R6YFvouG", - "E9nLyV1V99DSxbAr9WcvXQCx4sJkJewAw7LF59yJK5io", - "E9qZxXtwWT5FuwsXHLjA4cjJyyeYb3ixHxBSrJJDzPwx", - "E9vpHp9wvEZzLGHXMf3s5dQa555ecDAHY2ipddLq2RTd", - "E9WbzbArKL5bnW3NTYZPKuU2dxMiznaWAyc4jpNDfdv7", - "E9WQKtoMMJLHhNvAVuSzTRFJaKhdEu2zM29wHSGvuAVR", - "E9XhLYQ4mXmxb4nLUFBbEnAs9QTNJEhJkJRGh3MQQ2rw", - "E9zZpVWU5wn8WtMgnG4Lwkfx1pqYccCFh4MTDrxfh6ME", - "EA6BCVDr6jpy36pzEpKaZNPBmfXBLvondeGHjtPgLWt", - "Ea6QXqMnvhMAkR6uxrHuAUppsF9QeVuAcbCGN2YWk6R5", - "EA9oJviXnFk89gV5Hm4XubFoYDBZiXabh7M2jKWoyZGM", - "EAam8AbKTEHnJaN4Pb71oJHReT7rkXguW2owoigaGLH6", - "EakS5gnzQ95bvR3qN6wvm5j8Vh8uXyGXsmL6qhM42jZ5", - "EaoJc7czkc2gaRqfGcKGbsQMFLz9FiEnqCahLxY7dEUG", - "EaqH85cYAQoUb5KHUPhn7DGZfZJRukwqxgZVEWJ3ifpo", - "Earu29pJnWSRtrQ1gPEea5jYLAGbgUU2sHvcEBQmMaDy", - "EaT8oGEMsSEbcQHeBVJhvuR7mY4PSNFm6M1XS1SQwb4F", - "EaUMfbMjjqmZ8QgNs3uTE5FNu65euCVsYuHZT7a94Xay", - "EAvERjj5TZB5QzACBBsF3hEAxaHWcP1pMT6nt7cdSxUZ", - "EaVhV1UzbiAh8BCdTiAbvoGWktfK7fdR4PEXkkN1qG2n", - "Eb6WvGEGzr2yaJgX3yKv3KsxupBME3QdGpKvp6wKCSsh", - "EBB42ZLTjtMjAbNjVVWdtS5hMh1mEh5E27ECzMyKtEP9", - "EBcu9uBaLVhVQuGzhNdDtpFAoecPecrhVKko48AnZ7zm", - "EBDnuJT5USg5HsQSZtWT1q8y5XjgW21b1ebYSahcX9V5", - "EBFeccPasCMn4WSp2BgPX844hBCgDLSxjpAdutgQ1DMX", - "EbgzbkV3vopZsNFWg51eVk82HEwZe6baQpfr4vurAkyz", - "EbHBuqyoDhdRadfXHBYwzR8tozSknSU4GvB3BoMubRs2", - "EBhwNXAQpnp879YXmmRiCL37AWZoGf7r1g7asg7a6mee", - "EBkqxwDt5fUorb1PPaiDHXvrgDy5qu6NfjXRf2seNhAv", - "EBM3BCrC7Diek9TBiRac2z22orPcmRgpgcfosRYLK9JJ", - "EBqSPQtUzVCeTKbEKq4XTowhTHvpGbjV4mUdQYTAJMM4", - "EBUmXF7Jv2kPk2ANMxu1ggRNtFfUkj6vpnuufqaSXHrs", - "EbuSoLHithmNPTQHSafeU7E67cMg6VkUispbTDunizE7", - "EbVCEn2DQjEspKn1kJYACrx5r5EjNcFKaSL5fxJ2Tois", - "EbVMp8QBqpVazpssnhL4eN7D598NUov1MgGtBagqMfPH", - "EBxhSfAWW2Cfouvj1k242W6U8krZVAxJS47SG8UKb4ch", - "EC1TjttBQaKU1dXuMbv4ZMSFXuPDt7UCMvNXruxCXdA8", - "Ec7d7N5r1xHSzq6nZg7o2nVVaymvU2APpagmBJ6LQ7Zf", - "Ec7i4YZM6mDeDyNwNbZdU9ACH5imAVQuGi5uZpcjGWLm", - "EC8cRNmwgbhbs5LtvufLkme1QqedbugySgkofYtPoDKd", - "ECAaSXi49ZJBQT3gSYo5VLLdbmBeuQvhuZcXbEb17cMS", - "ECaNZkRLVfNUHhGKMEQsYBV7HHjGnpdfsAYqiMcSkqkr", - "EcbnXv9TMf59KKQ2yD41UXZ29P8Vpc9NHZoDU7jrLuPd", - "ECbxCeH8zoqH1ZMJ5R9EEUMCosLaGoU1mvBwP958bY6S", - "ECCDvzUjbKACqAakFEa9EZC4Vq8sVTDc1n9hLC6DjDP4", - "EcD1RapVJ6LAx5d9jo6QWMcWV17AJKBDR1XR2qZjA6z", - "EcE4cmMG6CX4z9LdEsykVu3mSXNuXAqEtg2LvzCX29bM", - "ECEcSLUe8Uq2ikg4GdYXtWNe8dUwzK3xc8AkUf8b5MTK", - "EceYU2ZDuVCZ48CR8yJsMWrDHxn98SJ8Jw1iVzDLdo4s", - "ECFPfdC2KXmf14T4aA79JZ6SAZrcQCF4qURyGtycioU", - "ECHQnEu6Hn3BV5kanFP4m6hz3XnST9ncDHPLKbtxHUhM", - "ECkgLwKD3Lg2hQsUgQkJdv1mvgKxf2p8Wx23z5A1gNNR", - "EcSd3jwTEz5XRTbuZ4uVfQJ7BDm59KN9MsoUVqMW3wiN", - "EctCZALcqG8x5Y9BfoVxoJApojuB163r4bp71qAJ5PCa", - "ECYTLkfbyQV1piR86TJK38yvPKypUtubb9CoLkGzPFC5", - "Ed2cbqffj85JtCw9fKX6weRN3amAZ6upPMUJ49RZzYru", - "ED3Y3cuH3wtHXT8TmbDE5toHU6kwQzevWtvkP6rGFNgc", - "ED4pSxzaemm1KZ2kgSnimKp3nw8GB4qpUSmFCxhqUKRw", - "ED8nPtDn4qS5pQbq3ymmmPwnpxSAygBBxam85ozUQE4N", - "EDBimmHbZkfCx1sYCvePwRsRktGvEPczrBWrRhGUaWi8", - "Edbnojm7WupYER4CGMU8CM5xPRknmHL4QWTp8SGmnYKE", - "EdCwWrXw4yyXc3UWQFx9VEztu7v7Rij5WFbRXUrmSCdA", - "EDD6CuVDzPU7g9PCUZcM7Bf4rQqeNrt9ugCBh1iVRMaN", - "EdgHmRmpczrq4Fp35UXzpTmCQDSL7T3MmraakxK2SXxR", - "EDgVnoUk6UYx8CdVcXSXwgqMDa8DFLd4MdnC4dZF7EiK", - "EDm2T8SHCxhUgAfPMH7YE7nsSVEB6zijoxYF9fuKrbYf", - "Edmn4FjZMGSmCjCE2FBLzHNjukEXbzEKiHptMfj87uU9", - "EdMtwX5q383y45kz6LeKjAMiUSHUWzJo43zhfTQs3J9i", - "EdNeYM6KpBwehsvoNdmDq8KMcgj7d3TKUx8d8gotCkC8", - "EdP9NSZNGS6D3ePwiUDFtk4esUABb1RdEetuDH3pre6e", - "EDpQ655JNe3hFVgMdCjz3JJhAVkZpwNguyYxUvQbvbc6", - "EdSaRxfyh1Wjeq331Cr7aSpdentiPyCPXVHvSacovueU", - "EDTQy3XFuV93BxXePCZhi5ccBYB9JCKXix133K3pNMG5", - "EdujCuWbg7QKyty42igLbYvxGfWNWB5VsKZyi1wHbHTc", - "EDV1P3dLAxUgRpaE5KQW9iB6Bbvq7pPDStjnqVmNM1JS", - "EdvYdFmL9UFyDDJ2fBdToCpS2u88hC552ihpUECt8mnx", - "edX7mfCcFjwX9e5R2PZKU3zRstdsaGzQX9cVgDN9A4w", - "Edz3K4fo77U6sFZERAA8JFPnTcC1KYnLL35pCyw7ihjw", - "EE2rrZAKPUiD1AzNTmZC7JN2bhRuQZRLmVLwjq2XcZSx", - "EE2rSKetydq6C4DkNeeRfffE8ZYJjWhxNnfMisGgRpcr", - "EE3uPvztSAkgJ99KYSsWrNjEoU23Ni1pid55WveXbp8b", - "Ee6kHRXvq1gGH79JpbHT9bXYDyGGUwspyfbSviLrXPr7", - "Ee7qEiGrF6RQph8QSdibHqmk86i75XvxwhWBHj14mi8C", - "EEBa8frib8zBLxj61NEMAUoEyrHFgV9MUzneHVHFax42", - "EeDqupDVXQ2RQyGZ4ow4KSU6mSDN4msdB6fi3TpV4N3w", - "EedTQxzUFXQaEipBb251AnS75r4SVMfc9SKd57tX2LJv", - "EeebKTaPKaff2WmcaHyMH8mTVyAL8Gku6Z2owg7Aj29Y", - "Eeejz5vdyz44hsyeAFmzibQmpmxks18ize5NQVVrVJxM", - "EegRnAxvtvgU5dfZsGWvs2jVvoPVGBfWuUSDKHozkpAv", - "EeHdr93aBEXELpbDx9p8ScgzstUZuNZmFFHM7oPccXzS", - "EEioq51C6qugsiwk7AN2tf6UwrZF2MsnviF4mFwtzV4g", - "EeJVSRhpKixSfPey4JTRPjiNwTVx55scquHT99gYBmZS", - "Eem6rzePhp56kYBvWNgU89PNjrnWqJs22WcuiSjmkBc5", - "EEpAEPJ1MCfZJes2sdCtkFwdMWvRPmDNnynnG2JkhGso", - "EeSncmDSPKG9sTy3rsyXNpnRrNVvYiXqJbkLcYjrGmP1", - "EEuszqommFbgrgFsZx8F2C6ZcVABjq86h3Bbpg85orgz", - "Eex8CrgSh4e5pramo2Lpn6jjh9xYshu62xQAED4CvB6g", - "Ef3JE32ceZjx8jQc4R7gYz7fJN5zGJoMcCWx5MfRj9QQ", - "Ef5gVy3PFRJA7uQ4UkAD6AufNcZNtHN45k5N3L5mYatU", - "EF64j4PUFobMXwALnm5V7o3gYUii7qeJYTkXJKxL7aua", - "Ef6htXWDkCx4ZxcJMxA8J7rN5fCpui9wzqqAgmgBak9G", - "EFfvcofQ12Q87Qer93MM1ZEGrejHNxc5FQqZrhaEuAMq", - "EffWtE22iP6qXtz6gy9cphQN7Fus6L8fpywEaZaL7ovD", - "EfHsjv7dEeCB5w6RAZvEsKSsEztUjEi3phfpbDpXYRq8", - "EFUguUoBWZZZu4ErTsU77EhtFbJsEUjynZbjmXS3kkeT", - "EfW4A4GnQTLMDgXt8ZRB9Do35Qk1pVBcghF7bgHqgjet", - "EfwYe7ahjRYRaTXULGvL4NtChKLEVcPNTsYxa2HfQnke", - "EfySAAyytkuDEN1MkUC1hDNuxzFDVdhW1nB28ZHRFwyg", - "EfZWJ8DPBn6GD9xcD34bq2iGfGRaSHJ74a1mQQUS1dKA", - "EFZYbuoLoBVRmXS9h3KjAshoH4JCPbqgYh8GbM8ZKKuq", - "EG8D25QxDJ6nbD3oBpu4tPDvihriy9mFiPq3CxCGFiPF", - "EGAKpYYhiEqaYPHqELFLoW96uuCnLoSygTpJQyX2hsbd", - "EgANuXjUMWfQPMimR6nqnWS1oWBSaZ3i6EPLDDFUhPsZ", - "Egax4hJe9Z87fkxUUi6DkuAHPomqrRtuyP2dL13eWPRf", - "Egfsg9WxAqxQkEWvdAfXJdSKwEmuZySTFpdp2T1tjfg4", - "Egg18f5SUozL8AwSF2SfzUSxASEfPThsmWVzA648HHFE", - "EghkgnGmNmLiPsZmgnqdUBDsgtex1Bi3guh7Vocm9C7J", - "EgHzs3tMmSmJAiKMkyCPc73TV846VfiDX16uVEEADpgj", - "EGiZsf6rUT8agezf4VKjB7xguBr6GVhNwbxLVEvjBnDe", - "EgJ8YwE68gSp9URg11Y69qCBEyKrNvUX3UYu6gfcwvXr", - "EGknxV4LZM4DNL1Y68iAPQEdLsMZbL82wQbDmsGw6w8", - "EgLL4omqVVxgSCU7bAUP2XkiP5ER28j44D1BnvRSRrQp", - "EGPAFp7JnWFGHwyw5JsMUANB2MDKed1pwe13xKHWHmMT", - "EgQ4ZdobHjVmgdzMvFhk6MrTWcyh6ULD6m2VFNqdCGx7", - "EGR5mW7QjJriWjPzDswcC5njXPx2zzTruTRZKS9X2Zbv", - "EGUokLgsyQt92vyiZMZLQK7c6QMkJtyTHMQyNhhfbKK5", - "EgvhNP4BRARwzoA8R8YbW4Laf1D4v6WvrWmnLSNQuhe9", - "egXPoYGqdSkqhuUycbzrYdiJh7q5rWsykkTPyxGqXWt", - "eH4SrRi1kehQTNYAi7kXTcgT7LKzTThxjf8cJd38nkn", - "EH5MgZDRVf1X3w9Hh8xVuyFChUjBaQ7opYf9Q7i2QRLG", - "Eh6TsDUr5oUpNnhpH7wt1FcFS1xvEz75PMudToLgZerc", - "Eh7p4k4TKsd9pDGEfNU7pKnSsbf39RV4WnpYBgY35dP4", - "EHaPkpLJUoNLwEYQwVEEa2HEvfkhXyyRAea7ghLMig6b", - "EhbkxVg79mPaexn5wKkivhyu3GmPeUfQPYF6Mfj3fpWZ", - "EhbuwRFUHGCrS7sQmRQMt1CgcuJXCDSwdADfSaEgdjQw", - "EhcCw2oFQPekFqZFNqCucQPR5b4ooZHq9AReeT3AzTb8", - "EHDmJ5km617HYx5nPTXLuhTLSbprUagEn1ahFdxFaGF4", - "EHfkVytUGk68AV8H9Pp3iuQ6UrWC5mgHQrLWb3gMeTPq", - "EHH8qZAVqgUvz3m2FbUS9pef2nGgK6skTx4ViU9TuNNS", - "EHjNSy6NjUK4wpsS6Wbeqy5Pi41y7T2xw4T7aXjrf5pj", - "EhJnXqSV4wjCEA1bH8LeZQZmJnMQXJEMj6Qnya3u68gn", - "EhkMK9DaJWRP6uG1kUNXm6j7BeaVaVxVcmCkgijYwGVu", - "EhPBGGesveq5C5H5gJtkob16gb381c2fQ36yL8dQspnF", - "Ehq81kYypo11pMb829etueYh1unr41fp2TrrsnSaa9YU", - "EhRSYFM1RgJoTaZ8LXHwePB6VGRPyYuXE1KiHNnSkX3p", - "EHrUwpT5GSaJXMT26cWHkUCKX79jLpMBWdMgj7KsbrKW", - "EhSqnUnBcQinLLB7yj9p8jSQg6NngiQVa8j2jBA9tfku", - "EHue2VBTzAssRW3hH3A3ZSR7g3uNktwc6xTrxiaABqUu", - "EHve4fLMKhezrZwuvAZntwzFphAjNQACASPa3dzWWN5K", - "EhxLJWG4Mx4QB8MVfoNLApiD43yKRES1gdD3zQzsFiLp", - "EhZmFRvBcYQU5TscYdQV2i66pmmeKrzecbHYbUT9fuyk", - "Ei9V9JQ6d5dTBVf1k3WWa5W3zeM2WV3tFfzZfDM6EJaw", - "EicET7E1Qj5b9NAFU5WgAVbjwxxiAxGchAea9dj1XsDD", - "EicYAgyPkGNv4gHbjJndnuUfDyaLnrSoXuU4Ku3ow2n4", - "EikadJgwVsyVfD4DaknPamdbzGrmR3TYn5WbyE9ZdNCk", - "EikaMcPJZ253k8dCZL97rzBdFTqMqtnJFib3Jkh5y7uX", - "Eix5krwnUbTcmBcheF4tF1wUiRu2FtJQ3GuT3Te7C3M9", - "Ej5DQmtYPzcAXVQ8DgEqciWQZXeRj6jGaMq7ySYS7Tvz", - "EjA5KDF6xjFprx2MFcuvkz6WfFP57JhBUkqeTVdcQz4g", - "EjabB6nn2xMkuqhcjPhRCFCc9U17ksgADdFYn8gx121Y", - "EJaFE9ro5kQ1NbvPS1YD24iuswAdFt8vTsVRyM7VnWUH", - "EjcB41hrq5Ltr9Yvda3jQ8zGkkfFGKadkykTCQnPeCne", - "EJcuUAoiwsEvVJT9bTn2izUMoM7Rt68m9cjczxR7M8JY", - "EjF84cDbMCzqJmnx9yxAYCDq3Z2fSnVrNAHdo9eQVZnq", - "EJGvYNiu7yh1nBWNJtayBC4sV3UoULEdA7Z5sALuvAdC", - "EjGwW6Se2irvNfFx4NkSrTvbpWCRVema7tWDbqoGYe6z", - "EjhWFV5f5nxUx2YaSPfPCXfd9iZiH9kFKJhLKpNUdWWH", - "EJJtA4Uzis7a2eowSGCGgXypScp9aLzjJAiKrBzdT2zJ", - "EJn2CAQoepXRbG1MYKBfC3eSZJrB8PH92ba58HqN2jzQ", - "EJpcT1Pjn4qyvpGQXYU41Zgxq5jJe4X9VhmxUse3TRPW", - "EJqVBubhCVSMFCXrLWPUL5HcA5dkfVMcJkLyPRzAoUcn", - "EJrHWAhsNxcSjWBujdzkeR3MyFK7Jmh41wWLYbJ3zTro", - "EJRjGeKT1dPRiaudwhEepjrsnkJ986RjJbiurjPiBe6Q", - "EJvj2pSGfG2vcRZ5dzuwLokme8xXABnXL44Z61w3hxQX", - "EjwARxkYs6gYBPhcsEDrFiXKkfmjX9KSE4xQUxwq5M1j", - "EjYjThh5e3rd4qfoFf2nc3SgTPf3kGBMoELEnCXZidsE", - "EJyzeKRHL7ZQq21XNCDxHXTZGbdhM24yMosQc11SDhae", - "Ek2aw3vFy3NDDRRtsr4fhY3Go9UcYc4P1PTm1EVWiAH8", - "EK4qbySXjBfApFA1cpb1hzWUCNd7JCZrzWbGiJgKMNvc", - "EKBBsq7snZXyabwMa7jbyyRTMhaUQqtDHtpVgDnSg19c", - "EkC95koMgTHd6kkHNfvz3xX3Sr7CTE2GP9qitSP4NT3F", - "EKCBxULD7YuyejuQgEmLg9pS6b1bfXDPL3SbpQuSUP7L", - "EkCbYFvhbY1QmuA4D5XTggghpPWsVWumHkBZYuLBqyMG", - "EkEUHoM7fN2qVG5pS2sMnm4EeJcSEbu5uFbqHV2VSz1U", - "EKgjzpYxEAreSnzFhAqUaR9Vh4kKuvJMHmzcFmn73JU1", - "EkgS5stawGtHk5ducQDbGQo741VeVue9uTipgJMo32gK", - "EKGVVNbAfGGDUYkS9sSSXFdoF76fRgoEt69bW3xVpRfw", - "EKH17WCLR6oCVbUJR7YcThnTNRNf1upYRvSnha4Xu7cN", - "EKmdAcisowiVPoHALxSqfyYfqp6vvYbEtKtqdeZsoBGP", - "EkPH7Z59PrtKvyDKuoS2fLsuvW9dhMVMmGvhXmKt4qsh", - "EKpqwfKsNSthdDwZL6KtcPcxGQECeVK6HGKjnTB978YK", - "EKqQWMvZ55sM1tWYQrNo6Y4XUQzxjtTBjjtK9XYHi3oc", - "EkT6D1JNExdWPUtBwdQxHV6fY5FPKE56vDuDeN2xaQdm", - "EkVaQMGB3cbyKdqBwBagGtURjtoXsP6pS7HGyizwhUs2", - "EKxYfdfsxAR6BSpYKW3LD63UMn9ZWYUNRJ7GUonWSdrK", - "EL3mPSEjnjH7zEage1HaVxf7oSecbqJyhVkGG8eeQuCx", - "EL3RZmhvLAMMoDip59M3oKgqXXzHAPdZ88KQ2h82mCB8", - "EL4XzG7pU4eV2qwsTRMLt49hZCPBZYFi4qUA92u4HFum", - "EL7atsRxDwtyGxJBwVhnaGqf47j5qeA4U8BAb3L19Lst", - "ELCh9Q8hBATgKNmEvSyHRkNBcWEaSh1s1pPgomu3uobd", - "ELERzoazbkXxQdP1qPGxnVVGBJy2W7Do2MMRt35N2H7J", - "ELJyNgQ1jng6XCTGTJoha7af8srgZdQKdBGrZ988G4Wi", - "ELnG2qPbp3jRcXH5ksAbjadHo7E8A72mb7q3xbQr2qB8", - "ELrRQeQCgc1orfaRCxpxEhDbVNUpRb48fkgNx2sfn4PZ", - "ELsehFqpFHn2hJoJgEuSCpYhTvjCxFz9ToiiCXWUE2Tx", - "ELuh4horoRCeMDuqVUP2gGVpWzS1K6bbnCQVsXijK9L5", - "ELumXvF6tE3nb4LKd44diZPVKiokDcx93Fv7Ca5511ZC", - "ELWMKHPVZpFTwBSzVPF2q4nmvexLxWycjy8fuoC6egBE", - "ELY6u8Reinx7k2s9wgQA6jHHTsog7eN6qAYeTh2bNYx", - "ELYCbYhVh7Dz7hvTttmFHArEKhrZXnnfonCuEmqbgqfe", - "Em5DMGSiRzvb795hi1pJRWaYpKZZesyrhnaGYZQ45aNJ", - "Em5GWUVkAtbHkyQunyGxG2G1JmCCMrRiRRvygGfc8iUp", - "EM8VCVSwi6rQ3zpage3r6E8xQvREgr8tiy8HfurKoARx", - "Ema8EVYUxMBwzDmwSnXbCjfUhxRGy6VUJGiXzTSj4PFt", - "EmaRFKGJ4iweg9chfTptyruXP9mYTq6758PLgwgYkoJ9", - "EmDwEWAfsjmLJ6kyMKQVJgcM9WCE9LdLxukw5aLG9KjP", - "EMeaA1d3kmoBNtZQNgqEZS9y44gMrA7iSuqS4nZ4qxpB", - "EMh47FQCx1Z3HyWgSFSJUxfv7vCMaw4wkbjMT1V1PFac", - "EmKohoDf5ofnT8ivyF9RRtQB5YJJLKhHhvy9jRhyj8oF", - "EmmaLKkBBjvwqdL38cC5nv7SQunQr8g1iL9JeZ2bAk2D", - "EmMTajFfjBEncXEzTrJYcRCv52VHduhoEdT5uv3aBcct", - "Emqe9upNXhojTRVT24mMxLpNB3Fnaoa1FibRtVELunUL", - "EMT1Y5kWVSxj472rbJHk89B1fHqK7vCmWGNoH58KKJif", - "EmVfgcaPpEth2uRiz8EurhHZREUgSt9bsw14CfmEz7YA", - "eMVkN9G77VnE8QsLtMvArMcsM93cytxowJxbbwwmzWV", - "EMY3aN6PXJTNF6uZkqPUe3qkme9c4mSBRv1nb1msCaFP", - "EMy77LFicKbtye9u2T4u7E5sAgPJFKpM6wLsmTAF2vbU", - "EmyCUnZfBgRz1H6WgJRqAy4wqNMZbfC1myeEGduzjrY8", - "EMypzb4caFrZb3hFq7e4KVHjzqQ7ohyKnPe3f816BF8p", - "EN5GiJXgS1joMr2weqGSTCBmC6hhKKhq8jh13stiRomw", - "ENAvhKRf2FF6iQxVRkrTyGiiFhw4Gv1GEkRzzjQKpTzE", - "ENCVKduwGMUc3ZfVGZLyuUrwwQiR2YLbsP6y2bitnCV6", - "EngVeJ8w7soeVvKwypuSutnXFPSWDLMq3Vw5wuAdSGjf", - "ENkV2Xeb3gwkfcpT6bdr6pRuLw8f21hHxDknC8YW2Ap2", - "EnLMAih8NTU7ENb5tiTHqgP8MtTUnY4QDLUKrsRwhjtk", - "Enna2LavRFHKP5ZMmdwwfHvNyWpJeMDmuTUEcSC9RWKt", - "ENnjBNGS4LxBHE6wN6edQLNkSoBwvhzkD2AwdNBxKtDy", - "EnrrqXLwEwgDU9yfa7YVCxmm6uj9vjhCnNUk3qjpFgws", - "EnTA7wVdxhcHQZ7LCPr7kizVbhYRmrWcGG1vFe6gXujk", - "ENtpcfC4cBpkCW3kHza399ZoUcbxYGsYkxuKM1jwei4L", - "EnUpDpoANRzBToSFd1pRHe4L9XNwjdp6QeLvmoYiv6XM", - "EnvPizsyCWhiTziWcNwVNj8wznz2ygtugGUkdmB6phXY", - "EnVrnxxqLsTuNs1PV6yBTNFPkgJAamkyLNM8pA9pDMdp", - "ENwQCdwAFU6F4Cs5W1Zt6sMr2wqHZ3xCFQKsvhTGHm5U", - "ENYkdahxK8Zgpnp56Kvz2zNYTNDReMurgwtcwVchNN3S", - "ENzxKTey4Jv3mPrQS1kqu5FVyG2NPPRK4kHQKWeYNcUi", - "Eo1uPQgv6jHk5etCBX3hJ7Y1iYti7WqhisrtY3krEHCN", - "Eo8rLxC2apCYS1qQCzQA3CvSTFqbGxXEBe51i1i5sWkH", - "EoeqKqKmbyM1gFLwJXQ5U5aZ3ub3N2eZfkSG3MwnDCTh", - "EoFXVrTSggPHyKB4ZDoaaq7kUNsy4S7RtQnFEoeHBhfU", - "Eogtuw7vSstp33UQZ9mXQ4X8s1PSmUfJ9fQAxj6JZgWE", - "EoHfz2ybgn3GWN3TbTj2FB3AYAXCzhp4cWxMMnyAo4pi", - "eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ", - "EoNXHywtCNazMrWhnLBxgKLHeW7Kje56KdauDuR5wU9m", - "eopuRXqXh8HxG5Y7U7oGCN8CpzPudLx3j1CWz9WBDGR", - "EotV6Jxbr9NwDqWsTQKSzL9bjCRPHv37K8Hdnk5kZY39", - "EoXc1hfQM9Kq9bpfGgL8zWiKQRC7oAEcKnRghsZq9dfc", - "EP3ke3zQN8JkuGR4yzZSgcUTN7DsNFMdTRqJqW3oDSTh", - "EP4tU5nptSMUXJevPABzXmBqocTtboc7aeVsJaQShYjW", - "EPdTTdBRGeiXp9yzpPK1RUQeinoCfgq9qdicBJqZcJgg", - "EpDx82Vv2Hu9Emz9KLDtVXkKXvAiuG99ALzjQZa75w67", - "EPeLj3qm5C3hvNmsczEBf2t5pQNm7MhAxmCV8uoUgypg", - "EpfcKyhvVCGXNmf7aRoDwtXBMkE8xCkuLk1YTakwaPdo", - "EPfqV9XsvJ5BajPVntkWYwtEZfNkYNqnoStNujEbWfRE", - "EPh6hXYsenE5c32tayhPbnB67w9RvU6G9LocCuDJ8B7Q", - "EPHHyNcVuMCGZjjWTBLzMXkc2RgyZ81hbpzzVcCnG7Wi", - "EPjeRP7TVpj3e7CLmXrcbveCM3cxVEDwb9DGS7b5EyoX", - "EPNd9R6KmCwNDpd79bp9cKJcKT7JCTn2VEUmKyDAKucB", - "EPpXthnkXneSTPPxJhuDwzau8aeYddx2yhzX35qVbpR1", - "EpQNwG5HPxj7zyDtn4GMhxb8Nw1PQkixustmq4rXAdRq", - "EPS4ZAgsDeXEHuqa7N4m4nTBCkGQxbgEtn5kxdRN2Kb3", - "EPttBFnW5bCq1vNcuDuAyfKnWN5jX5d7yKMPfpy5N9UN", - "EPVNShGLknd3qtChqrgvDVmBZrpi2yktTk9YfcMbuFqQ", - "Epxg7Ft5s3pwue4NLBRXShZZTPs84Fs2tGaMHMfp3kPT", - "Eq1A6L2ZUpy1KPVni4TPYvedSTiFSNNTiJdECskb2Qrz", - "EQ4hgknv3VspRagdDic1SKLZdQy5wSTQ5fhGkFpm4Pwr", - "EQ56LwKcSWrjYcKcUnFPtc9CW2zNSR6xNs87wrwx39qn", - "EQ5XBk6AB3sQyNSdKuDVbmkn8vXV2HAK81HB8QDFTz2s", - "EQ8fzdtetzoQsk8VXsxyYp5Dc7PyCVfPzY22t8EaokHb", - "EqaMZqSjRtm1c2FKLmZoSp7bgzEW9WBYVfT19n74cYo7", - "EQEEdsGspyFKjFmAsv3gzYXbfqSCWuHrv3iXodb1LyXc", - "EqFNSiKb2fcFWtkgQ3qUtMEANYwm7kKRoZ1isUaZgoBT", - "EQFsB8CDcLsCYeRJxhZ4fJWnXjCnbxrbhyqjyUJvkDcL", - "EqMWFcVQsR1fQXwds3f1xSDMY6mcLA9oNBrzzXLaK3PP", - "EQP9Gybo8uMAjz6LUZ8JjUpE4cAX846BEYH3tKsf4fwD", - "EQUdzrkc6byaUM6jHnr9EVmgJcWppo6PjG8Jsj1n4F4", - "Er2zvR4xjErXdauF5MVqBWukgRCT5yKBEnYh8W2ZmXTo", - "Er8pX9TxC5c2cNMqguFRgEC7LB9JXjtewetsJn7hFaZ4", - "Er959seKnFTeLNNjHmtyAnXFfcMzYAQG6uM6x5ehFAbS", - "ErafbDRJVKQRnd5Af2fX7fr13KMVMYku84MDkoJP8kSV", - "ErbvzZx2Ss9GxizKyDviybhZPu8noHv4AM5vuzTh1ij6", - "ErDHBzez67vzkSZv6PtecFbtevJjdmLXbwnRetjazoYe", - "EreC6UsjP8bzZuXsYi73TGxk66cErSN3BKqC5cEmvZvd", - "ErGhWPSntPCAqw99GUjY8TXSQ6itQk4tdhvb5ThurbYa", - "ERj7xigCvX4kjZUehmsKDHkhs3EXNKVAhxAZr1w2qzyD", - "ERjWVTphx4f6HPx9mWAbXTpa7vg8a42zZu1rGdVYmsMX", - "ErLbAEzxmcVhhXRzmrZTYBQfTNp5ZYdRxEmerMfLD9BJ", - "ErMNPWJcyVnSYSHscW9wmer9euTtNJV4fQ3HzmWV19rE", - "ErpUdaPccnNF6757jQdmBpffyp2ztts3UFsJZRWCRMuV", - "ERR5tZwmDc8PSTaZJfpPpgRhAY5SCbnFBD21i3skW7FP", - "ErugkAcX3gz9cw2KwYZ5vPwGuQQxhuobM2tsdoggqB66", - "ERWJKBdJPoXa3kq1gFJninu65fYDTAzNSPsDxCXjNX6Q", - "ErxAGCPBB5wMWU7mgZRXUoNyYSnMmVR9689hd6CMTfsS", - "ErZDsBAjAZ6VcZscsDTmN9FE9H8qoc2QBfaw6M1zZYC4", - "Es1bTnkT94o4DxhZEbyc1hrmVWLQ1NaS9x5JMiBcXN6E", - "ES39HNDr1PZYtZH9WqAqaYFczDmgx5kCCVAQjCtUKLQx", - "ES48dbjH51ZzAgZRr1uLeEomtmyzKH6KChFjziQ4oYV5", - "Es8mxUGswaXbJhzW4Ci4oXAfG2rdPPEZXNt9iuzjaZnZ", - "EsACrbUAd6FeWzR1kRkLAmXxEyv7oSfVngGrTPLWVL2e", - "EsahHnnMbv1bx1cNhGvRHsNhpyYdqqG2KXpQ8PwyC3Mv", - "ESayFmuQaerugDVekdWxAz9E6A1xcbNtZrH9Zz8nHCF2", - "ESb8tECcRz4yh7XK9CzAE7NDPmzMPwKRaqdycKwSiWhE", - "EseFbhBi8rqHtRPzYAq55jqttsmwMZeYR9HuSuPuTttb", - "EsEhTF9i6ewtJk53Y3Zqi2rDuJJvJzGruNEiG8TRCoWH", - "ESF3PjpXBjy1Bgycbf59iXAWf8y4WjDLfsSv1cRABKvL", - "EsfPYjE7DxwLAVGtLCR2A9FJwP7QG9WAXNf7yV6WGjBZ", - "EshkMyJS2Ja2dmLdEqfqjtnToppENiDmmyAzMZc9winw", - "EsJNShcQHfqWYzEaSHSjr7aATmqtXK2h8GFQJ84aJGiS", - "EsjsuHxx84tJ7zowrGx1K8FfjDPqKVer471oYadKspfo", - "EsLKC2zS5Su5sHvkABXe6u9RuCv7q86jGiwihSz9uSav", - "ESmVjGxZoW3saqRbzU9vGCq8Z6xKTPibwpwmva3SZUu9", - "ESqhmZaDxh1W2HqGPHTEnXaDwT3wdCu5boGiGzqccfZx", - "ESSnx4SECiLzhkk6jdQuWUmgxnfmpHTeQFdVTMwGYqE6", - "EsXshV7Yva6ZiY5P3u41vjWYNHTNMaS19qcoGAdiPZK4", - "EsxtioWsZ4aQrsUJEQz9Jxfyx8ieAGUisFuTEddox16i", - "Esy4FTzXQ3skd8eEfByBteNRXByFaV76Gh77FpjjaGka", - "EszwgBRkea8qTRNjYPynuh5YZFtXwCCQPXDQNnaSCadq", - "EszYHUFr7bcUoRrBY1h7Ea2HAM1SjbKrG5ds5EXGUkhN", - "ET6eZRTHH6xYN5Q3ddMu7rNuYeGG4RnbcSy6FoJZtavP", - "EtCRc5neWsvXV5f2d5t4etd5z6v9yjV94kZFpFmhvpiF", - "EtemtT8ofMe1puaYitDPxyz7KHXPjsxNwsgBqYYBCr8F", - "ETMbiU7hEt7jkoA8H6ACsfeR7LyGA773k9HA13yJUfex", - "EtmHTosfXS5zbDbTd6RxWvGLWwmT6fbjR8YENZ6byfQ9", - "EtpFdJnQ25ZJMheLyURzyCD5ch1SL9smfMcEeKfAkEHq", - "ETQ4hA9Q1jgev11YkD6dU2SJdHtCR5upYoGAmWsZLVEr", - "ETqbKuWmJhrc3SWRRywTn1fHxSM99yUTjtJDXekzCDQF", - "Etrrh96WKE3aHPyS7B5mr2n8kuSP9axNvKLF7BuBj9DA", - "ETs67opxUT9SZEnYTiA6ueAUZxeoYhxYBxqxcTe7redw", - "ETvmARXJ8c85JonivVqAYrvuRKnCWU2fATd5X44imu2z", - "EtXh3dkiLn5y9G9VKgWVKn2K7VprRCar4LAk3n9CdNTu", - "EU4WhTarysysApDtXXF1DamrX73LPV7Fmd9PTSp2husr", - "eU5ECMMpw5LLBpPr5ZrEFrsh2iH2HQfmM7JqjSgazrV", - "EU8CmbUt1mk4ZKatZNZiceNGcZQFMosC3QgV2Do8ksAZ", - "EUDycXVD5Gf5yfgU719tJgUQJ8oXogiL54QCQ2r2Eza8", - "EUhvae2ExtJ4CztovgAD3khPAQreu5Ejn8At7oCqzoGK", - "EUjwiu81EZrQaLfCUthHQsdDPcuny1QfAWQy8Tag3Vay", - "EumsUKhqC58FEc55iv2MJ5ji3AJk1GaXNGouVkPivBov", - "EUN6qKPu7TYfrw9ro5tkhAHUnw4vcWTsHMxmn7hcWn8F", - "EUoXy9YP2tAefgW5CHEvMGAu17McAvrXiQ5ucezjNYcd", - "EUwiTG1ii59qWfgsJwEMjqh34NmShMdP131BWWqJVPaG", - "EuwkT6wL4AALGiy829AS11xvYSKkimkBdWsXsvhF5Eks", - "Ev2mtgyA1RMmFmYWWCx7wGc3oPLWeEr4VpwNSewHWm5Z", - "EV5QcbuJdafM6tSdz841AUvbQXu4V97R1JPZs5Cq6hJk", - "Ev5XWurbC8i3vL4nDahQCayJLMbJDmHzdpm6gUw3tsPw", - "EV7arpFrG8SFFAkfYRMEJtuqocMeXpNFD7zDt22qG23T", - "EV82622vgrzWfvcaMQS9tDfG3F2KFGHF5WdrAptr9nzT", - "EvAYjXoY9jMTR4bYVDBbw2nJKKvn35cm3DmvjHytGmeA", - "EVBcvaCjpB7jpT47oX3YGXmx88yZUXaKAhZyZfzjQyJQ", - "EvcgTJqGHmpB7qWeJUsYd4enPT2Ay5fKd9SFagXzqdtu", - "EVCxvddWCFgh9LF4EJKzQb7stsPpSBrvTFUYnE51pX6t", - "EVd8FFVB54svYdZdG6hH4F4hTbqre5mpQ7XyF5rKUmes", - "EvDnGZpca3pWC4tW94U4PUkruVUkq7PUgpVWpDfx6fxV", - "EvenXreut1ywzoMaY3iXtwbuV4xcY2yz763TSxngja6n", - "EvHzPv2Fy7zqotvC3QmRcvpvf2hFuHTk4Ry7zuTGuNeE", - "EvKfRWcJ7p3T8ejfDPzx4P7BPsunLLToP3ECxAtncvGH", - "EvKWsgngsiDwwn7BqauxWZ8qimHVXYVpkaMuVQm9LtDU", - "EVN4tjg6QRguuB78bL6FMbQPM8hykNnU72sxDthBHs8f", - "EvoevUyBFTbgydobTfvtZtNs4FuSCS2qDVqKrrsJ3bhs", - "EVP5AqRX9ocjTLTNjzDqeuZEvT6EmmmR9BW4UEezCMRo", - "EVQxcfApDm4snuJU1XHLcDmwqiLsAwRQ6MatFKmSTWv8", - "EvRCAhKGLLCTxao8LzE6KFxASK3ZZFTur3VGVHPLDEoR", - "EVrUnGJAxjiykPdfFW1sP3njRSCedmeMBouJ6xSz3i5n", - "EVT4VkocVYDqQsxtLkw2CRetz15vjRr2s7URtRgpSG8H", - "EVtpGGP5SWd5h2WLtGYMGL4e3SeA5Myob5E9PHSRdT7m", - "EVtVmV7S2qmMpX3KZnufVgtntpezoECPHgfqyKnKF6Ea", - "EvUCUZEbbporBCXbnuTDW6MoKuzFZoh8ZAawXTJLh44g", - "EvVrzsxoj118sxxSTrcnc9u3fRdQfCc7d4gRzzX6TSqj", - "EvWN8zDX4Qx8crrYZ9gDw7MWyquj8RCA8JzSNk8K2bU9", - "eVx14qXPWY9ES8JVfREuypk48cqhDyE6chCz9mu9KjM", - "EvyvbrFLX1M5yVRGFNHt6o3v3dBLgrz5NoE18rcwyyXh", - "EVZcuAJ6f46Ew9UA1XGR14gvGaBX6fS7Awg1j24VPDxF", - "EW2ARLDbKBfyRx4xXgSvc8Tx2zKcVeEy3SDDv9qLRa7b", - "Ew2CYG9VWnX7gCZKpPBCQV2MN7VDq15Y4mhNsP8A2LXu", - "EW8YLbq9b6saEKn6K9R1K29CSST1XDTPpJLeXThpkXes", - "EwbFhe68Bep9qazsVW9UQcF5HawrDnBhEgzNpNQdEMTp", - "EWCBiVd2KvN52izXnwnJwdRu3KrqPYPMvbGrPiwgduF1", - "EWCCZPJ8yc2LwzTvs4vkjrbZooJbk6hKxBRxTNgKhd1i", - "EwdPE1S3chT6YHj1XhtVzwUw9terVEFmLb7Abp6oXyxL", - "EWg9NTC5s7Pa9FktUk6dX8xRYkvJ952peH1z1iznd4nV", - "EwHcnUJYSMRdYDvWt1JS9a8f4a9vKo7de9oxTves8DDS", - "EWhSgyD3VM1HuUisMz31xQPuyAXH5skcY5btY5ezu48J", - "ewHY9FqxY2fNBYi4ygESPWoHtER9yZdKqoC5iMgFgjL", - "EWi3X56yoWm2WWMA6doetd2S9bSqm2cc8JSBaWHGuJ6n", - "EWQoNfVscjLbdHFAzCrbCt3FcQGuGFe7XWogU3KQ61Q4", - "EX5K39cCLhKckAd9s5ZFjAE4Zb6ye14etG3ERwSnL4Ze", - "EX85vqhRy1LD3cG5rZUBetjngTQ121yZhyRcWCr6pGBp", - "Ex8p2nUoRQyhLVzc1nFRVyrgeidWK7vWoSRvwhQhF8ko", - "Ex9xDDXzj9TqfMFdc2LK9BUoArYBM4hcDi7Zt9Uk61FA", - "EXaDpiWsCGQY9d6AUa54XBAs7fvxF1z7V63xN9ikMMvP", - "EXDxgcGpbSagLtWnKmXUVS5o7hEFh6eNcTGyEUbmS5jZ", - "EXEFh9rPB1VN5NGDQsJiAgR5qaxUzHQDRJqAZdqEYGV6", - "EXEvYuwDekSRHnMmxwbu56Q99gQ7B8FMrXBySZnL9wpg", - "EXjnkKs1jTQ7deYasChs71VgQZseMhvbefBuqtEGVVdZ", - "EXquLU85ujfDmL38NcoMNXh6hHSUxSjcQa7rY6zQYBEs", - "exqw1DYMFmECYcsSQiiTJmVXboCBsUQp358N9nkViZB", - "EXT1KVqLrtmBhLvAtHyyQcjgYS3nuFRRxPsSZacUpXoS", - "EXU4Xh5VHg3vHvwrTFiCf5jQzvcBG7NA47tDhm7RMEsN", - "ExwriAJEFM6dX9Z5ic9aZkBAe7Ei2nG9gcuCWu6VzkDF", - "EXX4QyspQGq3BANyzdxk7hdoY3HT6dEZAmHWNX6eBhc6", - "ExyBDh4ajq67itKb6HxuWBN7CFtTrg6NbNCF91mFjyx", - "EY8nwSqmxMtmfoeMaFHdP1gDzYTM3QGU7f1f3QxEbnTW", - "EYbvBPU9mSPTVJrZgioTt8PGPL9Bjv5342ENBMR5X8r8", - "EyDQXxVy3psVmhLrAoiWudLSSHy5sqficAhx6yTYa3K2", - "EYfKgHGVNRadiR42ZMGRF5APRUvRAEuedjczuXfEoGQt", - "EyfnuyXn6ANSZuc5rTupP2QWutqq1oDRZ8Hz7srCUsza", - "EyH3N9FuqBkg2wmaNY5XPWfCpuZFsn1URkkL8Pgtu9e6", - "EyicWxLUE8Lf3i7fNtB18ExTqPSksDvPp2PiDrUHT7AQ", - "Eyj49dCrCvTG6PMXaGiFQLYbi9emaXoewge14NV1dThu", - "EYK8d9aMq6EGyHT8wUinmX7R7mHGcSCfpPphmMw3aYZ4", - "EYMfiY8YjpRwPg6tLPLg8DCo9fMVd7JAuxv6D4CNrLwc", - "EyNimNczDewG7Ubov7T2RGKD2R7i54vbeDUnivnR6ePA", - "Eyo9dau8CEjVnDu7zZhvXsfx8HpdDFFYqC8WdQ52KKZm", - "EyxgnTt8CRoSUuSbsf7nrP3exqZ754HmRiGuQFfjUg9x", - "EyXvATbGHBmArtRAACD6jt2MgPynUn95XDp8srWE4fxv", - "EyZeSNbPpJ5wWQL6qj4UPPvZUTBecs4MFPGUf6MgWAYe", - "EZ1XmFk1u3nymqrtMAByk28uiNTM9Xkuqk18kr2d7hdz", - "Ez6Ggp3nQYEBdJHM4fGbnUEd2MrjaGK6XP2BApt7EHkf", - "ezbVkMFcrcFzMDr5vPNxDxPNEirqdim4Jy5r9YfLjhT", - "EzDnfw6aygi5dEjczVV4eXhCe7yhiKFYHKzkbNBev2oE", - "EzH1yE9HJqeFCrPkYLuiGz9RW43cuzb9SmJgCgFDeQPh", - "EZikAf9uQrdcKLAjoJwtQ5NagBcxD1GGBTYUYkJHoWN", - "EzJ3AZ9jrnUgNMtN7XoiieG9fWbPghFJUZL6Sp9ZjgfA", - "ezJHA3d9j5bzuXHgNHkQr3gj9vDJ89VP14nzAJMMpDn", - "EzL8SrxaRWx3EPCY6TmsF28JMaA2fkEi78iVG83st2qC", - "EZMocMSpodWGgHthkEwXCqfLXcwi1vspNo57L6ZTCoEW", - "EzNMLkZsZdxrKHj9G6H9Yzs4X7ELA4LV4hnidNyWfY7H", - "EzoKxJkEx59qWjX21rx5qSnvwWjXVE4Lf6MsJofrx1WJ", - "EZPCUGt38T4tqWXYe6ihvXNDXXnodL4z11Ypzor6WSEE", - "EZrb7bEQjXT25PzJB6ckLrL8pHrGKmdr3NYnA3SjCy5t", - "EzZ3ts9bm8Stjgg7go4Nz8kAKsug18gz1zhC4u6hayK", - "F129exPjSs9mvxJHaJxQAyaswXGN1zqewWtfEPVeSKK7", - "F12Ah86ymdNPuXya5i3PKG7jeLfSMGpoRTriVTgcXr15", - "F16J8jYx76jpt2vgTT5SPv8hJGGcrShzCHG9LBV5vQD3", - "F17dvzmVHJ4MJMG2bj93d3jAQRaA6FzGRh6oysYho4io", - "F195ZucbJPRnaCEifgDj7KMbSUeBpF7b3QFU2PsTzLc1", - "f1e1QEwrpExCojF2JkTRL2Dm677bGU7AU7qDKxhm9fR", - "F1hy9WdKEGFkzRtzHStwxf9TFVLN8HgCrXhmXYPHkLng", - "F1JaMT5TK8qNrXsFk9XvZhchi7Eahm5GfYaif1AUMisQ", - "F1jcLYJ1s8k4oYVy51J2RvYGh4sB1kWsUB2NaDrg6ejL", - "F1MevczAijZ9ZeWNn6T5ZHtiVkn3oSepvmcjCfPvdsSb", - "F1NtHjCRwu2k2Sta7TRMhLCJSeYdSa2BMf2futemvuE", - "F1TuusSghAobmbGAgNrdxRS9nBjwT6J1yyALUvpEA1is", - "F1VjTnpePyxwWXSdxc53yCBQVP8eHqhPNe2FBEeiUwGe", - "F1xo3mb5HsY1deHpigmkeS3ia5vVMpt4Dn3wipMwEjWk", - "F1XvcBuz8xYKgFsn4t3c5oZQwsBMoFBjekr1LJD18VT6", - "F25sZgmme6sdVkFXpgHU8vmPycCpR4E8ZSXAZj8cbA3q", - "F27fL7Ee9xFhuhjxYyoiHEKzVfpAAVTLEtVVDnc1jQex", - "F2gSqRcNyWqJexvSroWq9fpcvBpnTR7RLcJRC6HeWSTi", - "F2u167hkXmzvHnUzH3HA1uyLqB2srZeUFjc6HLvUmRgw", - "F2WeQhDGSVkdyhGTvxHwkGvE5z3Mjjgu9xPvFXp3iPas", - "F32gB2JBVXCmC5vq7ePJqjmMLxp7C8jHfsUUJ928AN82", - "F3bXikq6WnjMQjKcvj7U2tasv9Q21xTWVUTp48GmhVas", - "F3CRhNkWR6p1XYj7EapbpVFx1iaXNRKJVpbJ452RJXoE", - "F3Cu1C3qLddCXckJzZHFYh8Ttvm77eRiLTMWefnjKTFv", - "F3Ge2rptgSmjNtvDmozioQVGkZ6xNUoYEGWRbBRkhnyg", - "F3gsehGvHNXtF8mDbGVfB27Lq1paSgTiqe5nzvbFVREK", - "F3kPmteoT3zWKYNX5peNWwiEFdZef7ynTeWj5x1hXUeW", - "F3S8XEVrUyG8sN4uqyoU5hkyk1zRXwykE8QWmxA8QCBB", - "F3VbzYQAvW6CG1xC3jhefVRbL7pbSwDkmZqPmyXrjwKW", - "F3w8NqDxCxS2eL7d2Ucxti3suRkqSg8ox63uHgafUZCW", - "F3XWbLp1vfLyiCSY4dBxU3WSVWWXA3kTnuQqN85HgYNg", - "F42UBCuZo2WxyZRG71p7SKT9iewEE131hyVpr5hG5kBJ", - "F45N9TY6v5ABC2TVLdHu294mPQjfSn5C9MAkzSU2CuCt", - "F48TattaDuDLAeEj9nKvUL9aq5vTJTbx2gv8zJJ65hb8", - "f4fN8n4zEtVnw2fdQD8y8GBwzN5Asc4X6FzuFi1kEdt", - "F4R2g7TnRmr88GY9DjhFo5Ssk9Ji3phBRssrZL5rQxWs", - "F4uKbq6obzpq8AEZa72SMbCKb8ZwG8Uh7b7mwyyRVjff", - "F4ZXGmcgsEKGAWmSi5PPkHGgjahD34JB1mdZsh1qmLwt", - "F58GGzrSbENpdfsp37G2U47AFKE7JB6mCJwL9rdGFpXU", - "F5dD65LYUzHqPVpo8NHa9s8r7pMSrAqDpbHi7WNKfuVH", - "F5DXubJ3HqdWAV39GUX3rBUekzuzdjoeJwfKCbNnWKeG", - "F5f3vcPpfwgouhVVzSW41XZRzch16jr2qx7pYNYyVruW", - "F5HhG3r4E7ruxx2Nd2stnKu9iXFMtU1a6VpHuUob5TFB", - "F5J8qnXRLieyGqpD4o3qwJtvfn1DWfw9wDJ92dt8xUAT", - "F5JPmY5uVnJrjFMTTAqHWUX3CPKHMdxbkPnFLmeenUqs", - "F5vwBSZUjzdQxwWKdUBSxgsdqXpzyhtr8qiYPL94UqTH", - "F67LCN4eLwqBGbHyT14nJw61x4d4CMtzdcvFq3tZYwki", - "F6cFCqercVfQtnXH6seNtSPiFfSH4TJv6eGKMHhW3qWL", - "F6CM9cTbDvxjPPUFqEorJHJtPjjwAkjxVmBPnGDweZE6", - "F6iG9Bmz1HW2A6wRUC9JHubR1r2CNWscYh29wH2nXcwm", - "F6nCochwchihjbaMSjVX3Knhj9C6DwXLgciJydmvHpH", - "F6wLxxn9eb5zGmoS2LsrTtM2v18jtewyCwn9NDEmnTY7", - "F6yg5NDUJzFD7iRFG8LvXh6FGP33s2Gna3H32g6b6wVq", - "F6ZUwCZ2dVxY7sGPRoFd1j4UaKhdY3UkrayEfAtFhBbQ", - "F6ZzyJaFh2XNdDiZSnBHhQpqWH1YMifBxZNJ8JXeFwXB", - "F76cNAd4JV9VwzrF4HwnRmk7VxbJQn2PJncYzLRhE1ws", - "F7dwfwWMbFcV8nQ7rUH38549PTz1ibt3sXy8jo1hHiR4", - "F7FgS6rrWckgC5X4cP5WtRRp3U1u12nnuTRXbWYaKn1u", - "F7T7Uk5Vq5jPQuzYsjW4jrpmbdgPnYQfb7GdLuXx3vgT", - "F7YDNbK4nZi8XhVV2caCvPx4FfbrWEPhoeVYYpszii6f", - "F7zQemwQJo3bKVAvpcCAfkgXD18kZxYvgMxCP3X3qiK7", - "F8263UqjaPt3NKEkAGS7hVAPAHTXrSZ5zbzGZGhpmfdz", - "F86aXwZzAnou9a7P8JCjCVrrZKzih5u4AW45EWzcLU3f", - "F8Ck5JpwDvAXcu3wi1qbrrKeoWJf2r1HSWQHsS5Xqrrx", - "F8hAT7iejAxeFwk3iHJZN9DX3gPVSCFa5aPCvPMZzApJ", - "F8nTdhMMHtbDH9JntKNMxNoqTaoKnmtPrTriMe64KgMw", - "F8QBfDq2kqzhSyPYKZTP5RB7PEbaG9rTtekfcyFNnKHs", - "F8ujZDTG2zDmjrzksSekNUtrwSUPktwoe9GYJEmJjYpT", - "F8UWNhk4HpHPRqHnCb6p1JxnqG2vbGCUMpKQu65wfJxG", - "F8vUpx2eiVLpGrXeCcbXGpLpmfYFV6iohHdtNf5Tj5Su", - "F8WLRfCedqTz4qyPAG8neZ3oyrzwZcuUYTiyxKQXybgA", - "F8ZZW4WKUx273i4L2KubqUCVSKLmSgkpxwHRL7gar1F6", - "F96Ddanzck9q9afGjYyvsNpYebkQ8rjL1FFiej8LNXat", - "F98duxmqhuXCxrcCrHdHxtHjHZrUioNgp1WPXHrsW4oy", - "F9hwu4jorJUiGFoQVpckjkB2jxouSgDoCJMud58QCyAV", - "F9onJfrxWMpjbCA6dFsmjnijmMt3RNCju5p6EvXba7Ex", - "F9QszjwC9gkk6ZAx5GTnjMCqpvm9HZft8T6pYEPyYqQL", - "F9WaxnwbbJ7GyZmBoiCR4Q1gfmEEH7hnHMPtkFdBy6VA", - "F9YANP9X2AeorF1ZCY37GX6NXKLyouWNWELk9PrdPVCy", - "Fa6sLqAdZBZv2ntW6FUmFtB1yYdZqUxQ7a2ACHDaDnXy", - "FA7DtFHm4gh7gwtwdRphSq7wFdWBU4inVnrchCmTKLTG", - "FA7u52RGnvVgkdaG2SkmmLTZVRdGA8RMePopVgKwJHGA", - "FAB8xrk3LbcaTMZAjmXikUoXp82qPog1RFoPDuExqtfZ", - "FABH9qpzknEgdmttY53M9W9B2GdCRx5qH9zBpy9eGgCb", - "FAC4pS71G7XD8nj5BYKjQdx5g55fqf1nyhG8eAYXiZUE", - "facn5KwkJQdT9C2T4y5W2D1qvm3eMiRwSJHiPBjFdJP", - "FaDY17ZvKmssVNT3Zjnf1dupaBfBnUcERzMzyhfk3T3A", - "FAepHgncG3g3xHL5psDQC6M85UNezFjcGTmy7trujfjh", - "FAfKvBBvmSVFhsWM7D3geMeT5ckEdU3neBUPwW8Hh7Ee", - "FafsbtsDYwqEy5vbQc7gETmC4aAQsLJaUh98gZPGANi5", - "FaHNr6P3WevLomCmQKGPKdGvkW3SpsaFgrsDn44m9wVL", - "FaP1c2KJQ8Vvn2G6FpKspUy1JvXn2Gav2Etik9ytbQyU", - "Faspvb9GzYvgBBRwSdXvCLV4wTpWHy7FQfYsDaRcBu5H", - "FavsezxBQdxoQYBioVPoAuwH1NwBqCQhpNdtuiHdYyZB", - "FaxxiZsd8WS1prSBg4iaBBDq4eTvFmhNoL5LyYNgwShx", - "FazMcimRMw64FWqyP7LX4ATBJb8Vm91UCdc5kgmBzqTY", - "Fb5cEcYNgPXKJoEmvPvsU2ENYRVePQtExqgf77AnVX54", - "FB5j8QBkKvYa7B2bnjor1a2Ti5Y6uDAAH7uVFEyoU7Tz", - "FBgcSQ85Xkiu5iByh3AWAKen4ChnSmeUqbtnR3hH4fFe", - "FBH2zNFh1cp71EZuaz3sqs97BTKtEeKrqFivpJwv1MYw", - "Fbi4owmmGg1G3ah3dTTiSWSHjbDK69DQJ49ok4qFKU5x", - "FBMv4JP8heqqXFPgbBKp9Pc8e4BcFzHeXosHpTSRoixo", - "FBMzrM1mWb8QdTUY6cnTAG34wNefGCGRHYNHap1HbGsN", - "Fbni4N4ACy9ZJQxYZPgJQuj9LyFcoZuTWbiXKWuMvadf", - "FBRvHGTbksw35d4xcmEr1Gjsi9nd5Ska9kbKiXSyc5Y8", - "FbrzGwZkCtShTLqzP1gVeuA6npuK1WGyeuEKqxWGyBDn", - "FBTSvd7U9zLBia4NgfUYFTrE97JSUZwAhBeSbEgFyymN", - "FbWq9mwUQRNVCAUdcECF5yhdwABmcnsZ6a6zpixeKuQE", - "FBwS9NWnUfsNWAhPaYm3nzZaWVZkZuefEHAUWHzUue1Q", - "FC4n96rWdAq5ag2e47Pwg5Mq2FHMygpckwRd1Q98hT4o", - "Fc6NB99bkJQn7JsVSqdJs5fJEzj7KFpe4JHNQCGVCctj", - "FC772nKK3CViduHf4JfLkBrnbpofQVpRmzFL3kqbCKdk", - "Fc8xCDHzdRMeY2JRKKfHgh8bzKigMhAZtd6ddfcsKEui", - "FCBMCPPc6LcXbd2RoRLBmJnjk3EH21xUpoGv47fVXFHU", - "FCcMHVLR2JdZu9EeV4AXMtzVHLULn27KYhk2x8GNiaLP", - "FCE2Um1pUNMcxStrhe65HhqGV2maokxFCdb6spxWoGa5", - "Fceiwrs9CmFC3ZWSZWYUVDKPH3CR7FSevtQbL3e5XbTY", - "FcFgLq6WY5Fx1YbjYcz3Kkf3JcQ8UjMnVxSkwpVKT4bP", - "FcgCSFDkprXB1g51B8LnguBLxmLkNv9Pbi7UUFRa1PEC", - "FCkLmpoJenZTJcbBPVB7gjdCDFd7ZHmq8AAWgP3FPg23", - "FCmdCGgCJ1ufL3BF3YuxG4KrJXWtPi3c7hAvNCqk1NRc", - "FCnsZL8d45gC5aVsmheV3zs533DfM2jRk1vNnDgLNkfr", - "FCp98RpciYdSgdVvHfHDNqaqdCeSoYcV2YPVZfqEmKH4", - "FcTYrxp31zVjTW4qjFKkgRcKXbWcBbiRQqJYpufwcJZN", - "FcWgrc99RAix3y9th526GnzN23MQSkFmyWaeo9xJ6Jfo", - "FcWjjkFgHgaARvF3Aa2wu3C81B26CEPRwNRwaHZxcZHx", - "FCWo2THDRgnzryCoRp7fVEDgGrYEsyy3GMnhE8urKNhJ", - "fcWY56JMbBFUghshTCsX5mCkGS8wFvjrsnxE8cW7E5U", - "FCyCSAg86g7yRcNtsFpNugESUXQMgGjP7XSqHKAkauPV", - "FCyggD1FhfEuWyim4QLaijXcL3rL6mBDUF3wXRLJjX8v", - "FCyvtrQSHz7TMzqHSrWNQYgUqR5YWiQKdGNvSnVDxua8", - "FCzAspafNzukjrDD55cfJv1igQsanHbQcDiYW9tBPZ1n", - "Fczg2nfZcGzPtF3DFVS6kSm8KBpvRTVfZRXAPN3gR2Tg", - "Fd1sNgjc9mCYRxps1XuTNJ9XKbBRdV9zN5bueAUQryVN", - "FDAkewiAsasucwXK2gRFzPhVvGtmenLuyyBFymUsrZac", - "FDAR4Ms1QU9vparYAwi1jwYuvy8Zn5J79XyQvXWbHLQL", - "FDBGjJ7JiQaxJB22xiJAT27YBPm8wKbmKygY64omTXtK", - "FdbhKG6D1aTjGnaiP4xYCR2Dwy46Pm14rfgtyiQvhScC", - "FdC2FZ4geXeEh4pTPXWrNH4nqsriB3xD3GME9HPD8CVR", - "FDEoJs4q6QKn3ud9YPg25hQUa2wZQm1v5y1fTGCuMyc8", - "FdF9VSnzScTdh8KBo5J7xnbThnYAMYkMhuwUbB5FmaMZ", - "FDiC55k9Ki4u9DkA2A1biajegCFwc4YNu6kERGC9VwV6", - "FDnj4QMTCUq5NQ6aDZ6QEi4grw9wVqKYNzWMvCP3EQhu", - "FdQgwQ38ETKv7x1mWNoAdrLR2YZyp16xFDC9YR8Gseva", - "FdqGy7ubtVPT6m6EGLnE997LgokmuoRwqJX5vyQJauLE", - "FdsgtLMcTf4x2mtJTmdD2WCRjQkJ48gfnmBGHq8RcYoQ", - "FdTKWL6UZ6RnVVHG6uw3dmA57u3URXuc4BvwjUGnMrn7", - "FduhH45PnF2dskwxEW3iRyf7Rhv6iE9EFYpUDrPUE3u4", - "FdzLvwNndC8h6E9r1HSRRmqJ9jgndmjCA9mmgVcAUhjF", - "FE2hupm2Cu1444GQjMiJWQtFX9kQ2yo7EUCe1gM9nPJK", - "Fe73cmH1AY5ci5zhodNhgZTaBnGGvFnnjLXZAFq4V11N", - "Fe8oZecAAGKLDGziBLLpUM1nwD6DyF2pXLMZAkWjNm9q", - "FEhGBt8YuWRLMZMApaMppEUHEtWv7P3BncjBip7hch6X", - "FEiCiGi47jaLfFuUTwAgQiEdj96tVjzCsqP9BuTFyb64", - "FEitYz3DghTBtqyUFdKSt1Fso7KhpSJ89vr8YAdmU5PA", - "FEKzY1TLRYWDc7AHTkREpoSHvx9EyNpPmxp9FeojPbJq", - "FemGmuqq5aUhX5BCiRcCuDtyVDdYtQb31Xmjo1vkoEfN", - "FEq9FL3hzRDMtL8DinPAaeJpb28GBZYTpTeRcRyHSrGA", - "FETCogBxJNNpETzbtGMyuo7BEYXVpp1KLVQUTJJiibfb", - "FEVCdw7wiMGg8H1keD22TckwcVdnmU5yTLBFM28hBuiK", - "FEvnsWfKM3XpShdDgNzfSJ8winywzQrF2EsmkRCfjQ9D", - "FeXcDp3ixeSTqjBY66uCLRqDw6UcK63dnCe4wHf9Ftwd", - "FeYQvjTh9JFbYbeGuCbvvFriJV5TX9kA41f9sqjqWuue", - "FEZtkcvTuyGLeuDoHWQnEACLdFL7b9KdZQMtCmqeFqMP", - "FEzuco8cRMyqYbeoNLRR8Hu72Lfthi6kBsGLQCdUymrf", - "Ff4dexJUJkBWvAKpCCrFwvewynSin42CTKv3Z4AsY6sM", - "FF6DeRFFd4eEPvBi6aQ5sKZJGXFBCgES5sP8H4idmUda", - "FF9xQ1ZDZhdMVb8cUTzoa5kD46gi9xSuxF2wdvAiwxxM", - "FfA1NxKcNqtUHheoWGDQFqq5P2YiGFFZ7QQ6r2Lvn2gM", - "FfBvuF5wfvzgqdiR4BMeVKjDEvzocCSHCAEumPVG2Bkh", - "FFdXULSsfUCQw5VMvrXFALayFx7tQoc3ifdLoyTfg9Za", - "Ffh6rUtWSUUunLXyY9ejq5VpycjQXhiVDypVeyDHGuej", - "FfhLrFgkYWgVe3FntM5pHaYXFHBvPQUziZBHLCYgHXmC", - "Ffhp5AJy4YS1jimEFJB5cBEawEP5DR69995534QJf2HL", - "FFhtic9yPS8ao7Qg1GKjqyzwhGYK5tsksT9VrLioTgbY", - "Ffhz7rh71Y5R34Z5WvNibHqvqRkjscCAzc5FKmZ95NVs", - "FfjyUMZrzPHuoDKb8KoEhm2WKNwrB6s5jKyrCnHhpazb", - "FfkS2VYyVGH17y9Kc5UXpqaVZamGXtNGYmqNbnNBQS8e", - "FFnRssXNWY6dtsFtJsGr1nkcqNuyeiMsXBzYKcZjg29s", - "Ffp1W6Adn9mHbxrmyqf4Vamg4hANbgkiunQTKpeRVrEi", - "FFRanhUkAFoYNPE527F7BKeaHe44Pwi2SaiaCoppkJCz", - "FfREhUvTUisAFG9mHeetnDA9zYEGady5BJqj5jyCB5UY", - "FfRhwaPUCg616u8YeUkLa7MdhJwFodTn3uKSUJVwct3p", - "FFrx4NAJginBWNm155TXLgx1annkmdqEwAP79nNRwxjQ", - "FFs3d8z53TKQ8aiXnLwMJyTfVHA78gJKsRDrpnPS374g", - "FFTcfGrveaiXt1SEa5MN8PVL7VFRMpxPNSFZLEpzY6St", - "FfwtopRBJWKEJiCmkNUFyaQ2FMubtzMhAzKgHDF7XrLa", - "FFy5w6RVJqHHC9AbW2PN8ksNHb6kakQ8Eko4Y7sRTUx6", - "Fg1EZetLjczjkns8fHS7pL5C2kUzyCEozFGBmLcf82vH", - "Fg4SpbDkw5Qb5Adu5EMQquNDYJsvdxk2LyMUYcpLZVjx", - "Fg5BVXKX9amfzDdY5W6XdbegkEVMJgkKgZaseZ6ttDUV", - "FG5ZpNxoqhxkxEZynHdPgQj6hDpBh7frUMGNbcFE2Rnt", - "FgAZUGgFkz3G2Xn3KYctgjx18tPBueQt7JPkABzrT77o", - "FGcyKkHp5eZ1YTbVxBjvbpx4ocGNvVDCtJtUXoRDqP5K", - "FGdvNihfVjYymWevaiyndXxLqpikKSuwyKDfDfVigooP", - "FgEroJHnasNXH6ZKV7iywmRYzTH7BXMYa7LwkFofjDpF", - "Fgh4AT3pmxDPATMJ2B3ie1kUh3887VVFaAMkHY2ftyMd", - "FgRWXXYvpCBboHKbH4QGHc5ApBYLLkpkeirCnTMLz8YR", - "FGtnWNf7hSerB6etd46dusFd2o76YZvKqR2GgwnPSvxc", - "FgV26JAB3SQiFDf2ZxfCRVnsRsU4gjEL2CEhnFTxiyRc", - "FGXQyxvWrsRX8eHv2ezdBQG2g8a62GhfBDQysmHwBWFQ", - "FgXXgS8gHnXdg6viAH74nzKLgNAox9FTkr36FuXG3Qr9", - "FGzASVsHGu7NdSbrzuTHyGNViE5CdcR2ZAz8MVLY1jx2", - "Fh1f2KsdD6rcBic3Pg2uWf6J2MZzUGkPMNMMHNj5FrRh", - "Fh3h9t7o7ZNdKK1uHM6BfHYzXs48sBHue3EwyYAzkmRq", - "Fh6ycFtqFq48ghMAZbyYbVpbHwU8PXC2QHqrAzMQ8KZ4", - "Fh8hh2rCg2TZuw52yv2bcqSy2SyieypS1eJkEWp1gVHx", - "FH92Ten3N4KGiNxj3ZWJaYm6SqffXMTy1sbMGS1JhExi", - "Fha8bPQuzAE7UUAJxC6Gg8n2AkAkUCuXkp71HqEFfuGk", - "FHDkM2CDjdcQqYMhhkNBNEkyYYEWH9oi2TwWGiRLWC2g", - "FhEJ7Yi93Qua4Pq18DiuuLSKc3PmmgYdLjbNpkQpcFt8", - "FHgMNeRL5bWAjvZizCi8syxBCVpr5gBBhdezu6snHyV6", - "FHjhVhgkzHg2bZ9Ghy6utZQzZZT1XV7BiprbP5422Lwi", - "Fhk6eEUzMQ1zYrjmdEVGun3iWKA9Y3uLZddfDye6Esvf", - "FHKBwN46RaQa7kaVhPQb8JHqmG6Mv5AgYzPraBSR4eZQ", - "Fhq82HPgSpYqqWEL7Xv5H7BJZuMNVYWzY3uyRoe1kq4h", - "FHTfkDSmY7Fk9Pjes7NCyDPLkSYhtM6ZqmmFUWLUAC6e", - "FhUjWiMEFauc8nrypsy4Mp4eGpCme1ZBAJQadmYg9ULr", - "FHVcrKP3jx9wVbDFM2cBRjeR1kVBXvqWf3ZFEzDcHRVW", - "FHyGdnAz3pw2mbM4WpEQrTM7jpjkcHjUTw2BVpWizWcf", - "FHyqLxzvim55sLcM6SY4q99jqe5ifNi8oaj71pAef5gw", - "FHZbKviw56w6LpFjDaz6MSvwXsJNYS4Gry7Q2EwjDXBJ", - "FiEHvgPh2YMigcYWZtGn2tCgPFefSgTRA3RB3e11GhLE", - "FinkBUX83H7gMds4pBwaTntpdrK6ML28Up6Panpx2Atm", - "FiqLajUHAPrdmSZzcuy8gKNU1AweQpCXy8sznWgGEZ4S", - "fish2tcDFRiAM1cNKqF7b96WzQmmDRjsf5XD214MhpV", - "FiT4sReWDW4hrcPHW4bCmFN4GQQJw5cJMNeHf3VHVrKX", - "FivGzpupCvU4yr9E3J8RvWtLNWTm6ZRcGS87a51BVHWS", - "FiyRXQC4CqJc98RE8CEeG1Ccojh8a68xYwyF1xpXgzkN", - "Fj1XTsZGwbr6H72xaj4fPg8M4QyXUdnKJJbpZXunFpWr", - "Fj2vXmWzURtvnGBJt8dBrE6MjAj2nBdDRZf5xyxk4AVy", - "Fj39TNbn7GHy7kbvPvoCEtSFA1M3k8885FaSGc6WxqD7", - "Fj4pv6pARDjc1AzFNca59iHVSM3VFP7dVkFKTnyNvMiM", - "Fj4rnxgCVDk9m1HDNmt4NTgSFWW7QSiNBfxBM5S6AF6h", - "Fj8PK5Cg8bPsJzwN4bna8q6UYoMHknn9dGrkFcJZVvBu", - "FJA3XraMESVo57WRFkVe1JdvoMdzcuk2G1vZy6jo9kBJ", - "FJAGon2RTKdmFN6q39TDVNLXf5tri6tVJVMJT5EQDaaQ", - "FJBA1Q7gUvEkEsSuNDfDgJEKeiJmfF9Z7tF93sx8wNBe", - "Fjbe1R3HR3eLtomSMgQykB3oKV1R7frG2Nvy2iXcEPDm", - "FjBJji3mfw1UbX7xEW4KocWeSh1XqQaftGepDX6qgEh4", - "Fjc7dkd5ir2heioaU8eomUgbX2JY49BCqBX3doB8o3H3", - "FJdNrXU1CMdnuKvHVP3X5JmGPGbz5gMrAbmjd8DnnNqh", - "FjfXup5dXA16MXGr22655eqhQ1H32ZTGVEhfBatFCyLY", - "FjgKVcYYnxzUT3pd1TcqZBJT2HFG331L7xD5w6agLpmb", - "FjhpVN1awCk3y8MARr5VMiaXjGYpYxddXAPccmmMGkHX", - "FJhrWLdgLiR6qXkP6i6sVYouzBUAN35rZidHo7QH2p2m", - "Fjk2z1u9u893GzgQHibzFDmDsTTsd6BeSjcgPouLoM6w", - "FJKaQebiX7qd4fy4dhkXx5Re88B9DVxLT1pQRiMuUTrG", - "FjKF66X21e5rftc8sDjqUcgqLCg7zrfEPDy8DUnuKoiW", - "FjLDxb7Ky5DRtgd8xH5mrBAZPy5atkXL36F4Bd7ijWam", - "FJLMDeHxjxZhR1dWXNBNPct1T63W89kwYNQZdyCEV26s", - "FJMCiuiBEbKum7cLx7pqi1xWeNbpUuPJBKUeiBTkxLdg", - "FJMU8yfFnvTxyfKUw1f7bwXTUTotN189xzV4whrCMzZ8", - "FJU9g3xb3FLMvHquwECu2ckM2ksYigMQWgjKktQtEeEZ", - "FjVP2aWyBT1ZWkQWaC8gVcQL6jRrNceV7r7qNjGciqY5", - "FjXtJ7fvCGt1HRmYrhiqUz3r1DWDqfBwZCSESDPv6bSE", - "FJzX9Cs7zwo5AZKUjf9wkBHULSJr6DaESAbUbBPhx6E4", - "Fk1pCDCzbBULB6Kw4cQUdTjvvbLBooW2TPSZjvK6YKA4", - "FK1TQPnYVzg1e925kHurusgkXxxFuBfEko6D8ZirKNeR", - "Fk2e2PborkEmCiABeDy1paaebyHjyY9nxeVpU6vh8uX", - "Fk5e3YsFHiPZmiqzEKy4SesjRwi4AxoEGj8ZSE5y6VXi", - "Fk7aqMzDTKM3PZLhVvdpyr2UbwnYU9bMe5GwpwHsqEFE", - "Fk93o4E6pBKR4xvQBF4uhMbRvALYqt4vz2qENWJo9RRq", - "FkAkM3zC7TyEZL5csZNjTxchK6t7UmfnAbPSHdXmS1KF", - "FkD58f3aYnq3VMhADRfJja351WBFk9CcChMxKqA7SL8r", - "FkeDv7mGz5na2cycc3fwCtxmoWvZ8WvgVNxjYxeFmdGH", - "FKErtUGcnKvAd4xizrU3jyoe9WWkCSTPZA83J8NB2rFk", - "FkHabRHvsaNNVQqHEdyNAUnb6mScR7dVCZeL8d4ftEhw", - "FKHjyDr7u12wjNRXrxDiTXogkjB6xJ4ESCPsweiBBCti", - "FKjMUu4aoRG3bkVRrYNEnFiMwr9KRx5BFa5R8KVJR5N4", - "FkK1Z139cKkmmorAFixwKT6Tvh5AXaQfMueFkWjzmEsm", - "FkMj2LPSWd9LzLZrpZ2L9YL1CpB5eA5W3J1vyvvpp6Jm", - "FKny5Zv2nrLFKfNH4jatujiiNG2c5mq7MXweKAEBBzse", - "FkP1frfdmBK8pyci4bTwiFDWtGNdgafQfcTMQRqopvqB", - "FkTDPNzWHfPBni8e2JxnpJi5N4XNHTtVT226kfy7dKBM", - "FkYGpycFMx6ydTjar66XWnhV9AVGtk9fXdPBCZ1Xjfs1", - "FkYhpz7HSGQJvA6apj1BKoUfytQvWseLfSUrE3zjvkQb", - "FKYKRLCFmh7uUASUQjkL91yXCUuJ9wdbPCZEnv8HkKnf", - "FKZLwDQYd79r1iXWA3wBQBZkQe7h2YXUTm6XRfDWCFyH", - "FL117azyKxNeDWGWEoiTj88ygTHFZNs13GKJHa593GW1", - "FL2Fo4xmVeo6dGgsaBgJdG6sB3Gk8EmEpMBe67CKopRH", - "FL3c2VjWW4m1cdbLVF1DUscNLCNTGhrLMTMvq3wu8YgZ", - "FLcUYvDMd5nh4cyP3oErMHoKnKREmza5rdAZ6XHYU1bd", - "FLdAnmYGeGmwJY3qECfcZ8pyQ1LoTAeBPm8YKFDxQrMN", - "FLFmEzV9eDWDqLkZ5HECMaJA5ZuBD1B8dKbVY98tUyB4", - "FLHB8AGEsED5jAF5sS1kSkAzSXVK23iuT7YDPHGmbcjb", - "FLjMwfY9ahmyc6VgQpokBrra5Ucf5KSK5YW5x9MMKnpS", - "FLpMRfbSMkBnFXDdGKdzcGP8JgrNVhaYowmtArNughqt", - "FLpouJ8TALG2zroSZ2SC8wGdhQwyRjyyPetmJBcmcKQu", - "FLSYxgjDX26qceap8QWYoMogPqeCAeVHtM6ZioiuZiPT", - "FLVzqd7pq7ZC8J7hUhpwVqrmXWYr49HDwfEy5Ay3Hr77", - "FLWiJ2rRybNVxywyiR7uXniC3xkL6DGhb6BYNSixnsGn", - "FLxDbhXTKhhcbSZhyp3c53Lcsm7Bn5VYhW17Q3ygPu67", - "FLZsrLPmXuMCjwi4y4ywqx4aia6TsA4uvvjKLf3AwrLJ", - "FM4FAPKXCxBnBwbjC32hTKKyYP4MiLucg4xBoxy4cRNL", - "Fm4UoSZ4jYnTuLLhav3A5BysiqKani8M6naY5VLFzMsq", - "Fm6eg4e8Kgz2aHw9gMmM2fZHNE2rueP3fw3ZR1pPMjAL", - "FmaWRHAtnhTX3iDhgTzaFHpcuP8TgjWux68zo3kJxttT", - "fmCK1YbEqST3jdrShcLiwEt3sd6eGFepaybTPDdvMvi", - "FMDYeM5CwHDJ8wEadZEuUq84KXrdQAyD7T6UYEmkyRzB", - "FmEC4XcMjL8xdu5JSD4jdRANXLk1j8cpwMHJi2aNncqV", - "FMHjnmeRLszDSDTmHrbqUi7rpXLcrynh9K6jQvjdhqf6", - "FmkQ2kQ7HuYAG2fM2e9RHHtqb12Xg1MEbLyK5S6GLjNb", - "FmkYvt4BD3u5NXmdfyGX2g4QtKsoEbMB7FxmD4TCiTsR", - "FmMWTNcijryGbzDrbB4nsU148YQarwDnGqVnFwW7kexs", - "FMom6AY6fK492deHaCZX8ejhu3mwveEQHu5KbjLJzyPB", - "Fmp8WcfeM2GnTjDCxYwZRq9PaBsQk3utjfq5aWrJtDhQ", - "FmS8aVxk6qN6FtBhzdxe84iv14RDEUET5odAZC9wkkiL", - "FMs94yuSx6idmVsanrH6KrLdtz1CyambgH1jxCLorxHR", - "FmVd4YWnsiau4JLHYxpRW63uutA2sPKpKYGiwB3hBkwt", - "FMXh1Du7ZPPneJVUTetG5NtvH4rTTWYGicAi4ZoJotWg", - "FmZc8PpFoPLghneqvw6ZNd6HohL9uBWUZTxh1c6CETrh", - "Fn7ugsU3zmKJmVcE8V9n7aE4L7J2bNxiUtLkbbwmcwNa", - "Fna4nR4M2MrNE5oqbvSyAXyZ1PfMAejqCYUSWGZijxFW", - "FnaAWEDBPSNCUk49EM6JFS2hr9kGqXKkEDXkw5fdR887", - "FNbDB6Bw8LqN6WY5Xu5ZKZnSGPBN7X79Er4AXwRp5gXo", - "FNBpvn9cNMmMA8GRfGxaD5P5zkG8m3YAJybgJkVi9bbK", - "FNCnVhef4ZbzxMsKiRsHbjpiciwV1YcKmf79NzwZwDvY", - "FNdoUuKVBigMFGpVvSMLXJB4FC7XQL1RjPUqUiwvPiCS", - "FnEmaDnA3nCWFnsPY3DzcHRXZz6myQg6iBkLQ2sYJwbH", - "FngAas3r7KShgnvmgtx4oQ49tF6q7WpUSnxovVsSyyAX", - "FNH1XmR5WgK7CH7W7YdcfxtdgaKFueKtqaggVr3CnY7M", - "FNJXabZm1LnYUFc8am8tL2QnguWpZyHmYTDq4qPMjcRb", - "FnoT5CNbR9HfWgiQypZfiTA7Z8wPQHhhsuPS5eTaHcSK", - "FnpP7TK6F2hZFVnqSUJagZefwRJ4fmnb1StS1NokpLZM", - "FnpP7TK6F2hZFVnqSUJagZefwRJfmnb1StS1NokpLZM", - "FnqRLr1ifSfQmWuAdBjomeRkZFQwfzMaaJMCTeoPZuxP", - "FNRvcQ9hjynUVLf681Xekej9owfv8hYaZMc1UiT7zVUp", - "FNscPDMbmL1SGs3Egrtq23LeJp1nYZ8mB1t9ckBsrBDv", - "FnTXNWRte3UGNe2Ji3x6tbDD8AfWMfWtqc8i2SJzAYav", - "FnWB4YeRLny3gmNiCsVv6aS2wgF7YaiAjBXuk6856E8x", - "FNXL8xHEV17sZNVFqSdgiTfskyXKMgDMZpUB1SxmBGKG", - "FnyZzpqjg1Eo4zD6snpggCHKWQq7rS6gRdbmKpWcmQN6", - "Fo97rX1Wji19uZzyK1u3k9cinKJvcCmR8uZbKw4ceUAs", - "FoAXKMRT6MCNEnrJVMFpyGuvcevBk5Pi7wnosZSLHSkj", - "FobjnCwQyc8iPtY8keBkHTMExFeDMziFEuaPDBNFWpdm", - "FoDccJmq4PksAoMpRbygVVocdp4NrC8PSwwDd8nfKYzv", - "FoDJ1NKRXzv1hs3S6BNrYV4hQVEFPSyGUanhGa3oAXni", - "Foj91JCLzUhRRcfpXMnWACFU4hAQ81zQuCnDhtx7dqq6", - "FoJzrtWe8Fk4nPjwehQTJeVpEA1c1idG6e49Ck1H4wNq", - "FopUHTQwNmXJuANMpLMHRs15KeEtLjngCgZnAuToR4qa", - "ForPmSZ9uLbABumB6Y2uTF9ZYsXYqCMBD8PZx1FdAtWT", - "FotUJq3ueDw7HdUj4R73XUJt4YYn5L1QbEADVLgUCc5G", - "Fou7Du6KtVb8dVMzKMYW39fuSGpMzJGwpkQ45NbxA3Tx", - "FoucQL3gKMJjAksheh9miWwpB5cP9z9ac2Wf92Lfyd1m", - "FoXkfE3LB4CisV3N5jEMkUHbFHYz5XfNY9yR8A4ns7Qs", - "Fp5pxXyeqeAXZcdHZbTGyfmuFwd8YcXEWePwYgGRq5c7", - "FP7DQZLrpaSSM3fDKiyHX7esju4NUfz9D6hgzZDqLcwA", - "Fpc4MrSwUsSN4ntonx97fuBq1td7xpcHyMtQ3udFjUPR", - "FpcTktAA3ZVCNUfgbvFa777BwdChhX2t8oEoueeJtbgT", - "FpDAgx7pGqjegqmoZTDBDPCmS6JcLgsA4bXwYH7CtH4R", - "FPDDc7GZ5xS2w8c3TM1aiPvqmoQe8QW5Zx92ZAk2kmCQ", - "FpeEF5AEYLiMSKiimx575tXYSxy5ZNeYKVud9EAEJXk5", - "FPEsE5aeiw9gXRPBFGvAoBaJnLBwFTtnjNZpT9pyJfzi", - "FPF4V5wVGhiM4UxLLFA9LoaMFLs8pfnGrYhsRrjS9xGk", - "FpfaG95JF3gsK2hfbo6Fdy4FCJrnfSgvEpm8DQ9U8e44", - "FpHdmP8FTtfR8L1uAdBudYUgfCcAcMZ5bxapJBmSJwu2", - "FphypHn7XJ3HisFtdnUX2VdqsWNLa1ATwrA6ytR4VSbG", - "Fpjgh3jSa9xm1KMwcCKJ7cu3jXNNyFyPMoeoqw8GqdmS", - "FPncJ2ASP4cVPcmHxibgpqaxMuwjaw3qNQiZvVdoefDg", - "FPRgGvzosu6W7LnjyAuDECNYCNRRxE8EoWi1buj4hPo4", - "FpRVS6iuUGxfYjmbrpiC2mnYuXDEsLBjT7xqj7oTKf4", - "FPsHYaampDEMRY9eCk5HxNu56r1Q13JTyNffHWm8dsRk", - "FpX4XYrSFjBcUNgt3x2p2SwcHaKSdZxNDw9KYRjrnKbY", - "FQ39rvr27N3C3WJPVnK2BD7DemrGEJZYP5BtxuRpFizh", - "FQa4mYpWL7mNEXe8dWbd2FXxpreFtYJkD2S6hMD1oXHH", - "FqB5ZWTeLoB1LkJPs7HwJELtHg1YPty4HvetvTCdirzf", - "Fqd8awoq881cLu7xjGf6pSn1yUzrw7L7TRCMy8HFTt2K", - "FqdAcsUQBMibVJVr259uSAnA5FMK2xACaz9vPEtdvkYn", - "FqehgRtfTkSW2Pf9G4a6xzM3uAWshiPSY14HPiWcCmkQ", - "FQFrdHAhKFP9R5R6JkJPtVJhLDivDia4cNNUcL6Eja6j", - "FqheXr2yJSTRGncTqVFFG5sLaTtXZeQbkQAxbL8mcGru", - "FQK8VLPxL9KFx4rSysZuKEk3rrxuvatdSQLVNWyWfCz9", - "FqnhNavHvZWpKqJKoy59cibgZT2AqwiaywStoLSWhaRt", - "Fqp2Ui8znxbpNXZFGLbpTV3eQrrrmUxCfDupzhMnqJgi", - "FQPRF1x5eFUdNWvfVwwJkJdqqfstGnCkEFVKEKHp3GVG", - "FQQn4g2M7yiWdM4vvbWMt6kubFA7741vPhoeVA6gvfQF", - "FqrYY7h4wFofqE5DPPfdUUTo7VnZqguhTc6pDx6R9WA3", - "FQSJMbJR2S1FFfNTzkvgZV4gH6J35s9wyeRCMDSi8WQS", - "FqSMwPNkQkovdhM4boJh4X9ZhaFWrHPCPddGXTUpdWch", - "FQUuxWXPVvXvLbJo4YZLTcgeFzxZqydaf5mebreCx6Rn", - "Fqw9ty5g52pXCHtmDqf8szhTDWRNxeKacckBZSrEHijW", - "Fr1BMG4DE17Lu7Jj5kG9gndjKiBvr9kHyqmoFMWEpA4r", - "FR1LCt423dHUVkcAtBNCvcd2XEH1B2M7FFZ2toTUiSe2", - "FR2rptYjvSsYeDur8khPK33q6Byjn4if6Fb4oTiJF3Fh", - "Fr3WfD9xCLX83AaktYvcihvqoaJKh7f1AnD8mCN1egHw", - "FREfvZvktGtPiz3zxx5UtgwkHRkSCwjj4KA32dsMGkFa", - "FRhLumDLWhuS9sthUmnQWFUKKXVJf1RSABPKLD6RkTjL", - "fRiGutrC4h4ZdYVE65g3pCeJNDg2g9j21AvMjhDMwW8", - "FrjLcc6vQnPiyrXYBETkjDBWVTa3ZTi4ZYnpz82dGPi6", - "FRkebpUspgbCwzJeYUPhCMR5ETBfQgE5ZM58HbotfyxB", - "FRkEFxUbT9e3GCJWbjkajHF2tcie7dDeH8rwDUPThxZk", - "FRkquWctCH61f69pwNLS2LBfVcGprHFvHh336vVY1xXr", - "fRoujQSAf3vDmAed6wFuHVwv5MPd8p77W1a9PkhhnKE", - "FrPdwGZp7tJ4bMG5S5HQMcCUVvt6mH8JUPMcR4eEmWcR", - "FRwKE7ZqtVzj6g1tQQmEUHig5VzPqcUS3WhVaHN3YVfo", - "FRXTSuAxj4RaD2x1kEN6cgdcuMAMMdSEfaXcUhHSu4sM", - "FRZTCbPPDZEJfQBHASWz3EW6id2JNiewLcKUVeyJJvja", - "Fs22kmn2vDwK1wCf421UNf7n11YQL4kJteyLQHmxGA5o", - "Fs2pjC7SxCSRkKKLjLSzthoBynqEDdcFv39PMhEcyhXs", - "FS3YhnutytW6uHQ6WxEbPn9Dosgrp6UANmaNtefdSSx2", - "Fs4uULMoYXXA2G68Pf4murNBafuvmdFwZhVU2z5rrQou", - "FsaDVAfoR4Rq1NAzLU4ynhzuz6hLGJiVsY9deEWNCLio", - "FsAmc1i7XrKotJQJh4oLCwEirfoFpczPN9qMyA7zEt2P", - "FSCDgxLshVy6Mdieg1e44BtXHHZN2BHuggDy6Zob1ioy", - "FSr3fGXzbMPBwWhnWY6oMSAdZqiVXxw4EpwxRAJpu5pB", - "FSs8NQ8eZB2PAxzuPzp4rfnoLYJQf8sjXue5ByHEfvtr", - "FsXhxtFKXJBDu6ncnq3SBt9yvPPcYoeSL28ZMd29BMs7", - "Ft41sppgFUHY6vBvNG2sgD6ziT8fsAVFsxLXzXPZmNWh", - "Ft4ADhkxMVfgxNDQFqA3ymaNGC39rCHdUj6H8KEWQqXy", - "Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN", - "FT9QgTVo375TgDAQusTgpsfXqTosCJLfrBpoVdcbnhtS", - "FtcWXFsHJnua9iUAUvARcAnYDZXr6vFwZCaXRsN5eeWp", - "FtDFtvGeNCo6hnGCZEYMyLiMEsQ9AZ6pFjEHzLk8BqCU", - "FtdML2RtcoX4LHynbMaktAVo7KM7Eg3aSdjnSKJdKqBa", - "FtDmMDMfJXkwLBezKg8EsCuDhgweu2avFVxBVsZzKsNR", - "FtJWm7Bz3hEfJdQYeCUJY4uPBwtZXZUYHmF7Uti2GTto", - "Ftms6EEKfgb3FfaoJJk6A42MqQXVcU15RcRa749LLikL", - "FtnMU4gqaiRgAJ4uFDFARAp6WbCtGcjxqck15L6Q6EEY", - "FTUh2jo7GmxFqLy8c9R9jTPapfGjwcaDdozBjhKJz7UN", - "Ftvokkf73LnyqirUyaxggRgMAt9NYqWHBV5CUREBgfBe", - "FtX7DB9Cx6WCdUvJiFGxB28Zs3vqjoUMMgWqbmaLgtWW", - "FTx7MaiD4XK9JbmcZZboBbyUTfkaqiqtYMKBZygLemti", - "FtxskNsdgNW27aFVoRozBSw1x6NKbPPksiHKPyCVcWGH", - "Fu7znc4KTtQr6UcwVCVJ8Dj6UqrnvwiGzD6c87fKkZzp", - "FucNghMHRm5BgC71XYi7n5dgJ9BWyNY7XJoRsXc4VK2f", - "Fue9LZxjhk2DNXWxM3rPKr3z2qntChdeth615m7zUo8v", - "fujGwkeh2yqfhEcN9sPkiwffzGhKSYGdPBFUZttV3a9", - "FukZczEJ3fUUQkAhtp226VPXk3SwN4LE4A1xKMCqZmN2", - "FunoozCzy3zV8t8cepfNzWBHYRtsvF65T4oCBMX1S45y", - "FupytqL6vfWgaUVWUdZe5oLjXsG8egD1VXeZtKGNkPoS", - "FuR5Yd8ck4pciGHzLRyZtNzhmZ4HaQZQDTZjXV73KrUS", - "FuYNgUq2bp5WUPTDisKJeTZ3sbE7BkxRiwZKTdVyUocX", - "Fuz8HtpjJpUq4vCU3xx5S13yhZ4DZjwBsVf4EzFj5yVu", - "FUZNQwDpKa9Gkp4c4QYoBqzvDSdAHrbDXSCFJmARRYir", - "Fv4zJ7RvV8gEYxEtLjnGZAX1qxjqRh56DzBgqvFEVjjM", - "Fv684z5SvpMvZf4e1aaTwaA8j1kfnkxd3iQNBdyFNWKe", - "FvAEpFc9t2qwCSqKNfxfyB8oQNijq4gXCrkfbabJN542", - "FVC1wfwZAjs9YMZLvpPYF5ZQg2kGjMuctzMnAypSmcsw", - "FVD3oRjHRyDsGTwisgZrZPV6vbbRvkgx8hm6ctmBG1Ne", - "FVdYwixAoSThbdBQCWA4mtB3xaKnRDm6GCJ4BKpKXWPb", - "FVeAQHyyBjnuPDVHb8aFk8FRejULrB78K4SYyuuj8Q2T", - "FvjGQKxfxiewLFzEHSWSRD86j149tZCjKBjnmSL7gVsC", - "FvKdhrqKVjd6BTkMvtqsfiJKqByUwtq8KTW6DGm5qRJj", - "FVnG988wW3uF613QVxmQrkwtdzS8taxjFsuARTzZBwMo", - "FvowRg72oo4ZJz3a9vsN5KBWfXrX9ADFTZY6PQQFrjaL", - "FVrtWng7Jii4NoiPWkob2HjE4SYgiKXKuSSRjCKssyD1", - "FvVR4Fz6M4yaiwgUUrmm7DkVJKrfUNirNmGSgvZ2Kyw2", - "FvX3yeKrJeRfYGsDFHrJVPmd83QDBRn7iWhK6vbUViuF", - "FVZcwmWh4iQLdyr3wt8dpiJ9dAB2nDSRNCcTSK21Dq1o", - "FvZWvuFBEXU2oT2YM6fdwtreQQo4dmhmsHLMskavfjG5", - "fw7Td8AG8Sfha5ZQQnwaKAYFnskbbLBPJrieP4Puxwy", - "Fw8XNG1k2N8Gh6zKvSm7m45daXxysQ6DXxJwzW6SfSsX", - "FW9MB3wY2QDvKbFHTzLzq3YdUvwK1s7TRvD8KhGhWZ3r", - "FW9pXMpvMKac4XRzyHHCLEYrTkqdv9KksGcivEQjKa1E", - "FWCMvVvh94gRxE7XKyPAwcNEPLe7gdGWpTK1kefuB4nx", - "FwhKmbdbaqWqSMPimLFbPGwZqhpbPJEECnhLdURrc362", - "FWLHyd89CzwVRnsN6F8wQEhR3eyWDV7G2NR2oe7nVwaq", - "FwPJHAkooG3fD4Y4BQpAekjnd2pybWcCE2R98F6rNZdC", - "FWUFG4jKyCVpEhzYHAYuRNjjFpfrt4y9NifzrZPZfwK8", - "FwUowDF5dqyjo4ApEBQA28aRRfrmyzprHtaDPK7Xg8ky", - "FWVad4WzHbeoU3P6UYgvyKWgCzSF5FYBZHjuMXtrN2yL", - "FwvZgzLbagJR5BfBe32aJ7HkgMvriWjuachFTd7mfaJG", - "FwwoyYyU9HnaLQ5yDNEDatkp6RtMkPWcbMKTi2nnnzyD", - "FWXHfzX8UegPoYeL4rmukewwm29NptWKEyxEYmRrAokJ", - "Fx6D6VCvZ5ssHHm9AzPqroyF5tJgtyqZirmSBZxpCFUw", - "FX79FPDZxHAbPmSLHHgeDpQqU4H8RtTwad6yCjcLXDYA", - "Fx7dVi2oVpynBKzU2V7nRDbdfBjWrqqjLFxULXCVp2TB", - "FXAPWnKUispRRCaRD93eYnwot4VNMgKAZjjtS5UTcni7", - "FXGBEHAr81PVbD4ExKesR3AwXp7SwP2wX3kLsjijd8eP", - "FXKMkagy17apGEj7HzXxin4DK1nqzs25R9Bm7Kzekijp", - "FxMwrcSTgb8RKFwJxa6DSbsKQNmiDqstRTUeKej4Zw8D", - "FXoR2WBgC1iKBreUEeccVAjnsKHgsVAQJA5Sz1owKdVs", - "FXQdYdbdQcD5U68KVJQ4GbypfBeRqE2nhS6R8qXEiwCR", - "FXtiQHb6bGKdBz6UKmLrgw6c4X5GCYMcwDjKHk436NR4", - "Fxv1ymSwB6tdRCbjBURQK6P68XR2njCGfWbnfzVciJsP", - "FXVTpozaNNzwiaEu5HbS9EK7HMNm7QPLk1UEH55hAkK5", - "Fxw5NgncJhGbnjH1wuZuavVPDQcowTwG4wKiWAB4WNAw", - "FxzaKZFfSt7JyCjgWTWBHLf65KMVyiu4VeqZKfB3d5F1", - "FY27awPF692TJjwkCn1Mgnu56E9xRyGjiG8ZwdMQyXU", - "FY3F4JzCg3zZxCFVTLr7bPCHj4KRn65hX6HxRvnX3V2Q", - "FYbPGVQzjF7oVyKXxxHcFBGUXSwq2A6mB8bdipcKvMic", - "Fycm3maimWfFWgdLJubtEogL1v4aJEkQapRwWRPxvf5m", - "FyE8VVxHTPJCMhudPdZ6N2zTanDd8vU58MgxpMiR7aug", - "FyGLvXzJKfNEBFHS4ezGrWZjHfbqdMApYesRjt4yZD35", - "FyGvEevq9yfTJedbDBJRwKS9j2HBNh4V9xjpN34Pa7Ry", - "FYH7U2HPhgxQCsHBGDaC135Rsx4tZx7P6ZjxnGqWHBHn", - "FySAL2GQUfkqjUE11bTPEUjrkWRwgwFtcEJ7XyTq3hSi", - "FYTKct8pwWpnNw1X7a9ZPE9rPHzXaQvbeAdMKNNcMa3k", - "FyuVpaax8VBCvmHEz863a8mXjTJ2CWw1GVj97tugjZr6", - "Fz1kog3HGgUUUgh2sCUyN2BiUn4oaDn5AciSxXhXXvtF", - "Fz4KnnWof8h5J8JhrVeZq998C4YKP9VC3XEUkBs3nYUN", - "Fza2vbPUieBH9VzAyvUWoJfxShdtEMm14Vhmz1QE86LC", - "FzAFEuPW5SQDemmCZaRXtFPiFDcPkXDF3aV2UukBNv9G", - "FZaPLv5tXHy1ghQ9brfEPre3iR1aLFDeLmwmis7V7bo9", - "FzAv1TFpCyR65GrxeqBwnEzNVXEeUMPV5rKZGQhPR7mq", - "fzCFpDGUcyX78KEMSfJwczi61td55v133eyTeQtBuW1", - "FzdSTWjQCpErn9C2FqKH1y7oryuU2EgyvHZCGss9715R", - "FzeiVQGdYrFWa8p79HGPJdnvy3zTjxmwEk8fuMcDo4U5", - "Fzfv8LGqtE6KKFGFzJNrpQLH9CikGQBz92Yna2rDCi2C", - "FzNE4i5kUg2csgwihF67CELe6u7WRzGTYSqJyC1bKaZB", - "FZrQPB2zXDuyj3sHm6FbNi3hSawgtG9bksW6xMacChLY", - "FZs4wpdZEuF1TzFHQPSG1d91C6bo3m1Lqj6mGrhuewbQ", - "FzSu2Z1BLaZ74ePwxhy4qEgoWNHyc35r1zH22nB4qiKk", - "FzVhdCaP6rrkc1vG974koTThhiJwbMvzkwrqGZsM2GgA", - "FZwe9ppDShQjVoNvfGs8TZqQR3QrajheZBDDfR4oJRRd", - "FzWteqA5hxaMBoX16wD4ch32g9YUyhkod6m9xkTXz9YC", - "FZxF8nafbzeZxy5UR7ZUf3mDHhkRZYjd6awzMkuUNGXq", - "G1bkfjDMFHCc25Jr821z46p3yYU1FrLejLhoUpYbXQNV", - "G1GGRcb3izrVjNY9bJ3DcawFogVLF63vUDXKncQmCJgr", - "G1j4EQejsbiERu3xsts838kcCpudW4t5ZD28hahAGp7U", - "g1jyzFsCaJZmfkCWxcAF8Ay9DFm82cSrM4yfi8aDkgt", - "G1trMBxwwi2Qtdfdjzie88xDd2UvUAQXPbP8x74vN2w1", - "G1uCu6JrV683QK3kdAzEiiAEBSMk32Ugy56u685cynJ2", - "G1XAtQaBj7tkwZAHwmXcAKSzMB8C9Kbfge52hZuxBA5B", - "G1Y1hpraN4FofDP7tfeqD5kygWmU89QLRvjUCchqrRSj", - "G28zoLQPxMQu77cnPMABWzGFoQkP2T1bMUoDF41b5kH", - "G29KDaE6ed3YWzWaNesjgoBu5CFJrcHe9sb8dr7b7LLq", - "G29YqEYhdrrPkQr34YL6b9vRe7DNKWEZrDQJw9Y4FnTL", - "G2bNSPr2Peyi7CmyJ4srX3YdEvu5egpQiorjivMsgnrs", - "G2eTT6RJScbms267qa3N8xMroFAJgsJqqsdAVaykoi8a", - "G2F7Ts6ShkB3sXz8rMZfCo9fy6YTqix4ZjHZAXMztG4h", - "G2gA5awycmfrTkD7RZ3tGvZYwdfmLuHBr7MFdBw8Nita", - "G2iXoBeULWm57RQmgJSq4tPUHYh6XhuXybWi8LgV3Srx", - "G2KHjC49EUbvsrXrY89TJMCHSUnZqW4F2Z3QDXKUQTQW", - "G2NvwnX698HgTrbGYK2nNJamvm9JXHpViCKVp68hhDzX", - "G2p2N84sJiBL4HCHBpzfk76wTPacToPf6KZ8FDJbke5h", - "G3di4JQAJwV4iMZhYJafxrsP1hen7DQdtTWYLu9YrKgS", - "G3tnUHh4JgDTN8wnesqZqrWN7yA6hvdcj9kRCMNmEyfQ", - "G3WiaCtQP8MnG24jBSc5peVnNgBWw55A2VTVww8ncX5h", - "g3wQTEbSm3rHtxNxv4kKkRy26vo9w2gMjEsMLwGc4es", - "G3XPqL7h6TtKsenCBXi4NftqcVGwKFFVGzxeVbkbAKMt", - "G41jKhhCYy6ojY2SJjZz7wpf1XMK7EKxpC9GL4fkeksG", - "G45m26TfZ2GnpTF6R2A42EXHKtUYe8wDbMMHPC6PjNf", - "G47WACh32JUcxyiCna7UYw45tyYSFKQ58yFpUmhmMybm", - "G4AvG51vzJTKvSvRagZU4Qy7HyxKqQWM7opRkdGvNRG9", - "G568qfU9RoimMhw1UjGtwNUnmKG9TuaXGfbFRHvLg1YQ", - "G5dS2hFkFQcx3ZWTeLSu5RWmPxjXV1RY6VRwX4fmejQd", - "G5eW9bTGpw2S86iivS18hmQNHN7dXbpWWqya9MUWc5Gz", - "G5F9RG5hd136BNBtewsChY1E2jnPoABw94mZmeConsFv", - "G5ge3gXw7gxjVf9i2hjVoU8ZsmNGRBk5stDft5v4Xi8r", - "G5naszdWaPwDEaEvCUWKhWDkdEscVBhXyNtzhthKzsnU", - "G5r4XSC5D4Rw4NaWjbgBKnj6bNDsSGUvE46w9BYAT79r", - "G5raVcuyDQQb26xJ7v1RG9iMbssP9gpK6sG9qXM86VZE", - "G5rs43opKoVrYCqDvw5kgx5VUZ3At6GRUEGwJcMdfDKj", - "G5wSAoZRgCw6EMXsqkRJyP38wkyrV6YiyHup3PSnXCXR", - "G61zm6s8AnAJFXri34jFRtBR4ztyujgbvqRTn1cJero", - "G62gE3Yef1uRXxZ6VztHU6yNLZSL8BNpGnUmKYYzLq1x", - "G69xCsgfsBsdzrG4Lh7D9rMM9XKn93tQqgWtEbBFRF9G", - "G6b3dGp3vkkWZa2iUqRLeygdhB2ht8XbQiji8b6Jfh1a", - "G6eri5Q4x4Ttei9337eFipHuGU38oVtTb8dt2fmAPgy9", - "G6izaLV9qcLqv7JMRZXfqomyBQa2bpbqbza2D1bt6fLN", - "G6JWqpSsCVN8ZLEwfwgxd157ExZ4nvjWovCiVcghAS5j", - "G6kUvH1mLRuwhSzv84EwRXT9fpZyUb53Fjm2M2n8oQo1", - "G6NoDaPGvSwLzGYSwece5ntHTYo9ux1apoPsJFW58mV3", - "G6pc7F5JTt6SbYZJQdCB947kwbaiYX9veR4A9jxwAD4S", - "G6vrrFo9n5ud6FENYR3e5Mk5i3EEBknAqcYwuKdUxn58", - "G778RUorD6auopWv67SqFDggXzydxMNUzvoMVbhq1Pbp", - "G7cSi3avELxMLTCossnsooLj6UNhnfER6kpnSx8NKHfM", - "G7g3kou76GyMUtxCUG6MqrQ6JHiQgjMVaRgU8ABoihNV", - "G7G5atnpRyhPEW3qKdSdnWADTVM6KxSBnSTxyxKNsgSc", - "G7gAgJpRHnRvFhrUMA5khWMqHJ3tpWVWdpsBvCq6w6MY", - "G7Gth5YGEpVXaVBA38soXy3a9bR4jxtNwkRCY319RAPh", - "G7mFk3fX4xQmBV5je4926SzLCphWFoww8APYxQKfkNxn", - "G7NoACjYzRcrLibw3dbNoDCVoBR67ijm3tYeL5zL5qKY", - "G7R7QFy95eeELpCgRTdxFSJbGp3EdryFKN8ou41vZJGA", - "G7TikMTuTRhnhvTX6pJqndA423HbWYd2SvCSzEgjydSo", - "G7VZDgKqyi8quXbzbWkdGTTXtvPK9svdPDptV1Ko5soG", - "G7yLrWmBnFk55eSi5FSZEe4cDEum9ZUzkA5AMGj9s6Cx", - "G8b5ENyqnmMTfMyhC5WAfwN1zXjYsYUnCWjW9cLcQGio", - "G8fMMaLRGthFYvChhVn9pcedE58MkUVocnQmTeUHz1Gn", - "G8QaUmUwzJ9z8vu2XbxctG4eu336mfg1oPbBnWXpSE1H", - "G8XbgiaW7GFpnsUJ7f59osfzMw3kKxkULhiPDSvobHNg", - "G93wcRkzJFuvrfFcZuETSxn5SUQjPqzwNfRnRVAHD5wZ", - "G9AHwpSz6gRb2PYQTj13oouRmpN1VAdHwXGzb1eoTfCT", - "G9EdxCydRDhFW7u6sP5Pt5LcPiUVyS3DmreWh9ohuTK1", - "G9eHPh6QJH4uq7JeMECUu59SPh2HZu9hQZQN1bUfcqtS", - "G9FK4UJWbgNpMDmdC5PFJCcWo3zSaYJ8P3D1FR5BuDog", - "G9HvqyAPyDkfDVYXvdyBuJ7oFET3mtUYGvmQ4XwAuoa7", - "G9wia8u9NHED3GChjMkzGi8WPGnj8ccNer4wb2WHeqtu", - "Ga2H1djWv6qKUUjy7nwvPdkf7zKvp8i5j1SnhBYajtMV", - "Ga3U2KVbMn4y6z3u5SC82DZdDYUVAvnpyq83KERD6B9k", - "GA66g4BZZniutH4y6fkLqSWTCjnDUtXomLkWfEi3ZYvg", - "GaAb7uwik3bGsMurHJNmbabF8G8k2cYJy4Wrv3tefuWc", - "GacdeBPTj537WF7oK55GVPWf1n8NPrCoY8tPvgarjYUf", - "GaeF1H4TV1YTpck9KhB7nqcSjG2BqCVBHYYHsxyLfK9m", - "GaF3pvHbeCiUNxaX2KHVCmAToNrguoJ9KN5dQHcg7A7", - "GAFoH58REcxGLFDVwn3Ecxqw3etvSiXr5nMH2vQHbwro", - "GaHdjfgGc34FqpFuiKxf579we8HWMphyChJu4FvXoiij", - "GAHUkVX1enDQJSVsxJ31iL5QaB1S1Z6vfUjsZkESVqiR", - "GAj851Q82UCGTEmCGVFTVUrFWV5Wur88pF3b3dtSS9YD", - "GAMAN2FHsRxJHFgaNWQUG8ubxPNqezyaaoewcE6foF4F", - "GAmFDWku5dLgxXiRDUn5mt5nXRMRRzGVhJUW3X6qsHMY", - "GandRToXToyt4VemrUENWdwgxp9hBEWExwVMW7SApGY2", - "GANHa2x6MZdwAK6oPVoocKAdsefvAa7f1tMt4wzFBeZR", - "GAnkxgaZszgJDqgy3LAGgKELwnWLfgbiVnwpRYTbFTPt", - "GanNrbettUvQF8ifWpCjAXvDfriYDc7DzZjn7K9CzcyY", - "GAPNvBD6MXboQmxP9XTCC4CMsT5gUpdFZWbnj4Tz2s7i", - "GAs5dt2Xjtd4f1mqZob6hKhY7H2J2HEAc8oFQ2fEjAcx", - "GaTDMHvngmoJhuRYrLGcE2GMCofu7K8SLGwkCkDE1mYh", - "GAtiq3zJXV26xR5VjAqqrYCM3VoTZHZKCtub1DpzJRcK", - "GaVCM6rQVycyYNDVAjAKmnmCMnbe37qUuGmyTKhYPCQM", - "GaxhkG4HQbbHTPDPovbNPtPvKjzWYESEELaMEdwh13b2", - "GB1F3KY6GJpiCoNWWZuvMiquQ6kbbtiSFK91mZSHEJ6g", - "gb3gd6JqZTxptdd5f3keV9ufjaEKcVK4sAzVrp11yFm", - "GB8b8Zure8MzwQWPycAcEr9Cx7ARprAUoh8fWG9KiVLY", - "Gb9j79QFprtbY4sieaLZGjQr4a5ifFxGdnU2qkjPbBJQ", - "GbA4BabMKgVEagnp6tJNzScpizHWtNBj8W9LYnvQtvZ", - "GBbBhpn8USrYMZ22aykcJhy78q23yAtp6CzrVGySibdE", - "GBeyvNz19UahKPmJAKVuTUQLNWkYVpCbjDqExmYtgVFP", - "GBgTbQ9bfWyLMdaq8JvPQAdzyHtGY9hNpAtQaFHhXPAQ", - "GBiLHgSabibGLXrAfVTcRjVXwE76ERaqc4u9v6gnwQJw", - "GbivE7wYoEWqsAUM1C3URgYKS1JR2N4UEQ7sg96xa6E2", - "GbJ17wSd9EswW6VgFJ2TAoE3RuG34PkPB4LHGQ37PUbZ", - "GbJ72DJD9uNfRXbehAuNRnJyzHYxVMHa9QLc8KKbicaL", - "GBJEbVAVziLBQNHz8LkHHDHjMK4339VA99Xt5DGcxs1S", - "GbKgojQpyqs6Te7YXn8fdrKb4rGtLvaaD7JzFzVWyUt1", - "GbmZkxUgNcxxEFiHd3hMqpBnwSPyRYz5c2Ya6UPFchQj", - "GBNo5eYgtwJMi4FupV9b9cyoJdgJs9vjmJerLs1rj4mT", - "GBoq5MPQE1LQmBugdapDtSEQGvDshght4hjBxyPmVmS3", - "GBpCjaEKmHwSSPvFdQe7wpf5CzCiE3uLVxTnno4iFWEM", - "Gbqh5eq7nVajFNocG1GZGikoiAqPstfQjHxdGBc3SD4M", - "GbQXddYycCz7aK7HZUHNUQ8bxeAgPtSuJRLYaNN3pbej", - "GbsrzhR5dptQzBLcCTqwVoE5LnhX5Wgxv5Vu1pp8qwX8", - "gbTiMDm4rU4HNKgjJ5SM9drSuSD6C1nSZQNsqyiwzzn", - "GBtNh6c3Jbf7xMSA4VCAbjkJpBVJkB1QsZLh7iD6Hpq7", - "GbtVg3D6bNFSjem21vrJBJTpUniwwEtmvs8mQkX5XS1V", - "Gbwg3HCbD9gzma2o6oTqYkDQnojeZ1z7Ygc95DPFA2me", - "GbY9gVU9wuQKdWXrw4W4i9dBH6feAq3BpPwDKiFZecyY", - "GBzMFK3VSeqrTFi31iWPp8v9ohr7TBJ1Fi8yQMvigbZa", - "GC41PE9hngtmwzCbTuZQvCLN7C6xSLTC1AxRSAZSPRRf", - "GC76z11dHkHmhQuw6ttPzgn5SzWZ6P9gv6pK6kFbSWXQ", - "GC8QndJmaHpVbPL3UUMbikqmTPp3tAhzoieyTUVXoxaP", - "GCBBx5HU1Bidr3xVkc7dox4HRwpBwg9Y81s5h4pmVUrt", - "Gcbxsr1KQsrbH3D6mav8xcMgycU6Dr3GtLXFsQsxa3DQ", - "GcCuD1yJFSeDdbogBFrnKRfPcv84wNjzN2MAz5vrv25S", - "GcdquN8w7oe3i88dWs2QH2YhViENkTifYQersTyuYyCP", - "GcDXGgS8GSsSLcExjRdd1EWyNnTGJzPafEMmnHQ4HUJE", - "GcfQMqXSmCVVW6RVrCSi6UcjVaWyFVP8LtrCcHwxJR4d", - "GcibmF4zgb6Vr4bpZZYHGDPZNWiLnBDUHdpJZTsTDvwe", - "GckfhHQ1fb2mEhiSfThC6tgsvy8hPP5xJuqtymrueNPt", - "GcKtNxcFSQVof9Lo8EVTzx5QVqDbDXh2QG28Nry8HfyU", - "GCPW2jinG8pk2KfALJA2FYNhLKwCR42Y8ccQPXz2PYg", - "GCqADP2fHndoSwrfCRwGBxYbuPiTeD6U1Dv7LtcJv3Rz", - "Gcqdq9V3jq35apr6SLYk9CtTdwjkEywhVgysyt8SApw8", - "GcrQtsARSfNdxHUDT12zjhF7NgbdSB82b7fxTcNAevmK", - "Gcu1fpYPwoyBm7JjLJsY6H2eHRe8J5bjzoXtAwpy6m9F", - "Gcux6jgfZMCMcRhvZQH3gEDPEa6HJ2VhBxMNwoRQ5esm", - "GcVRQn1RrvyX9wmcDyWCJAL9HjRuu4txWpWti46brUbM", - "gCVSAXqKe8bG5V4NkXQQM3Uwy9Rx4JR1B83uJRyDruS", - "GCWhEP4dvHQWPMJfZ68XePB82qpuiTFGVgwAYUe95gF8", - "GcyuE3PbAprdPXDiyx5EoGHMNUZ2NA95bEA27bc2djGq", - "Gd2B1YDXPo2rXZVL5xbEu3KMR1ieZ7x1bfKYoQpz67zx", - "Gd7zbMcA37tfU6dZYi5GfstUxGowwTd8CQPdDfsAynKT", - "GdagqojZX3J878XZ4jgm9yB1kfdXb2cnrJwv9A2yC55U", - "GdD6uPAmbigBYCxkC3mEwMqA8A6ch1QSgassu5PSvCis", - "GDF1DP462tGF7jxdHFUmdba1LiNZLaq7FKfcwY2wCmgS", - "Gdhk5nYjRNv6pdGXKsv5CHQA9QxkZjcxdhJSK5Zwk1HW", - "Gdi1N4Bsq77sRHrvuth7wguHL11Vj6e51pyJzLaZFEFf", - "GdjGkagCgTkVE2rwPdPUy1KXfFFmihD7GGzpZzyRHfz7", - "GDoZFWJNuiQdP3DMupgBeGr6mQJYCcWuUvcrnr7xhSqj", - "GdPinFttkZNFcV8ytiUFsFS9rdtVDcCVQn3PeG8VMByt", - "GDs68fb61cy8gw1WPraWoEF8P7QNVhbFBaRN63t8QHmk", - "GDT3N7u2xtJjcaVUyxVppQs9dV4tiss8SR7BZj8UTPwL", - "Gdui5E4qiqD3cfuZ2GcxwHZquRCKAnWqneduSbgT6JRv", - "GDvW9BczzCHnnGLK7wSeZSkGQqP1ie4qcXuoaU3KR1mJ", - "Ge2SFnQj7BeJsVaNqSrMz3XFGBjoFMMZ8qThYZRYYNr3", - "Ge3uyUY1bvb1a1Uv1dyBKkd1LJorgjJh4eKkH3mmhLks", - "Ge97QfuPHxT3hLVuej8dVR4BnNcQDc9U4SQkek5FKmtB", - "GEAFsEHsXFJzEUvwHxoy6f57a8GfWq4HMZdaAY8QSHEm", - "GeAPezx44K3wAZPna7mgXL8YuJPvdqDKrwqSL14SxabD", - "GEAUq9s37PdQvkgxcVTGemjTGPjSALi5hZ72scLe4sDB", - "GEBvuMyPAM3Hmsr4UnGMqeeJNPiC6ZqPkCGKW6pADd8h", - "GEdkMRnnUALSdu5oB7L43chkDnBACNjq7WHEatk9sQk", - "GEeL5VToy7H2oEFyLW5q4T1HeCDa6AA5YN8r4PiCnyW4", - "GeFzk8NeXEcUVGLQRXfP6HrqZVQQ6CbDvJNfGFeWmYEf", - "Gek7ibcu48FM6j8P6ZP4qvTZU49uYATw5xSQTRYQytDt", - "GekSeCsLCQ1Vca4qehrNztYFoBzXv77rAmpDDGnzXREF", - "GEQ4zgAo1X31X8wZFxd3ArDULaw46Km8Bu5tmWVzUkwC", - "GeS9DzQuMz8PnUnUPPWmr5JrMdrRKDo7RiviNXET8Lak", - "GEu5S1Cp5hMdjhs8qUAXjDyvua3CqLsc6LEAar6g1bof", - "GevceSyTLxHv55phyp2PirpdsdqNFZRZSYViRCrXmneh", - "gevTxm36Z59sTxLJM1LMTJo1aVNUa7RCJuJ11b7eoJi", - "GeXhZ8dcMUeqENox6KjJ6RtBZWRHjMpW3bGzYnPxe2t2", - "GeXPswhhjmUA8x7X6D9Kyn1mFxczdcoVrmL6TE6Lspaf", - "Geza1KeYHg1EmwTxfNWpvZN2MTDxNX5aD6kLXw9ABuDT", - "gF3hsTNrujpd3s6yyFZKzJZGSUiYr5Gs4PAiCCWteSf", - "Gf6pamwAvXNseNSenB8YdUYM1eLC8L4X2PdP5aPec12R", - "GfaADNJjY7sPHaALSXru81Gv861kq9L359bCc3V3C65d", - "GFC1cMBKg1UnugaKKKtsvg2XWTGDZrZBFPbgqoVKWGg9", - "GFE6kHpCyNu329CgF8omYzVg8nanBevvfN5QkowFjo8e", - "GFFuGhyHAr2fjH1DL42m9EWpAWXXdZ7R6PyzuMzDodLy", - "GFjTeoccZZCPHhLTgJJ8dDMcTH4npY1CopF6vXyFD3c9", - "GfNzoFK3DdcW3NpdEZsHqjhudLYXVEQbSbK2EAmfS2j4", - "Gft346NFxfieeCXCHuwdQ9TN6HyPLr5oyfwGS4DGQWGt", - "GfUvtNoWnNo7frrBTYp7z2dZfEDr2bm3TewKw376GNMB", - "GfxuTHzCQ41cdDnqKTknX4YXX37NPh2umFp51pTXwjnC", - "GFZ3w5CU4Byjjo6BrQxVsiq9mumADrR58vH2TT2KxmFC", - "GfziPSVJBdc4FiksmCTKqR5hYNgW6wCyBDL8xLWA3qaV", - "Gg8EZcAjGBGktonv5PkhtQS9fWKkPxpAdPcy7bsjQYHe", - "GGBxF8ZHfJSz4WuCDpFrK7gcCXnQNneetkrJtszTsBjz", - "GGdJHSvmAUBBjawjuXk2YSirMbzu6mki2pegAzqobckk", - "GgfiMJLWSKHr9JPR122BiyEXgCDDmFQuzzkKMNbNkykk", - "GgfNfdmAb3Q5i35UQvS3jcbGTUG4P82scMDGCSUbUWaW", - "GggvaPf92W5X8u7TxeyL1Aj7Ztn5ync5DjTDfpH63ffW", - "GGH3pncFymkNRCYjGNfgiWu2VLWr41nWpkaxsni6KJYR", - "Ggk1D74bhfgSnv3n16cWKzZUxtwJk6RcgCCQiLwJY5By", - "GGMdnPHJwoc3Bab2M4tEv52Ybt5HDfRVaRBse56ReEM1", - "GgmneSMKWnEcavporN1vPpyTun2QRBzCjFCecQT5km8y", - "GGnmHbA5wzvKcn9kTcy1Q1JgdY8hQoHAYRk9HaCBNJzH", - "GGpeMQckoAKh7HSvmWhkB9jiCUqXTekDLDySsavd2Riz", - "GGQDNAb7hFMu9XnXPMw7NvyS6MA9BfeAmaZX8yp1QXFU", - "GGQFKUi8FWGSAnNWeoZdpwERRgaW4VMiBdiZbEETq5Qz", - "GgRTA319tq1aqY8p5CGn75oFuCynCmq2MduJbWTNKua6", - "GgsyCG7aGFzXA2A2gc2VCH5qpDB6Fz7zS4isJ4rfkrx3", - "GGtq764oWDUN81P7rxaVVAXzoVvGutpzZjztyyeyP6pc", - "GgULncvY1Un82pddi6VUuaeagsuc69KEZG8HrSew6a9Y", - "GgUmvp4uHDvzfx46XEfMScxjpnPTyDBoE3f18Vn8Sf8J", - "GguW9sE8bojqxQvZzYHqGYjP7QiJbBGbPDStCuDB3X4r", - "GgVX5vxGgZqMb2M8127Xy6AGA3kc6BCoFUr7Ex7rrK5W", - "GGwkfuZFYBuPS9UNT9rRo9bYNFAExD6EJfnehwZtLUXq", - "GGyi5gNaZYHpij4uM7UE6EuN93dvyMiKMphNWLfTPBb8", - "GH1t1LvHefMhw9y7W4LNWWa79HHnB1bQQcXGHaTc18kg", - "GH2H1t1gH7gu4wmE43JJvqfsZyNnFDsSp9hY9C9TfKj2", - "Gh2VtLSoQGwDvRerPayUsPyHTYLBzReMcDdhCLszC9vi", - "GH383ZjUf2L1MRqbjNVGtvUsJMUk4Wx3avcF1uVDyjLB", - "GH7tHMRcNVSV6yEr3Xx92Yjb1iJLXDqomTyyoqBJvBVi", - "GH9ng51QoxLGSDMPwrejXB3ahPWk8SAmjJRWzjbCbEgk", - "GhB45qFLZP6hkC181ccBBLJTm9XoCY6g4ys8Da419TKZ", - "GhBd6sozvfR9F2YrKTFwEMqTqhfUjxNUYKxye7ZvTr5Q", - "GhcYar9DdgxJh1uQ3DQsaqcaxMRR9R1N6xeW9N7ECmQt", - "GHeHAGviF2BMzdT4mmFLuyXD26aSfECJJthhNMnM9Lmw", - "GhNYcGjUeZyiSh99dNgLiXWtT9wBzaKCSRBixRFYAq59", - "GHQGxShptyDDuYD8d3P9aJ7x2yvQt9FvWzYgj444WD4o", - "GHsfP6GrTNu5XuPk4sdsYUHCPipWwdkvUJhJrDNozHs7", - "GHu1iYt3Q95pM5uB9Kcyax16VEJ2wJKiAHVbCzej4C25", - "GhUvMo1W63UG7EJWM4eo6w7r5e9axagsBJQTcLU4xrKb", - "GHycr5wgroAivtbUZ9N9r5fTgVd2mR7YYGrpiRyXXiJm", - "GHyhiw9H4HGYaaJohe5bEwbh4Nv1mfU8TWrUZm9KWj75", - "Gi3HDrjseuoY4rbdPmaZWYXiRKdJ4Z3DnCwJR7zqwZhK", - "Gi9vJVqTQy1ozVD6x8H6vxgcQC7GVpE1FwHutnhr58iz", - "Gi9z7rZdaxrzvVmBxuwaGMN5D334PUqrpCt6m4LJop8e", - "GiCafPg7fhwCSdnHstfvzmfqZREW9NwQFpLyqUQpy1uk", - "Gid26ttMpwEYFA16XHUZWeyUuyR76N1runpSe4PyCM64", - "GikKE4bXENxJUxUYinjXgaoRAwH4B4edwKCNf5hzqCiA", - "GikkfYtVZgaUtcmreVpQ1Eamw7mrnf2jnDFGJBnhVQhG", - "GikrYzWavFpyYpockcqignd1EojKyuRppqEzSgV4CN7T", - "GioZLbFnAdYTtLB7bGXSs4FpwetHdy6Q4s7XJ4Ghmmz2", - "GiPH5ctppbrTHYZqnM1i17nXb2G36o1iGqnJdRCcEqfe", - "GiQcU8KJeBVn2DvKvRxgRByp6ZgUEkaoT8VQENYxy3P7", - "GiTUgoop8xfGtTuoHTEpctgbwkfm44wP6C95QHyKTPGc", - "GiYhkSbrGdvNvsq3ytJx2PHPKZU2RZApeeef7RKmhoH9", - "GiyUNFvCWaBUUyr3YngWELGwKy6JjGhvH4gDkRYQwvru", - "Gj3QmL769joJq8fszxqX2obCfHV3S4ffKPT3rm6xUe92", - "Gj4Vs3HkwfGyFo8C2S8SmsaSZpVSYx6RAFnUd46vGhS3", - "GJ5Zy2T2HFGPEDS7sMXN1yqyqDzD3R8pmgLxrM25YxVe", - "GJ83NA5T85DWM43pQLGnCqkLKGDoHB9AtxbdjTqpctgr", - "Gjbntn4wuX9mFZacr3ctvFwSnTh5hDNKTTWDX318Q67c", - "GjBsnyYCJFjGhKXfbzR28jTQsCuLRn6uUW4o85zyMnTd", - "GJbU1XAJAky6sPVH9BGux11AGyFtkqZwtiRVS1itqcao", - "GjiLcUhG3qZoTDx6UMUEHxNE8592KrRNCX2N2pAqMqyM", - "GjkEXhwxYNuUR4sKfy5vhDrVJDuNDHHxvE42TBFdrmQv", - "GjKmqvjqN7yV7mEybjFCEaM2x4xuF1d2T9MFzFBxHrkD", - "GjNNtuEHRRqbS3SbhD94uiWbaP9q2Y1EwF3GdhyqAH6x", - "GJRLu6i8j4CJukLEQQXe3y3pdk3ynVkt7R7ttcfCZBoA", - "GJwigyrEMknyVkkpZNELptSaRokEM8Kz29T5MTtErjxd", - "GK62ttyfn7dhH7WBy4nGuCqkdN5n7K1VmhCKMTd5XT6v", - "GkA8e2TvYHa7HrTuGdYkminREsiHfJtbVDajL8YUheaM", - "GKaK31dY2nb9FdfYxL7jzge5v5BUo8M3APLarCijr4iv", - "GkBzNojRmX7oodcDFQZd1TatWWuAaCBwKp9BC7qWfDfH", - "GKcwMzK8ycPZ4VEbgERcZrMTDTZaWh1kS6KX3ExK3Deo", - "GKEcqfeBS6rP3NUZBV8PWrmmBkPUNRpsV1CqqyqBUkAj", - "GKGba31Zdwu7qRLBYGmPCkk9wwfJ2WH2a4FKxb3xfJuV", - "GKhGair7XT92THAofjGZYpyX1APExzLa2ujiqqihpTNB", - "GkhskyxqivHtaaqttgTxVCdT6MCCuDqpQ1coJWVbSnmP", - "GkinfhFgKZCwjwjVpF8pFG3uWCUSSTuqRkMtjbNGE1j1", - "GKKznSeuCDB89NqRaVhVPr7ite9bsG1X7ih3uc83wpUH", - "GkLRAjKa3b9gazDrc2wj6zVNbLWvibEKTuhsRp2i9Yni", - "GKPmKbjhiLqXa1Pp7KDQTF78WfvYxG4oyX2rmAAEJ8FP", - "GkpQYmJzR81VjuT4Gch8iF3LECvSEfVJomNqjUE1Ef8K", - "GKQfkqkcwas145FhizvY4iGK2YcVUEELnWDpbjauM6tx", - "GKsy1HjivoXp6v9CZBM1gG7jtrCAZphEBQkXDpiwirLg", - "GKTyFCuyxXASLJFrLxEaCz3Hzy2Hvma2wdBrnXYmrdS3", - "GkuEkzsEKyhgmomjiS9ZxruL9oc8tTWYQHaUv6Xa4Ch3", - "GkYsHzF1h4uZ2nGxykLqYJvVK91n9eWHymA5FhTrmRns", - "GkZaFaUHQhRnDBSEN8sg5z5Y6fR6KNTLYdCgZNUKGD1M", - "GL8k2CgUTKPtGCVrtook7LreRMnisxFLRQAqCfFcrYZA", - "GLjmp4qztfrcZNqxsMp7UHJpMgECdRjRnzKYDc3Ns6KS", - "GLKsDBjWBaXHkyMihjpU5ZdKyKWtUpJyE4W7PjEFSEHh", - "GLKtFTWTTKXVypRqWw5XYeSqnA6wvKnWCk2DkbLYpnCq", - "GLPe2gV9zG9kwJmNj9GFBrzEiqridEd5KYgeSiPrubGz", - "GLq5dob9pV8Uz35BaW3Bxt3mkMxB8NDpqXYYpqqPh491", - "GLw2eAoVVbqwAjnr6pDSebGPAX5je8AhC6jwtGC5dLmu", - "Gm6AHvNLKSG2yD5VFu3iA2GPowso8TZsJMuuxBF9SW69", - "Gm9hPhh5MbBBkGX8KNvg6DVGs6T35aGzafAmLivvbprg", - "Gma365NahM6qkXdhqBNBVsPuZp5eZGXPkBkmDSntj9x6", - "GmAuzYVHNBDTX3zGRwHqH85hnbBaxQdTbeVpyvAZpufN", - "GMEMvNsUerrfShmMJMqZJGBs2MkUjimjD9RxJiXzkuiy", - "GmfSnsWTjySx1FJn2cVGgDChMgvnAvtSztnutycVV4wy", - "GmgV3mnVohRz99rsnMNWNFqzop4oSgNv6Hx1kE7PKvYU", - "GMhCc4SBnHPHmL4WwRFiXaDkc6qyUpeifCP7jcTim4LX", - "GMjyjTvqWhdwE9ps3hyFMFhHrsX8ijXNWyzeTT2YbBKy", - "GmkZCVze2rYTbtRpv1Dbi3hkc96CmagHseNJmpPQs6T4", - "GmPCivJE4kPgXA2tHa75nBYYS2QZdxNhkxJi6QvRbygN", - "GMsiLxbFZcd72mz1oRGHeVq9Q6MPXwB1nMiKdrqfp2Qj", - "GmVcF5yXa9zdj8f77cNwrzgoTUroPx6ByAoeEWtdmoo4", - "Gmw9GarCUcQNYnqePXNBREuLhcMUwXhQWZMAvxSUf6c2", - "GN5iJpiwAo4fKE7YqSV3xgCHgvFpUiZ68Mxz8baEJyDB", - "GNBFMdgbJnEQohZGh6cQ6reBcHGiuNtKhpqc7tEpxfDf", - "GNDHwncRV2VpzXQLpGLvQUGkkfDFhA3g36Jg8ZthCNLm", - "GnGYixWL86RAMkGi6dkw5b6PWMammFZj9LCT9h4bUMmf", - "GNk5YmCWubXGsWrySRx1JY6kkDzAGNVogNei7r8dGfDd", - "GnkFbGe39VZq1XxLq1u1oA9X5AeK62adFKqnK5AW5Csz", - "GNktzGAPRyneTaS89MBt3QRQQAevCMdyuztimyeFLBZj", - "GNLKxNiDNzN7Gw6ug2PU69ojCGriufp1bMsPqP6ncXrd", - "GNPK6pfoaXcz1sKavyYRdAD7EtQy3F1CXBTWVyxEv2xu", - "GnpU1cEFBCL4BtqijxLZSVLg9jmUAZ6St285TMzxEefp", - "GNUZ3dg2h1CPP6QiUqHPvFdtqQy9JzqEj2zMb2mKspLm", - "GNYP2X39FjkijbqiNTFKEFoJmUAXPoHJpCqFy4NK3HZj", - "GNyTEDxotSquc7vz6qChAYS1Yy5rDXXLXTXEbxFXW2UT", - "Go2JnvXcktYNyWGSWs4aoK8snt7XpCZrwcorVKpWxkXx", - "Go2nJYBJeAdESKTZLHzWSSvJAfYHpkwjLRCgj3Nh1Bq8", - "GoD1Kvo8xGhatZj9Kz9SVM8HfbM5YDzR825GUKFpzLdk", - "GoF8wQhEeaVF3rR9UVDR2yKpWwqTtiYyVhzLv3oQox9L", - "gog5Jhq3Q3oyN2657yXQR5nnDEzKtaZFSgwj1CepnjZ", - "Goi8zcCG344xn52HJYfw55rWs8bAQ4t8s36Sn2v3Nuwc", - "GokfNYT1GH3c8BQrXoAJBypARuNFWcRG3xa5KQ8hKwPe", - "goo9ALHa2zxHJcrJuCQFW9BHZBMccM6NsZ7ZbUtntcx", - "GooDvvk8U2WygKYm2PCpak8ADpKRnXbu6rdbBbbdvyiQ", - "gospeLah7AeJAanrMH6EPhitTgusELN6jFZLzVHVwes", - "GoszoLnPkGdgumegAo3dGm6kguXT2q87Yf3zh2LFij1S", - "Got6skKXqByMAh1E2wVhR9r85CUEe3K8rGzou3TpEo6n", - "GowyxqkHGBi9sMC57cVSE6MAB8cRvyAxB9ndc7BtbTFS", - "Gp96C7xbTVp9SU4YDK26zYjnzLHSuHkfcHpzXQXNNvNq", - "GPAEtmhfbbhGugcRUt1XqPJTQLyPUeEz7rqbPAzcWvXK", - "GpdHV64VCYUAM51U85pRvvKo9xK36voTQE2Cb4cAMHZA", - "GpEoiQ148pi8BhG81qcN8BXP37Bptw2XVxnmses7aPg8", - "GPjyjDGYSNkPK2XJQB8LeX1rP6eVddK8dW1idw6YEwdu", - "GpK1oL91n2dv8SViCg2QVJytHDUBqrsY94pFsrMShG8Z", - "GpMwsXK4HULrtg3GkR6qRFzzGAoR9fE3BykspjM9xJP4", - "GpowxwT8wY9x2uFLWhZtL3ELFdAMnpBxTrpqFgnEukVn", - "GPp1gtTaTKp2N1dX2UXVSs9agx3PJggHSMApXCqFtwEh", - "GPpFVDjENZafNP8uysYR6TtnXWdN935z9jNDocP5hbzB", - "GPrXj9TamMQsMBu3SaQvJ8VYmtC5WU8ytpx2t5jXKtcD", - "GPx9y9F1gnuWnz1b4bNn9ZafFfsccQRCotu6DeSvDoB9", - "GpXcoJ7jRzCEpoSLERYQCxDi9jQ8oJxCCKqjEMBnMUDQ", - "GpXiKWdAL8xiHgVM3xgLaWhPsUGDw55oKdp2g13A4S9p", - "GpXSzrMWKYhmDmzwctAmhiTJo7D3EWpZxZbeBDii59GN", - "GQ6bxpaCoxC3BmQtLSj67S9VenHzzU2vShhzLJogvHD4", - "GqB7UarmVgehccpFu663hZmHWSZ4Jghzf81wt4HLNo43", - "GQCgtjErUk8HCgayXyjuCFR15pnssi4saPnxD2Pm9oav", - "GqDncpQgL7Bssv2L5ryhjpGz8hHoWVHr7U3Mf2bGMGpS", - "Gqf4fmfXXEuxRF9piKMCftcG58s57BAivmQ5fm9LxVu5", - "GqfjfogJTi6Zy6nXk1AGAH299E6CukdUDYbrT7YTmDH2", - "GqFWgFDHj6fgahisFk8TEngmsEdkSxbmk8ZktpgW5LaS", - "GQG54rQqKEP68aG1pvExGj3RHd6rHtesr1QZriHudZhi", - "GqGkpxyWCgfEgxow1819qJnwdBa9ErCkpJxa8RY5Lkue", - "GqgN4rEtnEz5PDEEBWVNpjeMQunedZLQBhYaVdVteWnT", - "Gqh15vkZB5PpxnuUuPhCA2bsKaN157D5Bc7i8xigYPvR", - "GqKBTo1G8m61vWXPxZ4zs4FN56stZ6sf82Yg7fZmH89B", - "GQnaJJu7h53SVVhVpg2ErkSKhYMtqYrqv1qr13MUobuq", - "GqQr5DtRfBStiAevEeVoFfN5JBCnMMjcEcAwSGYu9ELf", - "Gqsgpy2ZLDD7oPTWh3TxNhJStsRfMAqrNFf1K39DYShz", - "GqsnwvnnwfvevfovAfRu8XrJwGietC8h8t4dwyQerbfq", - "GqsVQCMTCYG91G2YCZyp8PGukTeFv2axpT3zgVHornxD", - "GqThqYamAwuQs5jsppDyxgy85voeAAcKvUJEzQQSG1QG", - "GqxoZRdZNrERcwX2e92srpbx6rdpjmdKp92vbFLNuhip", - "GqzMqSyS7wMwBGdzN27JWmprgX9Rcmfy2ob9DoE7RwM2", - "GR1e6CLgygRUrbXVzCkNRiS6a2WX4vudWpBQ93AC7hrM", - "Gr4nhKuUJfrBeruu3cBH3vd557RjVqxY8WkgLJ6WEpVH", - "GraWXC11stqBmL86aJW8cBEncRhAFX86mX4E5pE2eKg1", - "GRCGqWWt4hxCA3X5HVcdF2gTZfXd4dkFAPh6wzz2MNYp", - "GRJExQVWj3Hi5RoMVb5LKNfCGvocrdyXi3QY8aGQ49wN", - "GRJohz4qkCV6YNjcSb3mRBYbtcTcN7GLG2cm6ffZqmW3", - "Grk95iXQYYTfAi9NpuacVzBUcmxcsuTKenTP6cVQekXc", - "GRL6NvXmNH69CmsJjZEoiGgididrWhWije3httCuyGd1", - "GRLNbiaFBHq39iceBZ948moLLsDfg22KBfB833TTcnrD", - "GRMSo98aw34vXB31YxWMRLQtU6ULHhwxBKi6gNDkdFyk", - "GRNydUJwsBA3UzgYgkC7aCuEYu39Z9fEcBcqYk9eF4pk", - "GRoeuXLfdibxxowGoDAnYZF2Squ7KoTPatKFFiF5LJNg", - "GryzZqWTG4FUEdRq1rjEyVytKHaoYKwTE3ymXpRMNpYp", - "GRZ6gQmgkfYns4kqN2Unz5azpuuT6bwmanDmveRgoSgt", - "GrZcGUJ7baE8r9KSmrNJAKtgYAMiD7p2YfxefkbgTng9", - "Gs4EjdfKTevfxTBaAGHyzXRm18hY6LkAvZFo9TwoXsBG", - "Gs98N52KtNybZSZiHEFrF1zekma9ZzVDxMHKdXP1s7MA", - "GsG1i1k6zk2fkGLG91ATWRGTMPFx7nug6xbSsuW53nE9", - "GsJvqqZhrxdefUpFXgzmUKuQR7ZYFJtzZxwDYqrocyeP", - "Gsooc16Z2JNRxfcsfGY16pvJ3LGaBaEsFRR1ANDdixfW", - "GSQYnfP3yz8aNWcKeg8f3xXDVnDVZHZEVCCfRKjrio1S", - "GsrDroPLwV22T5Se4tBTck9bD39o1hSv7sPwRdcjGAqC", - "GsSiJZSAz2HxESYL2K1cDFajd8aivX32okvjWyB3pqTP", - "GsTKJfSxEXvAvw3Vkw4cLzBFzBUSFSqvx7cW9qnsZFvV", - "GSWzDkiWBaLSHCpyWzFwoLyaCnizLMvXtk1FjQSTimwU", - "Gsx8PRxaBKtKwz3ecgF1iLLSbefVyQxfPxijvCDzi8M7", - "GSZpBMHhS7f8GT2dFT4niF9b8nLNtSkMecXR8thMnkSV", - "GT4TfRPkTAdbV24bGPMcS6LpKeXJvcJxNb93zAHLNvd7", - "GT5qhZS2ubkc9vkZADbdeY8U2MXWkYPtoAhaYfosd1ZA", - "Gt6QEDDNiZwv1ReU8YY2srnPjJ94J625VshZ9uF52Z5y", - "GT7LBaGAjnuGmp7Vfao5VWzchxV8p9cMYZzauonKXAgd", - "Gt7sVKdaJS49Wx47g3xGuS51R1yuAUNDuhxudzYfQFZR", - "GT9A5TjTyQT57J1FmzRM2mWjADZY6yt8Wu1u2jgLaovT", - "GtENgdbBUL5Y8fmtfsQoiV8WLuDrRvXtGsHcUDSdXeYw", - "GtG5xUdXJTeCVprjdQn6eqozcmErzroSXGtyVyvtV2Kk", - "GtgtQLfqKjn3gaHuH7Fw64n49vr2DrYHiJAsSTNNscAE", - "GTguXAdcqbMEYgpW4REWpq5cMUj54bHBLKHWScFSNTNz", - "GTHJ3sckyES6VxMAwho8RdJFoPwaaS69vwZauoEZNBZz", - "GtPP7yTUt1Msr42sFpwxnXiurQ9rvu3WuY519HHfQaDA", - "GTrJ6nRo1oK8bgv2bMpweaffbwwfDbLHDqSobqWG2gjC", - "GTtm15Y1gQZJ5hsy61juha8oyPY9TiHJUYMj3o8rY4Ng", - "GtU7wyz6vwTo7d82qNpFM6zsxWUnN7caxNMaxLwbwCEr", - "GTXqdpbrTw6uEwRWrJUDsKVsVH5KjVNk4zUKJhsoUgES", - "Gu167nvh1XEz1pmMh61iB591uM18CMDAqiy6rYXh7ty8", - "GU3cJrx2F2nY8nXeVx6B6zUTwyVaFujgU6EcGkz92aVQ", - "GU3NxbUE2GrZRiqzAYuvEr9h8rgCPj4GtqznSqr9yQiA", - "GU3YUGA1uyXayrnqtCgabUxg3s8VdhWuZbiRSYckEEgp", - "GufPaZ7pGsoqfkx4d2uUCU2E5HFeTMgx4k37YRZTn3Xn", - "GujheBpAMACWnxUBw3zPy16TT7yfyR6w2aLhS1RFfR1c", - "GuKn8nEJwUPjBfxpwyq2MXU2JNrSpj7gqnKptCZeEk7j", - "GUm2k9BJSgJtoDZ3sa5P6nrmQpVPECzFFJxyHiMz7W2h", - "GUMhwogpDUNSzrFTYzc9soNWQxVKR9XJR3xYttPTVA8v", - "GuoGMRs5dmtL5c9E6V7JM6pNvmXCVsE8XQkBE1Fykq2r", - "GUPSEUuun5Z83RaDA8Ao4d6yCtftEAVwjTJAAKDJpCjX", - "GuQ6XebFXFcpmKEHmyh7kTNRgenqXaTmoyxggP9ZKboR", - "GUq7RT6MzPK5vswngQpJdJkvtUDWU9cLarM5Rec8VW8C", - "GurfodDZfiVyd889TL1g2kT3QtafH3j7QbThi52Jjvvc", - "GuRTgza4GSDuCpAoeFLqMXCwEqrN9qucn5HCoz9Wg6HC", - "GUv98F3KBpgqK2ZqkQ3jA5kV4HHkvpc71N87ue1JbSGS", - "GUYiwgZBbpoJTRYkqH5L6zL1DgHH1hDx9c7zYi78cS84", - "GuZQrkcZT2qmK5rZ4uv5cEjo9FbMFdi3y9edbLgVnwAh", - "GV1xf235uAg69qujfg7GjEPMqBRiELxvUHzFXpRPtaDV", - "Gv4WPocqzi59G7sbGiVWZAtLwDohpB8xSMG4kg41g3U5", - "Gv5tBouarhWcmAkyCEVqCdViursg17DnZ3kWswVejckM", - "GV9et7Z4ojYvU2P53xtBiB2MbJ2aq66cDVfNSUqrpy7Y", - "GV9EzFssL3fSNmrJJuiiwbG7ju7rrGLhu1qQUBCKuG4A", - "GV9R4D6CBENg4S11tMhwgGqFuoocSdwMpneU9vKfCryY", - "GvaAjmntoKHLeomGexQcQCG1NXroniUJR9aTExVzwqKW", - "GvB8xRCx7HFxuM675n41mSsC5adFre4Sn7CMq1V6v2MN", - "GVCCZx9r8H98dMPAwsxDAcAfe6JSzg3JCZUBvHTximKT", - "GVkR6wWKTS3To3NfRwLMC9xGb4LQb35AxioPmh6LrUtR", - "GvkYeWeoxH2QzvDrv1Rqr8ZmmMmj6xxZbbBWptCDVX4h", - "GVLw678jDRM1kSN9ihrVXEFaV7F8WNy8McoMBHdjfLF", - "GvmyimjLdeee4kmUuiswvdcvXN33pQghHG9nhzBZN3of", - "GvpfXu3ZecJRJWR6Gm2dND3DXe8CJvCtT8XHZXMsZ5Ap", - "GVQkvsd9iEKzyjEKrWn1BceJ3pAsy8MXanwUQ2M5SZtZ", - "GvRMZtjdNZY9B3vBVJKsKtcBiNxfHbvXy3yBfPuhswH6", - "GvRQCdtZZd7jVzwuestmUoj349jFVxL1Ja4GuxDYKB3p", - "GVS1B7hSXnUQMQWN78BWjT9Kr1h3k5UW5UTdFsDhtRGk", - "gVuUFY5MPjhayfUVTKTuBidEwFxYbQ6sgFMsSDNpRiU", - "GvWoMZaf8ZbTnKKxrTGV5aGAjofinufohuqT827waAEy", - "GvXFM9aAWxaaVk312jENx1MFv4ez7HGLuXtbecUyvjbz", - "GvZQ6JUcGiw26huYVv2eDTgrgVh3rKtADPYLfBiznVda", - "GW1rxbzkQREZV3K7Nrb67BvGzz5v3fygnzp2MUfrjwAF", - "Gw1WhYZMZ86i9spDNPspi5zykLfnwaB7uNU1czetyWJN", - "Gw41fTihgd75GDsujJNwYdUfUELQT4h7Wvv49tbmFNA7", - "GW4SePJ5ahNESeuNN9pn8EQzh4T37juArypJMz1hEPTd", - "GW5Ls9oHasGrazuHMLtru1HKgZsVDh6tgmnPzewnpEic", - "GW8YqP8ajRDDAuawk3ngLxEBZGSaMRGMy1MQXx5uDFKW", - "GWDNEAzvV2i3Tx91D8PSW5aMzPicHRe1ySZ3vMWPHg4b", - "GWf95ymumDmFXEc5VaBmTC3Yg6AxeXq7hi8J94GEp7VQ", - "GwfgoAStNx1kj25z4HtzFdaLCk9MQmfiBBVAnCD5b4SN", - "GWfXaf8FumXX1jT6mymXqc93Mm4oZt9TZ1tpfnc7v9RS", - "Gwgg3usfEkB2dFZutVWsnCwTDEbTo3AncyYLdpjdNwE7", - "GWGo6XZScACfDFuGu9GajtruTK3dovUvThyCjTGsW3kh", - "GwiSQinLr1znEu1VeGv9CmAtRU8Waqe8v9PnNnBVWCqQ", - "GwuVgxewTRizBWM622HQeY5qBJ4dcvyQyZ7JnsXnRLRQ", - "GwzSMkoijJjqWJ9inFnjMG1pM7dwwVEeTn6aEUxoUPo7", - "Gx3a1YzZCLrih1R9FPnqj7yzW2ekFWHVTCM76Zq41D63", - "Gx6SwGTbYAFrUeBRMgMrgLUKaeGNeCKzkULXdEpwPSwc", - "Gx7i8D1RmbFjR1yBxeVZ9vb9dzyKfvriQmbjqNXN64Zh", - "GXePTm3iHy57NWt85uU45VmVT2ucmZUUNm1gTiuCd2e3", - "GXfJaLrWgQbiuutiLyN7ijRgBvAvunJy7bYzaV562VWP", - "GXHfzQ9cv8KiT4V175zML4ZS3davkAnACVZ6bqbBo3BR", - "GXKhtuB6ctB5h1gMC8ZiECKJy9LPZSDgYV6XHHtjHfzz", - "GXLEAdgE2z5XVBbKMqHwKxmZR9kQQ3mW8vFyzNy1dnUV", - "GXngqGCgvY8jXbcWkgaqhgSJFiB3hWcf2oBfYv6fHApq", - "GXRPoAxz1gmqyNz3M21cKSJB47yAc3sJLGvenworEJn7", - "GxsCFq64XtYYa5NHnJ2s3wVUbtEePBsQbFXPpgfH6NJH", - "GxtyvnbMxRPxBvbjqAChxHmqXzvnqCW6Z4Ddq7UWVpJt", - "GxV9T7FJ5Gb2t9MrS8LcHSCSa2BiPcEswds3cZ5CAiNo", - "GxVXY7PskABf3pXTXmdXqr3dp7DWBsjK3EexUAgvGk6t", - "GXxLtm6JWwRs2TYqUWsHXmwRJD63xN6BAGznnDgie5eE", - "GXYeHHFjnnKdL2un96tLmSduturuWzAi8MEBEYH8WYYm", - "Gxz6FZW2nzdQU5mENPgkXnX35NozHHZMMuf8T4kpKdgE", - "Gy8KaDfyrEeBzZU4XKAEMXd1bJo7yz4yNMw7gAh4ojqE", - "GyLft5nEYDFY16LznUa8FzqfDfRTZ35sYLKvtB1EG992", - "GYNPtzPmbceWBZjTe63zeASYXdW83uh6WK83zghGQqzf", - "GyoEkrR3Zsfq1FayyXfEcKM2UtTEWztYAEQBZHxqEmTP", - "Gyudgc3a3V33vSdFRKJjz7wDMLRVVuNiboFfsf37cvuV", - "GYyCbybjf9PNE6RRsfoA2qr1H27KebWRPixjxFABCqvr", - "GYyuxVpqCTh5aXSkSu8rMYaTBhpmEzL4jWLkjb6Q9sro", - "GyzTncE9qE29YEWS6JyQVSNrTesf3V5k514x6pYzCER2", - "GZ13zCPfkYgUREqJUm86UGVxJ7qMc65WbwTqNAU2hyDm", - "GZ1amozdib18ehWuFMb16B7qbsEmqXZ5BBNTLvC3rKN3", - "Gz1v4Yag3nFoRfkrCZD4jSEGUPYdFZsZiTgpo1rsGajT", - "Gz5YjrzmwPbHykrsNZ85tffJT9aa9AjKPmuJL2m9f8GY", - "Gz6PqxEuKY8v5JueNrrT3XwCr1B2AmZnAqf6YUmxZpcU", - "GZA4y8zY8SZe85tDGb8dhXqyuEvdkdatBF3ivoce2sir", - "GzBSsd7MyLGn6WPh3gMru5AyhR4qtaoXnmUwju8DaD12", - "GZeAno1q7JYL493V8aED6XQzqNPjJRZMq84jtKdLhWNB", - "GzeThbXZzp7iSQBsCNGQU2CsA5YDi3Xr9Gdm4Sjj7gP8", - "GzFTdRZgzMdaTc6nrkgx3eeRbRtsTy78mXNHvzMkYJAu", - "GzfU5r7PyYTj8LYnC8BYXNfAiw3T5JRzazZUMqhrcg7V", - "GZgEf6qWWUbiZLxZHBcS5Xq4E7na33rSZYa3gGbWNo2R", - "GZgLom18cFaUKpAhodJ7LPzKCxyPbCzX5UxSFuYbdUdY", - "GZh1vKYXPoz2hgv7vgmyUHy1dahu9PCaBRXSeUpgCvdL", - "Gzu36XfqrYg98XdzpKVXnpQo79iJVJZVjPkBEYQnmboD", - "GZvmX5ooGidthybAp6NuMuCTyszmGX1aQCs5HxWvDb7i", - "GzZvchew8ZkmabvYdqNKejLATDors7egDWjyotvX7MUE", - "H1cUNg2hoDoiwzSrthzXBU6Fx3kdDa75sMkyn7Y8vPkk", - "H1iTTMzqVvcrZ5WThpPpppzQGnBKdzLpRm14q2XgUrD4", - "H1KLnvWbvwp2AeHVVtiu3RcZuUrYW9Su2x4BFdko8TUR", - "H1r43b64ubcwcUkDZ3yg3h5b9qHrYQCttHinEnCUhsdX", - "H1RVX3SNcfc3A7EhkaKjc3pMBHejEXaUEGAXfvonwGf", - "H1uSjkzRp86vK2xvC9tiYAhwbPShHUX8qPbj6RiVYWS8", - "H1viLpR5DHys7g6jmD4GqUhEM8M7gGygvQVjybhWURNh", - "H28YbKcxkEekLDHmTYnRStkFBhpVdNckNzBQSvRiWHmR", - "H2aCsvmJvG3tQZ58S4dTXBwmqia2GHvctgd5t2p1u2cV", - "H2qBXkxdFh3XiKbAkJVfRsucdVkf6uCwJe16TA5VZeNt", - "H2rfavSCj3rxRYmgpssGUq3wFRuuqX3P1E9t4KwBHmt6", - "H35RKfMYxF3NER1UcFza1qxgEevf9HxtVeotAwaNvnhG", - "H38sz75z7Sgbq1Jh7JeQYFq12eGXQ1erbtZjx7qLX5Tx", - "H3ajvvv4AC9FPmuivvbRaMjr7a7Tt5bWZE4w2zSweDF5", - "H3Fo17wX65ZDjfX69C9MdkdDfraoErtoNAvBQwgjLN71", - "H3isssGn6A8d1kZNt42vFXwdvPBR5wxkBYDbKdLcTNCY", - "H3JBWZEVRCPXMpq6Em4f427Dp7DYjRr6W4LVnRYXLf49", - "H3KBF7X6yJVJDBfyJrP82Navw5NENNZvT866wXiFEvSm", - "H3KE8CKunjN79guRS9wzBbn7AWPHCijckEMLr876BT9z", - "H3ozHzfBSJQvdkvERvS9nogXnPSa9KvPJRW5nnEdyMLH", - "H3UX3xVuiKN5NmkAm3fdbjo71PanKU4HiavbBHUU5dvx", - "H3wZxRnhoudszeXtgMQn8DLY2hvWCL9Xgy1tB7YQRBaH", - "H4Aq4RPa5coDMtPydkm2WyY8gd3k5R32ieL5fo8QFBY4", - "H4Dgb3KyCuYWKT8yKtp8qbY49cvaqZcisa2GDnroFsv6", - "H4f9d4Ru1BV2CVDyYsTRShVWk1q99DjY62LxccREKZch", - "H4oKv7FbWfmZLaXZd6T9F7UXZny463x55PTCT9VbVvSh", - "H4P15wosDXPBBC5t4eYdjkeTbShG4xm9kZo84GAHKTg5", - "H4RambYsdoqZF1zNaRyhYVq7JLdjA2GYHXMRQUHW5FM5", - "H4uRuRSAjd7cBLmrMSy7hRsgFPYtnKxSxAFzmzPQpEcu", - "H59bSKhpGYyUQyU5p52tQNiibUzbcixEcZc2rXs21UFr", - "H5aQjanQGz5Rrh4s6g4TNHTAXDzdr4czBtEJPdeDJ1jo", - "H5cuqx4t4vLp2mipyrU6u4P7s4DwBzGtrT7eNjqfhCf3", - "H5FVid8iRWjQAo8Cbvc7CJJGMwtTSQgk25sknxnEKkYs", - "H5HUpb9m5pWpm2UrAbouriBq4ezoqAs2CawgDDZmDR5U", - "h5PKenWafwnyCRa5ghTfdCuWNbNZAbHNBL7Aa7GRcno", - "h5VojMqAUTJFbpyz1pDVFVG6uscgPBKZPXU4UWPZCmu", - "H5YdwNcDt6DNeAL816CP3Kn3fYXFoigMw3zaASvZc4rA", - "H5ZhxXscZ7JzR1zeFCrYpem6RB4sQFUoTAchgxiMV8Yc", - "H67AFhHzFdnQ17nrrojToAc92iefJRXiUid85YvVoBQ6", - "H6BYeWwuWGwrq4Dgg3Lk7fozaRDWQvWSoCP3i13a5CaN", - "H6djbzHAiv46Wxy3iwqD7LA8ART8YbgrWyxQPCNhnLPE", - "H6dYPbE54vDxZuVUHBdiNaQSSYu8ZLcwK4kBjNwPSFii", - "H6PAyv9GYFZs827emLmWhu7XrAKy1jBUDhvNFiiyzsgS", - "H6uKA5y1sKwPKyB4vsjbfaBKnJdg9qQ4w4ZtFt1eVeHf", - "H6ukPZkMcz94Kvyf4KUKPFcazTsNUagSpYf7mNCv1qTu", - "H6UzrDTHCq6wBQDnyEAcofQEheza3wczmJcrwtU6J3op", - "H6Woeeijhi3YZiALxPqDPhTuZ8EMvMyNFq2stk39T34m", - "H6XeK1njtkX46u659KkTJo8RZoKRAu4ZPw9CWJK2gGqD", - "h72KguPPadkKfEyFFrqK6toSGXLMfqsQZ6owHmy6SAe", - "H76dSeyRwWGjsbKxNFqgKLSxh4YnaiC1iP7NHfuo1KTi", - "H7ia8QstfFTu1d4kSXtjjRpW5hMBRYGrVaCpm6tSUcLa", - "H7iiycS1Bc3KCtARt1Yxo1YxKhjzYhEL9JnzTEVR9Hk9", - "H7j886kkgbBPZUqUXRr2WdSb5kMZqryE8x6KB5PxGKvi", - "H7J9jvU7Y4BNd6knCtyPPhYWAmtZmyWTAV5pzMwSWY7e", - "H7TsJxr19yj3V8DPD5iSQVg3XciKNLUdPW99dGeyCyCX", - "H7ymY3ffUg4ybs113jL7UcTSPiisz4mrkHvUVNP9XUkq", - "H8ACGbhYk4UA2F2nALk4aSia6Z8Vfnk3U3SnNDdENMAh", - "H8AJgEgQFaaZVXBMz97A8YKu1YFte4GtphNy5Hf7SawS", - "H8DNvAxi4A7k59oAs83yqdk5uwVafni8qAiPA4EbxoBZ", - "H8kdiUSyvHbxshcFmRqWTB1HZkQHKcQcagQ56TzLe8ib", - "H8M8M1F26wsykZYnRM3RyDqxGhYrcyHqKR3fNARbq7ZV", - "H8MUh74GVNbSqGrYkZviws6xCmdVS3VZF1rbhE3gSESQ", - "H8QbZpKhzLitA7RbnpJoBCTTfh4gsNGiotFBEBLRs7Hg", - "H8sujzme3g3ecb433yRq1NP6Pte3BJQR1M3sEsAH5Bnn", - "H8tJGdLH5DnJ3QDCxzQ2uEXBiM8usG4pj94oFnLvz9FX", - "H8uBLqKF9MfMyRwyeafn9a8aYcvUsFmrNC5i1w8sLqLT", - "H8XwdjAte1PcdfMf3tynnPDdJ3jr2danF8J7hr76qmKT", - "H8Z9onQ3jccUihHanTx456Lsj6TZYdtnyHxToaMSiVCW", - "H9cLr4j4AsCw9wiGCrb9XpGArYKspAoYkdw5WSQ4YUCF", - "H9mrBeWh9jzXd6v1TwqDpCRwB8GJyHBJTDknFESK57uK", - "H9PJujAtZMZJ4tAoWeP4UDFjQtYSCsBtUfpipD4nti4D", - "H9r7GTwqAvgYCdsT2EZb9NgCFshrxBfMydyiJKmens6z", - "H9Th9in92sTsCxiA6oBe49vUW8PPv84HrN2g4KfSVgnM", - "H9v4kr9FHroh9GiaJnDN9uzpDXYp9Y5Wac1T1Y1Nsthu", - "H9XBRL6tBdrodScNKVPP7wBsvbjr34VUbwTMebyhbmm6", - "HA4Deivs1g4iC2wLww5P4j5DhLqLhGTyYRRWzFZaGGcC", - "HaAm7QhLAuhopBQV2gzLVrdxorTLxB5QfhKxqmc4HNJf", - "HaDrjvGfvneb4Rs5LyUThKY7PEh9QyBKsZoi7jNcyune", - "HAF7WKBnvXXqkt9vpMnEFQUrGsu7vkGYKDBDsLiLNJV3", - "HAGYMs3MBgRhhhP7F2hLdy87ebTwwjsUgUPdyY4TEU3d", - "Hahg6pT1qcuRR4iJhuPoCCouwX4rh552ozgNJsHU9HyY", - "HAMsS6X6fnBRXjHzp5gLNUL1GmuaMq82t2AmdWtJxSE9", - "HAnWJVk57VQfNtP177cCEnhzKTybbNR5HMvJdK18g47J", - "HaoEcxxxNVe6G3eGqdjsFNGwZB161Xfh7wyqXo8xJthE", - "HAPQtG3eDTg2KJ8Cy7GBTCRJr7XASyGW2E9XEtx7DbKr", - "Has5UpRZwnb7TrhyFPDETgnGThLPe38BiMcqkvXBLsra", - "HAS6mPyZ5ayzxAKs2iipcSjtcSRyQVV8auqqga5j5HBq", - "HAuLkfjwLEW77NjNKVBesC1Ye3P1xm6Z8FL3JgnhCEk5", - "HAWtbJMgfSmsAT7KYKNzt16yyVi6iWNpoh2LXy2fCKkE", - "HaYRPn54wxhLNWHLoncrEWRMqKv9Nn37EALMSb9z4raG", - "Hb3iFBP755dxEPaFDQ7NfYAjq66ACViy9w9kXiQ8y1Aq", - "Hb54h32QMewwa8jqNskv1VH3cTfE8bgMYFx45UtvKRiZ", - "Hb6mRayjxbXVmwqVtq4rsVAZHS5AZkeN8WHHvm9Gpaxg", - "HbGsYrb18bnvq4Vwmzd6iEYyoNkydPzCPn9rbBdCN8Vi", - "HBjgdJLTvT2K1av3LZ2imsQhBTqBUyZ6sjx1QqtTwjm3", - "HBKZysG6ymX1KupMzcrwcJRbbtqiwi72BkBvuTXvZdYG", - "hBnWTsRJJqy91H2pF9qYSccucmAVFTNjDZcKE4te49q", - "HBnY5R6YrrjSwEgEbdfgtF6ooLH9gnTQAWVAxJniqMHp", - "Hbw4rccbiqiQv46RaPUTpUyAkTsRKFhTsbDuSUBQVknT", - "HBxAuevRKFgUtigUbwhYXEyZ9FNKczaJ3nZmRFdGF74x", - "HbyjLDa1vVsJ54Ec69pfZKsp1ZTqQonUeoQm4ws1gcGh", - "HC1VrzBeP2PPg1MSxBampcXcBjn6KnmoRbyUzqRMQxqL", - "HC3UsF36e9LMThk8kLzEg4FdiQ7JZW1bdY5sGa889TPj", - "Hc3VHypCxrN9wekmjkpTXMzHMCD7dKHCUVU14SrCpXHB", - "Hc7JiayRiPKxYe2Kv9A8yLb4KHx5WjJtUP4wHxdK3JYz", - "HC8XwPmsBSsmwQbAtapyH5mQr33rSyLp5H7a4E2q1sso", - "HcasCt3HSWS1J2YH6qcVy5WNiKuuRqQ4kekN429dbcMm", - "HcceuxnHDDL1z87NTDosZMNC737bgU7kDkH7N4rG9JA2", - "HCCg89N8aNMBwwatFi6VQEZQyaa3RKhLZx6z5bk6UHRM", - "Hccyj9QaUjnmoxeM2L3G4zUPFVKBHQVyjWNdr6ef94mt", - "HCE6KsQnrCER4MHkYXBkGxFb7Sr6jhN3BhhXSVUuCiXh", - "hCFnuXP3Z1FdBA3KkznAXbsoz7ZSE2B7qLzDDvcEviY", - "HCikGbQ6gUseeVTvjwe4GZx145hpd2JR57DcC1DjecrF", - "HCJAmRXf1RiANWB6h2TEdmn55ARXVD63bdkvjPDtKhho", - "HCkbW7BPAcLQ7kFwg89F7swnmnGLF2HeQ4zMNqG1YYoy", - "HCkh6HftFzX8PVp2jtceo1YcM2uBrmXE2HYSXkkZ3rY9", - "HCmkk8hYxz9VnrhzG17HcoyCKn59kuZ9f6QHqq694yQ1", - "HCNqQ7aAbLGn8Ty7Z3GGnqZJZjfVsUufeimPhq5CDson", - "HCScKuiAGhKhMNCp2TKWMjAL5CKaCWHNqfcdfMHzoU76", - "HcSsQNTBFaFP1LuUHqGzosigQCQK98yhqa4Fovg1Tw84", - "HCw71XWEtACsw3Q7B2Cki2CfkLicnma3SUUtKNSM1Aer", - "HcxDf7N9w4BKhzqGZnWrnpAmTLhFvrKSFJMStn2LqF9E", - "HCyonapCXNMXrPLmYKp95yagq659XCHkXzbuBx4iYJPw", - "HD69Y6LkoVWWK9mXaepoJzcZpEb3LxC7ta7137tuLAjM", - "Hd7pZx5AY9UJY84VND3ogXeBzVR7K5UnLnbsZ3MBjeBP", - "Hd9NtFQuC7nw5v6dbijtCkgAJj7bjM3vaqqWLsMt6oAE", - "HdeKetdPnmJaYLX4vn3Jovht6XcS4nKWcKy1wwUdubgf", - "HdeT8eqQEGTM2tB58DimhvDu6XNjTKeHvFQKxELTpTJ2", - "HdH1u6gRwqmb8rcTFt88mVjeSADoADUwTGf15kuJfgoC", - "Hdich4gjBqgGiU8TdthKVrMdcbvd742toBo4jTXksYKs", - "HDitfpmCcy8WyJgNCQTrnZ8r71Nn7t7SjmVHnRwumGZi", - "HDPWRPLNyeyRhbXmp3RNzchG3rYby9r2MvqTDjCfNdTy", - "HDrYUaFQPKMrUUMRKX2fHm4Aa7jm7r8G9fFsfC53vo1L", - "Hdvb1wQTRKD7pir8aPSbo6SFEmqLCyVPs9KWvuHMbLfE", - "Hdws8ABDJc1hDxk1AbtTMAWHs4R1Xd8YhLdVFcpt8o1k", - "HdybxKHZEWmkXXqESqWeQX5RARn5Ra567Um3jwfpf6gA", - "HdYdd2tE5jXY1AwEQS4Pr9DCidPBTkvYEELJotYdXRbo", - "HE35aDYTJHJ6KA7kLEXvENiRBX8c5UG5xHzgeKiXyQno", - "HE94g4Qp39SrUtBtLXnjEYPxbjxMb28u7JvrNwcqGryX", - "HEbMY624UhDGm1Qhy6neKSyi3bQjQ2RidSTyt7ARK8RW", - "HED8UjfJxRjnHDxbJcjLzctt2m7wD2gJtGaUwbxevWc4", - "HEDZfY3xnab7WKn9r9Bg6ePi5iQjcWc12DF93mJnm17J", - "HeeEbBAkuLzqxsFLcbKUfWmeNizywy2uzAfvRg63LFT2", - "HEgDHQD4cZsVu3QEjLLE49EQmuDoojxiZZbPywgdX9dE", - "HEGjsRP7K8thvtSFoymKHTmHUyLLaViw4LhJMHzFaGUa", - "HEHCYLinrDq8sqDfhCnAeibvLyuyhsHTLYcyRiVBQXX3", - "HehQKDuoiNCbzovqzhjzSmNN2VBKYPgKLKyxNYqRsZhi", - "HeJ89AR6XYqq7sibuHMf9wEz3XMTRBL3gbtUor3JKANE", - "HELDfJct75h4kqtFCyzKRX2iiMAwgqfCAoqWpPQmKefv", - "HELPwwfg5W9LmXv3axe43EY1YGJjfVf3CcVjA8BZM82P", - "HeS3sUTqiKAnRh3t7ww37LHEvpzZ4TnCcGoCX9d4mgK5", - "HetV3PKLbG7vYpd4bYNpxGQaePEMGCbnEAt2Pq7yxqhc", - "HeUNAoWmKWrteB8eJB8SnNn345pzM8ymfZARzVrvtKFF", - "HeUzt2B4PEAdcCpw4hMZZzrMjQ49KhajvC2xULhv3ke1", - "HEVxZQExGLJbpySA7MVumiTv6qbeCzmAQJT42CthZwoX", - "HExheUvBFRbiTAE1jBPJXJJWYP67da9ML7ZUYdK51BPY", - "HEYsakKxLuuEWsSdH2cevwXJXdQ8tX75KT2SHWCkerHs", - "Hf7gX2vashauTCKxNhNvXzxtM7yB4imAoyEfpW4NaYGt", - "HfBCPHcX6hJFkrnvgEJvunKcavMTSmW4AHEvma4U1kDg", - "HFd4ugnqnbv6PTnMAdxF8kZYDsKYGpy78xnPchopeZFs", - "HfDCaM4XNmXPxD31Qbq6E1PFEZEpXTkqhHiGDxjh66e5", - "HfFsvzyNJ9gMz9F5sP6xQT46TtkviCizu6hdjw1FZ2DF", - "HFFw9Xc1p4GhsoKEGEyJwxzXUhUYJcaMpnYVR9HcYjop", - "HFhk75F1bDKuEbAFz4Qr2NSipo3J7P2AiVpq4iXw6gC9", - "HfhM2ABreBYwUxg5R3BjcJgp4vbbsFau9dCEbawn2gHp", - "HfiZW2nzc64xUiGdhJCjXP9aFkfcuXvZRVg7ZwWtaGng", - "HfkB17jhe4JnzUjrNHYjXtp76sXkUt6TR5mxoU8aWFDW", - "HFPuWt2NiEyPrKwPuAshBmJkzjMw24daAuPAFmswecfj", - "HfQsx5a64LYtf6HuUyfTQoktNJt119xkrFcVG6g628Hw", - "Hftbx5LykBFttwsQ5mASpCat8NYiaY6khwgqwQ71jLwc", - "HfxzFiP19ymtxHagP4Zpga2zVo6ZgivpK6VkBKDowHRr", - "HG2CuUSFhdkdcv31qeyR13aS6chRgCFdqZfoFfPmYn2a", - "Hg62zo86wHQqYB86Frmo7CEHZFfTYb5M4uq4xH7KFmM2", - "Hg7qwMSFzaRDLz7FtbJ1eoXa5euS59m4ZYhNYrFT1P8K", - "HGbivbAHXSFRN5KKsFmaQqPErDnwfEJkUyj3XNACnyQq", - "HgDEw4tF4duJ3XxhQ6YWgA1nLELYQsa6BrWV8c1bMY7L", - "HgF66KCFTqcs55WAK9co7o9f4ZuPuXmFQTCKvRWz9A3H", - "HgFDugox7d3VgZT1UwB3WNydCq3Vq5HtTRuZYyEJCx6r", - "HGHMEEHCfbVFjqB69Hu9oNW6SviukB8jUheEhYVZJKe2", - "HgK19TWcH4FcbtpWNdjU4gRQzBdS9GUokz4XbzTm9WP2", - "HGkZ4BCw3mHYoo74ZwwzKJsSjnH8u5BW2poHVVMLTjuR", - "HgmPwzNcY85HfrN3bYiqaypb6Nmf7ayaZEaivGY37913", - "Hgp3kh6Vv8iw5wHD86LqkW3H3JApJeW3F5XLaGXkZZW9", - "HGPE7645ZDiUzeBVe9A8YtrCpA441j2R1kN1PPZE3EAD", - "HgsLLdRKYwEEjmW9zeBKYXoih6fuidyZrvtjp5cbKESF", - "HGthEYmVZTvoGptPHvgD1dPxxKMGXYSrPDcFAPSgdYYK", - "HgTXVg3dA51mGNSh9iPoeC6QLsy2cMEB8WPESRAQMBz7", - "HGUJAJWxEW6jygAApsRh1RzCLTJwUdxNb8HXYMXhTLZU", - "HGUoS3wvVnTKwyQfXt8Fc3qKaoi39WBj4KEt4VcH9UXk", - "HGUt3hu6M6ER7Tmb5NneamNM7Q6KHSW9Uj4FVUMWegq8", - "HGv9NFa8dQeCCZcua4vg4Tqa8FpTK8AWBAQqqAE3z81G", - "HgwBu67f9LA6zrb7KsFnd8pWCRuEhPXfmJcmnzmomPuK", - "HH6mxkhoWfs57ZgxPyxSKxVL5Ud1m8k3Rz9nUGqYTbG6", - "Hh936V8TMZ8MffJ7faC7Yiy5eGxUsSmyMpkw1reddpes", - "HHA1sWURvbw7Yu3mvZKqNn2Ma1LSHChshYhgXFrmBoRR", - "HHeWLc4QBgxwz5Eh8nY3Kpi9p8uiDT1KX873ML5hCcyr", - "HhFtqgstBTDPcjTr71VWBJwxjkYJMz3RGQXMvfkhB3Kh", - "HhjxbH3vLpUNShQB34NuMCL1Qc3xoiNDbvALWrAMCCnb", - "HHJZoGNe6VtsHFeVVPhVbfpq6tXcHDYbEwZJ3Dq3dP75", - "Hhm3FxpmpRZgsQmqS4FBALTTCHaTPZ47AJJzp19ZomfZ", - "HHPuzWBb5Sf9YhpKuFUaRozqE9kyWwRyX2upAxShhTgT", - "hHqZ61TMXN3gbmThjpD8LXGQRov88jBWGpVAMXzjzG9", - "HhSdzc2hvP3jL8QoaRwKqVFcNUJAQ5yJsvgJY8CENEE3", - "HhVZQersDuNPpxQwhVpuXiWiahZ76QybhesPbGjbmEnf", - "HhykTdwTCijWtmoVTcp5zXij3Vi8VTLJVFycjY9ZFFig", - "Hi448jxWt3GW6i6g5Hqu3Mq42L2aezwwSvKWMaGqRKYY", - "Hi6tKgGpHi64UbsAvNxzkny72Vgc2sDYWkzvdVAr96VX", - "Hi7nrBKTTEhS7mDkYDt68DkYAEXpyZktNdBcDMhtvVRk", - "HiJ1pjUGoJ2G1fbrkYSNwPRrJ5ap3Q5usZMQB3pK7Zgs", - "HiVDGAGPSxxydKTY6BkjuLE3CyabGKyEuMMHc1yMw5Qq", - "HiZ9PLLN4u2xkVW7Axqdgj7cd5SSrfgdhfXqmqdBdSJM", - "HJ1hBuwYztBeiPhscJqQ1KKfLuhCcEKcPJQzKuZg14iw", - "Hj5Kn3zMDhYNswQR2jv4Dq7UMxG4qBPM3c8HwfehNPpF", - "Hj9stWA7Dfb5EpP2Kiwwnoz6XJpTXLrV2ySsSu2PBuyQ", - "HJFVM2NWiFXp11hWJPPZYNT8EXWQrZ8nXgyjUD2FyNHV", - "HjGgfFk4EshHQeMgHmQZLW6LupW85spE1HBLhe4BddZg", - "HJGzquApFD1tdnVbPLzbihMHd1wPGXswNmWSVcaWZwhf", - "HJhcE1XDYTRoHaDWcfkmfGvJuDWPZLEK8YkuMw9FYpP3", - "HjMU7Q9jU2Dzaa3rhmAThQddsJtQXHxJtsqGb3CKyXk", - "HJPWjD9subqDtuLzG3ctwt1tQ6r5GFsEnzytgKkbB5xd", - "Hjqfrrmd8s8FZzucmkFh3RGQEN7NjyzUBFAX5atwcF9h", - "Hjsgy7BuoUFo4WUr1sSvxSYK2oLf7hf2dYq818Fgc5Gh", - "HjSn1b4ecsycXjyRk1fcyiXULkVPzwNMp5yTiuWvDyGg", - "HjT9tCUEFWrUXFR37ahB383QTF4u53KWx9J29EWRfzdi", - "HJtQMXJznWcPLuWzsFxyoLoosCPZcuAeLtd41nBng6j3", - "HJuT4bfbCiemzxYtVj1tKvUoi4HtrmkKuUTJ3c6my8Yy", - "HjUWHzfCkHkoV67wmVQf4Fh3jQPeidkKAzC9TyMyuiss", - "HjXDTiG3U55FZo2YM4Sozvbq97RLeqyfRMKTtaQDFwo5", - "HjZL4YFtfDTyjrdUmoqpA8syTXLrB7cHnJiuwFSSMtA5", - "HJzThe9N2fn6uMcKUpyaVDKo7iupMVojAhALNpkU4ZjQ", - "Hk863DCrSbm9uS1daJfbtEAUJXvtfgfKx19fEVKmrVdi", - "Hk86P6VepF1Xv7McHgPyina3Rx5nSruKoKGjGed2opnC", - "HK8JqaKtn9iC5AZdZubBBpZvK8aACL4MZe5etd7m5XRP", - "HK9eC64pxRuDaKDBfmzDJVbKTbVzsGMWCTaTGA7dMkue", - "HkA1mvQ87foNDTpPEhHP9ZyuhfmYYbc7oFkeXEWm2iDw", - "HkDj9Gu2DBLoiYx684xqtMCmNHiJQKHxqWEjufnu9qkv", - "HKGnsEYje4nKuSU5S6bon3j7JUUB59zJKqoy6Vu724v7", - "HkH3HfbkA67hnYDaA7FBU4Fde4Q42fGK2DgJCK7QADdW", - "Hkj4Y4QxFvyoCd2wzAswsDpwW4vD1vyC5vppVyDDhJ8F", - "HKK59sFfs2myhLq7AaqusZDYX5hFDTK9bdCCJ8JH8tGG", - "HKM7CfuNPKeU9crk7SWJCFgvFKvGh3VFgqT1sQVyeDDm", - "HkMtdNNk8GRraYtTzYT6qD2AimPf6ZJuyuPK1WdQTiPD", - "HkpipuR3tXxg12cwgWT69mAFf2UutpEFEtEb9cJrPcgL", - "HKpk8f7t6MB5gYb2uSP8R2LZabMRezKqgCAVSb7tmsqQ", - "HkrLBTdWT8GmHWJDThNZMqHGvABXn8uZr6b91eA6Ryy8", - "HkSTpiQR4YTP29yRBSactwZCKh3fp7NoLHLQrMK58xRE", - "HKu753Hd2F1nWLPvcNZHX6RAGSXkg6AtywiVvRqDXxcP", - "HkXUfo7jkpymbV2LuekirjvJDzXEREB1c8hfy6cPxgLy", - "HLE1kVwxGfyhayHwdeTQhqNULYFTvJUKNzxTjdYbK5cf", - "HLGUjnFmizKzxg4Ds6mFqoRLJcq3u1W5SAnxhjBoAE4Q", - "HLj1wdQ6J9CNxwViYyXyxuj5g9NEgjucAdk1VetTZmG1", - "hLpsXaK1aP98dV1wEECRATQ8ZSo57rXbowcMNWa7wpj", - "HM2hzFLTd5TAhejGFjaXAm8LLjdmnj7bqQrzpRTaawdo", - "HMCNR3LWZG59Wytf48rRMb41XABZj6jDxF3hMGW7xdaR", - "HmD9baVLsNVxALt5mo3yzuH85ND625cTDuDnvVo3sf6R", - "Hmen2Ev1pjcuPwcMjeDofZp2bLEQ1MCQnD3Hw7RACG3x", - "HmEUD98iS9DFkt5dUjtrG3jDixVU53B3YPKPbGwSPrC5", - "HmjtHAza7oLkwJb5mvgoGxYjYeMBmrC1ZghveC1dESeZ", - "HMqQoCxrcg7aTormubtZzRqdYWCdEuS2Y3KirzrcJaSQ", - "HMQVCUmxNFBLpJRNCkdgit7P4pE6mXbrJ8D8t5UXCwEo", - "HmRmvf8TEXjhpPFthdJa2aqLY2xMhks46rMf661xawc2", - "HmSU5YJr4XK2SYdF6dxNXtF9PQRzbXXupUXCVEaJZX37", - "HMtri4bE9Vs3pztgZRtU21M9CuPhHTanZXtiuiR2azKk", - "HMvHSRXVZ6RrtdKVA4wzdQq8d3eGK2i6weSBEwD8b7oz", - "HMzBDqxq5as7JRyd8PfDyvqL1LNF9R7yX3YNUVi8xT9m", - "HNCXUUJ93TwdaAdL38YBg5D6eSboF9SMSWCm13N3H7gM", - "HndLDxGxQJ5D9kvDzLhf1wqmtJKXf6ADdstbR6i2AVpY", - "HNFTsFJN6Hk2w73eR4Lf2tLfaCVp79vJsamVPkpZpDgq", - "HngPeCBmKEooRBX4nMYYNvqic6QRDhXAmRAYEGD5WNr1", - "HNJTofxjz68XBQxPHoakD5rru3qnLBJRVoRKVTYxN4EL", - "Hnm1MNB7VNwMPjKNC7tPpAsuaaGyyJBec9ZHfnERJ8TT", - "HNNG7GrfmZoq4vvCJVqba3Asns2HewPF2B5zJ1uLnSth", - "hnoGBBvXhNhZPqinhfF3TYMgeKY8cqgGRxdQQMaUKsV", - "Hnp981DgpWig4dBQASkdJG8r7KzrgNRvGVUo2Em4ZTAJ", - "Hnr387JmCWF4Rbt2rohahPeCv3u6kZKMZ5G1NJZmo9YE", - "HnRsTCsJ2ue5n3zCqqi7t4rex8eDgqKNspTZL44cdgDB", - "HnV1GpztGo8FmCRaszjfBofqbabwd1ncqSjScUhMiRkA", - "HNX6Tba28Y4o4vfU33s5HkYefZcS8xNKY3R8zwxwor4z", - "HnxMF1pHqj3q4yDF42BCraRVVHepazEXZQKqRpz2u65u", - "Ho8iBoe5GwKJx7Sdw2YZTL5yZs3tupaJgXsZzP7CVLJV", - "Hog4dB9wqFrEMY7JWNJEQyaXm5bL1K4sjNqeJub8jgDP", - "HoHVjCSbq1xskBHeqCLfx8w5GDMQXQbVY6vs7FSA4bqL", - "HokEEbihiUjq72seSASdDSmroWFY9DGqguUzWBrn4MNz", - "HoMBSLMokd6BUVDT4iGw21Tnxvp2G49MApewzGJr4rfe", - "HoqJg8fyYyeB9quNuAwYmeyTE69oC1NiopSS6Q8vd2JJ", - "HoqKAs8Bu8V4YupdKbCpkKokH1HgmX6Pm5Sf9WyW3bRy", - "HoQXJmDFpEFJadpDMwVGfAaqibKEhymVwALTAHHmEM8z", - "HoRgaDtE5MBgfCjD4dQzmT1FqoEDkcqFjmH3D54dh51A", - "HoVZCsbMXqo9crGv1zPtzNw7ZpFn7whyy5ziLParHBmo", - "HoXDwBmioCu3pbrQAqVPrYUkpZ8NN9g5SPy9e9Db6cMe", - "HPAsEkYuZ4L975AKzzAagV2mTy87x1RfSg4wSDtEWTC9", - "Hpfs4rKozG5L2j26Aek8bVT29pzL3vBmYXy3djaBKBnx", - "hpFXMX9vxudCx3rD6KSzbjPomguYAyb75V6m4pnx5eC", - "HpHAufta5C4BgCbQXtL2AvjHRDzH8H5nN4dgdpSX674F", - "HPisnDx9nRswcNBkqr6q5FSQ4saPj23GfdCAzNQcy5TY", - "HPjnDuJVUPgdnEWASaj71YempGGwESRKtzj86ap6MScN", - "HpMCLobAANkWvP3Hip7sjqHpggg7F92qz6qAzoXaNZ6f", - "HpMNvGvQ2MAQwKvSbgB6mdJvKENdZ4jVXQhM7Ed3zJAm", - "HPpYXZ944SXpJB3Tb7Zzy2K7YD45zGREsGqPtEP43xBx", - "HpqHk7KzBJ7zDeg8Qbychz2GJMgwXhYfK8ax7zspfmL5", - "HPRX7U781J28ndS3BGnct5GUat33Emr47gE89uSW2475", - "HPwdoQWKqJzgXL9c8Ru8Cqc34CGeKf8Xo8y8pXvas6AF", - "HPwNj9cotHgFyt1Z2MhKsQTU1w4LxT2R71GoSdGSrbvP", - "HpwvcCyphDeZSjjHMD2XyUnekveFx87ZRYeJiWNnmZNr", - "HpZJE25ihvPNzUqHQcEb1bsRiYTV8KEoAVwGwWcbTVoA", - "Hq3D8STgwm4tswkx73V67rgrpFBaifwWELS1sMJiQ615", - "HQ45PeTgNEHQ3kVwbEVNkZXuqp3U3PC1gDDtArhmJvUZ", - "Hq4qrc6VqKm4uZP1Bv2T1b4QHd1szLZTg5n27gixP8Fa", - "Hq5o5jjDysktyUQdUxFk3RqbXvjSDyzNn1XtXKexHUu2", - "Hq6Ctthk4tZ9tT62kWnpnBqJ17y6CLu6dQVaQDDjmtmC", - "Hq6KFELsmXWBGCUoNM2xFXCtBA6brwuMFU1XQUjvFZmT", - "Hq7fMCmAVvHL33NHCGwqNBBppHZw8re7WSEiibFsHP8H", - "HQADBjUC69RXYDrRsEsZrvmwgaXR1qNtsPdwWk1L8fXj", - "HQbmu4XDUnw7DGmB1eG3D3LerTyfAZNAsa864gcqvFAY", - "hQBS6cu8RHkXcCzE6N8mQxhgrtbNy4kivoRjTMzF2cA", - "HQkqHJ9Ew5kBXU3WC4nxdTSDudoeR8hy61bkj14qqjqu", - "HqM94HSczd41k3D1Pgd9XHteYYpTiBueQuiiHNrDHzoZ", - "HqNQfTww5DQrwn8CEBgr65qmC6mpBFJ34XML4GuCHgWU", - "HQpKa57u8oe6SZbgvUFJxGFZB6kMaVUt7mcuZeKodEaG", - "HQSjbVY7YUjqbSEZ1K9EeEfLsw3pYYVz8hwRG7SWgCmb", - "HqUWCRuyPreATPgUec9ubR5Fj8njdtRvCjKR7wFUbrN7", - "Hqv4PrfCGpsbBQfPukyuhEFCw5z72cDqhfDNW1JeCvNj", - "HqXHSTtrUUraYZ4xcPuze9pX8LbRaV4wQGQ92Y2L26vN", - "HQZpRZLSzgDdPc21U7nCxXpK2VjMh8U4PE5G3YE9H2Y4", - "HR2MDiCqTegYdfSKnW3wRuhpmi6Fi8DHFwRegG2cz7Eg", - "Hr3PCkpdBpotx7CL9P51Xi7Yj9mJVPvmEHKUmUFrNkr4", - "Hr4MzzBiz9seA7rZwvhMfmM2jLKCptwdVgFtuDGVmkw8", - "HRCBqRPZWyxghiRvCG6qQsPEfnnXvDeMGQwXYTvuGkKr", - "HRcVpMid4bCudTxHaMNpMREpW4fQqnQVAGNjVSFVX7jR", - "HRddSLZVC1dH1uDvuKKqsJCN9pbihJEmVDAVtyL92JY9", - "HrDkZBmgxaV1373agNpFArvae53uga91HYdRHLCEdrkQ", - "HRfDPBSEAB5hfvxxz7dyWRdX2xDqA2B37X2KZXm4vYNG", - "HRi7SuhGvPdHXFMiAhkcFgYgd1M7hAW435XVhtWwCj7z", - "HRjJjGh1T33Rv3TeD9oLLEnkZVVvezP47kXsCbdXgJfo", - "HRLU2CW6raEiEaWw5tyXHiu5WzmtcefoMPdNBG2WBvEo", - "HrN5Ls12LSWwARUgCribpBWgwon9LWzwL8d6YXfR2Zx6", - "HRRxHZhaEF3xh42M7imBd3eFXFTKAFGKEKTKNt9FMTa5", - "HrUnfWMLuA7pJViVtz9PBaBVu9uHhvwQMZBRA1ApUFXE", - "HrzzQ2MHeLXoMFFdhSCvuAV4y47VVDjVtDZSAenAoFat", - "HS4PUndvxQp8h4hr2GsXd8xfkXuoEaAWWawDp54MmV6x", - "HS4UY3Xbs9AMBnUv3YFsTuGvEExmBPVnPRrR8DGSCRmE", - "HS7DkETWE7GP4Js1AXMBXSgMxwTPPzzGMJt3VJ48JDwc", - "Hs9s6g1rm7RmW725D158M3GT4MhCiUc8HNRVvBstLYFm", - "HsBV3BYXkEEU9MM4W299vYP4fnVmDCcXvGVergjpied8", - "HsD3m2jyU6vvyJodki9vBU2pUSnX3YKF2z6UqzSezNbB", - "HSiQRPeSasveTd3Z2DrLAtsuksFF4yrnHMNag14keUPB", - "HSKW3uvKvd6spwFSdxzbxH87os134SFGJrLj4uWCy4qM", - "HsM8Xe2Gcy49DH2Phy5PL7rS4zYdPYyXRKnu6U3L5wrp", - "HsMwWZ72yMvW2EWhnWtnhvhqSruJMd6vueokHn8RKZsV", - "HSPysEmZeXB1VsBnpemb1AdMMjv155m4tZ6LYq2uzWSd", - "HsvwsJhS7LdeFQLARY9szSb99TdFATRMpcEv5W96LAaS", - "HsWUiXARLPhYitGMapLYyMdV7k27kW2xzy9Z6L77jKBC", - "HSyQVMDPWiukduwnR4vS2fpuHZYWvK8LSnaY3UtrJoKa", - "HSz24VWA6XkssEVUSHyMehtE2gZykEENVssmq5Zxdfh3", - "Ht1MbZE3PsLatF2kPDnZws96Pbvw7YjUqNPSZeaB9Dcn", - "Ht4Zd1QjJPkvEUsJUeFgkFNWoqwW49mZZesCVm4xKr94", - "HtC9DFLScd8PKewDrGzC2dZdMURZgEfNDv2ji43coc2", - "HtcFzk7ETrSDasXkZB1n7v8xYsghxRyEuNTiN7AizT7m", - "HtcXz1k9MXkNJZ5DXsLa8raRGrBSq1VCYuNa2zozdr9U", - "HtfFWic5Vek3uMvZJS7kuNM8bSmoBgBPJExzERLLPRvk", - "HtHVCGzaJbH5K3Vq7kQRi2z8sHY6WHHSaH898F8Vur9a", - "HTiK9VSnfNUs9FmQMmJo9uU8Vh5f4tvmcdXG1bUWn98B", - "HTJ75TWA9ew8C2eRiDEuexwNiekWroUiC57AMxW6FMX9", - "HTJoE24YnEaRPaCMrVC318SNnXLK7EZPR9sjLpm2ybba", - "HtL6WWfAHCEQFHumzYPU3qupZzXth8D5jafz8v7tTgVy", - "HTLfHMbjjHEaYSXDnNvckFqrKyPWJtpmRgZJQMkuXwiS", - "HTm5PLcZptDqGY6jj5EAbbTUd2QyYk8AXTb6ryqRciKB", - "HTMD28sa3WvNq53givNcPHhaLKvWPgzUbGfJbQMuaLA8", - "HtNFmWY2Ua4zx2PLKq1uAxmm5iaLXKcV7oGkPk5dFYZ5", - "HTr9Pm9QVNtoQ7WTxEn1aj6ZhFiRBGPJEKq17bERYv7Y", - "HtUHk5Z6im3ZRPn8sWNJ9sHbTTPHCFYB2oHnuijrqNQe", - "HTuJgsDNuuXRv6i1dzg7TgCTgF9iTqUXkzsEePbW9mzA", - "HTw47YQTtR3pZSqigWidD68z5P1H3R3SZ2SrFZwGc47P", - "Htx97tAYfkqk1PCDB8SwB6tQrKbhL3Nd9BqiVzh8Fwu6", - "HTXB94Ep4TyrcwegEW3adaRcJUzwG1BrKMSyt214ALs8", - "HTxqGqWEoXZJppXEu6UdmHCK6uyu8hQn2pnFpH1VxtT4", - "hTzYQHBSeqW7gjTDsZhUTe3NGGJjTJgwF9sTikSuwiY", - "Hu2yLzgMWSVBxDgogz37YGBwcvComGXR9c6GmbWciL7X", - "HU6s5Sjz8n8WNnnx8vpJcEJZG5GeHCAJ1FBu2yTrwWRp", - "Hu7DW7BoXXuKbwaFJaAMEXpBv8pqBJPhfThMD96WHiJR", - "Hu9AdDAYsKYYdpux3HurAcTSjRiRpWtoQRwRKdurAh48", - "HUABZxjziFU7GXurTbRTeWjEdPoL5Xt9LPTbCZH5pZMz", - "HUayrxzPZZm4nvkYSr6aqSebATvMmtUA124BVEQqdJxo", - "HUcuPx6i18nyNKkbM1du3f9tUXGroQVi47Xro75pqkzS", - "HUenpEsrg6brLpZ3gs9YuARrEiBid1yesqWNNG6DPSWi", - "HuivGBRqJeRSFrNuLLHAEQnKXzenc45y54pSr7XkGZgv", - "HuJHVhpsf9nF4vbTWjgqgcCf2h97eFf4DnhAe3txLERo", - "HULK5BvtN9ra9faCSfvHXPeMiqZw4EmFGcgDJXM6M41s", - "HUmFTdMXritk8CcGyRipnd2GA7zkiLDaBVsXEVQx8VFj", - "HUNxVtTNjiq3eguGTwV249SVgdVbaitvdpPUB5XijkWK", - "HUomqfcCgXYTRnEhZtS4bUtoEvSt9htCjESEMwfr3mAa", - "HUoud6qywaWj8kZwdHRTbEPkKmskHa6Md1KNvF1JQFYF", - "HUrBwQeq52MqCih9c3yuixfrMWgYh1zuBZC8XNyk8TaR", - "HUtFMtq115zhNf1ecuHHhqhP3fJupC8vt1wkWevHf1Xr", - "HUVHZaG1wtYVpNqCK5X27X42LesHPpGgbd1gYaExQofS", - "Hv8CgXv7bHzuGM2FDa2NLe4pf61kfyy8S3R4Vt5yTM13", - "HvboKw4sw6maJGCo8PUZDRz73tkQXV2FgJa5jYQniVFw", - "HvcLUyKPmQjbTSdEmwbNgJkM6V6YNs8mFr9F9JgN1KRe", - "HVD6ZDBgzjqYKyDLNadSkzev3qwSUnYEs6k81JktNuom", - "HvdSjF5QpghqwJzWmTTCEVE4k8KAyY6KNsRbtAghtRQm", - "HvEPsfGSnXosYNYgKLnvNC7rbHa7jMS2cNLYe2eWrK1H", - "HvffU16UWHuTyWAqoYTUsBmY6vuxJEkgQff3cWz2qsAs", - "Hvfgqr7AmSvFhcekR2hdvjn2si1p8ZdoJpCXN5btSPax", - "HvFPw2Vsx1AjhK6SVjQPSCJLbLJthf7VeMtAK9YBeSHj", - "HvHs3TT2BLHRPa1q3RKeo4ynnt2oNc6KV8Q1F2uy5rqs", - "HVK74e6bD6cwDrK28hijNxiHZkvyXCXS8bd41tH6QwTk", - "HVKALYtCDrtsnuABH15oU8syJGK6kgLpb1V7o3D5EDXs", - "Hvm4ngE4dC16BjFPGAQ4hnLfWPGtgAvQaDMPyq6AALAG", - "HVncAUd3DQoMntxy4joU3AzMrtRniuhHXYDNYoZQWPmb", - "HVNK2aYs2zF19fXNbe14PAfVS98FKLX4zfnf6Vfb54Q1", - "HvofH3GhdBkVdPctTWhiPmGKzsADqtUpr4tpLgss3NX", - "HvqQDoVtjmDQD13F3FrDypBfpjrBiiGTJYF4MvYE5qQC", - "HVRRKmhv2uUVBHSx5Gb422jpkTFh7KCaLtE3A34bMCLE", - "HVrwRh7n3QEMRjSctCZNZsR8F5yFr89QgJZBp9tgyMqe", - "Hwakdirgxjpu5UgMgAb4t4afgmCJBFsKLug2K6s1D1KY", - "HWBHKQBwqgoyusqu74dQtrMTrXftTQVL2RcDXkN9r2oV", - "HWEy8f8pmxQRhx3YyNvLjhV7qboT1yMexNMFF1Z89VLX", - "HwFvyMbGLkiTUaT66cfL1FnJ26c9VqtpqAg4UbWSXtdq", - "HWg4WYeJHENvTGZ1xyCpFUCJHk9b4nireN15tA8fHdJZ", - "HWGh74TnvTzGoMrrXGWctEEon88fvKkoFPbuE8RHSUyZ", - "HWGJrR6z4tT6EU7NvPQaPwbZiWikDnTYsVzMCLhrCi4t", - "HWimgco55vSMfErqPPgQzyyiwQSmk2DyeqQrNX1TkPtZ", - "HWJhg6YaJ33LmANd2TSjuizEvxjorNG9tUHCJdLEFNVf", - "HWkNdtnD3wsm2u9cMnFqT1XncfZ7x71dszu8wYwqrdbv", - "HWKwGWgWpnt1HYo7kAbtpuNzi6PovGXz3oWW54GDEQWc", - "HWrjumc4GhUpPCmV9QoNdm8JH1BmFqgfD5bRasTxVF71", - "HwT2pvb6omGR2NVe2XkzG4uDbo3MizWHKzzPKfNUBcgq", - "HWvSRgESdWKDccWN91iRVQLN4rRyuCbuAHVWtPR1cJ1C", - "HWZ4RUW8q1XiGUY7V1zHLSX68Nc2XqascZdeXcxz5CGd", - "HWZ92s4GiazhzhLSbbiFqUndPvAok2VrrSTrpCxQcMzu", - "HX6Ah9VWDhyGM4xBaizvZgqAwxPmYHWyFasnEQevjyBD", - "HxBkCVtiYAymCCv4EYakNDSCPgog3vBJMZx54dCceSyS", - "HxEDcMYCE4RUJpv6JWoWHEpdsGd1dTpshXZ4Y7gYcGY", - "HXG4Chh5NQw9E7EN6ex9DEZk6cPm81d57ig2H6LzQtZ", - "HXMAoiGarsgssYSGYDAEC2QdEyKaFctx2RpA9p7zriUV", - "HxnjZ5Qg59nupGGXVo77idUxfsiRXPcBbBt2hw3Nt99c", - "HxobwX463kfsaPUuh9mbRBnkK14L31TVsFZYxQesZrkx", - "HxQYh8NKVepH9XJ3QBVdh6Fz2BM4Pb8FgEbCWwJqusfF", - "HxsJQAfgMFVcTqf7hfLBg8UzcCq4rQJdo7g61Z4i6ExG", - "HxVAvGErXppK9E1MFCxJ1C721Ut7e5gFoqPULQspJhZQ", - "HXx32KHv2YdJzb1jmnrQAruBWYvkqQTpfDuURwFs6Nxz", - "HxyUgcfGDbNjVJDvSFS1s3KSfCap24xXctAymaYVY1Bm", - "HXzRSm8SRmGE8Dh6oGY8eFTaUnpqcx4D2p5fniTLXDbE", - "Hy3vmC6EnqwHmKuveRPuVNxEtpDAw7SRexRNVtJ43bAp", - "Hy5Mano3fc6AZceKCCwooL1sb55KaucRTGAMxRxsZ6qL", - "HYC6uUzW7ajkWmdX69YMfTrxqVjdPC7ehneE8Lj1mZQi", - "HyCf5LyHfwnpnvwTQkfPWVdkqJJ2R2A8fBKb52m7cunf", - "HyGrAcMxN4Fd1dMNu1uiuVDdd7g1Ffoi6VwDe8eqSQYG", - "HYhAdLUymUWAYgoS8zxUaNzFGX3gZBoq7216nejXtSKU", - "HYnDWLewE3CBAsvdTHNhBUUQsVvRLSS2xGTWuGKUbXUQ", - "HYprdZe91jxpgy8s4RJBCfwYxK3uzBNatuUWJN9ptpGq", - "HYQ8scsAj9ANiqS9RbauNyDHH4xEP8b54mfLr1wcpA1m", - "HysezqG8V9NHQTuTvTnqrv7P7j8Zr5V7KZrgzyEuqyBP", - "HYvcjQTdtcHhH6sZUxDd84MCmuQLYXBYgmkmxwJdREV", - "HYW69eojAvAqiPfebT3S8yUTvTDHnssZbTq1TMCm5LfP", - "HyWJrRcRcoTaME9J5nmfh416M9P1Cs5ieEd3aY1zsjkA", - "HywMhn8fUgxVFYTnXdCCZGGVKK8QZ4Yz5AC2bgVaEVGQ", - "HYXDYMbBAssZHrJheW1KoAo5J36VQ4mN6Ac4uSbrvEW5", - "HZ2LdJz9vdX6HguQ9Ch7nqvX6KQgJtjGA98dzkMWJnsc", - "Hz3eGWqsWQXu6KT7nGFEk3UmRp1WcaugpZiVuHkSkUcM", - "HZCUCLqV3P7QqG1oskLLMJW28zuckhxmRzEQ7UWaH2U4", - "HzDLKSzTbt13wRp6bGdLcbXVpHYu3iafjUUgNsDW6Mps", - "HZgVJho74yXoUU6TVMajN4FRqshBPRJVx5kgnuPoiDUj", - "HzPFqFKsGRT3Yvd5Wgfng16c8q6e1bDe3W48fZbuuS9Q", - "HzqY5CnkciT3mwiBNbXCRUN3d6mwhRoxn9G6sLkmidqt", - "HzsNqb78fZVfUuQ5oy8hW5TyKnSmbtLXFbvQbfRaJ9Pi", - "HzURD4BRdpNGV4MBwvuwvdtiB67TUreJaRfoAv6fw3LK", - "HZwbEfKY3TNJ9RPeAYAH6zABK8Jr3CX8xXrDS7fKsc9x", - "HZX4MWsSDzRerGuV6kgtj5sGM3dcX9doaiN7qr5y9MAw", - "HzzApCxMXFzUyeiFkJiVC7sK8De1tX8NfFKPzSU5TZ5N", - "i6NbVrExc5CntphocSLYFcfZ3SfR9QxL5y5sExgBEVb", - "i8rvmPksJDKGadwVGYeSgwa7QnmyV92nALAtWWCAVVp", - "ibwMFhkkeMTn9746FERTdb7rGuQwVcRXDbNYXB4QB8q", - "iGfBqZ8cx3s71e6fcL74ZXWf1k5jPkFQJFApH76ruEN", - "iMZEU6pbrLTCHZsaw6HkwABYvMTfn9pND9AqQgaEyuo", - "irmVepLsWGTFjCrqGpkkfjYexrvCgwJ4CTSUQVjsFs7", - "iUQQChnApUWT28Te7X861h5eNDvgHfopoMySpXY99tE", - "ivan9RF7XH16AEC2WYeMBujNWCKxV3NztT4FkbRTR7h", - "iwf4VCAm2WYfHMWkGC6p7PScW5vihfVrXs8UTnMuHuc", - "iX7Z4qJ54RFfa51zCPi9ZXvtd9Ynq8hHugdwWjtRdLp", - "J16NbAo8MJAthmm4kfrLdyTKFsWRTVn8Vaq8gue6eJMD", - "J1AsdhK5u3j6x3x1bx1XvqVY7xbG8JWZiSdyVa5qdrpm", - "J1Avgbk11jXQ7YfXcLiuh7zdLGwYujyGVixHLywWmSuC", - "J1CrDqeWEz4Lo7ydPK8dQ5gphmAYYGG1FgZTZe5QhXkt", - "J1MJaauyhcEwoE3o1rRih3duzLm7fn5CmRYYbboedk7X", - "J1mnigj2PmzRCuLvjqBX3h6Lb5b6PoPt2Cvqu8g2wNG3", - "J1oQHFs1ZAgt35YuwYyj7PJN2myhSERiKEPYFk88yxjN", - "J1PvFvs8DHsBjocQgRFVmYTxFkjPDDqyNAv7mFxaHkoR", - "J1RpwhRqrLGUpuwazwHn5yVuUUjQXZWC5pVRoU2YqTYx", - "J1z6RJc9QQ6twx6xbF9BMiYAeuknJL7cWWyWZ7U1c2EH", - "J22uAT3L9h4TVYvTgmBHRTaTGDrwjJpV6NFy2DxTKkKk", - "J2crq7h1jqvXZiyNeTSpi6S112WjQHMmQe336qPqB3cF", - "J2LPt6Pza5KcNfeou7WrqNKs7wu3v1rSeLnXY5iF7szh", - "J2mcFPs2GW3qyuy9gufw4H8RZGXoB3PTKc5QpEX1bgan", - "J2NT3pjS4JWMMHb9Ks1rcycAEbLPSA4u7d1eMv87rAWC", - "j2p9Ccp7FBBfNzrW1dtF64aBDZzTVD874dqe5ZrZCgC", - "J2RzbW77NveGcT2Rse8tRvKZ8f9dnN6bMuT8q6a1LBut", - "J2VXfywh2oc5eT1LAtSApAqUVB1zJypFTYKTBdJg7BLW", - "J2wtCJEsJVer3mye66pNENawdDejPiagrCAaLogjMW3J", - "J3bHWu8Gx25m5VrwZ5NC21gTJdJNVLgLKpb8abkog3F6", - "J3F9iW24BD1P7prFk3H5SWJcCM888vNJ1KYFiqsvuTHq", - "J3ntASTkNvYY238adCcyyUKV82nDRvGfEjgYFxVa4Npb", - "J3qZ9mxb73Ufd7rBqPqNjt4GbWBepbhHFvRY9UbGrKo7", - "J3TfSarBYPyDCR1A8CTXPBGVAb6ibaF9VVueh95MAAkC", - "J3wqjuNuduVLKFrZscCwZtoy6F8HSJqbSFQJV3LSqHJ2", - "j3z8UNavf2RXACm5fTkfmkhb9SZZDBt9pyYX5ZyyZCj", - "J3ZeDsiNJBq2DpXeC3AJxM9ssp3thV8DhxupCxW2Bh8u", - "J47mf8KQxk7bq4qof9EBD8VwRhCVTZ31xjcW7TuXw2Aq", - "J4ALBsdvgjny9DFheA6SVKre31wNfA1yet6ukYVnvAwj", - "J4BYF57GRA6ChSmHPxgMfjhiuX4uq8RWQKdXnDbam443", - "J4DeN4MHUbH8gbdDHrWWMAxzvVLNVzn91x7x8H24cC2c", - "J4FGK7xXt6E5pfxBtQhGfEX1djdgsLNhdrei4s5ghSaX", - "J4hTySvBjgMANKBU639Qa9CCXqKx29Do8pMTVGC9yJRi", - "J4JwGBzuZvnLC1g8BVC1wd922LyxVnRAUAGwnYL3oPjX", - "J4nSQXb5RLCdws2ftb1HxewPYFAtHHL4ajss6G7KrqNm", - "J4o9eDPr9dDpVbsCg4iXnFbeSQ9P7ZiWUrPyko8hbXWC", - "J4TcVKv6hgURdJj91dTDyEcVb5kHXoV5BYhhyw5tm9o5", - "J4UpwAYXYesZGtnykW5YuXLeLtFYuPa7aYiRAKGUjw5N", - "J4XB86vMdBAS6uheFWPYxMQnRde8Giqsjz2Y2WkEsxhJ", - "J4XtyAqT6k9SYhipEAieyKWmCrc7kPaPJqzw1VWWZ7eM", - "J596ieDeK3eN42jD8Rj3LRwuLJTkGKs3Ju27LPBLhvqz", - "J5BJHkRuGpWwfkm1Bxau6QFge4dTausFzdgvj3vzipuv", - "J5dv8S6bz8gXqLeKe3qkNeP3EpLAypYfnUzaEFWcHnPg", - "J5dVAuWTHSppRogVgdinqaEHgkkzzKYWdkSRZue5zpvi", - "J5H3VAjy8SDxotbQEzwpAdtfhF7vtQYzQSyZsgrsohtW", - "J5itHSDtc8PZc5ra7VmYNWviSMMvbNfp5jufejUVXPsA", - "J5RKZBQ21j65Gn3cBBcFFtBaJW25Y3YEA3n1WjkKjNSE", - "J5sUyW8dKTXHcDAacuvrB6ELL8t85rJxo8iFobNccpoF", - "J5t4xw96R5WDR834mqBpjg1VaVwhKFRWRyfkhPiheXkD", - "J5tNbVt55ccb1h1dXvu6kHkmajz6dzqKYUYnoWyNKYVX", - "J5TxmqomwJVQJMSeD6pXo8vmV8nRRRF311D9BFWV8vyi", - "J5WvGwSohavp3d8pmU1wMbKPV8cWUxaCX2RPxJmZ2WGF", - "J63rQazpR3qLHBz5DQLg5NB5xKDWAe3rLxGjpnJmZvmp", - "J6e8uGMTyZnWBURZWKtoNm8n2WPL7UYwMTwpfHaYzPrL", - "J6hdDCgmBdRn9D9vrPPe3W5njSMe5PczLWAfPMs99i3P", - "J6YG6AQd1AqZVsvBU3VCuHwzweFYrQL4Wdrqhpur9pUu", - "J6ypmUL27j46uATh6RCC58m3yPDqbXfpE55oGsnYuSQ", - "J6zWiwZBuMreGBkKQ6eqkbdESgp7BjhjcHBdBfYMZ64a", - "J77tp3dPwFNGifQyXK33iMBaKiSpjkzMrstQAaxWf6Zi", - "J78A5iY9F7er41gwy4QuGgA8dWAtKvS1gdGtz6v4pRe5", - "J7jtFSn4ndaqu1f99wz4Nruy6aYixWt4psiFvSgKL3A1", - "J7Jx6vDZNfCHUzMAXxbdjfNJY2WXcVsd5qMtVN1Pua6t", - "J7KpQer4k6ivTgRhBMq1aBKFCbhnWiJdu7d7ZoMSE5FU", - "J7PEvxr45BSSZhLm5fmJwaFmbnEWXkA8kpJAP7pfyZE8", - "J7v9ndmcoBuo9to2MnHegLnBkC9x3SAVbQBJo5MMJrN1", - "J7zKbLHGuNMVCRJBaS3pRjuKYaThMLUFepnTUYirc66o", - "J7zKnVqk72fpjcSdP3v2xFStnowEfif9Ldtxw2bR1dB4", - "J86C71FUa1Uv7wHMDuch4KsVYRtqJce6ULfWqCW9yGMn", - "J88cJrD589ziDdwjnxgFPfvtA3Svf4nvewqQSFLuUt1Y", - "J8d11HHB1ttEf6wJpFdUhXvpyZefykDpAq2UDcPJsunW", - "J8dhCjuBfS8uPFGgSgV8UrYELerfAGXf2kQ3pGdApu3o", - "J8DQkLZArBMLSdGGfMSdarnUwk7EybVjfBU1wHpZbzG", - "J8u1DK5WAXBegKV8vwugDvewcUtWJNEvzDUmYAeKCuTw", - "J8uNbnUPpFW9uqe4TSXjPVBHsEcmSBZonDS4bSJDxNUW", - "J951YGaMYMXp9gBiDoFngQQ6yJmFisE3pDTvYQktJ9Tw", - "J9aAcLds2yj6SBw5pBtB2JPxCa5Y73hCcFjGBZyVmtu2", - "J9abhBMAgM6ejD5RozRGE3bZdzDZaxpMRrDAgoaNqJsm", - "J9wpknjG6QdFZf6KjVkoHcTwsXsfWx7KeisBawMeFHPD", - "J9Y9xwDkqFgiLypFoFmpC9MtAqkt7B9CTWrLUvyGZfKV", - "JA2ZQRZVmvPVLS3bECgiajpW2N916XqWRXjui1P9gTJj", - "JA5W7X7BxDTt4fQZtAMCFC5Jf8V8beZ1cYNFBDeUvpWo", - "JAcifzr5KQx27sybKNR4SidStj4uc4tDUPzbxZZ2VfuU", - "JAeDQsQhiXVEByzT4eCrXJQGgttf12Gnk2bPYMUt3eBC", - "JAgqqfmUxsLzLxbuWpigwJ7Hz38vtgyzzt4eKE5K6nfX", - "JAmW5ya6pPQ8QfCsnk6PhuM7vwNwKQ1dtc2kPEZNQRJB", - "JAwqKSV73htDK2T2DyGbgwiqEiDp7fDVX7yztD2TKsvf", - "JAXyzy7iCvCSTxyd2JwdTooQJAceQyj4Ajy92Nwn8Axy", - "JB18dCBQyzfa937YaSwiQDrPW7joqj8mKyRBiShGMriG", - "JB8RSct3osMU1oQq3WEUirHWaE5PuRoB4cKC1kDSzmEh", - "JbH2fcw6UHvZ452Ydx4ynnoHkXSUeDWQQJBJsAHigeW", - "JBH2sxUUGfXSDaxrm1Dsh1cLpMJWiDzuyNkDWne4qRHV", - "JBKuee3CNKdaxxqiBfA5CXARk5vkbQhLvNLFW8Jow89o", - "JBtk3KGDoQXYedMDiUFDp6VXJr8MxY9tqXg6pZ8EkaT8", - "JBVWoq5pDYFaQqpP5UEztm54GZVQzrQpWKnWWn56UK6b", - "JBydjjFRfR7SD9ivWfsGaDCTuEoYBmMbEbyJkGqQpwD6", - "JC2onbSu8byAKP4z3rvqG2yxoCJ9Pj2HcnmrhDzULL3w", - "JCB8LhxGhcXTeWvFtzRH3zFFBVBWnRpTDA86ZUfoWo2T", - "JcguGKcfrgf5kvw45bPsPDuHTtVmuAwJzHJdYwxjoRG", - "JCK6PepzvqsmgZe8uv2sLsu1xumE9LGM3Taod8k2ZWGg", - "JCkJrBSF8Z48EX4TtsbnBUUSErehW98fA66gdwTnZSrd", - "JCT2ibLK9tSYsxsJwbwypPWuaraygXQKkRg73QgRaPih", - "JCtrjaF9bagyryB5vC48yY7rMjPyLWEoDMGjkhFqjxBm", - "JCzKpJMcyNCd4NEEJx64zkzPm3nhGKTfG8ox7UQ25z83", - "JCzWZfmZ4ByAjKvqoo6vihhJRKJHUd6fjPgfqy4bjt1u", - "JD6Ge6ZpdJVGiiWKFDvqjQvA1jVPVMTdCtF1mPskFiK3", - "JDAKa4jVFM7Lh1ejm7vjzYY7w4eCgKUvwwfuCtwe7okY", - "jDHsVXS1bwrcGm3rVEBmkCVpXGVwZyenPW5E157pDQk", - "JDmfWWcWiE4kU49ix44oeM9XV4463639sUz5QyYQudxi", - "JDnuadR75tEVEyrCn1ypntgRn6WugRszBWX2pEvn6Pwg", - "JDNuqhoZkTCesM3Z9vNUCFxsiKzZhwMdYB3jyc98PYvh", - "JDo61DPWkfUMo5GH9MukstgNBHfcXZPDfTeRsuDbCSmW", - "JDSSd8fRsY3skSKEE6KbLLz5SxURf7nDkf2caazkMP4G", - "JE1JeV3wmz2YDKYLBQhr3NTyocrGsRwnE9hFvKMbM9tB", - "JE4SnYk5xBTZ3QCZjQxcdvQWebEhktThiEGo4arRqU3w", - "JE8KzGDYADW4ddCNe93d8vLHTuWvi4v6XgQvou18ZtP7", - "JE8vncP4cHCGhwJZQuzeBTfUVZ5tsFajkqUhcN4Ljk2f", - "JEKwh5nazSaAr6h7tc2oK6oLrmjXu6JFvabdVDEArdx", - "JgcWmNdwrrmvJiuSo4apJCLx9MozajzKRTF5mQREiXH", - "jgrFMQXicg4Dt6tQbhvEuXu6YY46wRPTd2Vs5yeYFQh", - "JGuq3oqd4ZyFSZiZQNKCs7aQc6nLfVD31SfDjRwE1qD", - "JoeKdMCnk9rE2DkLnej7tw5repqdfCDetSLCUedhUVn", - "JopXnS8RuyoKm88MNn2VuJ2a7HfwpvKpvCzKSPxiFqj", - "JortrVgBnTJ764kQH5HHhv3ozUpGUDPKqWPavUmjEuv", - "JpaDR41DYXTH6FksaSg8tgoXbJxstUb2b5m26sNQx55", - "JsmiDjCH6XjrJdMjetZqTtsJZ8VBHXQ7Gw3VQ7zcB9P", - "juit9nXU1uKis8ivPz959mJpjQuzHPZ9cJtHAs3vk1Q", - "jw3RWGkKoRDRnvscvmXHPkATtay7oeoTBMvQinprcyc", - "JwyyboEo5MYzg6ob8o5GnYMjZirTyZWXrub1DbGCTKy", - "kaayXi6r5JKVdp2u84fNjTbYiAA6vUJqH8JiBQHr29Y", - "KAyrerKk1pZLQjHBTrCqoJFapguzg67xjMfi83uaD12", - "kazvJTiG2EFoAaksSysMMrDmHjYptYgceM1LkKsHSnU", - "kd43xysQBqTxANTNWmg3nnEcu4irXvMRLf4At9YF7Dp", - "KDe7YsxgQHqMK6HGD6PwLyzYVbpnA8A3i7XThVSaC9k", - "KdNhBD4WCm4Gd1fwi7Uf7Z3JD9KrZcnWWm8nSEZ6NEB", - "kffvkDohANNa2rpj8Ti6KWZctCX3Ci6Rj1SnGHx2r63", - "KFw9x4NW8Xc7DmEX3KN9rQgi8CZVAiedrxJTfSVF4VX", - "KhBHw8r7pwMqurHv7N8pc4T5CHUaKiFnXKzFdCmkQZV", - "KjkPqUPPsYe4exTrHj6XPKuKcEmXorNLPuPWboQMSaw", - "KK56APewFFFgM7c2ehKY1Eky6DgdDpmaBH9521roatW", - "KKNRRzxy4Jr5PsWmK4dW7UtJadhTXsF1rpRRY752wwo", - "kLEZJ6qJeLjLKzfN1RJrUwgmu5mnHMfjEoAwsv4PeNn", - "koFTBeEB3tk4J3FyyzHJLpGmWvzQFaVvCiLvr1JWwfW", - "kot4RqPzCUf4PeBwnmhp5Z8NZUCCdzvrgp6XywhxkWS", - "KP196hubH1PqMgwDdD2nzNXHBLannUjywaLL5Qtt5Dj", - "kstXXwcerPDMXjBVziYTWCZL8HhGanrgTSeAX8k56Rh", - "KsVqET2Dg9WR1WsKbqXCC4VMybFqyrxPePrUXFbkQiH", - "kwm2bdHofv9RwXq3WQmQySJiFu88ccwtNo7A9xiYCbb", - "kXV44mBdHXR9hVd5Zv38nqne5Jk2qkk5iFp8sNt1ime", - "kZijBFWfswnfxtTg2kLQhud4Xvec6gyAp8WFqNH713f", - "L3oopmz3spxq91PpQ4LLZtKT6Fq25y6gRFTBhyGUx8M", - "L56eX7BPA2bCwkBMq2qofA7LAK34kPZPLf5X3CffxAK", - "L62SbP3iTzhzTP5pfP8DyXCpxps1LnEiHTqLws2C7cW", - "L9hQqzWE7yv3uB8xT2TpKsB1BqukPg1yYN9e1ygAbM9", - "LbYKxJsQekkGem8sJ2deqWzFYDGjExy3KdxUUT35xLH", - "LDeC9zPL6ikrs5exK2om77cBKCu2dXrvjW6JjCdxsgx", - "LevTBhptL4H7VZFHNPTSMNXztDvkLkyVvJzk5EpZwUB", - "LjqZg3EaB4AZCXvgda8QZRuueXUHoLnDJ2t4CbARJFA", - "LoDE8y7vFtmxacxL8gKRVHnX6aFVt1BHwP7cgvTyieY", - "LPGATvYWNFLrtAjyfk3Hyfdngp24MFX7S41T238rBDu", - "LppWbQ6PGdbkEzuQ2txArybrjpq5fsisrULfZhUb6Wt", - "LRGoZt5pRhwX5b7f8TkrSAXEbPkNKfCGXvbWQDZTThH", - "M3Uaf2iuKHaU8TF1quUa8RbAkmSdDA6RmYdCVLTQ1bb", - "M7Pcv3j8KpX8ZAkeSsvJnexgKrZbBAaMEcRTvf6t2Em", - "M86rJtjide6BGJcAzDLwRDmvSn2fCrhUjbsA1rVdEMs", - "MadT6G5NH9nHHYJ7PW67MoWNZ53PV5WRQ2d94aW6UHi", - "marivpF7DDv9RhGnBYrn7SZFuahFdwHt2pBenWfG49j", - "markiLNTC3FuWYGXKz8h9XpbwJbVQhzuV5U3bfpPc64", - "me6VLuwCTfwKfa3gE6vniz1FBeHnjGPPvEYRjJQoUyu", - "mETnAkTMdDN41d9wSPYJWDFu7xehfoHyT5py2thcxHB", - "mf1oPU95NbDVo1V4ca3QayhQg7WdS9iLWeEM88ex62B", - "mFJG277eG7EFS7Zu2UU5BkFZQW7PpAVfjMaFsTqXAUq", - "mitP51Bw82BnB7Jq6CErXAPWDwWLiR2xEQxRdvPLJw5", - "mjnFaZkvvoD58FXrAhGkFvieR9t3B1sDaA8ChVrr2DZ", - "MmD4skDEjkNZx1R13vyJkk2siUywqLNW3qgA71mW1cF", - "MpE6coBvQU57d1vjJpbrh1QLecncAtphujkMfBmrHT6", - "MsLRycLFx3P1orZX9HGzuiq8pEPZ4H86uszwZx7vYZy", - "msSy9EbJAcrgC8mEY13GkuTCQMsospcGAeqPfyUJ2cx", - "mTg9neh3hW4MS8m22K5H3qicnmCBkdf77MxuddQHP1Z", - "MtHxUcUtadd4f6sJXbNbp2oArYKDoPeU3x94iEs9677", - "mueCRgMPE3pLjB4N1tsYKB3jRN28frykjQy7Qq9cghE", - "Mzo3PrRYZ6x32dBfkomayFohKCt2QuX4svNSvWsP6Aq", - "n71dLrNvcFAsdXPPCoywRdRa6r9ndYLHQLN1mMNLNzs", - "nAMJ9uyPMjJvn72zCBMW2n9C2RoP93qmqVFCK3pnRaT", - "natAq1cgkknU39BC4m1czUHrasjmQokBJ3F1gptVL2k", - "naxTnU8poYjXELficT2EYrUBwpK8oLAPtcnRqkGFLsa", - "NB1NH1W7V7vVb5aFz4vdC3NTNZATk3QxoruGT47Z32c", - "ndBbbTMCgnhUj5F9fbR2dy6H7YXv7brbS7zm7mxQeMT", - "nDJ8x1UfnPmFGZWdkSf68e85MkD1EvZzT2fayChBHGh", - "NEc4XPda5fJ8GXtCokiV2L64sUEb3RBuP6issa8vBGz", - "NHtR8X7dmwtCagm1FuuC6ngQ3wv52uJYqFvA79G47MX", - "niHohRDHx4ZhqoFEiKZQCFTt1tTiGmX9saEuDcguG2j", - "NLSAhhTDXFGQPyYB4RxoTVio2kXPD4NsSvy87JXq6oq", - "NLTspezFsbdHhUwnJbXLaemN1Tgu6cN3jzSXToj2YHb", - "nmbmmQ3WEXo11XYh7agSBKyWVzia4r4B6gDJzfso8tj", - "NNetet8BiymZxMBWLRPCcNGcBPZDBeEcpgtfTSwdFPX", - "nqkFSApiR4mTENxvmQwsNy9hXF2MGb6NqCA4Epmp7AH", - "NRD4nEvE19pj5uRooeMTv1GdcSR8YqJEjYZQu2ShENN", - "nSVxmgt2USKnLgpWnoCuJ8mivyRNp4FSWdzr1eVCaHb", - "nU1dSr3koksmMnJ1nV9rRNKpkeACV1szZj1y7brJU5a", - "NU2FSppDqL3jYSWMmrYLfTer11fGzrrDsfDSzbCS9KU", - "nULu8JxhCG1gwwmRpgAaZrjqqXWrJdRjMqy2Wrkzz8q", - "nx36byg9iU1ryu96pvB9BZSEHPMJHtXhswuBG6ht48L", - "NYhCWaPgyNe5Jm7oJzvd3U9gHRwmsSnnqoFxVL3Lfxq", - "o5HG1nXnt6CV7W3HtabWP4ZQL1hEbV8yHBCCwqF4Fci", - "oJeE9QezgnwLcBFAajszyVMau9BS2Ng5C9DsczGNF5f", - "okTmwsXBWtjnrPrjqnDieyY75DTKDHHEbRg94a9XyiL", - "oMvsvLVa4TeT9tZ3aVuRxKKJMnyTFpc6iQ73V5yAbh7", - "opticKVjGsc6VvgApoiytJL8q8TFn91Nqny2Vcj2hq2", - "oQcqLhbpxQdDPgFP2d2HBNWqJFKGk9JfHw6kxyLgfK2", - "otdbgVXRPtmh4Bk3pXp8VZbhmVAeWdrUB7L6VUdmsH8", - "oTibFAoCXCjv3wtyFsG99NQyoTt9wfJcFz9jDyVsntS", - "PAne4uD6et9papQgdZXNjCwjk7K2tdMU7vwyzjqvJEC", - "PCPAjjnUJPQrv14DZx79sywT5P8L3RbpFKyaNzQwMFx", - "pdX6msj5h6fcwg6RzytNNE1hwqrAo5FGRTt5ZBSogs1", - "pdxNFgHb7h6MiUnpoZhUYYTdFKYep7VYFuKfqzcWv73", - "pEGAw9EsoUKJ4HyxRksTpFzZuhXGHHbdYnm2menShie", - "pfUA19FXbxnHzfj282xgFi1vPaYY21H8tT137yHVFZr", - "Pfw89YaUkjvPKLs5VpoHGKrnmfgUtzKtzkKUz3zCJxt", - "PiTHN2JjVjMaCkTtK4JcRhsUb8nwhtQVqwckP6tvprk", - "pitTXyFgrNFYKUUTbmrZGrf4gDJbJXmLNxmmFvM1XPJ", - "pko6Qkzpw9YZC8aRPxBY85nNXup4qWU4pkiT1HQbQci", - "PMMB5vKBvvc4jU6GfD3eiFmDDHDHHzR8xGcia3RwXZq", - "pMnaWse9Ar9EndpYo59m43guiijYe59bADabRMNhwJV", - "PNbr4XAXVfrfrRGo8WJnBHKWkphvsYy5UvoURzLV6QC", - "Poo1fGex6LzoVSn1kkQcvTamyK8J4FvKnEUeZhkd9Bv", - "praWMt8AuF5XXN3k4m8tDw3N3QZr9z7mhZyhJWcsNgY", - "PRMrU2LoJQNffehpiJRMaDAzTUQ8QDb1Kyz4SdDHLm5", - "Q6W99zZs5C7yChhrdNWD5FxJb9hte93NqDqraPUNK5E", - "qbraNXJmu8UJXMQcfsrERrBajq4kKi6kgTXkzN6abgd", - "qDYUybcUEgh1uBrPcVJBgquu5PQXaLCRJwSjHqKVzo7", - "QE94TmgvpNPFeLLmCwkkytpzMZaQuvNcVgWPv2hgd5C", - "Qfp5wD5TwLiecZZP64cn3SwfqvF7W4fzo2tjEy2c1MR", - "qG7xDp3RxwLpEMeKfPCa8CHyzFUxmVte8UFvAdWwhMU", - "QgGbMf2w1349tEksb7CfX8bDqUfTi4Cm7Tpye9FnzRF", - "qGvEV833EDFcfR57ts1Toh2oJRWrMrFXBEwYE2jCy2E", - "QHE13DLL6Rt1A7RuFcCC8tTCT8pxvVZAVTuHXMZbnnc", - "qHL6QWySV4eH2MHzdHkBmsuKmSVNBEWKaynfoGhqjj4", - "qJeWieUJ1NXdGeMCAnagwr3FsvwY9NLZn92Zj6ircLm", - "qN5z3VouWWoauKZ6oULUSWZxKwZce8MeEboa6qo8NRq", - "qPcQkC9pqtSCqssrVgZd4Jq35pdw9p7L42VUp8p6QhM", - "qpMoxweMT4RGLJox8zFcEWMUn2vGF2m5UZJ3c8pmd6j", - "qRdsNXf2VZ2TfJTxQrBneKg1zuvCQpUTrk5ikxuJqF4", - "QvEaohMddYEcMAmqmFoBi5y28sQQ7KdKiBQcXJVCsk1", - "QxgXRHsBe4vazdrboKaRtXMuf1EhTVvF68tVcfepRr1", - "qYnmmhLqaNsedmU87jchyzfJsSYAQYFS62KRY1bWhvj", - "qzCAEHbjb7AtpTPKaetY47LWNLCxFeHuFozjeXhj1k1", - "qztvHUz8PD7boomGiqPi2WcY473uujKqAWzP6NSQSPw", - "R5CZLg9YWrAXqYPRd3dTzrvaPiBqa9EDRUVrs1r7nLR", - "RAbGPTmaLVn1HkP38tqKYjGceejMWiyfDPEhenjH1Aw", - "rAEVgLDieWcb3N975fNsLbmpNenL2simANdvk35iLeh", - "ramPZsUAtn2Lkbp62L78pxw42HL7ybbDTSmzRgw1S1L", - "reisen5FAkzw9iKy7RWZqyhRq5PrDVTKGAAQSB9McYg", - "rEJrTSEJt8c6XmnoTtYMdvRxJDQ2H4uKBrDurohLYRN", - "rFBqVrngRnQMkSLGacicvFP7mR6S25fNVZQyso4pvW6", - "RJiu2orZQFCMVozEjsQxfpn29EMXCUC46iDmR19ECJV", - "RLag9Ufp8mqaLZZjduTySzZ4zU4jjyWUz2bXLApDCqP", - "RmQNKxg8et4ovHsa6Cs6GvwvPb8W1wwspUnyyFw9gs5", - "rndmncXAZhA6XBRxQg2ysyhdPTZMp9BjUQrk46NeJS3", - "rnnxMQdMQy8JbF3AKcFn5KCotLGaT5rpoJzHDpaGRcy", - "rushgWJadwtdLtjyWeMu97QhL1WbqbYJ5aA3z86SBFM", - "rw4s7nYLMhF6pmHvUxZvn4dJ7VXz4TCKsHfUe49Qx5H", - "rx7QruEjiDw7HMboHgWNCH2F4dSU8SRZXXvytLpZ3Mk", - "RxvxTbjKkKpb3VF1SqHBcGi9323tUZ8uAVhdPL7Lf7o", - "rY8HrZAF9KkWxT1ejUsjCsxqymXDMJza4YNvjqdhYYa", - "s8E6CB7qaZyRCBsWGGvPuc3dp4gCMucinMkU98uThoK", - "S9DKCRiiExhuKKkuTjgAkZgvtwZy4qTGTJV9yoBqbiL", - "sasMTLdZSKwBw4NZtS1DYahnzeZ1bo6xFnf9Jj4kZe8", - "Sb9BcvbMPUGbhoz9K5eDv2SZM4vnioSxj42e6nUGE6V", - "SBKMQUZ1G43jxnKEP3nZqTHybMuRGDuhpCJcpDEJaPp", - "ScN8WkfK7c5nmNvNh7SbFTQcNyw5poXv97h5KRFBRWL", - "SCVM6sdakyiT4sc7CyLk61B46Qff8LY5y1qk3n78Mxv", - "sdpT6DaCgct3MPgcomA1pC4j9iyCdeJYhAwZfk15mG4", - "SetarNoXv7nxYETxwg2eJZ7dmWa3wbvjcgr4DbUeQH7", - "SKYUZZvZg2b9BsnQABMTSpYU2Exdd1z26bDuuHFydVn", - "SMc6ox3sXbwkJwFEPxpPnjjbhmQpw4aScFpmJPrFUye", - "soFtoewQmjJaxRTJpNAhBfpboziRUCXSCZGxG6ij2MT", - "SQJYmcjgo1bwJe2YxJwRDAH1JKFdrQM4AfLzuLi5TME", - "srtx6STsnXoaYRYSP2bEHvp4oRo9XvfUqczNPhZrZVU", - "sT5BHjAKVGQKh9FAGc4eR9Kd1Fz6gt4UG2QZSDYzuMQ", - "stafbPEkp6BcYM5PoWP9PFGqBFo8yRdWbnah3KVp7UR", - "stiAiB1jZaRDbyQhRABW1LCGCHqQhN9xeApKmU4U7Sn", - "SuAtC2FY2S3PWTDi7JQBXcgrrdXfCvFmCwiPJbTfAGJ", - "suQfHw939894vULHmTQesdXQHqCKQUfnqUDX8eut3zq", - "sV9DSypw99PcZ9vY49yWvzCQnFgWr46yn9UaeyZRp9L", - "t3ChqFTKHUFdjNPDf8CuhFGwkwzqR47LL7sDbeU99XD", - "T6CVCqL6Mcea4wjRgvoZRkDSexzNP6fuNcyEdQZH21H", - "TAqgkbS2qcZBR1tGvbGCWpnUBQvXWcGZwQYLBeEeH15", - "taTvYWU91Yxwast3ahrtbnwZ3vYdD98tycadqKVgkPv", - "TBA2vCEUBPMCfVbxTWLstvyM3oqhg6bboYy24sBHEWX", - "tbD5m7ELVSSD9LSendxCXau5CYBpNSrX195pfuCwVqF", - "tBsrBq8vfFsUVhVURbc9riEdTCsD6XtZ5Zfx9ZLienq", - "tcfX6XgV3LZBGFifi3WfSnGmcvqynWjbtuook3Ny39n", - "TCLWW7YNhWgHM6KcQTupmH4NXL3vkYwfCxceFdFjYXS", - "tcXZGcGPa6RRtemnZWS6U28JXZ2aa6JzGKh5p2jzkbX", - "tEjPuEWTKQACmKYRYYNfxWUu7qcn72fjqU9T9hiGTxm", - "tEST7VtgmRM2rLW5FS4tGRvsb2jpL1X4eJvVyDTtTWg", - "teST8LwphVigCpXdn7ShE5VYbyuU2myDHV8UUXMUQgw", - "TESTo1c4tMAqssgwi4Nm7xgiY7rY3h41XAHDDnhSUbU", - "tg1jQ55tQKnB9oPxLUZuVxqRYporHH4Up4N9Kv629GH", - "thu7oh6w1aS9bLjgZDpqH9FTzD8T12sTCww2WC7p8Xr", - "TKMNqvfwb7PKkc9KFEJJ8EaNK9s5XjNWgFS6oyqSLkp", - "tntK86xzzD5BXSVX7FGeenKoMhPakRps1QR9nCxUyoY", - "tNZMLNhcUGk8pr5LVk2R5eV7jxiuU7SfDNa6uNbHeTF", - "tprpcwrfWewdDV6Vjj3yxsMLsTdXR6ieYtFvyxBv4TX", - "Tqrdg8Ze3ofigVzgkdk2mHowD9zQ3YxLZsJkp6WdJdH", - "TqZCAZpm9fyBAdcHZGCF5ip9uTUJ4VVAHDpMH3uckmL", - "TRDznMhVVyYAz12pUh53tbqssTWBsHUA7kcGi7wXJX7", - "TS7mNjzAkgqKSR3PhSXhrqjVCkyAmUta3skRF1NbRUx", - "TV57U77pZGTkbTaMqqoB44byUEhRjGUMz8LuCM5jcbK", - "twnGnxPFih69b1bL5K1byMFp2cZeLPZHLshH57fB56L", - "TxChgiaHwnkdT18sBnSepLE5sGk7vsQ4CZnhwiHUMQw", - "TXyVKC9XEy1CTmLUxXCULL1BLCdJXprp9BGfn3eipNJ", - "u4a7ipGYKpmnuhCF5BAjmJPxrSucwiVteWgqeWYvCF9", - "ubtoim6JRPZpRdTDo83HY4bQmcNquP9tJ9E6psL1oDq", - "UcNjMG3HSZ2JTUAM9hgbGx8JsDoWAqnSphYtpKwJUeM", - "uCZLuou7dGjJw29ZLC7GnBiHfvnmvBcbdN1TrUuAqUN", - "UdAZ7oz1WshdwyimF6e2VXiy1eSJ6UdHSRng9yRLtgY", - "uEUexMNNgtCtFC8PoPEtCvrPfQ5EpQHcjRiiGbDBZLT", - "UgvDUbkmYmUvyRS7XHT972oGY8iZGVMgcxcuXYFSMxu", - "UjwAn6wXtCNXMR3LLhaGUdHhWG3tnrjFVmAaiJ6mcsX", - "uknL1QAVVNLT6FEDxc21yN9Q8jykDCJDvCyS1f1qUkJ", - "UkQCtmg2gSygRMRJq3wHT8fZahqYzwRp2rHXE2hCTX1", - "ukUHb36X1JPvHokeMur171P8jcEnsYgRagGxDyuLPj8", - "ungTcuwCzTLBJrQLUyXFHePwC7syY7v5p4kw4vpLh5t", - "UQ67J38vcXokqSc5rd8VtsauHHXdPWdqSnwyE2pSgkK", - "URiXUe7p7eriRjuYumLnZMgZgd3VNmKcNAazefYMssB", - "URnkWZGiuB7jXbfCSuNSwir1qkn7sXjiSPeLPaXys7b", - "UsAEdnLj1hxWEqyFCNY3D4YvRi5SjDz2H23QwPM6551", - "usxkageTUviWSXsg7t6DeusoVgMWWG1Tb8ZtC5mTCQH", - "uSZYTFxh64RkFg5CZKVybwETLoNTgPjaebqRBQJuxmj", - "UUphehFzWa4XKHz5zVs4wC1WGsyt3Xzstn7uwt3pLse", - "uv25bCcVy1tEZo8wUjWfMZNF1eVXtT7ycwzxu2ZHBAz", - "UVnYYsUHVXGHsU7Cq5AbF7tDQBz94YasBAwLs7bYVZc", - "uWkiMoFzFEj4Xc8sQKPcFvF3bNPc2JK6q9q98duU3YR", - "UZBtRacZ5ZUBdcwN4sVfzVporzM3tkC2Wck3tFenPfe", - "V1gt1mnDCUPCgPyqPyfic2W16p2ZKzUYY5yv6cczEVD", - "v8MRjcRuuvzZKVBWo6Vh2zmpiYy4HTPufPPcxTrnGei", - "va83z18T1UDvJjZVFZf68LsnyghhEn7PoAj9tHQth2E", - "vaCnteQy81xU7hgnx52WBwL99uDgiSTNT2bKo6DisPq", - "VALSNhu4YBoAo1zenMMj8DtYzRB2dQcR671o5c8Eieb", - "vaTiJo51fxzKbE4X7nrLERRwew6Ga4id7Y1gz74rEZ9", - "vav8fy4UyYKf91g9uFZybjwZh1VS6hubfaKyFtbYcvT", - "vawktMPYeGD5aZhfXBeipw6GDvB7YUJH7fkkKjCmHva", - "vb3Bz6eYV2GRdm66fXQgzN36ncgEW4HLZj6a3PfSWMb", - "VbPq927r2eM2AiRcfibv9qdKtgbbpWJMCJcSSQjNWgL", - "VCRrRTgSjDLHvo6UQKXy8VQbNVG2ioHNUEyS7oB7u3X", - "vDPdd991hq61NUqj4gDETkqUt14WSY6wyd5ZTjzSxyZ", - "VfbqmRZxdYZ5xqkgGxDMf6ubF93RDyPQKDJ59Qrh18K", - "vhHuZpYWqnNqWTBzhHBMSASPZbkH1gZHHdXPx4xGagQ", - "VHTxnPAVEiRAKMeqFx3kNpWAnrgENNaJqpYr3SNDjWt", - "vhyUg92qBPWbT6RWWugstPEnqdqxNiEXuSZAwFuDDZB", - "ViKoHh7i1zgKi78qzedWrWvBHGWMwSSWiEZCJFedWvs", - "VisixkGG8H2htLvq2EKiywbHXVjNPQiszUKHeu9r6bd", - "vJmH2wJwpUEju5f2CWSu3q8pgw8BsCjFTqTdPYYNRnF", - "vJNRQnJ8Rcws13U7ekLfaBnuYMNsK4mp5AB7JYMAAhz", - "VJTd6Y5W4ew2x8t9qhhP6JKJxLkPxK9JppTqNvN3iuG", - "VKoaYMffGUE92ZPve4wLCypUxoGsKYeo92F7BK1Rh61", - "VLADTpxpDXcXEb1BUxAhSzJgu5CgguMt3sZhzqr43XH", - "VT4raQnNzotr2JSuzsxdDhmhZAoc5MeozdHgodpsBeg", - "VTAZqz5HadKsUWyavErx3hhUeaDPerPVDssjB69hP8b", - "Vtn6oMwbx5tNXSWFyg7CWQQnYYWdsuro5WB8QX5Jqdd", - "VuWvEqEthfo7qgJCSTgXnkrdcL3iJx6in7KGhDsfgBQ", - "vWoxJrxUz4JjxXiRKoMKZ1BfkDFcDcDVB55Lx4isemS", - "vwP9miRZmabcxb2A4RgURvPBJKiVKXxS5SB88miN2Tz", - "VzbHiqN7E7PcT1fD9B855E3kWhRpdcq2QU1VJEWrrFr", - "VzZqDXSDF8KbfAQUvizj52NTjRg9cfXCAZ1cUJt5614", - "w32pcMdcwN8U4fika9AnBEYTTJipeg3YkJtBV9smhkF", - "WcY7EbPe7RGDcztPk7GKViVYTJqo1w71WWet6pL1zkS", - "WDG4WzgnT7hCz8tqt1iP2Cw7Nk5gUAGTtRVCgHCeLW4", - "wegaXwEgNQ2CQVvZtLEPLVvGtV5gotwCxMGpGm4xshu", - "wGa8yUShHGCt2qvpa7kM8wrLLRArxvir2Kabz9FuXpU", - "wgd8cG13hpTNmDwjyFVRPhQ2LuCkmPBEq1Wm8zkvGN6", - "WhXimQKBLiMUAWBaVVenpweVJNSahrFZdPLd8hr5Tfq", - "WLd5GSBpJfyS6pWKetsDp9zdWmKZdnkKwPJzdAuvpSM", - "wQwze5wHySpfQVM6JbzLZj7yDgZcjPX4h5LVR8BYdXn", - "wtrb2i56dg3C8xP7W5fRWH43myK57ouUaQJB1ajtZtE", - "WuH33aEB8y6YdSgAvoXET5QrfgVLx2TJW6iJvAgGBtQ", - "WwsiWZrmNF7sQ9Kk5ZYrmVySWjRn1QfXc7kEX8veo9s", - "WwTbZgpd2ELy6TUhSBwcnrJfeTVcruXDEYqoNS9JGRa", - "wzLCKiVuP3VokwcfVeUwFUXh5CH5BWNGYtAkF11DyzK", - "WZz15vW25scyEuWRKHAyNZNj49hBGrW121GrZPF9RZN", - "x31Ldohp254zduxhHMHNR3JbXZYrxgjEaWTvd4vuxZ6", - "X8UDqnz9DemEwsVTmKcboZERqQXe1gNHRXAmGFQsY5J", - "X9SKD9MtQC9BnFuV9ygbpU6R2Qkq5CyyaPP5PJkq8Er", - "xAx7Xup3RDrqnpG3Q94d7aUaj8B4T6ifHD99M2AeGZC", - "XctiDwBwYbZomH3pfBKca69BKrxjEQtFbdu6TXw9fe3", - "xDeLwxJtgNSWBEhKNHQyfHzC8mJYmtEoB5kYWT67DxK", - "xEymXc1xgVDkn4KHZUUxG2BNgtafkRRAHB3gRao6GF6", - "xfCpo4ouRs5BP3WY5BdWhbr41pQxYGcXxz1sFyzPsZr", - "xfhaXVXPLPqRPDRRbwzPysE4yhV6GTXM2mkGawq9zL5", - "XfMwUsiuKQp78HLF3VtWw14o4UavECuh7qV3S1H1AvQ", - "XHY1ef24Y5HJpTdrTD3gcBtTiSyza7uQnDVfRiRBbNJ", - "xpUcNBmk2kh3aNW4AXbSr8TQpBq3ahLgwzh2r3ARdWL", - "Xq8GX23YwT4pCroxiBS1KMLxbmBqmCRRFBb241cWsUz", - "xTiMkpp4xAYKP8BnW1Aj7voYWL2aKP2Qv9hEkZtMvpp", - "xViooFwobBZE416moj2yFV6RJwGVaBDbCQJRfCyz2FS", - "XxHHUXm5S925N5eWLQhjBGo122gNUDRFcAhRpKaN9dp", - "XZ1cGzxs5iNibYWzaanLEQncVaS2WEVeBn1xLorxHic", - "y3MSrNFUUKLaYEwbkAVVX94dE2pGsq6CfXzh5JxjdNR", - "Y4VgcBdUEuTHRQhSToMrrbbbt5942wtsNr8VnhmaZnN", - "YAvwEYUQJNHmwk48tGtzHfKxz6gjT2Z33oQBBgrkJAG", - "YC1eftZYyooK1WTmXb4YbNR8TuHaNRSETT3DaGHWGp5", - "yceezVTgTQddHr4s1VBv5eND2qWaBdwkdkWoPEwsvfn", - "yFNUpNFaUbQQS79biyJAao4c7dXgf7mQh7QGGKXMUCd", - "ygCzGv2jaqAM6gTDM6N1pCS3PWkdU4sopEN7aSZDeuR", - "ygkCkgip2MbboVLSnq6FpEz7N89nqiaTCKBCSexamR8", - "YKhfczqyMeHPMSJzcs8JiAVCtu3iieampLr3j63yTjk", - "Yp3LN2GxDuG6pBCDXstSPM2zKT2DuqKpKCGGy98kSHn", - "YpGaosZwUmt5p8gXbdGriya7zKZvU6439CDXQSS5Gcb", - "yPkW7UQQhjPBYFu71yG4rfQ6hSa4Cis1gWwhxZFtxrZ", - "YpopmpJ5ryYnLZKD7a2dEbPdPiiSLRARWVj3oAmgWLt", - "YszXDbZy9L5G4nF3WFKyCscq36sA77KyfFwFXFjrqR4", - "YutcEKV75MBnMXPhJh8Qbg5ahmwMXZGTyafQjfeD6Ud", - "yy9NTP3FcXJZKTx466JxPeSiDWSpoxN3cvfF3jTMaA7", - "yyctNfBog7XdMzVoVnNCJbi5vMCokbm3R6LigpxdvFy", - "yyKcBjfDY1Y8UoE848nxmGGzsda7xV4suxZQamYhENq", - "YYYYW8eKkmwQFhVGUKdBAnDQPuhMTpG7zwm9nikNndC", - "Z36ZMwALNp9sLgBt6nUhb3NAFAJbUp9kCDM3an7Xhb9", - "z4FDJWmvf6Sh7n2VyPhn6sXGBJG9hXHS9dwRbwk8sCZ", - "z5TVKgNfNnVcmuCVPMSm9XEovW69YjFDJj1fhyB9PpG", - "ZAXKHZD5bBPt7pQ3KUSjeAbqtwoeHKgXizvcMRcUHaQ", - "ZDCJDkoBMTXpf8zsfQzbLeTfAus1qaxiFHnANseQrmA", - "Zeta4StZ2MLT64AhiAzGypfCJFXmEGgTmzXktdHSs58", - "ZgnpwxhtomEjgKxqJyNP78PZxnA9jxcSkXoBmh1Wm7P", - "zi35ABZ6Lc8L5s4nVt2qzAHJCAZZV4E2aYXL2Xq9aqF", - "zjG7sHeExhC7tfLZwTJwHH3zzDSqDcwRVe2LdXg389j", - "zKuryCTzgvwoyDZTTh4NuiT9D9bpMHG33tTRyKKZUUT" - ] -); diff --git a/bot/src/validators_app.rs b/bot/src/validators_app.rs deleted file mode 100644 index c27b3fd0..00000000 --- a/bot/src/validators_app.rs +++ /dev/null @@ -1,342 +0,0 @@ -use crate::Cluster; -use solana_sdk::pubkey::Pubkey; -use std::str::FromStr; -use { - chrono::{DateTime, Utc}, - log::*, - serde::{Deserialize, Serialize}, - std::{ - collections::HashMap, - error, - time::{Duration, Instant}, - }, -}; - -#[allow(dead_code)] -#[derive(Debug)] -pub enum ClusterJson { - MainnetBeta, - Testnet, -} - -impl ClusterJson { - pub fn from_cluster(cluster: Cluster) -> ClusterJson { - match cluster { - Cluster::MainnetBeta => ClusterJson::MainnetBeta, - Cluster::Testnet => ClusterJson::Testnet, - } - } -} - -impl Default for ClusterJson { - fn default() -> Self { - Self::MainnetBeta - } -} - -impl AsRef for ClusterJson { - fn as_ref(&self) -> &str { - match self { - Self::MainnetBeta => "mainnet.json", - Self::Testnet => "testnet.json", - } - } -} - -const DEFAULT_BASE_URL: &str = "https://www.validators.app/api/v1/"; -const TOKEN_HTTP_HEADER_NAME: &str = "Token"; - -#[derive(Debug)] -pub struct ClientConfig { - pub base_url: String, - pub cluster: ClusterJson, - pub api_token: String, - pub timeout: Duration, -} - -impl Default for ClientConfig { - fn default() -> Self { - Self { - base_url: DEFAULT_BASE_URL.to_string(), - cluster: ClusterJson::default(), - api_token: String::default(), - timeout: Duration::from_secs(90), - } - } -} - -#[derive(Debug)] -enum Endpoint { - Ping, - Validators, - CommissionChangeIndex, -} - -impl Endpoint { - fn with_cluster(path: &str, cluster: &ClusterJson) -> String { - format!("{}/{}", path, cluster.as_ref()) - } - pub fn path(&self, cluster: &ClusterJson) -> String { - match self { - Self::Ping => "ping.json".to_string(), - Self::Validators => Self::with_cluster("validators", cluster), - Self::CommissionChangeIndex => Self::with_cluster("commission-changes", cluster), - } - } -} - -#[derive(Debug, Deserialize, Serialize)] -struct PingResponse { - answer: String, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct ValidatorsResponseEntry { - pub account: Option, - pub active_stake: Option, - pub commission: Option, - pub created_at: Option, - pub data_center_concentration_score: Option, - pub data_center_host: Option, - pub data_center_key: Option, - pub delinquent: Option, - pub details: Option, - pub keybase_id: Option, - pub name: Option, - pub network: Option, - pub ping_time: Option, - pub published_information_score: Option, - pub root_distance_score: Option, - pub security_report_score: Option, - pub skipped_slot_percent: Option, - pub skipped_slot_score: Option, - pub skipped_slots: Option, - pub software_version: Option, - pub software_version_score: Option, - pub stake_concentration_score: Option, - pub total_score: Option, - pub updated_at: Option, - pub url: Option, - pub vote_account: Option, - pub vote_distance_score: Option, - pub www_url: Option, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct ValidatorsResponse(Vec); - -impl AsRef> for ValidatorsResponse { - fn as_ref(&self) -> &Vec { - &self.0 - } -} - -#[derive(Debug, Deserialize, Serialize, Clone)] -pub struct CommissionChangeIndexHistoryEntry { - pub created_at: String, - // commission_before can be null; presumably for new validators that have set their commission for the first time - pub commission_before: Option, - // This has shown up as null in at least once case. Not sure what it indicates. - pub commission_after: Option, - // recently there was an example of epoch being null - pub epoch: Option, - pub network: String, - pub id: i32, - pub epoch_completion: f32, - pub batch_uuid: String, - pub account: String, - // name can be null - pub name: Option, -} - -impl Default for CommissionChangeIndexHistoryEntry { - fn default() -> CommissionChangeIndexHistoryEntry { - CommissionChangeIndexHistoryEntry { - created_at: "".to_string(), - commission_before: None, - commission_after: None, - epoch: None, - network: "".to_string(), - id: 0, - epoch_completion: 0.0, - batch_uuid: "".to_string(), - account: "".to_string(), - name: None, - } - } -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct CommissionChangeIndexResponse { - pub commission_histories: Vec, - pub total_count: i32, -} - -#[allow(dead_code)] -#[derive(Debug, Clone, Copy)] -pub enum SortKind { - Score, - Name, - Stake, -} - -impl std::fmt::Display for SortKind { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - Self::Score => write!(f, "score"), - Self::Name => write!(f, "name"), - Self::Stake => write!(f, "stake"), - } - } -} - -pub type Limit = u32; - -pub struct Client { - base_url: reqwest::Url, - cluster: ClusterJson, - api_token: String, - client: reqwest::blocking::Client, -} - -pub fn get_validators_app_token_from_env() -> Result { - std::env::var("VALIDATORS_APP_TOKEN").map_err(|err| format!("VALIDATORS_APP_TOKEN: {}", err)) -} - -impl Client { - pub fn new>(api_token: T, cluster: ClusterJson) -> Self { - let config = ClientConfig { - api_token: api_token.as_ref().to_string(), - cluster, - ..ClientConfig::default() - }; - Self::new_with_config(config) - } - - pub fn new_with_cluster(cluster: Cluster) -> Result> { - let token = get_validators_app_token_from_env()?; - let client = Self::new(token, ClusterJson::from_cluster(cluster)); - - Ok(client) - } - - pub fn new_with_config(config: ClientConfig) -> Self { - let ClientConfig { - base_url, - cluster, - api_token, - timeout, - } = config; - Self { - base_url: reqwest::Url::parse(&base_url).unwrap(), - cluster, - api_token, - client: reqwest::blocking::Client::builder() - .timeout(timeout) - .build() - .unwrap(), - } - } - - fn request( - &self, - endpoint: Endpoint, - query: &HashMap, - ) -> reqwest::Result { - let url = self.base_url.join(&endpoint.path(&self.cluster)).unwrap(); - info!("Requesting {}", url); - let start = Instant::now(); - let request = self - .client - .get(url) - .header(TOKEN_HTTP_HEADER_NAME, &self.api_token) - .query(&query) - .build()?; - let result = self.client.execute(request); - info!("Response took {:?}", Instant::now().duration_since(start)); - result - } - - #[allow(dead_code)] - pub fn ping(&self) -> reqwest::Result<()> { - let response = self.request(Endpoint::Ping, &HashMap::new())?; - response.json::().map(|_| ()) - } - - pub fn validators( - &self, - sort: Option, - limit: Option, - ) -> reqwest::Result { - let mut query = HashMap::new(); - if let Some(sort) = sort { - query.insert("sort".into(), sort.to_string()); - } - if let Some(limit) = limit { - query.insert("limit".into(), limit.to_string()); - } - let response = self.request(Endpoint::Validators, &query)?; - response.json::() - } - - // See https://www.validators.app/api-documentation#commission-change-index - // Note that the endpoint returns a different format from what is currently (Jan 2022) documented at this URL, and the endpoint is currently described as experimental. So this may change. - pub fn commission_change_index( - &self, - date_from: Option>, - records_per_page: Option, - page: Option, - ) -> reqwest::Result { - let mut query: HashMap = HashMap::new(); - - if let Some(date_from) = date_from { - query.insert("date_from".into(), date_from.format("%FT%T").to_string()); - } - - if let Some(records_per_page) = records_per_page { - query.insert("per".into(), records_per_page.to_string()); - } - - if let Some(page) = page { - query.insert("page".into(), page.to_string()); - } - - let response = self.request(Endpoint::CommissionChangeIndex, &query)?; - response.json::() - } - - // Returns map of identity -> CommissionChangeIndexHistoryEntries - pub fn get_all_commision_changes_since( - &self, - date_from: DateTime, - ) -> Result>, Box> - { - let mut return_map: HashMap> = - HashMap::new(); - - let mut page = 1; - let records_per_page = 50; - - loop { - let results = - self.commission_change_index(Some(date_from), Some(records_per_page), Some(page))?; - for record in results.commission_histories { - let pubkey = Pubkey::from_str(record.account.as_str())?; - - // Ignore if there is no "after" value. Not sure if this is the right thing to do. - if record.commission_after.is_some() { - let validator_records = return_map.entry(pubkey).or_insert_with(Vec::new); - validator_records.push(record); - } - } - - if page * records_per_page >= results.total_count { - break; - } else { - page += 1; - } - } - - Ok(return_map) - } -} diff --git a/bot/tests/fixtures/spl_stake_pool.so b/bot/tests/fixtures/spl_stake_pool.so deleted file mode 100644 index 9125a3386245db46ba0041bf782bef1fe02240f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488064 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 z 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 z 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


j2jrpdygf#qJD$HD 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 diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 5005b4c0..10c1a140 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-foundation-delegation-program-cli" -version = "1.0.7" +version = "2.0.0" edition = "2018" authors = ["Solana Maintainers "] license = "Apache-2.0" @@ -11,16 +11,3 @@ readme = "README.md" [[bin]] name = "solana-foundation-delegation-program" path = "src/main.rs" - -[dependencies] -clap = "2.33.3" -serde_json = "1.0.83" -solana-account-decoder = "=1.13.6" -solana-clap-utils = "=1.13.6" -solana-cli-config = "=1.13.6" -solana-client = "=1.13.6" -solana-foundation-delegation-program-registry = { version = "1.0.1", path = "../program" } -solana-logger = "=1.13.6" -solana-remote-wallet = "=1.13.6" -solana-sdk = "=1.13.6" -tokio = { version = "1", features = ["full"] } diff --git a/cli/README.md b/cli/README.md deleted file mode 100644 index c45c6236..00000000 --- a/cli/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Solana Foundation Delegation Program Command-line Utility - -This utility manages Solana Foundation Delegation Program registrations. - -## Installation -Install Rust from https://rustup.rs/, then run -```bash -$ sudo apt install libudev-dev -$ cargo install solana-foundation-delegation-program-cli -$ solana-foundation-delegation-program --version -``` - -## Usage - -### New participant registration - -To register you will need: -1. Two validator identity keypairs; one for the Solana Testnet and another for the Solana Mainnet -2. Approximately ◎0.002 to submit the registration - - -To begin, create your validator identity keypairs by running: -```bash -$ solana-keygen new -o testnet-validator-keypair.json -$ solana-keygen new -o mainnet-validator-keypair.json -``` -Keep these keypairs safe; you cannot change them once you submit your -registration. - -Confirm your balance is not empty, -``` -$ solana -um balance -``` -then run the following command to submit your registration: -``` -$ solana-foundation-delegation-program apply --mainnet mainnet-validator-keypair.json --testnet testnet-validator-keypair.json -``` - -### Display your registration status -To view the status of your registration, run -``` -$ solana-foundation-delegation-program status testnet-validator-keypair.json -``` -or -``` -$ solana-foundation-delegation-program status mainnet-validator-keypair.json -``` - -### Withdrawing your registration -If you wish to withdraw your registration, run -``` -$ solana-foundation-delegation-program withdraw testnet-validator-keypair.json -``` -or -``` -$ solana-foundation-delegation-program withdraw mainnet-validator-keypair.json -``` -Once withdrawn, your registration is deleted and cannot be recovered. diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 9ee356c4..55c6d680 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -1,51 +1 @@ -use { - solana_client::{ - rpc_client::RpcClient, - rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, - rpc_filter::*, - }, - solana_foundation_delegation_program_registry::state::{Participant, ParticipantState}, - solana_sdk::{program_pack::Pack, pubkey::Pubkey}, - std::collections::HashMap, -}; - -pub fn get_participants_with_state( - rpc_client: &RpcClient, - state: Option, -) -> Result, Box> { - let accounts = rpc_client.get_program_accounts_with_config( - &solana_foundation_delegation_program_registry::id(), - RpcProgramAccountsConfig { - account_config: RpcAccountInfoConfig { - encoding: Some(solana_account_decoder::UiAccountEncoding::Base64Zstd), - commitment: Some(rpc_client.commitment()), // TODO: Remove this line after updating to solana v1.6.10 - ..RpcAccountInfoConfig::default() - }, - filters: Some(vec![RpcFilterType::DataSize( - Participant::get_packed_len() as u64 - )]), - ..RpcProgramAccountsConfig::default() - }, - )?; - - Ok(accounts - .into_iter() - .filter_map(|(address, account)| { - Participant::unpack_from_slice(&account.data) - .ok() - .map(|p| (address, p)) - }) - .filter(|(_, p)| { - if let Some(ref state) = state { - return p.state == *state; - } - true - }) - .collect()) -} - -pub fn get_participants( - rpc_client: &RpcClient, -) -> Result, Box> { - get_participants_with_state(rpc_client, None) -} +#![deprecated = "solana-foundation-delegation-program-cli is deprecated and should not be used."] diff --git a/cli/src/main.rs b/cli/src/main.rs index 957ecc46..a7aed7e6 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,878 +1,4 @@ -use { - clap::{ - crate_description, crate_name, crate_version, value_t_or_exit, App, AppSettings, Arg, - SubCommand, - }, - serde_json::json, - solana_clap_utils::{ - input_parsers::{pubkey_of, signer_of}, - input_validators::{ - is_url_or_moniker, is_valid_pubkey, is_valid_signer, normalize_to_url_if_moniker, - }, - keypair::DefaultSigner, - }, - solana_client::rpc_client::RpcClient, - solana_foundation_delegation_program_cli::{get_participants, get_participants_with_state}, - solana_foundation_delegation_program_registry::state::{Participant, ParticipantState}, - solana_remote_wallet::remote_wallet::RemoteWalletManager, - solana_sdk::{ - commitment_config::CommitmentConfig, - message::Message, - native_token::Sol, - program_pack::Pack, - pubkey::Pubkey, - signature::{Keypair, Signer}, - signers::Signers, - system_instruction, - transaction::Transaction, - }, - std::{ - collections::{HashMap, HashSet}, - ops::Deref, - process::exit, - sync::Arc, - }, -}; - -struct Config { - default_signer: Box, - json_rpc_url: String, - verbose: bool, -} - -#[derive(PartialEq, Eq)] -enum OutputFormat { - Print, - Json, -} - -fn send_and_confirm_message( - rpc_client: &RpcClient, - message: Message, - signers: T, - additional_funds_required: Option, -) -> Result<(), Box> { - let fee_payer = message.account_keys[0]; - let recent_blockhash = rpc_client.get_latest_blockhash()?; - let funds_required = - rpc_client.get_fee_for_message(&message)? + additional_funds_required.unwrap_or_default(); - - let balance = rpc_client.get_balance(&fee_payer)?; - - if balance < funds_required { - return Err(format!( - "{} has insufficient balance. {} required", - fee_payer, - Sol(funds_required) - ) - .into()); - } - - let mut transaction = Transaction::new_unsigned(message); - transaction - .try_sign(&signers, recent_blockhash) - .map_err(|err| format!("error: failed to sign transaction: {}", err))?; - - let signature = rpc_client - .send_and_confirm_transaction_with_spinner(&transaction) - .map_err(|err| format!("error: send transaction: {}", err))?; - - println!("{}", signature); - Ok(()) -} - -fn get_participants_with_identity( - rpc_client: &RpcClient, - identities: HashSet<&Pubkey>, -) -> Result, Box> { - let mut participants = get_participants(rpc_client)?; - participants.retain(|_, p| { - identities.contains(&p.testnet_identity) || identities.contains(&p.mainnet_identity) - }); - Ok(participants) -} - -fn get_participant_by_identity( - rpc_client: &RpcClient, - identity: Pubkey, -) -> Result, Box> { - let participant = get_participants(rpc_client)? - .into_iter() - .filter(|(_, p)| p.testnet_identity == identity || p.mainnet_identity == identity) - .collect::>(); - - if participant.len() > 1 { - Err(format!("{} matches multiple participants", identity).into()) - } else { - Ok(participant.into_iter().next()) - } -} - -fn print_participant(participant: &Participant) { - println!("State: {:?}", participant.state); - println!( - "Mainnet Validator Identity: {}", - participant.mainnet_identity - ); - println!( - "Testnet Validator Identity: {}", - participant.testnet_identity - ); -} - -fn process_status( - config: &Config, - rpc_client: &RpcClient, - identity: Pubkey, -) -> Result<(), Box> { - match get_participant_by_identity(rpc_client, identity)? { - Some((participant_address, participant)) => { - if config.verbose { - println!("Participant: {}", participant_address); - } - print_participant(&participant); - } - None => { - println!("Registration not found for {}", identity); - } - } - Ok(()) -} - -fn process_apply( - config: &Config, - rpc_client: &RpcClient, - mainnet_identity: Box, - testnet_identity: Box, - confirm: bool, -) -> Result<(), Box> { - let participants = get_participants_with_identity( - rpc_client, - [mainnet_identity.pubkey(), testnet_identity.pubkey()] - .iter() - .collect::>(), - )?; - - if !participants.is_empty() { - return Err("Registration already exists".into()); - } - - println!("Mainnet Validator Identity: {}", mainnet_identity.pubkey()); - println!("Testnet Validator Identity: {}", testnet_identity.pubkey()); - - if mainnet_identity.pubkey() == testnet_identity.pubkey() { - return Err("Mainnet and Testnet identities cannot be the same".into()); - } - - if !confirm { - println!( - "\nWarning: Your mainnet and testnet identities cannot be changed after applying. \ - Add the --confirm flag to continue" - ); - return Ok(()); - } - - let rent = rpc_client.get_minimum_balance_for_rent_exemption(Participant::get_packed_len())?; - let participant: Box = Box::new(Keypair::new()); - - let message = Message::new( - &[ - system_instruction::create_account( - &config.default_signer.pubkey(), - &participant.pubkey(), - rent, - Participant::get_packed_len() as u64, - &solana_foundation_delegation_program_registry::id(), - ), - solana_foundation_delegation_program_registry::instruction::apply( - participant.pubkey(), - mainnet_identity.pubkey(), - testnet_identity.pubkey(), - ), - ], - Some(&config.default_signer.pubkey()), - ); - - let response = send_and_confirm_message( - rpc_client, - message, - [ - participant.deref(), - mainnet_identity.deref(), - testnet_identity.deref(), - config.default_signer.deref(), - ], - Some(rent), - ); - - if response.is_ok() { - println!( - "\nThank you for creating your on-chain registration for the Solana Foundation Delegation Program.\ - \n\nAs a reminder, your registration is not complete until you sign up on https://solana.foundation/delegation-program" - ); - } - - response -} - -fn process_withdraw( - config: &Config, - rpc_client: &RpcClient, - identity: Box, - confirm: bool, -) -> Result<(), Box> { - let (participant_address, participant) = - get_participant_by_identity(rpc_client, identity.pubkey())? - .ok_or_else(|| format!("Registration not found for {}", identity.pubkey()))?; - - print_participant(&participant); - - if !confirm { - println!( - "\nWarning: Your registration information will be deleted. \ - Add the --confirm flag to continue" - ); - return Ok(()); - } - - let message = Message::new( - &[ - solana_foundation_delegation_program_registry::instruction::withdraw( - participant_address, - identity.pubkey(), - config.default_signer.pubkey(), - ), - ], - Some(&config.default_signer.pubkey()), - ); - - send_and_confirm_message( - rpc_client, - message, - [identity.deref(), config.default_signer.deref()], - None, - ) -} - -fn process_list( - config: &Config, - rpc_client: &RpcClient, - state: Option, - format: OutputFormat, -) -> Result<(), Box> { - let participants = get_participants_with_state(rpc_client, state)?; - - match format { - OutputFormat::Print => { - for (participant_address, participant) in &participants { - if config.verbose { - println!("Participant: {}", participant_address); - } - print_participant(participant); - println!(); - } - println!("{} entries found", participants.len()); - } - OutputFormat::Json => { - let json_participants: Vec<_> = participants - .iter() - .map(|(_participant_address, participant)| { - let state = format!("{:?}", participant.state); - json!({ - "state": state, - "mainnet_identity": format!("{}", participant.mainnet_identity), - "testnet_identity": format!("{}", participant.testnet_identity), - }) - }) - .collect(); - - println!( - "{}", - serde_json::to_string_pretty(&json_participants).unwrap() - ); - } - } - Ok(()) -} - -fn process_admin_approve( - config: &Config, - rpc_client: &RpcClient, - admin_signer: Box, - identity: Pubkey, -) -> Result<(), Box> { - let (participant_address, participant) = get_participant_by_identity(rpc_client, identity)? - .ok_or_else(|| format!("Registration not found for {}", identity))?; - - print_participant(&participant); - - if participant.mainnet_identity == participant.testnet_identity { - return Err("Mainnet and Testnet identities cannot be the same".into()); - } - - println!("Approving..."); - - let message = Message::new( - &[ - solana_foundation_delegation_program_registry::instruction::approve( - participant_address, - admin_signer.pubkey(), - ), - ], - Some(&config.default_signer.pubkey()), - ); - - send_and_confirm_message( - rpc_client, - message, - [admin_signer.deref(), config.default_signer.deref()], - None, - ) -} - -fn process_admin_reject( - config: &Config, - rpc_client: &RpcClient, - admin_signer: Box, - identity: Pubkey, -) -> Result<(), Box> { - let (participant_address, participant) = get_participant_by_identity(rpc_client, identity)? - .ok_or_else(|| format!("Registration not found for {}", identity))?; - - print_participant(&participant); - println!("Rejecting..."); - - let message = Message::new( - &[ - solana_foundation_delegation_program_registry::instruction::reject( - participant_address, - admin_signer.pubkey(), - ), - ], - Some(&config.default_signer.pubkey()), - ); - - send_and_confirm_message( - rpc_client, - message, - [admin_signer.deref(), config.default_signer.deref()], - None, - ) -} - -fn process_admin_import( - config: &Config, - rpc_client: &RpcClient, - admin_signer: Box, - mainnet_identity: Pubkey, - testnet_identity: Pubkey, -) -> Result<(), Box> { - let participants = get_participants_with_identity( - rpc_client, - [mainnet_identity, testnet_identity] - .iter() - .collect::>(), - )?; - - if !participants.is_empty() { - return Err("A registration already exists with the provided identity".into()); - } - - let rent = rpc_client.get_minimum_balance_for_rent_exemption(Participant::get_packed_len())?; - let participant: Box = Box::new(Keypair::new()); - - let message = Message::new( - &[ - system_instruction::create_account( - &config.default_signer.pubkey(), - &participant.pubkey(), - rent, - Participant::get_packed_len() as u64, - &solana_foundation_delegation_program_registry::id(), - ), - solana_foundation_delegation_program_registry::instruction::rewrite( - participant.pubkey(), - admin_signer.pubkey(), - Participant { - state: ParticipantState::Approved, - testnet_identity, - mainnet_identity, - }, - ), - ], - Some(&config.default_signer.pubkey()), - ); - - send_and_confirm_message( - rpc_client, - message, - [ - participant.deref(), - admin_signer.deref(), - config.default_signer.deref(), - ], - Some(rent), - ) -} - -fn process_admin_rewrite( - config: &Config, - rpc_client: &RpcClient, - admin_signer: Box, - participant_address: Pubkey, - participant: Participant, -) -> Result<(), Box> { - let message = Message::new( - &[ - solana_foundation_delegation_program_registry::instruction::rewrite( - participant_address, - admin_signer.pubkey(), - participant, - ), - ], - Some(&config.default_signer.pubkey()), - ); - - send_and_confirm_message( - rpc_client, - message, - [admin_signer.deref(), config.default_signer.deref()], - None, - ) -} - -#[tokio::main] -async fn main() -> Result<(), Box> { - let default_json_rpc_url = "https://api.mainnet-beta.solana.com"; - - let app_matches = App::new(crate_name!()) - .about(crate_description!()) - .version(crate_version!()) - .setting(AppSettings::SubcommandRequiredElseHelp) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::InferSubcommands) - .arg({ - let arg = Arg::with_name("config_file") - .short("C") - .long("config") - .value_name("PATH") - .takes_value(true) - .global(true) - .help("Configuration file to use"); - if let Some(ref config_file) = *solana_cli_config::CONFIG_FILE { - arg.default_value(config_file) - } else { - arg - } - }) - .arg( - Arg::with_name("keypair") - .long("keypair") - .value_name("KEYPAIR") - .validator(is_valid_signer) - .takes_value(true) - .global(true) - .help("Filepath or URL to a keypair [default: client keypair]"), - ) - .arg( - Arg::with_name("verbose") - .long("verbose") - .short("v") - .takes_value(false) - .global(true) - .help("Show additional information"), - ) - .arg( - Arg::with_name("json_rpc_url") - .short("u") - .long("url") - .value_name("URL") - .takes_value(true) - .global(true) - .validator(is_url_or_moniker) - .default_value(default_json_rpc_url) - .help("JSON RPC URL for the cluster"), - ) - .subcommand( - SubCommand::with_name("apply") - .about("Begin a new participant registration") - .arg( - Arg::with_name("mainnet") - .long("mainnet") - .validator(is_valid_signer) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("Mainnet validator identity"), - ) - .arg( - Arg::with_name("testnet") - .long("testnet") - .validator(is_valid_signer) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("Testnet validator identity"), - ) - .arg( - Arg::with_name("confirm") - .long("confirm") - .help("Add the --confirm flag when you're ready to continue"), - ), - ) - .subcommand( - SubCommand::with_name("status") - .about("Display registration status") - .arg( - Arg::with_name("identity") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .index(1) - .required(true) - .help("Testnet or Mainnet validator identity"), - ), - ) - .subcommand( - SubCommand::with_name("withdraw") - .about("Withdraw your registration") - .arg( - Arg::with_name("identity") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .index(1) - .required(true) - .help("Testnet or Mainnet validator identity"), - ) - .arg( - Arg::with_name("confirm") - .long("confirm") - .help("Add the --confirm flag to continue when you're ready to continue"), - ), - ) - .subcommand( - SubCommand::with_name("list") - .about("List registrations") - .arg( - Arg::with_name("state") - .long("state") - .value_name("STATE") - .possible_values(&["all", "pending", "approved", "rejected"]) - .default_value("all") - .help("Restrict the list to registrations in the specified state"), - ) - .arg( - Arg::with_name("output_format") - .long("output-format") - .value_name("FORMAT") - .takes_value(true) - .possible_values(&["json"]) - .help( - "Print the registrations in specified output, \ - format, if unspecified, use", - ), - ), - ) - .subcommand( - SubCommand::with_name("sign-message") - .about("Sign message with validator key") - .arg( - Arg::with_name("message") - .required(true) - .value_name("MESSAGE") - .help("Message to be signed"), - ), - ) - .subcommand( - SubCommand::with_name("admin") - .about("Administration commands") - .setting(AppSettings::SubcommandRequiredElseHelp) - .setting(AppSettings::InferSubcommands) - .arg( - Arg::with_name("authority") - .long("authority") - .validator(is_valid_signer) - .required(true) - .value_name("KEYPAIR") - .help("Administration authority"), - ) - .subcommand( - SubCommand::with_name("approve") - .about("Approve a participant") - .arg( - Arg::with_name("participant") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .index(1) - .required(true) - .help("Testnet or Mainnet validator identity"), - ), - ) - .subcommand( - SubCommand::with_name("reject") - .about("Reject a participant") - .arg( - Arg::with_name("participant") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .index(1) - .required(true) - .help("Testnet or Mainnet validator identity"), - ), - ) - .subcommand( - SubCommand::with_name("import") - .about("Create and approve a participant") - .arg( - Arg::with_name("testnet") - .long("testnet") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("Testnet validator identity"), - ) - .arg( - Arg::with_name("mainnet") - .long("mainnet") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("Mainnet validator identity"), - ), - ) - .subcommand( - SubCommand::with_name("rewrite") - .about("Rewrite an existing participant") - .arg( - Arg::with_name("participant") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .index(1) - .required(true) - .help("Address of account to rewrite"), - ) - .arg( - Arg::with_name("testnet") - .long("testnet") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("New testnet validator identity"), - ) - .arg( - Arg::with_name("mainnet") - .long("mainnet") - .validator(is_valid_pubkey) - .value_name("ADDRESS") - .takes_value(true) - .required(true) - .help("New mainnet validator identity"), - ) - .arg( - Arg::with_name("state") - .long("state") - .value_name("STATE") - .takes_value(true) - .required(true) - .possible_values(&["pending", "rejected", "approved"]) - .help("New participant state"), - ), - ), - ) - .get_matches(); - - let (sub_command, sub_matches) = app_matches.subcommand(); - let matches = sub_matches.unwrap(); - let mut wallet_manager: Option> = None; - - let config = { - let cli_config = if let Some(config_file) = matches.value_of("config_file") { - solana_cli_config::Config::load(config_file).unwrap_or_default() - } else { - solana_cli_config::Config::default() - }; - - let default_signer = DefaultSigner::new( - "keypair", - matches - .value_of(&"keypair") - .map(|s| s.to_string()) - .unwrap_or_else(|| cli_config.keypair_path.clone()), - ); - - Config { - json_rpc_url: normalize_to_url_if_moniker(value_t_or_exit!( - matches, - "json_rpc_url", - String - )), - default_signer: default_signer - .signer_from_path(matches, &mut wallet_manager) - .unwrap_or_else(|err| { - eprintln!("error: {}", err); - exit(1); - }), - verbose: matches.is_present("verbose"), - } - }; - solana_logger::setup_with_default("solana=info"); - - if config.verbose { - println!("JSON RPC URL: {}", config.json_rpc_url); - } - let rpc_client = - RpcClient::new_with_commitment(config.json_rpc_url.clone(), CommitmentConfig::confirmed()); - - match (sub_command, sub_matches) { - ("apply", Some(arg_matches)) => { - let confirm = arg_matches.is_present("confirm"); - let mainnet_identity_signer = - match signer_of(arg_matches, "mainnet", &mut wallet_manager) { - Err(err) => { - eprintln!("Failed to parse mainnet identity: {}", err); - exit(1); - } - Ok((Some(signer), _)) => signer, - _ => unreachable!(), - }; - let testnet_identity_signer = - match signer_of(arg_matches, "testnet", &mut wallet_manager) { - Err(err) => { - eprintln!("Failed to parse testnet identity: {}", err); - exit(1); - } - Ok((Some(signer), _)) => signer, - _ => unreachable!(), - }; - - process_apply( - &config, - &rpc_client, - mainnet_identity_signer, - testnet_identity_signer, - confirm, - )?; - } - ("status", Some(arg_matches)) => { - let identity = pubkey_of(arg_matches, "identity").unwrap(); - process_status(&config, &rpc_client, identity)?; - } - ("withdraw", Some(arg_matches)) => { - let confirm = arg_matches.is_present("confirm"); - let identity_signer = match signer_of(arg_matches, "identity", &mut wallet_manager) { - Err(err) => { - eprintln!("Failed to parse identity: {}", err); - exit(1); - } - Ok((Some(signer), _)) => signer, - _ => unreachable!(), - }; - - process_withdraw(&config, &rpc_client, identity_signer, confirm)?; - } - ("list", Some(arg_matches)) => { - let state = match value_t_or_exit!(arg_matches, "state", String).as_str() { - "all" => None, - "pending" => Some(ParticipantState::Pending), - "rejected" => Some(ParticipantState::Rejected), - "approved" => Some(ParticipantState::Approved), - _ => unreachable!(), - }; - - let output_format = match arg_matches.value_of("output_format") { - None => OutputFormat::Print, - Some(output_format_string) => match output_format_string { - "json" => OutputFormat::Json, - _ => { - eprintln!( - "Unidentified --output-format type: {}", - output_format_string - ); - exit(1); - } - }, - }; - - process_list(&config, &rpc_client, state, output_format)?; - } - ("sign-message", Some(arg_matches)) => match arg_matches.value_of("message") { - Some(message) => { - let message_signature = config.default_signer.sign_message(message.as_bytes()); - println!("{}", message_signature); - } - None => { - unreachable!(); - } - }, - ("admin", Some(admin_matches)) => { - let admin_signer = match signer_of(admin_matches, "authority", &mut wallet_manager) { - Err(err) => { - eprintln!("Failed to parse admin authority: {}", err); - exit(1); - } - Ok((Some(signer), _)) => signer, - _ => unreachable!(), - }; - - if admin_signer.pubkey() != solana_foundation_delegation_program_registry::admin::id() { - eprintln!("Invalid admin authority"); - exit(1); - } - - match admin_matches.subcommand() { - ("approve", Some(arg_matches)) => { - let participant = pubkey_of(arg_matches, "participant").unwrap(); - process_admin_approve(&config, &rpc_client, admin_signer, participant)?; - } - ("reject", Some(arg_matches)) => { - let participant = pubkey_of(arg_matches, "participant").unwrap(); - process_admin_reject(&config, &rpc_client, admin_signer, participant)?; - } - ("import", Some(arg_matches)) => { - let testnet_identity = pubkey_of(arg_matches, "testnet").unwrap(); - let mainnet_identity = pubkey_of(arg_matches, "mainnet").unwrap(); - process_admin_import( - &config, - &rpc_client, - admin_signer, - mainnet_identity, - testnet_identity, - )?; - } - ("rewrite", Some(arg_matches)) => { - let participant = pubkey_of(arg_matches, "participant").unwrap(); - let testnet_identity = pubkey_of(arg_matches, "testnet").unwrap(); - let mainnet_identity = pubkey_of(arg_matches, "mainnet").unwrap(); - let state = match arg_matches.value_of("state").unwrap() { - "pending" => ParticipantState::Pending, - "rejected" => ParticipantState::Rejected, - "approved" => ParticipantState::Approved, - _ => unreachable!(), - }; - process_admin_rewrite( - &config, - &rpc_client, - admin_signer, - participant, - Participant { - testnet_identity, - mainnet_identity, - state, - }, - )?; - } - _ => unreachable!(), - } - } - _ => unreachable!(), - }; - - Ok(()) +fn main() { + eprintln!("solana-foundation-delegation-program is deprecated and should not be used."); + std::process::exit(1); } diff --git a/program/Cargo.toml b/program/Cargo.toml index 9876ba4b..84581421 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -1,24 +1,14 @@ [package] name = "solana-foundation-delegation-program-registry" -version = "1.0.1" +version = "2.0.0" edition = "2018" authors = ["Solana Maintainers "] license = "Apache-2.0" description = "Solana Foundation Delegation Program Registry" repository = "https://github.com/solana-foundation/stake-o-matic" -[dependencies] -borsh = "0.9" -borsh-derive = "0.9" -solana-program = "1.13.6" - [features] test-bpf = [] -[dev-dependencies] -assert_matches = "1.4.0" -solana-program-test = "1.13.6" -solana-sdk = "1.13.6" - [lib] crate-type = ["cdylib", "lib"] diff --git a/program/src/entrypoint.rs b/program/src/entrypoint.rs deleted file mode 100644 index 7cf225a1..00000000 --- a/program/src/entrypoint.rs +++ /dev/null @@ -1,16 +0,0 @@ -//! Program entrypoint - -#![cfg(all(target_arch = "bpf", not(feature = "no-entrypoint")))] - -use solana_program::{ - account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, -}; - -entrypoint!(process_instruction); -fn process_instruction( - program_id: &Pubkey, - accounts: &[AccountInfo], - instruction_data: &[u8], -) -> ProgramResult { - crate::processor::process_instruction(program_id, accounts, instruction_data) -} diff --git a/program/src/instruction.rs b/program/src/instruction.rs deleted file mode 100644 index 450a2d12..00000000 --- a/program/src/instruction.rs +++ /dev/null @@ -1,194 +0,0 @@ -//! Program instructions - -use crate::{id, state::Participant}; -use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; -use solana_program::{ - instruction::{AccountMeta, Instruction}, - msg, - program_error::ProgramError, - program_pack::{Pack, Sealed}, - pubkey::Pubkey, -}; - -/// Instructions supported by the Feature Proposal program -#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, BorshSchema, PartialEq)] -pub enum RegistryInstruction { - /// Apply for the program - /// - /// On success the participant will be moved to the `ParticipantState::Pending` state - /// - /// 0. `[writable]` Uninitialized `Participant` account - /// 1. `[signer]` Mainnet validator identity - /// 2. `[signer]` Testnet validator identity - Apply, - - /// Withdraw from the program - /// - /// On success the participant account will be deleted and lamports in it refunded - /// - /// 0. `[writable]` `Participant` account in the `ParticipantState::Pending` or - /// `ParticipantState::Enrolled` state - /// 1. `[signer]` Mainnet or Testnet validator identity - /// 2. `[writable]` The account to receive the closed account's lamports. - /// - Withdraw, - - /// Approve a participant. - /// - /// On success the participant will be moved to the `ParticipantState::Enrolled` state - /// - /// 0. `[writable]` `Participant` account in the `ParticipantState::Pending` state - /// 1. `[signer]` Admin account - Approve, - - /// Reject a participant - /// - /// On success the participant will be moved to the `ParticipantState::Rejected` state - /// - /// 0. `[writable]` `Participant` account in the `ParticipantState::Pending` or - /// `ParticipantState::Enrolled` state - /// 1. `[signer]` Admin account - Reject, - - /// Bypass the normal workflow and rewrite a participant account to the provided state - /// - /// 0. `[writable]` `Participant` account in any state - /// 1. `[signer]` Admin account - Rewrite(Participant), -} - -impl Sealed for RegistryInstruction {} -impl Pack for RegistryInstruction { - const LEN: usize = 66; // see `test::get_packed_len()` for justification of "66" - - fn pack_into_slice(&self, dst: &mut [u8]) { - let data = self.pack_into_vec(); - dst[..data.len()].copy_from_slice(&data); - } - - fn unpack_from_slice(src: &[u8]) -> Result { - let mut mut_src: &[u8] = src; - Self::deserialize(&mut mut_src).map_err(|err| { - msg!("Error: failed to deserialize instruction: {}", err); - ProgramError::InvalidInstructionData - }) - } -} - -impl RegistryInstruction { - fn pack_into_vec(&self) -> Vec { - self.try_to_vec().expect("try_to_vec") - } -} - -/// Create a `RegistryInstruction::Apply` instruction -pub fn apply( - participant: Pubkey, - mainnet_validator_identity: Pubkey, - testnet_validator_identity: Pubkey, -) -> Instruction { - Instruction { - program_id: id(), - accounts: vec![ - AccountMeta::new(participant, false), - AccountMeta::new_readonly(mainnet_validator_identity, true), - AccountMeta::new_readonly(testnet_validator_identity, true), - ], - data: RegistryInstruction::Apply.pack_into_vec(), - } -} - -/// Create a `RegistryInstruction::Withdraw` instruction -pub fn withdraw(participant: Pubkey, validator_identity: Pubkey, refundee: Pubkey) -> Instruction { - Instruction { - program_id: id(), - accounts: vec![ - AccountMeta::new(participant, false), - AccountMeta::new_readonly(validator_identity, true), - AccountMeta::new(refundee, false), - ], - data: RegistryInstruction::Withdraw.pack_into_vec(), - } -} - -/// Create a `RegistryInstruction::Admin` instruction -pub fn approve(participant: Pubkey, admin: Pubkey) -> Instruction { - Instruction { - program_id: id(), - accounts: vec![ - AccountMeta::new(participant, false), - AccountMeta::new_readonly(admin, true), - ], - data: RegistryInstruction::Approve.pack_into_vec(), - } -} - -/// Create a `RegistryInstruction::Reject` instruction -pub fn reject(participant: Pubkey, admin: Pubkey) -> Instruction { - Instruction { - program_id: id(), - accounts: vec![ - AccountMeta::new(participant, false), - AccountMeta::new_readonly(admin, true), - ], - data: RegistryInstruction::Reject.pack_into_vec(), - } -} - -/// Create a `RegistryInstruction::Rewrite` instruction -pub fn rewrite(participant: Pubkey, admin: Pubkey, new_state: Participant) -> Instruction { - Instruction { - program_id: id(), - accounts: vec![ - AccountMeta::new(participant, false), - AccountMeta::new_readonly(admin, true), - ], - data: RegistryInstruction::Rewrite(new_state).pack_into_vec(), - } -} - -#[cfg(test)] -mod tests { - use {super::*, crate::state::ParticipantState, solana_program::pubkey::Pubkey}; - - #[test] - fn get_packed_len() { - assert_eq!( - RegistryInstruction::get_packed_len(), - solana_program::borsh::get_packed_len::() - ) - } - #[test] - fn serialize() { - let testnet_identity = Pubkey::new_unique(); - let mainnet_identity = Pubkey::new_unique(); - - let expected_instruction: Vec = [4] // RegistryInstruction::Rewrite - .iter() - .chain(testnet_identity.to_bytes().iter()) - .chain(mainnet_identity.to_bytes().iter()) - .chain([3].iter()) // ParticipantState::Approved - .cloned() - .collect(); - - assert_eq!(RegistryInstruction::Apply.try_to_vec().unwrap(), vec![0]); - assert_eq!( - RegistryInstruction::Rewrite(Participant { - state: ParticipantState::Approved, - testnet_identity, - mainnet_identity, - }) - .try_to_vec() - .unwrap(), - expected_instruction - ); - } - - #[test] - fn deserialize() { - assert_eq!( - RegistryInstruction::unpack_from_slice(&[2]), - Ok(RegistryInstruction::Approve), - ); - } -} diff --git a/program/src/lib.rs b/program/src/lib.rs index 865cf706..62b881c0 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -1,12 +1 @@ -mod entrypoint; -pub mod instruction; -pub mod processor; -pub mod state; - -pub use solana_program; - -solana_program::declare_id!("reg8X1V65CSdmrtEjMgnXZk96b9SUSQrJ8n1rP1ZMg7"); - -pub mod admin { - solana_program::declare_id!("AdminzUFhXiGmLZBCBeFQT5ZjQkZsHc2rUh28egNnMwd"); -} +#![deprecated = "solana-foundation-delegation-program-registry"] diff --git a/program/src/processor.rs b/program/src/processor.rs deleted file mode 100644 index 72f4b7c3..00000000 --- a/program/src/processor.rs +++ /dev/null @@ -1,380 +0,0 @@ -//! Program state processor - -use crate::{instruction::*, state::*, *}; -use solana_program::{ - account_info::{next_account_info, AccountInfo}, - entrypoint::ProgramResult, - msg, - program_error::ProgramError, - program_pack::Pack, - pubkey::Pubkey, -}; - -#[cfg(test)] -mod test_admin { - solana_program::declare_id!("563B79TEFBRx8f6vwJH1XWo85MSsJRaV3E2EdmwUtjmG"); -} - -fn is_admin(address: &Pubkey) -> bool { - if crate::admin::id() == *address { - return true; - } - - #[cfg(test)] - if test_admin::id() == *address { - return true; - } - - false -} - -fn authenticate_admin(admin_info: &AccountInfo) -> ProgramResult { - if !is_admin(admin_info.key) { - msg!("Error: {} is not the admin", admin_info.key); - return Err(ProgramError::InvalidArgument); - } - if !admin_info.is_signer { - msg!("Error: {} is not a signer", admin_info.key); - return Err(ProgramError::MissingRequiredSignature); - } - - Ok(()) -} - -pub fn process_instruction( - _program_id: &Pubkey, - accounts: &[AccountInfo], - input: &[u8], -) -> ProgramResult { - let instruction = RegistryInstruction::unpack_from_slice(input)?; - let account_info_iter = &mut accounts.iter(); - let participant_info = next_account_info(account_info_iter)?; - let mut participant = Participant::unpack_from_slice(&participant_info.data.borrow())?; - - match instruction { - RegistryInstruction::Apply => { - msg!("Apply"); - if participant.state != ParticipantState::Uninitialized { - msg!("Error: participant account is already initialized"); - return Err(ProgramError::AccountAlreadyInitialized); - } - - let mainnet_identity_info = next_account_info(account_info_iter)?; - let testnet_identity_info = next_account_info(account_info_iter)?; - - if !mainnet_identity_info.is_signer { - msg!("Error: {} is not a signer", mainnet_identity_info.key); - return Err(ProgramError::MissingRequiredSignature); - } - if !testnet_identity_info.is_signer { - msg!("Error: {} is not a signer", testnet_identity_info.key); - return Err(ProgramError::MissingRequiredSignature); - } - - participant.testnet_identity = *testnet_identity_info.key; - participant.mainnet_identity = *mainnet_identity_info.key; - participant.state = ParticipantState::Pending; - } - RegistryInstruction::Withdraw => { - msg!("Withdraw"); - let identity_info = next_account_info(account_info_iter)?; - let refundee_info = next_account_info(account_info_iter)?; - - if !identity_info.is_signer { - msg!("Error: {} is not a signer", identity_info.key); - return Err(ProgramError::MissingRequiredSignature); - } - - if *identity_info.key != participant.testnet_identity - && *identity_info.key != participant.mainnet_identity - { - msg!("Error: {} is not authorized", identity_info.key); - return Err(ProgramError::MissingRequiredSignature); - } - - **refundee_info.lamports.borrow_mut() += participant_info.lamports(); - **participant_info.lamports.borrow_mut() = 0; - } - RegistryInstruction::Approve => { - msg!("Approve"); - authenticate_admin(next_account_info(account_info_iter)?)?; - participant.state = ParticipantState::Approved; - } - RegistryInstruction::Reject => { - msg!("Reject"); - authenticate_admin(next_account_info(account_info_iter)?)?; - participant.state = ParticipantState::Rejected; - } - RegistryInstruction::Rewrite(new_participant) => { - msg!("Rewrite"); - authenticate_admin(next_account_info(account_info_iter)?)?; - participant = new_participant; - } - } - - if participant.testnet_identity == participant.mainnet_identity { - msg!("Error: mainnet and testnet identities must be unique",); - Err(ProgramError::InvalidAccountData) - } else { - participant.pack_into_slice(&mut participant_info.data.borrow_mut()); - Ok(()) - } -} - -#[cfg(test)] -mod test { - use { - super::*, - assert_matches::assert_matches, - solana_program::{system_instruction::create_account, sysvar::rent::Rent}, - solana_program_test::*, - solana_sdk::{ - signature::{Keypair, Signer}, - transaction::Transaction, - }, - }; - - fn test_admin_keypair() -> Keypair { - let keypair = Keypair::from_bytes(&[ - 195, 121, 73, 133, 212, 8, 231, 45, 116, 99, 128, 66, 118, 174, 197, 26, 112, 146, 204, - 201, 119, 40, 97, 2, 86, 10, 98, 116, 235, 40, 163, 221, 60, 185, 28, 52, 69, 70, 108, - 96, 236, 253, 114, 203, 81, 219, 79, 136, 0, 185, 165, 101, 147, 67, 207, 255, 69, 83, - 242, 34, 36, 32, 80, 87, - ]) - .unwrap(); - assert_eq!(keypair.pubkey(), test_admin::id()); - keypair - } - - #[tokio::test] - async fn test_signup() { - let program_id = crate::id(); - - let participant = Keypair::new(); - let mainnet_validator_identity = Keypair::new(); - let testnet_validator_identity = Keypair::new(); - let refundee = Keypair::new(); - - let (mut banks_client, payer, recent_blockhash) = ProgramTest::new( - "solana_foundation_delegation_program_registry", - program_id, - processor!(process_instruction), - ) - .start() - .await; - - let rent = Rent::default().minimum_balance(Participant::get_packed_len()); - - // Create/Apply... - let mut transaction = Transaction::new_with_payer( - &[ - create_account( - &payer.pubkey(), - &participant.pubkey(), - rent, - Participant::get_packed_len() as u64, - &program_id, - ), - apply( - participant.pubkey(), - mainnet_validator_identity.pubkey(), - testnet_validator_identity.pubkey(), - ), - ], - Some(&payer.pubkey()), - ); - transaction.sign( - &[ - &payer, - &participant, - &mainnet_validator_identity, - &testnet_validator_identity, - ], - recent_blockhash, - ); - assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); - - let participant_state = banks_client - .get_packed_account_data::(participant.pubkey()) - .await - .unwrap(); - assert_eq!( - participant_state, - Participant { - state: ParticipantState::Pending, - testnet_identity: testnet_validator_identity.pubkey(), - mainnet_identity: mainnet_validator_identity.pubkey() - } - ); - - // Cannot Apply twice... - let mut transaction = Transaction::new_with_payer( - &[apply( - participant.pubkey(), - mainnet_validator_identity.pubkey(), - testnet_validator_identity.pubkey(), - )], - Some(&payer.pubkey()), - ); - transaction.sign( - &[ - &payer, - &mainnet_validator_identity, - &testnet_validator_identity, - ], - recent_blockhash, - ); - assert_matches!(banks_client.process_transaction(transaction).await, Err(_)); - - // Reject.. - let mut transaction = Transaction::new_with_payer( - &[reject(participant.pubkey(), test_admin::id())], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &test_admin_keypair()], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); - - assert_eq!( - banks_client - .get_packed_account_data::(participant.pubkey()) - .await - .unwrap() - .state, - ParticipantState::Rejected - ); - - // Approve... - let mut transaction = Transaction::new_with_payer( - &[approve(participant.pubkey(), test_admin::id())], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &test_admin_keypair()], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); - - assert_eq!( - banks_client - .get_packed_account_data::(participant.pubkey()) - .await - .unwrap() - .state, - ParticipantState::Approved - ); - - // Approve with wrong admin key, failure... - let mut transaction = Transaction::new_with_payer( - &[approve( - participant.pubkey(), - testnet_validator_identity.pubkey(), - )], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &testnet_validator_identity], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Err(_)); - - // Rewrite with wrong admin key, failure... - let mut transaction = Transaction::new_with_payer( - &[rewrite( - participant.pubkey(), - testnet_validator_identity.pubkey(), - Participant::default(), - )], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &testnet_validator_identity], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Err(_)); - - // Rewrite with duplicate identities, failure... - let mut transaction = Transaction::new_with_payer( - &[rewrite( - participant.pubkey(), - test_admin::id(), - Participant { - state: ParticipantState::Pending, - testnet_identity: testnet_validator_identity.pubkey(), - mainnet_identity: testnet_validator_identity.pubkey(), - }, - )], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &test_admin_keypair()], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Err(_)); - - // Rewrite... - let mut transaction = Transaction::new_with_payer( - &[rewrite( - participant.pubkey(), - test_admin::id(), - Participant { - state: ParticipantState::Pending, - testnet_identity: testnet_validator_identity.pubkey(), - mainnet_identity: Pubkey::default(), - }, - )], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &test_admin_keypair()], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); - - let participant_state = banks_client - .get_packed_account_data::(participant.pubkey()) - .await - .unwrap(); - assert_eq!( - participant_state, - Participant { - state: ParticipantState::Pending, - testnet_identity: testnet_validator_identity.pubkey(), - mainnet_identity: Pubkey::default(), - } - ); - - // Withdraw... - assert_eq!( - banks_client.get_balance(refundee.pubkey()).await.unwrap(), - 0 - ); - assert_eq!( - banks_client - .get_balance(testnet_validator_identity.pubkey()) - .await - .unwrap(), - 0 - ); - assert_eq!( - banks_client - .get_balance(participant.pubkey()) - .await - .unwrap(), - rent - ); - let mut transaction = Transaction::new_with_payer( - &[withdraw( - participant.pubkey(), - testnet_validator_identity.pubkey(), - refundee.pubkey(), - )], - Some(&payer.pubkey()), - ); - transaction.sign(&[&payer, &testnet_validator_identity], recent_blockhash); - assert_matches!(banks_client.process_transaction(transaction).await, Ok(())); - - assert_eq!( - banks_client.get_balance(refundee.pubkey()).await.unwrap(), - rent - ); - assert_eq!( - banks_client - .get_balance(testnet_validator_identity.pubkey()) - .await - .unwrap(), - 0 - ); - assert_eq!( - banks_client - .get_balance(participant.pubkey()) - .await - .unwrap(), - 0 - ); - } -} diff --git a/program/src/state.rs b/program/src/state.rs deleted file mode 100644 index dce66b2e..00000000 --- a/program/src/state.rs +++ /dev/null @@ -1,68 +0,0 @@ -//! Program state -use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; -use solana_program::{ - msg, - program_error::ProgramError, - program_pack::{Pack, Sealed}, - pubkey::Pubkey, -}; - -#[derive(Clone, Debug, BorshSerialize, BorshDeserialize, BorshSchema, PartialEq)] -pub enum ParticipantState { - /// Default account state after creating it - Uninitialized, - - /// The participant's application is pending - Pending, - - /// The participant's application was rejected - Rejected, - - /// Participant is enrolled - Approved, -} - -impl Default for ParticipantState { - fn default() -> Self { - Self::Uninitialized - } -} - -#[derive(Clone, Debug, Default, BorshSerialize, BorshDeserialize, BorshSchema, PartialEq)] -pub struct Participant { - pub testnet_identity: Pubkey, - pub mainnet_identity: Pubkey, - pub state: ParticipantState, -} - -impl Sealed for Participant {} - -impl Pack for Participant { - const LEN: usize = 65; // see `test::get_packed_len()` for justification of "73" - - fn pack_into_slice(&self, dst: &mut [u8]) { - let data = self.try_to_vec().unwrap(); - dst[..data.len()].copy_from_slice(&data); - } - - fn unpack_from_slice(src: &[u8]) -> Result { - let mut mut_src: &[u8] = src; - Self::deserialize(&mut mut_src).map_err(|err| { - msg!("Error: failed to deserialize account: {}", err); - ProgramError::InvalidAccountData - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn get_packed_len() { - assert_eq!( - Participant::get_packed_len(), - solana_program::borsh::get_packed_len::() - ); - } -}